ImagingTools Core SDK
TDesignerGuiDialogBase.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/qmetaobject.h>
7#include <QtGui/QMouseEvent>
8#include <QtGui/QShowEvent>
9#include <QtWidgets/QDialog>
10
11#if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)
12 #include <QtGui/QScreen>
13#else
14 #include <QtGui/QDesktopWidget>
15#endif
16
17
18namespace imtgui
19{
20
21
22template <class UI>
23class TDesignerGuiDialogBase: public QDialog, public UI
24{
25public:
26 typedef QDialog BaseClass;
27
28 TDesignerGuiDialogBase();
29
30 void SetDialogGeometry(double screenFactorX, double screenFactorY, const QPoint& position = QPoint());
31 void SetTitlePanel(QWidget* titlePanelPtr);
32
33protected:
34 // reimplemented (QWidget)
35 virtual void showEvent(QShowEvent* eventPtr) override;
36
37 // reimplemented (QObject)
38 virtual bool eventFilter(QObject* watched, QEvent* event) override;
39
40private:
41 void ApplyGeometry();
42
43private:
44 QWidget* m_titlePanelPtr;
45
46 double m_screenFactorX;
47 double m_screenFactorY;
48 QPoint m_screenPosition;
49
50 bool m_cursorLocked;
51 QPoint m_pos;
52};
53
54
55// public methods
56
57template<class UI>
58inline TDesignerGuiDialogBase<UI>::TDesignerGuiDialogBase()
59 :m_screenFactorX(0),
60 m_screenFactorY(0),
61 m_cursorLocked(false),
62 m_titlePanelPtr(nullptr)
63{
64 UI::setupUi(this);
65}
66
67
68template<class UI>
69void TDesignerGuiDialogBase<UI>::SetDialogGeometry(double screenFactorX, double screenFactorY, const QPoint& position)
70{
71 m_screenFactorX = screenFactorX;
72 m_screenFactorY = screenFactorY;
73 m_screenPosition = position;
74
75 ApplyGeometry();
76}
77
78
79template<class UI>
80void TDesignerGuiDialogBase<UI>::SetTitlePanel(QWidget* titlePanelPtr)
81{
82 if (m_titlePanelPtr != nullptr){
83 m_titlePanelPtr->removeEventFilter(this);
84 }
85
86 m_titlePanelPtr = titlePanelPtr;
87 if (m_titlePanelPtr != nullptr){
88 m_titlePanelPtr->installEventFilter(this);
89 }
90}
91
92
93// protected methods
94
95// reimplemented (QWidget)
96
97template<class UI>
98void TDesignerGuiDialogBase<UI>::showEvent(QShowEvent* eventPtr)
99{
100 BaseClass::showEvent(eventPtr);
101
102 if (!eventPtr->spontaneous()){
103 ApplyGeometry();
104 }
105}
106
107
108// reimplemented (QObject)
109
110template<class UI>
111bool TDesignerGuiDialogBase<UI>::eventFilter(QObject* watched, QEvent* event)
112{
113 if (watched == m_titlePanelPtr){
114 QMouseEvent* eventPtr = dynamic_cast<QMouseEvent*>(event);
115 if (eventPtr != nullptr){
116 switch (event->type()){
117 case QEvent::MouseButtonPress:
118 m_cursorLocked = true;
119 m_pos = eventPtr->globalPos();
120 break;
121 case QEvent::MouseButtonRelease:
122 m_cursorLocked = false;
123 break;
124 case QEvent::MouseMove:
125 if (m_cursorLocked){
126 move(pos() + (eventPtr->globalPos() - m_pos));
127 m_pos = eventPtr->globalPos();
128 }
129 break;
130 case QEvent::Leave:
131 m_cursorLocked = false;
132 break;
133 }
134 }
135 }
136
137 return BaseClass::eventFilter(watched, event);
138}
139
140
141// private methods
142
143template<class UI>
144void TDesignerGuiDialogBase<UI>::ApplyGeometry()
145{
146 BaseClass::adjustSize();
147
148 QRect screenRect;
149#if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)
150 screenRect = screen()->geometry();
151#else
152 const QDesktopWidget* desktopPtr = QApplication::desktop();
153 Q_ASSERT(desktopPtr != NULL);
154
155 screenRect = desktopPtr->screenGeometry();
156#endif
157
158 if (m_screenFactorX > 0 && m_screenFactorY > 0){
159 double screenFactorX = qMin(0.99, m_screenFactorX);
160 double screenFactorY = qMin(0.99, m_screenFactorY);
161
162 BaseClass::resize(int(screenRect.width() * screenFactorX), int(screenRect.height() * screenFactorY));
163 }
164 else {
165 BaseClass::resize(sizeHint());
166 }
167
168 if (m_screenPosition.isNull()){
169 QSize dialogHalfSize = size() / 2;
170
171 BaseClass::move(screenRect.center() - QPoint(dialogHalfSize.width(), dialogHalfSize.height()));
172 }
173 else {
174 BaseClass::move(m_screenPosition);
175 }
176}
177
178
179} // namespace imtgui
180
181