Mercurial > hg > orthanc-stone
comparison 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 |
comparison
equal
deleted
inserted
replaced
276:5de5699ad570 | 277:a38465cc909f |
---|---|
5 | 5 |
6 #include <stdexcept> | 6 #include <stdexcept> |
7 | 7 |
8 QCairoWidget::QCairoWidget(QWidget *parent) : | 8 QCairoWidget::QCairoWidget(QWidget *parent) : |
9 QWidget(parent), | 9 QWidget(parent), |
10 context_(NULL), | 10 context_(NULL) |
11 isMouseOver_(false), | |
12 mouseOverX_(0), | |
13 mouseOverY_(0) | |
14 { | 11 { |
15 setMouseTracking(true); | |
16 updateNeeded_ = true; | |
17 } | 12 } |
18 | |
19 | |
20 | 13 |
21 QCairoWidget::~QCairoWidget() | 14 QCairoWidget::~QCairoWidget() |
22 { | 15 { |
23 } | 16 } |
24 | 17 |
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 } | |
25 | 23 |
26 void QCairoWidget::paintEvent(QPaintEvent* event) | 24 void QCairoWidget::paintEvent(QPaintEvent* /*event*/) |
27 { | 25 { |
28 QPainter painter(this); | 26 QPainter painter(this); |
29 | 27 |
30 if (image_.get() != NULL && context_ != NULL) | 28 if (image_.get() != NULL && context_ != NULL) |
31 { | 29 { |
32 OrthancStone::BasicNativeApplicationContext::GlobalMutexLocker locker(*context_); | 30 OrthancStone::BasicNativeApplicationContext::GlobalMutexLocker locker(*context_); |
33 OrthancStone::IViewport& vp = context_->GetCentralViewport(); | 31 OrthancStone::IViewport& viewport = context_->GetCentralViewport(); |
34 Orthanc::ImageAccessor a = surface_.GetAccessor(); | 32 Orthanc::ImageAccessor a = surface_.GetAccessor(); |
35 vp.Render(a); | 33 viewport.Render(a); |
36 //image_->fill(0); | |
37 painter.drawImage(0, 0, *image_); | 34 painter.drawImage(0, 0, *image_); |
38 } | 35 } |
39 else | 36 else |
40 { | 37 { |
41 painter.fillRect(rect(), Qt::red); | 38 painter.fillRect(rect(), Qt::red); |
42 } | 39 } |
43 } | 40 } |
44 | 41 |
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 } | |
45 | 60 |
46 //static void GetPixelCenter(double& x, | 61 void QCairoWidget::mousePressEvent(QMouseEvent* event) |
47 // double& y, | 62 { |
48 // const QMouseEvent* event) | 63 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); |
49 //{ | 64 |
50 // x = static_cast<double>(event->x()) + 0.5; | 65 OrthancStone::MouseButton button; |
51 // y = static_cast<double>(event->y()) + 0.5; | 66 |
52 //} | 67 switch (event->button()) |
68 { | |
69 case Qt::LeftButton: | |
70 button = OrthancStone::MouseButton_Left; | |
71 break; | |
72 | |
73 case Qt::RightButton: | |
74 button = OrthancStone::MouseButton_Right; | |
75 break; | |
76 | |
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 } | |
53 | 86 |
54 | 87 |
55 //void QCairoWidget::mousePressEvent(QMouseEvent* event) | 88 void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) |
56 //{ | 89 { |
57 // if (mouseTracker_.get() == NULL) | 90 context_->GetCentralViewport().MouseLeave(); |
58 // { | 91 } |
59 // OrthancStone::MouseButton button; | |
60 | |
61 // switch (event->button()) | |
62 // { | |
63 // case Qt::LeftButton: | |
64 // button = OrthancStone::MouseButton_Left; | |
65 // break; | |
66 | |
67 // case Qt::RightButton: | |
68 // button = OrthancStone::MouseButton_Right; | |
69 // break; | |
70 | |
71 // case Qt::MiddleButton: | |
72 // button = OrthancStone::MouseButton_Middle; | |
73 // break; | |
74 | |
75 // default: | |
76 // return; // Unsupported button | |
77 // } | |
78 | |
79 // double x, y; | |
80 // GetPixelCenter(x, y, event); | |
81 ////TODO mouseTracker_.reset(viewport_.CreateMouseTracker(*scene_, button, x, y)); | |
82 // repaint(); | |
83 // } | |
84 //} | |
85 | 92 |
86 | 93 |
87 //void QCairoWidget::mouseReleaseEvent(QMouseEvent* event) | 94 void QCairoWidget::mouseMoveEvent(QMouseEvent* event) |
88 //{ | 95 { |
89 // if (mouseTracker_.get() != NULL) | 96 context_->GetCentralViewport().MouseMove(event->pos().x(), event->pos().y()); |
90 // { | 97 } |
91 // mouseTracker_->MouseUp(); | |
92 // mouseTracker_.reset(NULL); | |
93 // repaint(); | |
94 // } | |
95 //} | |
96 | 98 |
97 | 99 |
98 //void QCairoWidget::mouseMoveEvent(QMouseEvent* event) | 100 void QCairoWidget::wheelEvent(QWheelEvent * event) |
99 //{ | 101 { |
100 // if (mouseTracker_.get() == NULL) | 102 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); |
101 // { | |
102 // if (rect().contains(event->pos())) | |
103 // { | |
104 // // Mouse over widget | |
105 // isMouseOver_ = true; | |
106 // mouseOverX_ = event->x(); | |
107 // mouseOverY_ = event->y(); | |
108 // } | |
109 // else | |
110 // { | |
111 // // Mouse out of widget | |
112 // isMouseOver_ = false; | |
113 // } | |
114 // } | |
115 // else | |
116 // { | |
117 // double x, y; | |
118 // GetPixelCenter(x, y, event); | |
119 // mouseTracker_->MouseMove(x, y); | |
120 // isMouseOver_ = false; | |
121 // } | |
122 | 103 |
123 //// if (isMouseOver_) | 104 if (event->orientation() == Qt::Vertical) |
124 //// { | 105 { |
125 //// UpdateMouseCoordinates(event->x(), event->y()); | 106 if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions |
126 //// } | 107 { |
127 | 108 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); |
128 // repaint(); | 109 } |
129 //} | 110 else |
130 | 111 { |
131 | 112 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); |
132 //void QCairoWidget::wheelEvent(QWheelEvent * event) | 113 } |
133 //{ | 114 } |
134 // if (mouseTracker_.get() == NULL) | 115 } |
135 // { | |
136 //#if 0 | |
137 // double x = static_cast<double>(event->x()) + 0.5; | |
138 // double y = static_cast<double>(event->y()) + 0.5; | |
139 // mouseTracker_.reset(viewport_.CreateMouseTracker(*scene_, MouseButton_Middle, x, y)); | |
140 | |
141 // switch (event->orientation()) | |
142 // { | |
143 // case Qt::Horizontal: | |
144 // x += event->delta(); | |
145 // break; | |
146 | |
147 // case Qt::Vertical: | |
148 // y += event->delta(); | |
149 // break; | |
150 | |
151 // default: | |
152 // break; | |
153 // } | |
154 | |
155 // mouseTracker_->MouseMove(x, y); | |
156 // mouseTracker_->MouseUp(); | |
157 // mouseTracker_.reset(NULL); | |
158 | |
159 // repaint(); | |
160 //#else | |
161 // if (event->orientation() == Qt::Vertical) | |
162 // { | |
163 // unsigned int slice = scene_->GetCurrentSlice(); | |
164 | |
165 // if (event->delta() < 0) | |
166 // { | |
167 // if (slice > 0) | |
168 // { | |
169 // scene_->SetCurrentSlice(slice - 1); | |
170 // emit SliceChanged(slice - 1); | |
171 // } | |
172 // } | |
173 // else | |
174 // { | |
175 // if (slice + 1 < scene_->GetSlicesCount()) | |
176 // { | |
177 // scene_->SetCurrentSlice(slice + 1); | |
178 // emit SliceChanged(slice + 1); | |
179 // } | |
180 // } | |
181 | |
182 // repaint(); | |
183 // } | |
184 //#endif | |
185 // } | |
186 | |
187 // UpdateMouseCoordinates(event->x(), event->y()); | |
188 //} | |
189 | 116 |
190 | 117 |
191 | 118 |
192 void QCairoWidget::resizeEvent(QResizeEvent* event) | 119 void QCairoWidget::resizeEvent(QResizeEvent* event) |
193 { | 120 { |
206 | 133 |
207 context_->GetCentralViewport().SetSize(event->size().width(), event->size().height()); | 134 context_->GetCentralViewport().SetSize(event->size().width(), event->size().height()); |
208 | 135 |
209 } | 136 } |
210 } | 137 } |
211 | |
212 //void QCairoWidget::UpdateMouseCoordinates(int x, | |
213 // int y) | |
214 //{ | |
215 // if (scene_ != NULL) | |
216 // { | |
217 // double cx = static_cast<double>(x) + 0.5; | |
218 // double cy = static_cast<double>(y) + 0.5; | |
219 | |
220 // std::string coordinates; | |
221 // viewport_.FormatCoordinates(coordinates, *scene_, cx, cy); | |
222 | |
223 // emit PositionChanged(QString(coordinates.c_str())); | |
224 // } | |
225 //} | |
226 | |
227 | |
228 //void QCairoWidget::SetDefaultView() | |
229 //{ | |
230 // viewport_.SetDefaultView(); | |
231 // repaint(); | |
232 //} | |
233 | |
234 | |
235 //void QCairoWidget::Refresh() | |
236 //{ | |
237 // if (scene_ != NULL && | |
238 // updateNeeded_) | |
239 // { | |
240 // updateNeeded_ = false; | |
241 // emit ContentChanged(); | |
242 // repaint(); | |
243 // } | |
244 //} | |
245 | |
246 | |
247 //void QCairoWidget::SetSlice(int index) | |
248 //{ | |
249 // if (scene_ != NULL && | |
250 // index >= 0 && | |
251 // index < static_cast<int>(scene_->GetSlicesCount())) | |
252 // { | |
253 // scene_->SetCurrentSlice(index); | |
254 // emit SliceChanged(index); | |
255 // repaint(); | |
256 // } | |
257 //} |