applicationlistmodel: Space out application list refreshes

Use the same behavior as kickoff on desktop, to limit application list
refreshes to once every 100ms.

https://invent.kde.org/plasma/plasma-mobile/-/issues/440
This commit is contained in:
Devin Lin 2025-02-13 11:39:28 -05:00
parent bbfb367f23
commit 7d9054f74e
4 changed files with 36 additions and 14 deletions

View file

@ -18,10 +18,19 @@
#include <KSharedConfig> #include <KSharedConfig>
#include <KSycoca> #include <KSycoca>
#include <chrono>
using namespace std::chrono_literals;
ApplicationListModel::ApplicationListModel(HomeScreen *parent) ApplicationListModel::ApplicationListModel(HomeScreen *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, m_reloadAppsTimer{new QTimer{this}}
{ {
connect(KSycoca::self(), &KSycoca::databaseChanged, this, &ApplicationListModel::sycocaDbChanged); m_reloadAppsTimer->setSingleShot(true);
m_reloadAppsTimer->setInterval(100ms);
connect(m_reloadAppsTimer, &QTimer::timeout, this, &ApplicationListModel::sycocaDbChanged);
connect(KSycoca::self(), &KSycoca::databaseChanged, m_reloadAppsTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
// initialize wayland window checking // initialize wayland window checking
KWayland::Client::ConnectionThread *connection = KWayland::Client::ConnectionThread::fromApplication(this); KWayland::Client::ConnectionThread *connection = KWayland::Client::ConnectionThread::fromApplication(this);
@ -51,12 +60,6 @@ void ApplicationListModel::load()
const QStringList blacklist = blgroup.readEntry("blacklist", QStringList()); const QStringList blacklist = blgroup.readEntry("blacklist", QStringList());
beginResetModel();
m_delegates.clear();
QList<FolioDelegate *> unorderedList;
auto filter = [blacklist](const KService::Ptr &service) -> bool { auto filter = [blacklist](const KService::Ptr &service) -> bool {
if (service->noDisplay()) { if (service->noDisplay()) {
return false; return false;
@ -73,6 +76,12 @@ void ApplicationListModel::load()
return true; return true;
}; };
beginResetModel();
m_delegates.clear();
QList<FolioDelegate *> unorderedList;
const KService::List apps = KApplicationTrader::query(filter); const KService::List apps = KApplicationTrader::query(filter);
for (const KService::Ptr &service : apps) { for (const KService::Ptr &service : apps) {

View file

@ -44,6 +44,8 @@ public Q_SLOTS:
protected: protected:
HomeScreen *m_homeScreen{nullptr}; HomeScreen *m_homeScreen{nullptr};
QList<FolioDelegate *> m_delegates; QList<FolioDelegate *> m_delegates;
QTimer *m_reloadAppsTimer{nullptr};
}; };
class ApplicationListSearchModel : public QSortFilterProxyModel class ApplicationListSearchModel : public QSortFilterProxyModel

View file

@ -18,10 +18,19 @@
#include <KSharedConfig> #include <KSharedConfig>
#include <KSycoca> #include <KSycoca>
#include <chrono>
using namespace std::chrono_literals;
ApplicationListModel::ApplicationListModel(QObject *parent) ApplicationListModel::ApplicationListModel(QObject *parent)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, m_reloadAppsTimer{new QTimer{this}}
{ {
connect(KSycoca::self(), &KSycoca::databaseChanged, this, &ApplicationListModel::sycocaDbChanged); m_reloadAppsTimer->setSingleShot(true);
m_reloadAppsTimer->setInterval(100ms);
connect(m_reloadAppsTimer, &QTimer::timeout, this, &ApplicationListModel::sycocaDbChanged);
connect(KSycoca::self(), &KSycoca::databaseChanged, m_reloadAppsTimer, static_cast<void (QTimer::*)()>(&QTimer::start));
} }
ApplicationListModel::~ApplicationListModel() = default; ApplicationListModel::~ApplicationListModel() = default;
@ -49,12 +58,6 @@ void ApplicationListModel::loadApplications()
const QStringList blacklist = blgroup.readEntry("blacklist", QStringList()); const QStringList blacklist = blgroup.readEntry("blacklist", QStringList());
beginResetModel();
m_applicationList.clear();
QList<Application *> unorderedList;
auto filter = [blacklist](const KService::Ptr &service) -> bool { auto filter = [blacklist](const KService::Ptr &service) -> bool {
if (service->noDisplay()) { if (service->noDisplay()) {
return false; return false;
@ -71,6 +74,12 @@ void ApplicationListModel::loadApplications()
return true; return true;
}; };
beginResetModel();
m_applicationList.clear();
QList<Application *> unorderedList;
const KService::List apps = KApplicationTrader::query(filter); const KService::List apps = KApplicationTrader::query(filter);
for (const KService::Ptr &service : apps) { for (const KService::Ptr &service : apps) {

View file

@ -11,6 +11,7 @@
#include <QObject> #include <QObject>
#include <QQuickItem> #include <QQuickItem>
#include <QSet> #include <QSet>
#include <QTimer>
/** /**
* @short The base application list, used directly by the full app list page. * @short The base application list, used directly by the full app list page.
@ -37,4 +38,5 @@ public Q_SLOTS:
protected: protected:
QList<Application *> m_applicationList; QList<Application *> m_applicationList;
QTimer *m_reloadAppsTimer{nullptr};
}; };