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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
18 void QCairoWidget::SetContext(OrthancStone::BasicNativeApplicationContext& context)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
19 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
20 context_ = &context;
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
21 context_->GetCentralViewport().Register(*this); // get notified each time the content of the central viewport changes
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
22 }
276
5de5699ad570 first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff changeset
23
277
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
42 OrthancStone::KeyboardModifiers GetKeyboardModifiers(QInputEvent* event)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
43 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
44 Qt::KeyboardModifiers qtModifiers = event->modifiers();
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
45 int stoneModifiers = static_cast<int>(OrthancStone::KeyboardModifiers_None);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
46 if ((qtModifiers & Qt::AltModifier) != 0)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
47 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
48 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Alt);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
49 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
50 if ((qtModifiers & Qt::ControlModifier) != 0)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
51 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
52 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Control);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
53 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
54 if ((qtModifiers & Qt::ShiftModifier) != 0)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
55 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
56 stoneModifiers |= static_cast<int>(OrthancStone::KeyboardModifiers_Shift);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
57 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
58 return static_cast<OrthancStone::KeyboardModifiers>(stoneModifiers);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
59 }
276
5de5699ad570 first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff changeset
60
277
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
61 void QCairoWidget::mousePressEvent(QMouseEvent* event)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
62 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
63 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
64
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
65 OrthancStone::MouseButton button;
276
5de5699ad570 first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff changeset
66
277
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
67 switch (event->button())
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
68 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
69 case Qt::LeftButton:
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
70 button = OrthancStone::MouseButton_Left;
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
71 break;
276
5de5699ad570 first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff changeset
72
277
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
73 case Qt::RightButton:
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
74 button = OrthancStone::MouseButton_Right;
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
75 break;
276
5de5699ad570 first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff changeset
76
277
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
77 case Qt::MiddleButton:
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
78 button = OrthancStone::MouseButton_Middle;
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
79 break;
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
80
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
81 default:
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
82 return; // Unsupported button
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
83 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
84 context_->GetCentralViewport().MouseDown(button, event->pos().x(), event->pos().y(), stoneModifiers);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
88 void QCairoWidget::mouseReleaseEvent(QMouseEvent* /*eventNotUsed*/)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
89 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
90 context_->GetCentralViewport().MouseLeave();
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
94 void QCairoWidget::mouseMoveEvent(QMouseEvent* event)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
95 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
96 context_->GetCentralViewport().MouseMove(event->pos().x(), event->pos().y());
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
100 void QCairoWidget::wheelEvent(QWheelEvent * event)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
101 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
102 OrthancStone::KeyboardModifiers stoneModifiers = GetKeyboardModifiers(event);
276
5de5699ad570 first display in QCairoWidget; no mouse interaction yet
am@osimis.io
parents:
diff changeset
103
277
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
104 if (event->orientation() == Qt::Vertical)
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
105 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
106 if (event->delta() < 0) // TODO: compare direction with SDL and make sure we send the same directions
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
107 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
108 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Up, event->pos().x(), event->pos().y(), stoneModifiers);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
109 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
110 else
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
111 {
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
112 context_->GetCentralViewport().MouseWheel(OrthancStone::MouseWheelDirection_Down, event->pos().x(), event->pos().y(), stoneModifiers);
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
113 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
114 }
a38465cc909f Qt: refresh ok + mouse interaction ok
am@osimis.io
parents: 276
diff changeset
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 }