diff --git a/src/private/quick/FloatingWindowQuick.cpp b/src/private/quick/FloatingWindowQuick.cpp index 452c55d8..31682b77 100644 --- a/src/private/quick/FloatingWindowQuick.cpp +++ b/src/private/quick/FloatingWindowQuick.cpp @@ -26,17 +26,53 @@ namespace KDDockWidgets { class QuickView : public QQuickView { - using QQuickView::QQuickView; +public: + explicit QuickView(QQuickItem *floatingWindow) + : QQuickView(Config::self().qmlEngine(), nullptr) + , m_floatingWindow(floatingWindow) + { + + updateSize(); + + connect(m_floatingWindow, &QQuickItem::widthChanged, this, &QuickView::onRootItemWidthChanged); + connect(m_floatingWindow, &QQuickItem::heightChanged, this, &QuickView::onRootItemHeightChanged); + } bool event(QEvent *ev) override { if (ev->type() == QEvent::FocusAboutToChange) { // qquickwindow.cpp::event(FocusAboutToChange) removes the item grabber. Inibit that return true; + } else if (ev->type() == QEvent::Resize) { + updateRootItemSize(); } return QQuickView::event(ev); } + + + void onRootItemWidthChanged() + { + setWidth(int(m_floatingWindow->width())); + } + + void onRootItemHeightChanged() + { + setHeight(int(m_floatingWindow->height())); + } + + void updateSize() + { + resize(m_floatingWindow->size().toSize()); + // contentItem()->setSize(size()); // TODO: Needed ? + } + + void updateRootItemSize() + { + m_floatingWindow->setSize(size()); + } + + QQuickItem *const m_floatingWindow; }; } @@ -44,14 +80,14 @@ class QuickView : public QQuickView FloatingWindowQuick::FloatingWindowQuick(MainWindowBase *parent) : FloatingWindow(parent) - , m_quickWindow(new QuickView(Config::self().qmlEngine(), nullptr)) + , m_quickWindow(new QuickView(this)) { init(); } FloatingWindowQuick::FloatingWindowQuick(Frame *frame, MainWindowBase *parent) : FloatingWindow(frame, parent) - , m_quickWindow(new QuickView(Config::self().qmlEngine(), nullptr)) + , m_quickWindow(new QuickView(this)) { init(); } @@ -106,9 +142,6 @@ void FloatingWindowQuick::init() qDebug() << "Focus object changed to " << object << this << m_quickWindow; });*/ - const QSize minSize = minimumSize(); - m_quickWindow->resize(minSize); - m_quickWindow->contentItem()->setSize(minSize); if (QWindow *transientParent = candidateParentWindow()) { m_quickWindow->setTransientParent(candidateParentWindow()); @@ -121,9 +154,6 @@ void FloatingWindowQuick::init() } QWidgetAdapter::setParent(m_quickWindow->contentItem()); - QWidgetAdapter::makeItemFillParent(this); - - m_quickWindow->setResizeMode(QQuickView::SizeViewToRootObject); QQuickItem *visualItem = createItem(Config::self().qmlEngine(), QStringLiteral("qrc:/kddockwidgets/private/quick/qml/FloatingWindow.qml")); Q_ASSERT(visualItem); @@ -131,5 +161,6 @@ void FloatingWindowQuick::init() visualItem->setParentItem(this); m_quickWindow->setFlags(windowFlags()); + m_quickWindow->show(); } diff --git a/src/private/quick/FloatingWindowQuick_p.h b/src/private/quick/FloatingWindowQuick_p.h index c4314ff4..d972311b 100644 --- a/src/private/quick/FloatingWindowQuick_p.h +++ b/src/private/quick/FloatingWindowQuick_p.h @@ -14,7 +14,7 @@ #include "FloatingWindow_p.h" -#include +class QQuickView; namespace KDDockWidgets { diff --git a/src/private/quick/qml/FloatingWindow.qml b/src/private/quick/qml/FloatingWindow.qml index 4d2f249f..89a722d0 100644 --- a/src/private/quick/qml/FloatingWindow.qml +++ b/src/private/quick/qml/FloatingWindow.qml @@ -61,6 +61,10 @@ Rectangle { } onHeightChanged: { - //console.log("FloatingWindow.qml.root height changed to " + height) + // console.log("FloatingWindow.qml.root height changed to " + height) + } + + onWidthChanged: { + // console.log("FloatingWindow.qml.root width changed to " + width) } } diff --git a/tests/tst_docks.cpp b/tests/tst_docks.cpp index e4e84453..39b5ff8f 100644 --- a/tests/tst_docks.cpp +++ b/tests/tst_docks.cpp @@ -329,6 +329,7 @@ void TestDocks::tst_restoreSimple() auto dock1 = createDockWidget("one", new QTextEdit()); auto dock2 = createDockWidget("two", new QTextEdit()); auto dock3 = createDockWidget("three", new QTextEdit()); + m->addDockWidget(dock1, Location_OnTop); // Dock2 floats at 150,150 @@ -551,8 +552,7 @@ void TestDocks::tst_floatingWindowSize() auto dock1 = createDockWidget("1"); auto fw1 = dock1->window(); - - QTest::qWait(2000); + QTest::qWait(100); QVERIFY(!fw1->geometry().isNull()); QCOMPARE(fw1->size(), fw1->windowHandle()->size()); @@ -611,6 +611,8 @@ void TestDocks::tst_sizeAfterRedock() const int height2 = dw2->frame()->height(); dw2->setFloating(true); + QTest::qWait(100); + QCOMPARE(height2, dw2->window()->height()); auto oldFw2 = dw2->floatingWindow();