diff --git a/autotests/client/test_plasma_window_model.cpp b/autotests/client/test_plasma_window_model.cpp --- a/autotests/client/test_plasma_window_model.cpp +++ b/autotests/client/test_plasma_window_model.cpp @@ -76,6 +76,7 @@ void testIsResizable(); void testIsVirtualDesktopChangeable(); void testIsCloseable(); + void testGeometry(); void testTitle(); void testAppId(); void testVirtualDesktop(); @@ -238,6 +239,7 @@ QTest::newRow("IsResizable") << int(PlasmaWindowModel::IsResizable) << QByteArrayLiteral("IsResizable"); QTest::newRow("IsVirtualDesktopChangeable") << int(PlasmaWindowModel::IsVirtualDesktopChangeable) << QByteArrayLiteral("IsVirtualDesktopChangeable"); QTest::newRow("IsCloseable") << int(PlasmaWindowModel::IsCloseable) << QByteArrayLiteral("IsCloseable"); + QTest::newRow("Geometry") << int(PlasmaWindowModel::Geometry) << QByteArrayLiteral("Geometry"); } void PlasmaWindowModelTest::testRoleNames() @@ -328,7 +330,8 @@ QTest::newRow("IsMovable") << int(PlasmaWindowModel::IsMovable) << QVariant(false); QTest::newRow("IsResizable") << int(PlasmaWindowModel::IsResizable) << QVariant(false); QTest::newRow("IsVirtualDesktopChangeable") << int(PlasmaWindowModel::IsVirtualDesktopChangeable) << QVariant(false); - QTest::newRow("IsCloseable") << int(PlasmaWindowModel::IsCloseable) << QVariant(false); + QTest::newRow("IsCloseable") << int(PlasmaWindowModel::IsCloseable) << QVariant(false); + QTest::newRow("Geometry") << int(PlasmaWindowModel::Geometry) << QVariant(QRect()); } void PlasmaWindowModelTest::testDefaultData() @@ -438,6 +441,36 @@ QVERIFY(testBooleanData(PlasmaWindowModel::IsCloseable, &PlasmaWindowInterface::setCloseable)); } +void PlasmaWindowModelTest::testGeometry() +{ + auto model = m_pw->createWindowModel(); + QVERIFY(model); + + QSignalSpy rowInsertedSpy(model, &PlasmaWindowModel::rowsInserted); + QVERIFY(rowInsertedSpy.isValid()); + + auto w = m_pwInterface->createWindow(m_pwInterface); + QVERIFY(w); + QVERIFY(rowInsertedSpy.wait()); + + const QModelIndex index = model->index(0); + + QCOMPARE(model->data(index, PlasmaWindowModel::Geometry).toRect(), QRect()); + + QSignalSpy dataChangedSpy(model, &PlasmaWindowModel::dataChanged); + QVERIFY(dataChangedSpy.isValid()); + + const QRect geom(0, 15, 50, 75); + w->setGeometry(geom); + + QVERIFY(dataChangedSpy.wait()); + QCOMPARE(dataChangedSpy.count(), 1); + QCOMPARE(dataChangedSpy.last().first().toModelIndex(), index); + QCOMPARE(dataChangedSpy.last().last().value>(), QVector{int(PlasmaWindowModel::Geometry)}); + + QCOMPARE(model->data(index, PlasmaWindowModel::Geometry).toRect(), geom); +} + void PlasmaWindowModelTest::testTitle() { auto model = m_pw->createWindowModel(); diff --git a/src/client/plasmawindowmodel.h b/src/client/plasmawindowmodel.h --- a/src/client/plasmawindowmodel.h +++ b/src/client/plasmawindowmodel.h @@ -98,7 +98,11 @@ /** * @since 5.22 */ - IsCloseable + IsCloseable, + /** + * @since 5.25 + */ + Geometry }; explicit PlasmaWindowModel(PlasmaWindowManagement *parent); diff --git a/src/client/plasmawindowmodel.cpp b/src/client/plasmawindowmodel.cpp --- a/src/client/plasmawindowmodel.cpp +++ b/src/client/plasmawindowmodel.cpp @@ -156,6 +156,10 @@ QObject::connect(window, &PlasmaWindow::closeableChanged, q, [window, this] { this->dataChanged(window, IsCloseable); } ); + + QObject::connect(window, &PlasmaWindow::geometryChanged, q, + [window, this] { this->dataChanged(window, Geometry); } + ); } void PlasmaWindowModel::Private::dataChanged(PlasmaWindow *window, int role) @@ -259,6 +263,8 @@ return window->isVirtualDesktopChangeable(); } else if (role == IsCloseable) { return window->isCloseable(); + } else if (role == Geometry) { + return window->geometry(); } return QVariant();