Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

222 lines
5.4 KiB
C++

/*
SPDX-FileCopyrightText: 2016, 2019 Kai Uwe Broulik <kde@privat.broulik.de>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "smartlauncheritem.h"
#include <KDesktopFile>
#include <KService>
using namespace SmartLauncher;
Item::Item(QObject *parent)
: QObject(parent)
{
m_backendPtr = s_backend.toStrongRef();
if (!m_backendPtr) {
QSharedPointer<Backend> backendSharedPtr(new Backend);
s_backend = backendSharedPtr;
m_backendPtr = s_backend.toStrongRef();
}
}
QWeakPointer<Backend> Item::s_backend;
void Item::init()
{
if (m_inited || m_storageId.isEmpty() || !m_backendPtr) {
return;
}
connect(m_backendPtr.data(), &Backend::reloadRequested, this, [this](const QString &uri) {
if (uri.isEmpty() || m_storageId == uri) {
populate();
}
});
connect(m_backendPtr.data(), &Backend::launcherRemoved, this, [this](const QString &uri) {
if (uri.isEmpty() || m_storageId == uri) {
clear();
}
});
connect(m_backendPtr.data(), &Backend::countChanged, this, [this](const QString &uri, int count) {
if (uri.isEmpty() || m_storageId == uri) {
setCount(count);
}
});
connect(m_backendPtr.data(), &Backend::countVisibleChanged, this, [this](const QString &uri, bool countVisible) {
if (uri.isEmpty() || m_storageId == uri) {
setCountVisible(countVisible);
}
});
connect(m_backendPtr.data(), &Backend::progressChanged, this, [this](const QString &uri, int progress) {
if (uri.isEmpty() || m_storageId == uri) {
setProgress(progress);
}
});
connect(m_backendPtr.data(), &Backend::progressVisibleChanged, this, [this](const QString &uri, bool progressVisible) {
if (uri.isEmpty() || m_storageId == uri) {
setProgressVisible(progressVisible);
}
});
connect(m_backendPtr.data(), &Backend::urgentChanged, this, [this](const QString &uri, bool urgent) {
if (uri.isEmpty() || m_storageId == uri) {
setUrgent(urgent);
}
});
m_inited = true;
}
void Item::populate()
{
if (!m_backendPtr || m_storageId.isEmpty()) {
return;
}
if (!m_backendPtr->hasLauncher(m_storageId)) {
return;
}
setCount(m_backendPtr->count(m_storageId));
setCountVisible(m_backendPtr->countVisible(m_storageId));
setProgress(m_backendPtr->progress(m_storageId));
setProgressVisible(m_backendPtr->progressVisible(m_storageId));
setUrgent(m_backendPtr->urgent(m_storageId));
}
void Item::clear()
{
setCount(0);
setCountVisible(false);
setProgress(0);
setProgressVisible(false);
setUrgent(false);
}
QUrl Item::launcherUrl() const
{
return m_launcherUrl;
}
void Item::setLauncherUrl(const QUrl &launcherUrl)
{
if (launcherUrl != m_launcherUrl) {
m_launcherUrl = launcherUrl;
Q_EMIT launcherUrlChanged(launcherUrl);
m_storageId.clear();
clear();
if (launcherUrl.scheme() == QLatin1String("applications")) {
const KService::Ptr service = KService::serviceByMenuId(launcherUrl.path());
if (service && launcherUrl.path() == service->menuId()) {
m_storageId = service->menuId();
}
}
if (launcherUrl.isLocalFile() && KDesktopFile::isDesktopFile(launcherUrl.toLocalFile())) {
KDesktopFile f(launcherUrl.toLocalFile());
const KService::Ptr service = KService::serviceByStorageId(f.fileName());
if (service) {
m_storageId = service->storageId();
}
}
if (m_storageId.isEmpty()) {
return;
}
if (m_backendPtr) {
// check if we have a mapping to a different desktop file
const QString &overrideStorageId = m_backendPtr->unityMappingRules().value(m_storageId);
if (!overrideStorageId.isEmpty()) {
m_storageId = overrideStorageId;
}
}
init();
populate();
}
}
int Item::count() const
{
return m_count;
}
void Item::setCount(int count)
{
if (m_count != count) {
m_count = count;
Q_EMIT countChanged(count);
}
}
bool Item::countVisible() const
{
return m_countVisible;
}
void Item::setCountVisible(bool countVisible)
{
if (m_countVisible != countVisible) {
m_countVisible = countVisible;
Q_EMIT countVisibleChanged(countVisible);
}
}
int Item::progress() const
{
return m_progress;
}
void Item::setProgress(int progress)
{
int boundedProgress = std::clamp(progress, 0, 100);
if (progress != boundedProgress) {
qWarning().nospace() << qUtf8Printable(m_launcherUrl.toString()) << ": Progress value " << progress << " is out of bounds!";
}
if (m_progress != boundedProgress) {
m_progress = boundedProgress;
Q_EMIT progressChanged(boundedProgress);
}
}
bool Item::progressVisible() const
{
return m_progressVisible;
}
void Item::setProgressVisible(bool progressVisible)
{
if (m_progressVisible != progressVisible) {
m_progressVisible = progressVisible;
Q_EMIT progressVisibleChanged(progressVisible);
}
}
bool Item::urgent() const
{
return m_urgent;
}
void Item::setUrgent(bool urgent)
{
if (m_urgent != urgent) {
m_urgent = urgent;
Q_EMIT urgentChanged(urgent);
}
}