KDDockWidgets API Documentation 2.0
Loading...
Searching...
No Matches
qtquick/views/ViewWrapper.cpp
Go to the documentation of this file.
1/*
2 This file is part of KDDockWidgets.
3
4 SPDX-FileCopyrightText: 2020 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
5 Author: SĂ©rgio Martins <sergio.martins@kdab.com>
6
7 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only
8
9 Contact KDAB at <info@kdab.com> for commercial licensing options.
10*/
11
12#include "ViewWrapper_p.h"
14#include "qtquick/views/View.h"
15#include "core/View_p.h"
16
19#include "qtquick/views/Group.h"
22#include "core/layouting/Item_p.h"
23// #include "qtquick/views/SideBar.h"
24#include "qtquick/views/Stack.h"
29
30#include "../Window_p.h"
31
32#include "kddockwidgets/core/DropArea.h"
33#include "kddockwidgets/core/MDILayout.h"
34// #include "views/MDIArea.h"
35
36#include <QtQuick/private/qquickitem_p.h>
37#include <QDebug>
38
39using namespace KDDockWidgets;
40using namespace KDDockWidgets::QtQuick;
41
42namespace KDDockWidgets {
43static Core::Controller *controllerForItem(QQuickItem *item)
44{
45 // KDDW deals in views, but sometimes we might get a native type like QWidget, for example if
46 // you call someview->window(). This function let's us retrieve the actual controller of the
47 // stray QWidget.
48
49 for (int i = int(Core::ViewType::FIRST); i <= int(::Core::ViewType::LAST); i *= 2) {
50 // Using a for+switch pattern so that compiler reminds us if new enumerators are added to
51 // enum
52 switch (Core::ViewType(i)) {
54 if (auto view = qobject_cast<Group *>(item))
55 return view->controller();
56 break;
58 if (auto view = qobject_cast<TitleBar *>(item))
59 return view->controller();
60 break;
62 if (auto view = qobject_cast<TabBar *>(item))
63 return view->controller();
64 break;
66 if (auto view = qobject_cast<Stack *>(item))
67 return view->controller();
68 break;
70 if (auto view = qobject_cast<FloatingWindow *>(item))
71 return view->controller();
72 break;
74 if (auto view = qobject_cast<Separator *>(item))
75 return view->controller();
76 break;
78 if (auto view = qobject_cast<QtQuick::DockWidget *>(item))
79 return view->controller();
80 break;
82 if (auto view = qobject_cast<DropArea *>(item))
83 return view->controller();
84 break;
86 if (auto view = qobject_cast<MDILayout *>(item))
87 return view->controller();
88 break;
90 // Not implemented for QtQuick yet
91 break;
93 if (auto view = qobject_cast<MainWindow *>(item))
94 return view->controller();
95 break;
101 // skip internal types
102 continue;
103 }
104 }
105
106 return nullptr;
107}
108}
109
110ViewWrapper::ViewWrapper(QObject *item)
111 : ViewWrapper(qobject_cast<QQuickItem *>(item))
112{
113}
114
115ViewWrapper::ViewWrapper(QQuickItem *item)
116 : QtCommon::ViewWrapper(controllerForItem(item), item)
117 , m_item(item)
118{
119}
120
121QRect ViewWrapper::geometry() const
122{
123 if (isRootView()) {
124 if (QWindow *w = m_item->window()) {
125 return w->geometry();
126 }
127 }
128
129 return QRect(QPointF(m_item->x(), m_item->y()).toPoint(), m_item->size().toSize());
130}
131
132QPoint ViewWrapper::mapToGlobal(QPoint localPt) const
133{
134 return m_item->mapToGlobal(localPt).toPoint();
135}
136
137QPoint ViewWrapper::mapFromGlobal(QPoint globalPt) const
138{
139 return m_item->mapFromGlobal(globalPt).toPoint();
140}
141
142void ViewWrapper::setGeometry(QRect rect)
143{
144 setSize(rect.width(), rect.height());
145 ViewWrapper::move(rect.topLeft().x(), rect.topLeft().y());
146}
147
148std::shared_ptr<Core::View> ViewWrapper::childViewAt(QPoint p) const
149{
150 auto child = m_item->childAt(p.x(), p.y());
151 return child ? QtQuick::View::asQQuickWrapper(child) : nullptr;
152}
153
154std::shared_ptr<Core::Window> ViewWrapper::window() const
155{
156 if (QWindow *w = m_item->window()) {
157 auto windowqtquick = new Window(w);
158 return std::shared_ptr<Core::Window>(windowqtquick);
159 }
160
161 return {};
162}
163
164bool ViewWrapper::isRootView() const
165{
166 return QtQuick::View::isRootView(m_item);
167}
168
169void ViewWrapper::setVisible(bool is)
170{
171 if (isRootView()) {
172 if (QWindow *w = m_item->window()) {
173 if (is && !w->isVisible()) {
174 w->show();
175 } else if (!is && w->isVisible()) {
176 w->hide();
177 }
178 }
179 }
180
181 m_item->setVisible(is);
182}
183
184bool ViewWrapper::isVisible() const
185{
186 if (QWindow *w = m_item->window()) {
187 if (!w->isVisible())
188 return false;
189 }
190
191 return m_item->isVisible();
192}
193
194bool ViewWrapper::isExplicitlyHidden() const
195{
196 auto priv = QQuickItemPrivate::get(m_item);
197 return !priv->explicitVisible;
198}
199
200void ViewWrapper::move(int x, int y)
201{
202 if (isRootView()) {
203 if (QWindow *w = m_item->window()) {
204 w->setPosition(x, y);
205 return;
206 }
207 }
208
209 m_item->setX(x);
210 m_item->setY(y);
211 enableAttribute(Qt::WA_Moved);
212}
213
214void ViewWrapper::activateWindow()
215{
216 if (QWindow *w = m_item->window())
217 w->requestActivate();
218}
219
220bool ViewWrapper::isMaximized() const
221{
222 if (QWindow *w = m_item->window())
223 return w->windowStates() & Qt::WindowMaximized;
224
225 return false;
226}
227
228bool ViewWrapper::isMinimized() const
229{
230 if (QWindow *w = m_item->window())
231 return w->windowStates() & Qt::WindowMinimized;
232
233 return false;
234}
235
236QSize ViewWrapper::maxSizeHint() const
237{
238 if (auto view = unwrap()) {
239 return view->maxSizeHint();
240 } else {
241 const QSize max = m_item->property("kddockwidgets_max_size").toSize();
242 return max.isEmpty() ? Core::Item::hardcodedMaximumSize
243 : max.boundedTo(Core::Item::hardcodedMaximumSize);
244 }
245}
246
247void ViewWrapper::setSize(int w, int h)
248{
249 if (isRootView()) {
250 if (QWindow *window = m_item->window()) {
251 QRect windowGeo = window->geometry();
252 windowGeo.setSize(QSize(w, h));
253 window->setGeometry(windowGeo);
254 }
255 }
256
257 m_item->setSize(QSizeF(w, h));
258}
259
260bool ViewWrapper::is(Core::ViewType t) const
261{
262 switch (t) {
263 case Core::ViewType::Group:
264 return qobject_cast<Group *>(m_item);
265 case Core::ViewType::TitleBar:
266 return qobject_cast<TitleBar *>(m_item);
267 case Core::ViewType::TabBar:
268 return qobject_cast<TabBar *>(m_item);
269 case Core::ViewType::Stack:
270 return qobject_cast<Stack *>(m_item);
271 case Core::ViewType::FloatingWindow:
272 return qobject_cast<FloatingWindow *>(m_item);
273 case Core::ViewType::Separator:
274 return qobject_cast<Separator *>(m_item);
275 case Core::ViewType::DockWidget:
276 return qobject_cast<QtQuick::DockWidget *>(m_item);
277 case Core::ViewType::SideBar:
278 return false; // QtQuick doesn't support sidebar yet
279 // return qobject_cast<SideBar *>(m_item);
280 case Core::ViewType::MainWindow:
281 return qobject_cast<QtQuick::MainWindow *>(m_item);
282 case Core::ViewType::DropArea:
283 return qobject_cast<DropArea *>(m_item);
284 case Core::ViewType::MDILayout:
285 return qobject_cast<MDILayout *>(m_item);
286 case Core::ViewType::RubberBand:
287 return qobject_cast<RubberBand *>(m_item);
288 case Core::ViewType::LayoutItem:
289 case Core::ViewType::None:
290 case Core::ViewType::DropAreaIndicatorOverlay:
291 qWarning() << Q_FUNC_INFO << "These are framework internals that are not wrapped";
292 return false;
293 case Core::ViewType::ViewWrapper:
294 return true;
295 }
296
297 qWarning() << Q_FUNC_INFO << "Unknown type" << static_cast<int>(t);
298 return false;
299}
300
301std::shared_ptr<Core::View> ViewWrapper::rootView() const
302{
303 if (Core::Window::Ptr window = this->window())
304 return window->rootView();
305
306 qWarning() << Q_FUNC_INFO << "No window present";
307 return {};
308}
309
310std::shared_ptr<Core::View> ViewWrapper::parentView() const
311{
312 return QtQuick::View::parentViewFor(m_item);
313}
314
315void ViewWrapper::grabMouse()
316{
317 m_item->grabMouse();
318}
319
320void ViewWrapper::releaseMouse()
321{
322 m_item->ungrabMouse();
323}
324
325Qt::FocusPolicy ViewWrapper::focusPolicy() const
326{
327 if (auto view = unwrap()) {
328 return view->focusPolicy();
329 } else {
330 // The DockWidget's user guest widget is not a View, it's a QQuickItem
331 // QQuickItem don't have focus policy and are focusable
332 return Qt::StrongFocus;
333 }
334}
335
336void ViewWrapper::setFocus(Qt::FocusReason reason)
337{
338 m_item->QQuickItem::setFocus(true, reason);
339 m_item->forceActiveFocus(reason);
340}
341
342void ViewWrapper::setFocusPolicy(Qt::FocusPolicy policy)
343{
344 if (auto view = unwrap()) {
345 view->setFocusPolicy(policy);
346 } else {
347 qWarning() << Q_FUNC_INFO << "Not implemented for QtQuick";
348 }
349}
350
351bool ViewWrapper::hasFocus() const
352{
353 return m_item->hasActiveFocus();
354}
355
356QString ViewWrapper::viewName() const
357{
358 return m_item->objectName();
359}
360
361bool ViewWrapper::isNull() const
362{
363 return m_item.data() == nullptr;
364}
365
366void ViewWrapper::setWindowTitle(const QString &title)
367{
368 if (QWindow *w = m_item->window())
369 w->setTitle(title);
370}
371
372QPoint ViewWrapper::mapTo(View *parent, QPoint pos) const
373{
374 if (!parent)
375 return {};
376
377 auto parentItem = asQQuickItem(parent);
378 return parentItem->mapFromGlobal(m_item->mapToGlobal(pos)).toPoint();
379}
380
381bool ViewWrapper::hasAttribute(Qt::WidgetAttribute attr) const
382{
383 if (auto view = unwrap()) {
384 // Only real views have min size
385 return view->hasAttribute(attr);
386 } else {
387 qFatal("not implemented");
388 return false;
389 }
390}
391
392void ViewWrapper::setCursor(Qt::CursorShape shape)
393{
394 m_item->QQuickItem::setCursor(shape);
395}
396
397QSize ViewWrapper::minSize() const
398{
399 if (auto view = unwrap()) {
400 // Only real views have min size
401 return view->minSize();
402 } else {
403 const QSize min = m_item->property("kddockwidgets_min_size").toSize();
404 return min.expandedTo(Core::Item::hardcodedMinimumSize);
405 }
406}
407
408QVector<std::shared_ptr<Core::View>> ViewWrapper::childViews() const
409{
411 const auto childItems = m_item->childItems();
412 result.reserve(childItems.size());
413 for (QQuickItem *child : childItems) {
414 result << QtQuick::View::asQQuickWrapper(child);
415 }
416
417 return result;
418}
419
420void ViewWrapper::setParent(View *parent)
421{
422 if (auto view = unwrap()) {
423 view->setParent(parent);
424 } else {
425 auto parentItem = QtQuick::asQQuickItem(parent);
426 m_item->QQuickItem::setParent(parentItem);
427 m_item->QQuickItem::setParentItem(parentItem);
428 }
429
430 m_item->setVisible(false);
431}
432
433bool ViewWrapper::close()
434{
435 return QtQuick::View::close(m_item);
436}
437
438Core::View *ViewWrapper::unwrap()
439{
440 return qobject_cast<QtQuick::View *>(m_item);
441}
442
443const Core::View *ViewWrapper::unwrap() const
444{
445 return qobject_cast<const QtQuick::View *>(m_item);
446}
447
448void ViewWrapper::raiseAndActivate()
449{
451}
452
453/*static*/
454std::shared_ptr<Core::View> ViewWrapper::create(QObject *item)
455{
456 return create(qobject_cast<QQuickItem *>(item));
457}
458
459/*static*/
460std::shared_ptr<Core::View> ViewWrapper::create(QQuickItem *item)
461{
462 if (!item)
463 return {};
464
465 auto wrapper = new ViewWrapper(item);
466 auto sharedptr = std::shared_ptr<View>(wrapper);
467 wrapper->d->m_thisWeakPtr = sharedptr;
468
469 return sharedptr;
470}
bool isRootView() const override final
static std::shared_ptr< Core::View > asQQuickWrapper(QQuickItem *item)
static std::shared_ptr< Core::View > parentViewFor(const QQuickItem *)
ViewType
Each View type also has a specific Controller associated with, except for ViewType::None.
Definition Controller.h:26
QQuickItem * asQQuickItem(Core::View *view)
Class to abstract QAction, so code still works with QtQuick and Flutter.
static Core::Controller * controllerForItem(QQuickItem *item)
int x() const const
int y() const const
QPoint toPoint() const const
int height() const const
void setSize(const QSize &size)
QPoint topLeft() const const
int width() const const
QSize boundedTo(const QSize &otherSize) const const
QSize expandedTo(const QSize &otherSize) const const
bool isEmpty() const const
QChar * data()
CursorShape
FocusPolicy
FocusReason
WA_Moved
WindowMaximized
Represents a dock widget.
The QQuickItem counter part of TabWidgetQuick. Handles GUI while TabWidget handles state.
Implements a QTabWidget derived class with support for docking and undocking KDockWidget::DockWidget ...
void reserve(int size)

© Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
KDDockWidgets
Advanced Dock Widget Framework for Qt
https://www.kdab.com/development-resources/qt-tools/kddockwidgets/
Generated by doxygen 1.9.8