From 5207c06a12ad369cbc878312d3cbcc7b430c5d8c Mon Sep 17 00:00:00 2001 From: Devin Lin Date: Sun, 14 Jul 2024 20:03:34 -0400 Subject: [PATCH] startupfeedback: Fix multi-screen behaviour Fix the model screen filtering not working properly, and account for case when opened window is already active. --- .../qml/components/StartupFeedbackWindows.qml | 9 +++- .../mobileshellstate/startupfeedbackmodel.cpp | 52 +++++-------------- .../mobileshellstate/startupfeedbackmodel.h | 9 ---- 3 files changed, 20 insertions(+), 50 deletions(-) diff --git a/components/mobileshell/qml/components/StartupFeedbackWindows.qml b/components/mobileshell/qml/components/StartupFeedbackWindows.qml index c308e0e6..a7547e40 100644 --- a/components/mobileshell/qml/components/StartupFeedbackWindows.qml +++ b/components/mobileshell/qml/components/StartupFeedbackWindows.qml @@ -20,11 +20,18 @@ Item { property real leftMargin property real rightMargin + onScreenChanged: { + repeater.model.setFilterFixedString(root.screen); + } + + Component.onCompleted: { + repeater.model.setFilterFixedString(root.screen); + } + Repeater { id: repeater model: MobileShellState.StartupFeedbackFilterModel { startupFeedbackModel: MobileShellState.ShellDBusObject.startupFeedbackModel - screen: root.screen } delegate: Item { diff --git a/components/mobileshellstate/startupfeedbackmodel.cpp b/components/mobileshellstate/startupfeedbackmodel.cpp index 3c811a3f..a65762d0 100644 --- a/components/mobileshellstate/startupfeedbackmodel.cpp +++ b/components/mobileshellstate/startupfeedbackmodel.cpp @@ -178,9 +178,8 @@ void StartupFeedbackModel::onWindowOpened(KWayland::Client::PlasmaWindow *window if (m_list.size() > indexToRemove) { StartupFeedback *feedbackToRemove = m_list[indexToRemove]; - // Only delete StartupFeedback once the window becomes active - // -> There is a gap of time between when a window is created and when it is actually visible/active - connect(window, &KWayland::Client::PlasmaWindow::activeChanged, this, [this, window, feedbackToRemove]() { + // Function to remove the startup feedback from the model + auto removeFunction = [this, window, feedbackToRemove]() { if (!window->isActive()) { return; } @@ -198,7 +197,15 @@ void StartupFeedbackModel::onWindowOpened(KWayland::Client::PlasmaWindow *window } window->disconnect(this); - }); + }; + + // Only delete StartupFeedback once the window becomes active + // -> There is a potential gap of time between when a window is created and when it is actually visible/active + if (window->isActive()) { + removeFunction(); + } else { + connect(window, &KWayland::Client::PlasmaWindow::activeChanged, this, removeFunction); + } } } @@ -245,7 +252,7 @@ void StartupFeedbackModel::updateActiveWindowIsStartupFeedback() StartupFeedbackFilterModel::StartupFeedbackFilterModel(QObject *parent) : QSortFilterProxyModel(parent) { - setSortRole(StartupFeedbackModel::ScreenRole); + setFilterRole(StartupFeedbackModel::ScreenRole); } StartupFeedbackModel *StartupFeedbackFilterModel::startupFeedbackModel() const @@ -263,38 +270,3 @@ void StartupFeedbackFilterModel::setStartupFeedbackModel(StartupFeedbackModel *s setSourceModel(m_startupFeedbackModel); Q_EMIT startupFeedbackModelChanged(); } - -int StartupFeedbackFilterModel::screen() const -{ - return m_screen; -} - -void StartupFeedbackFilterModel::setScreen(int screen) -{ - if (m_screen == screen) { - return; - } - - m_screen = screen; - Q_EMIT screenChanged(); -} - -bool StartupFeedbackFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const -{ - if (!m_startupFeedbackModel) { - return false; - } - - const QModelIndex index = m_startupFeedbackModel->index(sourceRow, 0, sourceParent); - if (!index.isValid()) { - return false; - } - const QVariant data = index.data(); - if (!data.isValid()) { - // an invalid QVariant is valid data - return true; - } - - StartupFeedback *startupFeedback = qvariant_cast(data); - return startupFeedback->screen() == m_screen; -} diff --git a/components/mobileshellstate/startupfeedbackmodel.h b/components/mobileshellstate/startupfeedbackmodel.h index 4bdfd45d..89bd853d 100644 --- a/components/mobileshellstate/startupfeedbackmodel.h +++ b/components/mobileshellstate/startupfeedbackmodel.h @@ -108,7 +108,6 @@ class StartupFeedbackFilterModel : public QSortFilterProxyModel Q_OBJECT QML_ELEMENT Q_PROPERTY(StartupFeedbackModel *startupFeedbackModel READ startupFeedbackModel WRITE setStartupFeedbackModel NOTIFY startupFeedbackModelChanged) - Q_PROPERTY(int screen READ screen WRITE setScreen NOTIFY screenChanged) public: explicit StartupFeedbackFilterModel(QObject *parent = nullptr); @@ -116,17 +115,9 @@ public: StartupFeedbackModel *startupFeedbackModel() const; void setStartupFeedbackModel(StartupFeedbackModel *taskModel); - int screen() const; - void setScreen(int screen); - -protected: - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; - Q_SIGNALS: - void screenChanged(); void startupFeedbackModelChanged(); private: StartupFeedbackModel *m_startupFeedbackModel{nullptr}; - int m_screen{0}; };