Mercurial > hg > orthanc-stone
annotate Applications/Qt/QCairoWidget.cpp @ 277:a38465cc909f am-2
Qt: refresh ok + mouse interaction ok
author | am@osimis.io |
---|---|
date | Mon, 27 Aug 2018 14:41:49 +0200 |
parents | 5de5699ad570 |
children | 829163c6efc1 |
rev | line source |
---|---|
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
1 #include "QCairoWidget.h" |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
2 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
3 #include <QPainter> |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
4 #include <QPaintEvent> |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
5 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
6 #include <stdexcept> |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
7 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
8 QCairoWidget::QCairoWidget(QWidget *parent) : |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
9 QWidget(parent), |
277 | 10 context_(NULL) |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
11 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
12 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
13 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
14 QCairoWidget::~QCairoWidget() |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
15 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
16 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
17 |
277 | 18 void QCairoWidget::SetContext(OrthancStone::BasicNativeApplicationContext& context) |
19 { | |
20 context_ = &context; | |
21 context_->GetCentralViewport().Register(*this); // get notified each time the content of the central viewport changes | |
22 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
23 |
277 | 24 void QCairoWidget::paintEvent(QPaintEvent* /*event*/) |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
25 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
26 QPainter painter(this); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
27 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
28 if (image_.get() != NULL && context_ != NULL) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
29 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
30 OrthancStone::BasicNativeApplicationContext::GlobalMutexLocker locker(*context_); |
277 | 31 OrthancStone::IViewport& viewport = context_->GetCentralViewport(); |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
32 Orthanc::ImageAccessor a = surface_.GetAccessor(); |
277 | 33 viewport.Render(a); |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
34 painter.drawImage(0, 0, *image_); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
35 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
36 else |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
37 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
38 painter.fillRect(rect(), Qt::red); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
39 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
40 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
41 |
277 | 42 OrthancStone::KeyboardModifiers GetKeyboardModifiers(QInputEvent* event) |
43 { | |
44 Qt::KeyboardModifiers qtModifiers = event->modifiers(); | |
45 int stoneModifiers = static_cast<int>(OrthancStone::KeyboardModifiers_None); | |
46 if ((qtModifiers & Qt::AltModifier) != 0) | |
47 { | |
48 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Alt); | |
49 } | |
50 if ((qtModifiers & Qt::ControlModifier) != 0) | |
51 { | |
52 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Control); | |
53 } | |
54 if ((qtModifiers & Qt::ShiftModifier) != 0) | |
55 { | |
56 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Shift); | |
57 } | |
58 return static_cast<OrthancStone::KeyboardModifiers>(stoneModifiers); | |
59 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
60 |
277 | 61 void QCairoWidget::mousePressEvent(QMouseEvent* event) |
62 { | |
63 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
64 | |
65 OrthancStone::MouseButton button; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
66 |
277 | 67 switch (event->button()) |
68 { | |
69 case Qt::LeftButton: | |
70 button = OrthancStone::MouseButton_Left; | |
71 break; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
72 |
277 | 73 case Qt::RightButton: |
74 button = OrthancStone::MouseButton_Right; | |
75 break; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
76 |
277 | 77 case Qt::MiddleButton: |
78 button = OrthancStone::MouseButton_Middle; | |
79 break; | |
80 | |
81 default: | |
82 return; // Unsupported button | |
83 } | |
84 context_->GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers); | |
85 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
86 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
87 |
277 | 88 void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) |
89 { | |
90 context_->GetCentralViewport().MouseLeave(); | |
91 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
92 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
93 |
277 | 94 void QCairoWidget::mouseMoveEvent(QMouseEvent* event) |
95 { | |
96 context_->GetCentralViewport().MouseMove(event->pos().x(), event->pos().y()); | |
97 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
98 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
99 |
277 | 100 void QCairoWidget::wheelEvent(QWheelEvent * event) |
101 { | |
102 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
103 |
277 | 104 if (event->orientation() == Qt::Vertical) |
105 { | |
106 if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions | |
107 { | |
108 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); | |
109 } | |
110 else | |
111 { | |
112 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); | |
113 } | |
114 } | |
115 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
116 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
117 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
118 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
119 void QCairoWidget::resizeEvent(QResizeEvent* event) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
120 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
121 grabGesture(Qt::PanGesture); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
122 QWidget::resizeEvent(event); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
123 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
124 if (event) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
125 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
126 surface_.SetSize(event->size().width(), event->size().height()); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
127 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
128 image_.reset(new QImage(reinterpret_cast<uchar*>(surface_.GetBuffer()), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
129 event->size().width(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
130 event->size().height(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
131 surface_.GetPitch(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
132 QImage::Format_RGB32)); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
133 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
134 context_->GetCentralViewport().SetSize(event->size().width(), event->size().height()); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
135 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
136 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
137 } |