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 //}