PeriDyno 1.0.0
Loading...
Searching...
No Matches
QtImGui.cpp
Go to the documentation of this file.
1#include "QtImGui.h"
2
3#include <QWindow>
4#ifdef QT_WIDGETS_LIB
5#include <QWidget>
6#endif
7
8namespace QtImGui {
9
11{
12public:
17 if (r && (r != ImGuiRenderer::instance())) {
18 delete r;
19 }
20 }
21
22public:
23 void newFrame() { r->newFrame(); }
24
25 void render() { r->render(); }
26private:
28};
29
30#ifdef QT_WIDGETS_LIB
31
32namespace {
33
34class QWidgetWindowWrapper : public QWindowWrapper {
35public:
36 QWidgetWindowWrapper(QWidget *w, ImGuiRenderer* r)
37 : QWindowWrapper(r), w(w)
38 {}
39 void installEventFilter(QObject *object) override {
40 return w->installEventFilter(object);
41 }
42 QSize size() const override {
43 return w->size();
44 }
45 qreal devicePixelRatio() const override {
46 return w->devicePixelRatioF();
47 }
48 bool isActive() const override {
49 return w->isActiveWindow();
50 }
51 QPoint mapFromGlobal(const QPoint &p) const override {
52 return w->mapFromGlobal(p);
53 }
54 QObject* object() override {
55 return w;
56 }
57
58 void setCursorShape(Qt::CursorShape shape) override
59 {
60 #ifndef QT_NO_CURSOR
61 w->setCursor(shape);
62 #else
63 Q_UNUSED(shape);
64 #endif
65 }
66
67 void setCursorPos(const QPoint& local_pos) override
68 {
69 #ifndef QT_NO_CURSOR
70 // Convert position from widget-space into screen-space
71 const QPoint global_pos = w->mapToGlobal(local_pos);
72
73 QCursor cursor = w->cursor();
74 cursor.setPos(global_pos);
75 w->setCursor(cursor);
76 #else
77 Q_UNUSED(local_pos);
78 #endif
79 }
80
81private:
82 QWidget *w;
83};
84
85} // namespace
86
87RenderRef initialize(QWidget *window, bool defaultRender) {
88 if (defaultRender) {
89 auto* wrapper = new QWidgetWindowWrapper(window, ImGuiRenderer::instance());
91 return reinterpret_cast<RenderRef>(dynamic_cast<QWindowWrapper*>(wrapper));
92 } else {
93 auto* render = new ImGuiRenderer();
94 auto* wrapper = new QWidgetWindowWrapper(window, render);
95 render->initialize(wrapper);
96 return reinterpret_cast<RenderRef>(dynamic_cast<QWindowWrapper*>(wrapper));
97 }
98}
99
100#endif // QT_WIDGETS_LIB
101
102namespace {
103
104class QWindowWindowWrapper : public QWindowWrapper {
105public:
106 QWindowWindowWrapper(QWindow *w, ImGuiRenderer* r)
107 : QWindowWrapper(r), w(w)
108 {}
109 void installEventFilter(QObject *object) override {
110 return w->installEventFilter(object);
111 }
112 QSize size() const override {
113 return w->size();
114 }
115 qreal devicePixelRatio() const override {
116 return w->devicePixelRatio();
117 }
118 bool isActive() const override {
119 return w->isActive();
120 }
121 QPoint mapFromGlobal(const QPoint &p) const override {
122 return w->mapFromGlobal(p);
123 }
124 QObject* object() override {
125 return w;
126 }
127
128 void setCursorShape(Qt::CursorShape shape) override
129 {
130 #ifndef QT_NO_CURSOR
131 w->setCursor(shape);
132 #else
133 Q_UNUSED(shape);
134 #endif
135 }
136
137 void setCursorPos(const QPoint& local_pos) override
138 {
139 #ifndef QT_NO_CURSOR
140 // Convert position from window-space into screen-space
141 const QPoint global_pos = w->mapToGlobal(local_pos);
142
143 QCursor cursor = w->cursor();
144 cursor.setPos(global_pos);
145 w->setCursor(cursor);
146 #else
147 Q_UNUSED(local_pos);
148 #endif
149 }
150
151private:
152 QWindow *w;
153};
154
155} // namespace
156
157RenderRef initialize(QWindow* window, bool defaultRender) {
158 if (defaultRender) {
159 auto* wrapper = new QWindowWindowWrapper(window, ImGuiRenderer::instance());
161 return reinterpret_cast<RenderRef>(dynamic_cast<QWindowWrapper*>(wrapper));
162 }
163 else {
164 auto* render = new ImGuiRenderer();
165 auto* wrapper = new QWindowWindowWrapper(window, render);
166 render->initialize(wrapper);
167 return reinterpret_cast<RenderRef>(dynamic_cast<QWindowWrapper*>(wrapper));
168 }
169}
170
172 if (!ref) {
174 } else {
175 auto wrapper = reinterpret_cast<QWindowWrapper*>(ref);
176 wrapper->newFrame();
177 }
178}
179
181{
182 if (!ref) {
184 } else {
185 auto wrapper = reinterpret_cast<QWindowWrapper*>(ref);
186 wrapper->render();
187 }
188}
189
190} // namespace QtImGui
static ImGuiRenderer * instance()
void initialize(WindowWrapper *window)
QWindowWrapper(ImGuiRenderer *r)
Definition QtImGui.cpp:13
ImGuiRenderer * r
Definition QtImGui.cpp:27
void render(RenderRef ref)
Definition QtImGui.cpp:180
void newFrame(RenderRef ref)
Definition QtImGui.cpp:171
void * RenderRef
Definition QtImGui.h:31
RenderRef initialize(QWindow *window, bool defaultRender)
Definition QtImGui.cpp:157