mirror of
https://invent.kde.org/marcoa/shift-shell.git
synced 2026-04-26 14:23:09 +00:00
fix landscape favourites bar drag and drop, and cleanup folder fix drawer scrolling add settings
121 lines
3 KiB
C++
121 lines
3 KiB
C++
// SPDX-FileCopyrightText: 2014 Antonis Tsiapaliokas <antonis.tsiapaliokas@kde.org>
|
|
// SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "applicationlistmodel.h"
|
|
|
|
#include <QByteArray>
|
|
#include <QDebug>
|
|
#include <QModelIndex>
|
|
#include <QProcess>
|
|
#include <QQuickWindow>
|
|
|
|
#include <KApplicationTrader>
|
|
#include <KConfigGroup>
|
|
#include <KIO/ApplicationLauncherJob>
|
|
#include <KNotificationJobUiDelegate>
|
|
#include <KService>
|
|
#include <KSharedConfig>
|
|
#include <KSycoca>
|
|
|
|
ApplicationListModel::ApplicationListModel(QObject *parent)
|
|
: QAbstractListModel(parent)
|
|
{
|
|
connect(KSycoca::self(), &KSycoca::databaseChanged, this, &ApplicationListModel::sycocaDbChanged);
|
|
|
|
// initialize wayland window checking
|
|
KWayland::Client::ConnectionThread *connection = KWayland::Client::ConnectionThread::fromApplication(this);
|
|
if (!connection) {
|
|
return;
|
|
}
|
|
|
|
load();
|
|
}
|
|
|
|
ApplicationListModel::~ApplicationListModel() = default;
|
|
|
|
ApplicationListModel *ApplicationListModel::self()
|
|
{
|
|
static ApplicationListModel *inst = new ApplicationListModel(nullptr);
|
|
return inst;
|
|
}
|
|
|
|
QHash<int, QByteArray> ApplicationListModel::roleNames() const
|
|
{
|
|
return {{DelegateRole, QByteArrayLiteral("delegate")}};
|
|
}
|
|
|
|
void ApplicationListModel::sycocaDbChanged()
|
|
{
|
|
load();
|
|
}
|
|
|
|
void ApplicationListModel::load()
|
|
{
|
|
auto cfg = KSharedConfig::openConfig(QStringLiteral("applications-blacklistrc"));
|
|
auto blgroup = KConfigGroup(cfg, QStringLiteral("Applications"));
|
|
|
|
const QStringList blacklist = blgroup.readEntry("blacklist", QStringList());
|
|
|
|
beginResetModel();
|
|
|
|
m_delegates.clear();
|
|
|
|
QList<FolioDelegate *> unorderedList;
|
|
|
|
auto filter = [blacklist](const KService::Ptr &service) -> bool {
|
|
if (service->noDisplay()) {
|
|
return false;
|
|
}
|
|
|
|
if (!service->showOnCurrentPlatform()) {
|
|
return false;
|
|
}
|
|
|
|
if (blacklist.contains(service->desktopEntryName())) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
const KService::List apps = KApplicationTrader::query(filter);
|
|
|
|
for (const KService::Ptr &service : apps) {
|
|
FolioApplication *app = new FolioApplication{this, service};
|
|
FolioDelegate *delegate = new FolioDelegate{app, this};
|
|
unorderedList << delegate;
|
|
}
|
|
|
|
std::sort(unorderedList.begin(), unorderedList.end(), [](FolioDelegate *a1, FolioDelegate *a2) {
|
|
return a1->application()->name().compare(a2->application()->name(), Qt::CaseInsensitive) < 0;
|
|
});
|
|
|
|
m_delegates << unorderedList;
|
|
|
|
endResetModel();
|
|
}
|
|
|
|
QVariant ApplicationListModel::data(const QModelIndex &index, int role) const
|
|
{
|
|
if (!index.isValid()) {
|
|
return QVariant();
|
|
}
|
|
|
|
switch (role) {
|
|
case Qt::DisplayRole:
|
|
case DelegateRole:
|
|
return QVariant::fromValue(m_delegates.at(index.row()));
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
|
|
int ApplicationListModel::rowCount(const QModelIndex &parent) const
|
|
{
|
|
if (parent.isValid()) {
|
|
return 0;
|
|
}
|
|
|
|
return m_delegates.count();
|
|
}
|