24 #include "../DockRegistry_p.h"
25 #include "../Utils_p.h"
26 #include "../FloatingWindow_p.h"
28 #include <QResizeEvent>
29 #include <QMouseEvent>
30 #include <QQmlComponent>
34 #include <QScopedValueRollback>
45 class MouseEventRedirector :
public QObject
49 explicit MouseEventRedirector(
QObject *eventSource,
QObject *eventTarget)
51 , m_eventSource(eventSource)
52 , m_eventTarget(eventTarget)
57 auto oldRedirector = s_mouseEventRedirectors.take(eventSource);
60 oldRedirector->deleteLater();
63 s_mouseEventRedirectors.insert(eventSource,
this);
66 static MouseEventRedirector *redirectorForSource(
QObject *eventSource)
68 return s_mouseEventRedirectors.value(eventSource);
71 ~MouseEventRedirector()
override;
86 m_eventTarget->setProperty(
"cursorPosition", m_eventSource->property(
"cursorPosition"));
87 qApp->sendEvent(m_eventTarget, me);
100 MouseEventRedirector::~MouseEventRedirector()
102 s_mouseEventRedirectors.
remove(m_eventSource);
117 : candidateParentItem;
120 QWidgetAdapter::QWidgetAdapter(QQuickItem *parent,
Qt::WindowFlags flags)
122 , m_windowFlags(flags)
129 connect(
this, &QQuickItem::widthChanged,
this, [
this] {
134 connect(
this, &QQuickItem::heightChanged,
this, [
this] {
135 if (!m_windowIsBeingDestroyed) {
141 setSize(
QSize(800, 800));
144 QWidgetAdapter::~QWidgetAdapter()
148 void QWidgetAdapter::raiseAndActivate()
150 if (
QWindow *w = windowHandle()) {
152 w->requestActivate();
156 void QWidgetAdapter::setWindowOpacity(qreal level)
158 if (
QWindow *w = windowHandle())
159 w->setOpacity(level);
162 bool QWidgetAdapter::onResize(
QSize)
166 void QWidgetAdapter::onLayoutRequest()
169 void QWidgetAdapter::onMousePress()
172 void QWidgetAdapter::onMouseMove(
QPoint)
175 void QWidgetAdapter::onMouseRelease()
182 void QWidgetAdapter::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &data)
184 QQuickItem::itemChange(change, data);
188 case QQuickItem::ItemParentHasChanged: {
190 qApp->sendEvent(
this, &ev);
191 Q_EMIT parentChanged(
this);
194 case QQuickItem::ItemVisibleHasChanged: {
210 void QWidgetAdapter::QQUICKITEMgeometryChanged(
const QRectF &newGeometry,
const QRectF &oldGeometry)
213 QQuickItem::QQUICKITEMgeometryChanged(newGeometry, oldGeometry);
217 if (newGeometry.
size() != oldGeometry.
size()) {
219 qApp->sendEvent(
this, &ev);
224 qApp->sendEvent(
this, &ev);
227 Q_EMIT itemGeometryChanged();
230 void QWidgetAdapter::raise()
233 if (
QWindow *w = windowHandle())
235 }
else if (
auto p = QQuickItem::parentItem()) {
237 const auto siblings = p->childItems();
238 QQuickItem *last = siblings.last();
244 QSize QWidgetAdapter::minimumSize()
const
247 const auto children = childItems();
248 if (!children.isEmpty()) {
249 const QSize min = children.constFirst()->property(
"kddockwidgets_min_size").toSize();
250 return min.
expandedTo(Layouting::Item::hardcodedMinimumSize);
254 const QSize min = property(
"kddockwidgets_min_size").toSize();
255 return min.
expandedTo(Layouting::Item::hardcodedMinimumSize);
258 QSize QWidgetAdapter::maximumSize()
const
262 const auto children = childItems();
263 if (!children.isEmpty()) {
264 const QSize max = children.constFirst()->property(
"kddockwidgets_max_size").toSize();
265 return max.
isEmpty() ? Layouting::Item::hardcodedMaximumSize
266 : max.
boundedTo(Layouting::Item::hardcodedMaximumSize);
270 const QSize max = property(
"kddockwidgets_max_size").toSize();
271 return max.
isEmpty() ? Layouting::Item::hardcodedMaximumSize
272 : max.
boundedTo(Layouting::Item::hardcodedMaximumSize);
275 WId QWidgetAdapter::winId()
const
277 if (
QWindow *w = windowHandle())
283 FloatingWindow *QWidgetAdapter::floatingWindow()
const
285 if (
auto fw = qobject_cast<FloatingWindow *>(window()))
291 QRect QWidgetAdapter::geometry()
const
294 if (
QWindow *w = windowHandle()) {
295 return w->geometry();
299 return KDDockWidgets::Private::geometry(
this);
302 QRect QWidgetAdapter::rect()
const
307 QPoint QWidgetAdapter::pos()
const
309 return geometry().topLeft();
312 void QWidgetAdapter::show()
317 void QWidgetAdapter::setFixedHeight(
int height)
322 void QWidgetAdapter::setFixedWidth(
int width)
327 void QWidgetAdapter::setGeometry(
QRect rect)
329 setWidth(rect.
width());
334 QRect QWidgetAdapter::frameGeometry()
const
336 if (
QWindow *w = windowHandle())
337 return w->frameGeometry();
342 void QWidgetAdapter::grabMouse()
344 QQuickItem::grabMouse();
347 void QWidgetAdapter::releaseMouse()
349 QQuickItem::ungrabMouse();
352 void QWidgetAdapter::releaseKeyboard()
357 void QWidgetAdapter::setMinimumSize(
QSize sz)
359 if (minimumSize() != sz) {
360 setProperty(
"kddockwidgets_min_size", sz);
365 void QWidgetAdapter::setMaximumSize(
QSize sz)
367 if (maximumSize() != sz) {
368 setProperty(
"kddockwidgets_max_size", sz);
373 void QWidgetAdapter::setMaximumSize(
int w,
int h)
375 QWidgetAdapter::setMaximumSize(
QSize(w, h));
378 void QWidgetAdapter::setMinimumSize(
int w,
int h)
380 QWidgetAdapter::setMinimumSize(
QSize(w, h));
383 void QWidgetAdapter::updateGeometry()
385 Q_EMIT geometryUpdated();
388 void QWidgetAdapter::resize(
QSize sz)
390 setWidth(sz.
width());
394 void QWidgetAdapter::resize(
int w,
int h)
399 bool QWidgetAdapter::isWindow()
const
401 QQuickItem *parent = parentItem();
405 if (QQuickView *w = quickView()) {
406 if (parent == w->contentItem() || parent == w->rootObject())
413 bool QWidgetAdapter::isMaximized()
const
415 if (
QWindow *w = windowHandle())
421 bool KDDockWidgets::QWidgetAdapter::isActiveWindow()
const
423 if (
QWindow *w = windowHandle())
424 return w->isActive();
429 void QWidgetAdapter::showMaximized()
431 if (
QWindow *w = windowHandle())
435 void QWidgetAdapter::showMinimized()
437 if (
QWindow *w = windowHandle())
441 void QWidgetAdapter::showNormal()
443 if (
QWindow *w = windowHandle())
447 QQuickView *QWidgetAdapter::quickView()
const
449 return qobject_cast<QQuickView *>(QQuickItem::window());
452 QWindow *QWidgetAdapter::windowHandle()
const
454 return QQuickItem::window();
457 QWidgetAdapter *QWidgetAdapter::window()
const
461 if (QWidgetAdapter *w = parentWidget(
false))
464 return const_cast<QWidgetAdapter *
>(
this);
467 QWidgetAdapter *QWidgetAdapter::parentWidget(
bool includeTransient)
const
469 QQuickItem *p = parentItem();
471 if (
auto qa = qobject_cast<QWidgetAdapter *>(p))
477 if (includeTransient) {
478 if (QQuickView *w = quickView()) {
480 MainWindowBase *mw = DockRegistry::self()->mainWindowForHandle(w->transientParent());
492 return QQuickItem::mapToGlobal(pt).toPoint();
497 return QQuickItem::mapFromGlobal(pt).toPoint();
500 QPoint QWidgetAdapter::mapTo(
const QQuickItem *parent,
QPoint pos)
const
505 return parent->mapFromGlobal(QQuickItem::mapToGlobal(pos)).toPoint();
510 return m_widgetAttributes & attr;
516 m_widgetAttributes |= attr;
518 m_widgetAttributes &= ~attr;
521 void QWidgetAdapter::setWindowTitle(
const QString &title)
523 if (
QWindow *window = windowHandle())
524 window->setTitle(title);
527 void QWidgetAdapter::setWindowIcon(
const QIcon &icon)
529 if (
QWindow *window = windowHandle())
530 window->setIcon(icon);
533 bool QWidgetAdapter::close()
546 QQuickItem *QWidgetAdapter::childAt(
QPoint p)
const
548 return QQuickItem::childAt(p.
x(), p.
y());
551 void QWidgetAdapter::move(
QPoint pt)
553 move(pt.
x(), pt.
y());
556 void QWidgetAdapter::move(
int x,
int y)
559 if (
QWindow *w = windowHandle()) {
560 w->setPosition(x, y);
570 void QWidgetAdapter::setSize(
QSize size)
572 QQuickItem::setSize(
QSizeF(size));
575 void QWidgetAdapter::setParent(QQuickItem *p)
580 QQuickItem::setParent(p);
581 QQuickItem::setParentItem(p);
589 void QWidgetAdapter::activateWindow()
591 if (
QWindow *w = windowHandle())
592 w->requestActivate();
605 QSize QWidgetAdapter::sizeHint()
const
610 bool QWidgetAdapter::hasFocus()
const
612 return hasActiveFocus();
615 void QWidgetAdapter::setWindowFlag(
int flag,
bool enable)
623 return m_windowFlags;
627 QQuickItem *QWidgetAdapter::createItem(QQmlEngine *engine,
const QString &filename)
629 QQmlComponent component(engine, filename);
630 QObject *obj = component.create();
632 qWarning() << Q_FUNC_INFO << component.errorString();
636 return qobject_cast<QQuickItem *>(obj);
639 void QWidgetAdapter::makeItemFillParent(QQuickItem *item)
644 qWarning() << Q_FUNC_INFO <<
"Invalid item";
648 QQuickItem *parentItem = item->parentItem();
650 qWarning() << Q_FUNC_INFO <<
"Invalid parentItem for" << item;
656 qWarning() << Q_FUNC_INFO <<
"Invalid anchors for" << item;
674 return m_focusPolicy;
679 m_focusPolicy = policy;
684 QQuickItem::setFocus(
true, reason);
685 forceActiveFocus(reason);
688 void QWidgetAdapter::render(
QPainter *)
690 qWarning() << Q_FUNC_INFO <<
"Implement me";
693 void QWidgetAdapter::setMouseTracking(
bool enabled)
695 m_mouseTrackingEnabled = enabled;
698 bool QWidgetAdapter::event(
QEvent *ev)
703 return QQuickItem::event(ev);
706 bool QWidgetAdapter::eventFilter(
QObject *watched,
QEvent *ev)
708 if (qobject_cast<QWindow *>(watched)) {
709 if (m_mouseTrackingEnabled) {
710 switch (ev->
type()) {
715 qApp->sendEvent(
this, ev);
726 return QQuickItem::eventFilter(watched, ev);
729 void QWidgetAdapter::setWindowIsBeingDestroyed(
bool is)
731 m_windowIsBeingDestroyed = is;
734 void QWidgetAdapter::create()
739 QQuickItem *KDDockWidgets::Private::widgetForWindow(
QWindow *window)
744 return window->
property(
"kddockwidgets_qwidget").
value<QQuickItem *>();
747 void QWidgetAdapter::redirectMouseEvents(
QObject *source)
749 if (
auto existingRedirector = MouseEventRedirector::redirectorForSource(source)) {
750 if (existingRedirector->m_eventTarget ==
this) {
756 new MouseEventRedirector(source,
this);
759 void QWidgetAdapter::setIsWrapper()
764 bool QWidgetAdapter::isWrapper()
const
769 LayoutGuestWidget::~LayoutGuestWidget() =
default;
771 #include "QWidgetAdapter_quick.moc"