3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-23 07:35:54 +00:00
2022-03-05 22:41:29 +05:00

146 lines
4.5 KiB
C++

/*
SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "systemtraycontainer.h"
#include "debug.h"
#include <QQuickItem>
#include <Plasma/Corona>
#include <QAction>
#include <kactioncollection.h>
SystemTrayContainer::SystemTrayContainer(QObject *parent, const KPluginMetaData &data, const QVariantList &args)
: Plasma::Applet(parent, data, args)
{
}
SystemTrayContainer::~SystemTrayContainer()
{
if (destroyed()) {
m_innerContainment->destroy();
}
}
void SystemTrayContainer::init()
{
Applet::init();
// in the first creation we immediately create the systray: so it's accessible during desktop scripting
uint id = config().readEntry("SystrayContainmentId", 0);
if (id == 0) {
ensureSystrayExists();
}
}
void SystemTrayContainer::ensureSystrayExists()
{
if (m_innerContainment) {
return;
}
Plasma::Containment *cont = containment();
if (!cont) {
return;
}
Plasma::Corona *c = cont->corona();
if (!c) {
return;
}
uint id = config().readEntry("SystrayContainmentId", 0);
if (id > 0) {
foreach (Plasma::Containment *candidate, c->containments()) {
if (candidate->id() == id) {
m_innerContainment = candidate;
break;
}
}
qCDebug(SYSTEM_TRAY_CONTAINER) << "Containment id" << id << "that used to be a system tray was deleted";
// id = 0;
}
if (!m_innerContainment) {
m_innerContainment = c->createContainment(QStringLiteral("org.kde.plasma.private.systemtray"), QVariantList() << "org.kde.plasma:force-create");
config().writeEntry("SystrayContainmentId", m_innerContainment->id());
}
if (!m_innerContainment) {
return;
}
m_innerContainment->setParent(this);
connect(containment(), &Plasma::Containment::screenChanged, m_innerContainment.data(), &Plasma::Containment::reactToScreenChange);
if (formFactor() == Plasma::Types::Horizontal || formFactor() == Plasma::Types::Vertical) {
m_innerContainment->setFormFactor(formFactor());
} else {
m_innerContainment->setFormFactor(Plasma::Types::Horizontal);
}
if (m_innerContainment) {
m_innerContainment->setLocation(location());
}
m_internalSystray = m_innerContainment->property("_plasma_graphicObject").value<QQuickItem *>();
Q_EMIT internalSystrayChanged();
actions()->addAction("configure", m_innerContainment->actions()->action("configure"));
connect(m_innerContainment.data(), &Plasma::Containment::configureRequested, this, [this](Plasma::Applet *applet) {
Q_EMIT containment()->configureRequested(applet);
});
if (m_internalSystray) {
// don't let internal systray manage context menus
m_internalSystray->setAcceptedMouseButtons(Qt::NoButton);
}
// replace internal remove action with ours
m_innerContainment->actions()->addAction("remove", actions()->action("remove"));
// Sync the display hints
m_innerContainment->setContainmentDisplayHints(containmentDisplayHints() | Plasma::Types::ContainmentDrawsPlasmoidHeading
| Plasma::Types::ContainmentForcesSquarePlasmoids);
connect(cont, &Plasma::Containment::containmentDisplayHintsChanged, this, [this]() {
m_innerContainment->setContainmentDisplayHints(containmentDisplayHints() | Plasma::Types::ContainmentDrawsPlasmoidHeading
| Plasma::Types::ContainmentForcesSquarePlasmoids);
});
}
void SystemTrayContainer::constraintsEvent(Plasma::Types::Constraints constraints)
{
if (constraints & Plasma::Types::LocationConstraint) {
if (m_innerContainment) {
m_innerContainment->setLocation(location());
}
}
if (constraints & Plasma::Types::FormFactorConstraint) {
if (m_innerContainment) {
if (formFactor() == Plasma::Types::Horizontal || formFactor() == Plasma::Types::Vertical) {
m_innerContainment->setFormFactor(formFactor());
} else {
m_innerContainment->setFormFactor(Plasma::Types::Horizontal);
}
}
}
if (constraints & Plasma::Types::UiReadyConstraint) {
ensureSystrayExists();
}
}
QQuickItem *SystemTrayContainer::internalSystray()
{
return m_internalSystray;
}
K_PLUGIN_CLASS_WITH_JSON(SystemTrayContainer, "package/metadata.json")
#include "systemtraycontainer.moc"