startupfeedback: Fix multi-screen behaviour

Fix the model screen filtering not working properly, and account for case when opened window is already active.
This commit is contained in:
Devin Lin 2024-07-14 20:03:34 -04:00
parent 3ca8e47b29
commit 5207c06a12
3 changed files with 20 additions and 50 deletions

View file

@ -20,11 +20,18 @@ Item {
property real leftMargin property real leftMargin
property real rightMargin property real rightMargin
onScreenChanged: {
repeater.model.setFilterFixedString(root.screen);
}
Component.onCompleted: {
repeater.model.setFilterFixedString(root.screen);
}
Repeater { Repeater {
id: repeater id: repeater
model: MobileShellState.StartupFeedbackFilterModel { model: MobileShellState.StartupFeedbackFilterModel {
startupFeedbackModel: MobileShellState.ShellDBusObject.startupFeedbackModel startupFeedbackModel: MobileShellState.ShellDBusObject.startupFeedbackModel
screen: root.screen
} }
delegate: Item { delegate: Item {

View file

@ -178,9 +178,8 @@ void StartupFeedbackModel::onWindowOpened(KWayland::Client::PlasmaWindow *window
if (m_list.size() > indexToRemove) { if (m_list.size() > indexToRemove) {
StartupFeedback *feedbackToRemove = m_list[indexToRemove]; StartupFeedback *feedbackToRemove = m_list[indexToRemove];
// Only delete StartupFeedback once the window becomes active // Function to remove the startup feedback from the model
// -> There is a gap of time between when a window is created and when it is actually visible/active auto removeFunction = [this, window, feedbackToRemove]() {
connect(window, &KWayland::Client::PlasmaWindow::activeChanged, this, [this, window, feedbackToRemove]() {
if (!window->isActive()) { if (!window->isActive()) {
return; return;
} }
@ -198,7 +197,15 @@ void StartupFeedbackModel::onWindowOpened(KWayland::Client::PlasmaWindow *window
} }
window->disconnect(this); 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) StartupFeedbackFilterModel::StartupFeedbackFilterModel(QObject *parent)
: QSortFilterProxyModel(parent) : QSortFilterProxyModel(parent)
{ {
setSortRole(StartupFeedbackModel::ScreenRole); setFilterRole(StartupFeedbackModel::ScreenRole);
} }
StartupFeedbackModel *StartupFeedbackFilterModel::startupFeedbackModel() const StartupFeedbackModel *StartupFeedbackFilterModel::startupFeedbackModel() const
@ -263,38 +270,3 @@ void StartupFeedbackFilterModel::setStartupFeedbackModel(StartupFeedbackModel *s
setSourceModel(m_startupFeedbackModel); setSourceModel(m_startupFeedbackModel);
Q_EMIT startupFeedbackModelChanged(); 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<StartupFeedback *>(data);
return startupFeedback->screen() == m_screen;
}

View file

@ -108,7 +108,6 @@ class StartupFeedbackFilterModel : public QSortFilterProxyModel
Q_OBJECT Q_OBJECT
QML_ELEMENT QML_ELEMENT
Q_PROPERTY(StartupFeedbackModel *startupFeedbackModel READ startupFeedbackModel WRITE setStartupFeedbackModel NOTIFY startupFeedbackModelChanged) Q_PROPERTY(StartupFeedbackModel *startupFeedbackModel READ startupFeedbackModel WRITE setStartupFeedbackModel NOTIFY startupFeedbackModelChanged)
Q_PROPERTY(int screen READ screen WRITE setScreen NOTIFY screenChanged)
public: public:
explicit StartupFeedbackFilterModel(QObject *parent = nullptr); explicit StartupFeedbackFilterModel(QObject *parent = nullptr);
@ -116,17 +115,9 @@ public:
StartupFeedbackModel *startupFeedbackModel() const; StartupFeedbackModel *startupFeedbackModel() const;
void setStartupFeedbackModel(StartupFeedbackModel *taskModel); void setStartupFeedbackModel(StartupFeedbackModel *taskModel);
int screen() const;
void setScreen(int screen);
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
Q_SIGNALS: Q_SIGNALS:
void screenChanged();
void startupFeedbackModelChanged(); void startupFeedbackModelChanged();
private: private:
StartupFeedbackModel *m_startupFeedbackModel{nullptr}; StartupFeedbackModel *m_startupFeedbackModel{nullptr};
int m_screen{0};
}; };