Mercurial > hg > orthanc-stone
annotate Applications/Qt/QCairoWidget.cpp @ 337:c4d4213f095c am-2
cont
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 18 Oct 2018 20:07:09 +0200 |
parents | 8716176ff7f0 |
children | 557c8ff1db5c |
rev | line source |
---|---|
280
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
1 /** |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
2 * Stone of Orthanc |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
4 * Department, University Hospital of Liege, Belgium |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
6 * |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
7 * This program is free software: you can redistribute it and/or |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
8 * modify it under the terms of the GNU Affero General Public License |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
9 * as published by the Free Software Foundation, either version 3 of |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
10 * the License, or (at your option) any later version. |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
11 * |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
12 * This program is distributed in the hope that it will be useful, but |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
13 * WITHOUT ANY WARRANTY; without even the implied warranty of |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
15 * Affero General Public License for more details. |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
16 * |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
17 * You should have received a copy of the GNU Affero General Public License |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
19 **/ |
829163c6efc1
split MainWindow into a generic one and one specific to these samples
am@osimis.io
parents:
277
diff
changeset
|
20 |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
21 #include "QCairoWidget.h" |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
22 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
23 #include <QPainter> |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
24 #include <QPaintEvent> |
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 #include <stdexcept> |
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 QCairoWidget::QCairoWidget(QWidget *parent) : |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
29 QWidget(parent), |
277 | 30 context_(NULL) |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
31 { |
284 | 32 setFocusPolicy(Qt::StrongFocus); // catch keyPressEvents |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
33 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
34 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
35 QCairoWidget::~QCairoWidget() |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
36 { |
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 |
291 | 39 void QCairoWidget::SetContext(OrthancStone::NativeStoneApplicationContext& context) |
277 | 40 { |
41 context_ = &context; | |
42 context_->GetCentralViewport().Register(*this); // get notified each time the content of the central viewport changes | |
43 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
44 |
277 | 45 void QCairoWidget::paintEvent(QPaintEvent* /*event*/) |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
46 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
47 QPainter painter(this); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
48 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
49 if (image_.get() != NULL && context_ != NULL) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
50 { |
291 | 51 OrthancStone::NativeStoneApplicationContext::GlobalMutexLocker locker(*context_); |
277 | 52 OrthancStone::IViewport& viewport = context_->GetCentralViewport(); |
318
3a4ca166fafa
ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents:
291
diff
changeset
|
53 Orthanc::ImageAccessor a; |
3a4ca166fafa
ImageAccessor refactoring + implemented Image Cache in SmartLoader
am@osimis.io
parents:
291
diff
changeset
|
54 surface_.GetAccessor(a); |
277 | 55 viewport.Render(a); |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
56 painter.drawImage(0, 0, *image_); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
57 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
58 else |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
59 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
60 painter.fillRect(rect(), Qt::red); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
61 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
62 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
63 |
277 | 64 OrthancStone::KeyboardModifiers GetKeyboardModifiers(QInputEvent* event) |
65 { | |
66 Qt::KeyboardModifiers qtModifiers = event->modifiers(); | |
67 int stoneModifiers = static_cast<int>(OrthancStone::KeyboardModifiers_None); | |
68 if ((qtModifiers & Qt::AltModifier) != 0) | |
69 { | |
70 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Alt); | |
71 } | |
72 if ((qtModifiers & Qt::ControlModifier) != 0) | |
73 { | |
74 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Control); | |
75 } | |
76 if ((qtModifiers & Qt::ShiftModifier) != 0) | |
77 { | |
78 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Shift); | |
79 } | |
80 return static_cast<OrthancStone::KeyboardModifiers>(stoneModifiers); | |
81 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
82 |
277 | 83 void QCairoWidget::mousePressEvent(QMouseEvent* event) |
84 { | |
85 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
86 | |
87 OrthancStone::MouseButton button; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
88 |
277 | 89 switch (event->button()) |
90 { | |
91 case Qt::LeftButton: | |
92 button = OrthancStone::MouseButton_Left; | |
93 break; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
94 |
277 | 95 case Qt::RightButton: |
96 button = OrthancStone::MouseButton_Right; | |
97 break; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
98 |
277 | 99 case Qt::MiddleButton: |
100 button = OrthancStone::MouseButton_Middle; | |
101 break; | |
102 | |
103 default: | |
104 return; // Unsupported button | |
105 } | |
106 context_->GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers); | |
107 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
108 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
109 |
277 | 110 void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) |
111 { | |
112 context_->GetCentralViewport().MouseLeave(); | |
113 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
114 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
115 |
277 | 116 void QCairoWidget::mouseMoveEvent(QMouseEvent* event) |
117 { | |
118 context_->GetCentralViewport().MouseMove(event->pos().x(), event->pos().y()); | |
119 } | |
276
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 |
277 | 122 void QCairoWidget::wheelEvent(QWheelEvent * event) |
123 { | |
124 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
125 |
277 | 126 if (event->orientation() == Qt::Vertical) |
127 { | |
128 if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions | |
129 { | |
130 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); | |
131 } | |
132 else | |
133 { | |
134 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); | |
135 } | |
136 } | |
137 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
138 |
284 | 139 void QCairoWidget::keyPressEvent(QKeyEvent *event) |
140 { | |
327 | 141 using namespace OrthancStone; |
142 | |
284 | 143 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); |
144 | |
327 | 145 OrthancStone::KeyboardKeys keyType = OrthancStone::KeyboardKeys_Generic; |
146 char keyChar = event->text()[0].toLatin1(); | |
147 | |
148 #define CASE_QT_KEY_TO_ORTHANC(qt, o) case qt: keyType = o; break; | |
149 if (keyChar == 0) | |
150 { | |
151 switch (event->key()) | |
152 { | |
153 CASE_QT_KEY_TO_ORTHANC(Qt::Key_Up, KeyboardKeys_Up); | |
154 CASE_QT_KEY_TO_ORTHANC(Qt::Key_Down, KeyboardKeys_Down); | |
155 CASE_QT_KEY_TO_ORTHANC(Qt::Key_Left, KeyboardKeys_Left); | |
156 CASE_QT_KEY_TO_ORTHANC(Qt::Key_Right, KeyboardKeys_Right); | |
157 default: | |
158 break; | |
159 } | |
160 } | |
161 context_->GetCentralViewport().KeyPressed(keyType, keyChar, stoneModifiers); | |
284 | 162 } |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
163 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
164 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
165 void QCairoWidget::resizeEvent(QResizeEvent* event) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
166 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
167 grabGesture(Qt::PanGesture); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
168 QWidget::resizeEvent(event); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
169 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
170 if (event) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
171 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
172 surface_.SetSize(event->size().width(), event->size().height()); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
173 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
174 image_.reset(new QImage(reinterpret_cast<uchar*>(surface_.GetBuffer()), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
175 event->size().width(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
176 event->size().height(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
177 surface_.GetPitch(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
178 QImage::Format_RGB32)); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
179 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
180 context_->GetCentralViewport().SetSize(event->size().width(), event->size().height()); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
181 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
182 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
183 } |