Mercurial > hg > orthanc-stone
annotate Applications/Qt/QCairoWidget.cpp @ 291:87376a645ee1 am-2
renaming
author | am@osimis.io |
---|---|
date | Thu, 30 Aug 2018 17:06:22 +0200 |
parents | 38b0ac8055b9 |
children | 3a4ca166fafa |
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(); |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
53 Orthanc::ImageAccessor a = surface_.GetAccessor(); |
277 | 54 viewport.Render(a); |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
55 painter.drawImage(0, 0, *image_); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
56 } |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
57 else |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
58 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
59 painter.fillRect(rect(), Qt::red); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
60 } |
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 |
277 | 63 OrthancStone::KeyboardModifiers GetKeyboardModifiers(QInputEvent* event) |
64 { | |
65 Qt::KeyboardModifiers qtModifiers = event->modifiers(); | |
66 int stoneModifiers = static_cast<int>(OrthancStone::KeyboardModifiers_None); | |
67 if ((qtModifiers & Qt::AltModifier) != 0) | |
68 { | |
69 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Alt); | |
70 } | |
71 if ((qtModifiers & Qt::ControlModifier) != 0) | |
72 { | |
73 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Control); | |
74 } | |
75 if ((qtModifiers & Qt::ShiftModifier) != 0) | |
76 { | |
77 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Shift); | |
78 } | |
79 return static_cast<OrthancStone::KeyboardModifiers>(stoneModifiers); | |
80 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
81 |
277 | 82 void QCairoWidget::mousePressEvent(QMouseEvent* event) |
83 { | |
84 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
85 | |
86 OrthancStone::MouseButton button; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
87 |
277 | 88 switch (event->button()) |
89 { | |
90 case Qt::LeftButton: | |
91 button = OrthancStone::MouseButton_Left; | |
92 break; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
93 |
277 | 94 case Qt::RightButton: |
95 button = OrthancStone::MouseButton_Right; | |
96 break; | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
97 |
277 | 98 case Qt::MiddleButton: |
99 button = OrthancStone::MouseButton_Middle; | |
100 break; | |
101 | |
102 default: | |
103 return; // Unsupported button | |
104 } | |
105 context_->GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers); | |
106 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
107 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
108 |
277 | 109 void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/) |
110 { | |
111 context_->GetCentralViewport().MouseLeave(); | |
112 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
113 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
114 |
277 | 115 void QCairoWidget::mouseMoveEvent(QMouseEvent* event) |
116 { | |
117 context_->GetCentralViewport().MouseMove(event->pos().x(), event->pos().y()); | |
118 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
119 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
120 |
277 | 121 void QCairoWidget::wheelEvent(QWheelEvent * event) |
122 { | |
123 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
124 |
277 | 125 if (event->orientation() == Qt::Vertical) |
126 { | |
127 if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions | |
128 { | |
129 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers); | |
130 } | |
131 else | |
132 { | |
133 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers); | |
134 } | |
135 } | |
136 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
137 |
284 | 138 void QCairoWidget::keyPressEvent(QKeyEvent *event) |
139 { | |
140 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event); | |
141 | |
142 context_->GetCentralViewport().KeyPressed(event->text()[0].toLatin1(), stoneModifiers); | |
143 } | |
276
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
144 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
145 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
146 void QCairoWidget::resizeEvent(QResizeEvent* event) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
147 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
148 grabGesture(Qt::PanGesture); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
149 QWidget::resizeEvent(event); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
150 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
151 if (event) |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
152 { |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
153 surface_.SetSize(event->size().width(), event->size().height()); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
154 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
155 image_.reset(new QImage(reinterpret_cast<uchar*>(surface_.GetBuffer()), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
156 event->size().width(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
157 event->size().height(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
158 surface_.GetPitch(), |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
159 QImage::Format_RGB32)); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
160 |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
161 context_->GetCentralViewport().SetSize(event->size().width(), event->size().height()); |
5de5699ad570
first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff
changeset
|
162 |
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 } |