/* SPDX-FileCopyrightText: 2021 Michail Vourlakos SPDX-License-Identifier: GPL-2.0-or-later */ #include "clonedview.h" #include "containmentinterface.h" #include "visibilitymanager.h" #include "../data/viewdata.h" #include "../layouts/storage.h" namespace Latte { const int ClonedView::ERRORAPPLETID; QStringList ClonedView::CONTAINMENTMANUALSYNCEDPROPERTIES = QStringList() << QString("appletOrder") << QString("lockedZoomApplets") << QString("userBlocksColorizingApplets"); ClonedView::ClonedView(Plasma::Corona *corona, Latte::OriginalView *originalView, QScreen *targetScreen, bool byPassX11WM) : View(corona, targetScreen, byPassX11WM), m_originalView(originalView) { m_originalView->addClone(this); initSync(); } ClonedView::~ClonedView() { } void ClonedView::initSync() { connect(m_originalView, &View::containmentChanged, this, &View::groupIdChanged); //! Update Visibility From Original connect(m_originalView->visibility(), &Latte::ViewPart::VisibilityManager::modeChanged, this, [&]() { visibility()->setMode(m_originalView->visibility()->mode()); }); connect(m_originalView->visibility(), &Latte::ViewPart::VisibilityManager::raiseOnDesktopChanged, this, [&]() { visibility()->setRaiseOnDesktop(m_originalView->visibility()->raiseOnDesktop()); }); connect(m_originalView->visibility(), &Latte::ViewPart::VisibilityManager::raiseOnActivityChanged, this, [&]() { visibility()->setRaiseOnActivity(m_originalView->visibility()->raiseOnActivity()); }); connect(m_originalView->visibility(), &Latte::ViewPart::VisibilityManager::enableKWinEdgesChanged, this, [&]() { visibility()->setEnableKWinEdges(m_originalView->visibility()->enableKWinEdges()); }); connect(m_originalView->visibility(), &Latte::ViewPart::VisibilityManager::timerShowChanged, this, [&]() { visibility()->setTimerShow(m_originalView->visibility()->timerShow()); }); connect(m_originalView->visibility(), &Latte::ViewPart::VisibilityManager::timerHideChanged, this, [&]() { visibility()->setTimerHide(m_originalView->visibility()->timerHide()); }); //! Update Applets from Clone -> OriginalView connect(extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletConfigPropertyChanged, this, &ClonedView::updateOriginalAppletConfigProperty); connect(extendedInterface(), &Latte::ViewPart::ContainmentInterface::initializationCompleted, this, &ClonedView::updateAppletIdsHash); connect(extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletsOrderChanged, this, &ClonedView::updateAppletIdsHash); connect(extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletDataCreated, this, &ClonedView::updateAppletIdsHash); connect(extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletCreated, this, [&](const QString &pluginId) { m_originalView->addApplet(pluginId, containment()->id()); }); connect(extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletDropped, this, [&](QObject *data, int x, int y) { m_originalView->addApplet(data, x, y, containment()->id()); }); //! Update Applets and Containment from OrigalView -> Clone connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::containmentConfigPropertyChanged, this, &ClonedView::updateContainmentConfigProperty); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletConfigPropertyChanged, this, &ClonedView::onOriginalAppletConfigPropertyChanged); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletInScheduledDestructionChanged, this, &ClonedView::onOriginalAppletInScheduledDestructionChanged); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletRemoved, this, &ClonedView::onOriginalAppletRemoved); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletsOrderChanged, this, &ClonedView::onOriginalAppletsOrderChanged); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletsInLockedZoomChanged, this, &ClonedView::onOriginalAppletsInLockedZoomChanged); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletsDisabledColoringChanged, this, &ClonedView::onOriginalAppletsDisabledColoringChanged); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletDataCreated, this, &ClonedView::updateAppletIdsHash); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletCreated, this->extendedInterface(), [&](const QString &pluginId) { extendedInterface()->addApplet(pluginId); }); connect(m_originalView->extendedInterface(), &Latte::ViewPart::ContainmentInterface::appletDropped, this->extendedInterface(), [&](QObject *data, int x, int y) { extendedInterface()->addApplet(data, x, y); }); //! Indicator connect(m_originalView, &Latte::View::indicatorChanged, this, &ClonedView::indicatorChanged); } bool ClonedView::isSingle() const { return false; } bool ClonedView::isOriginal() const { return false; } bool ClonedView::isCloned() const { return true; } bool ClonedView::isPreferredForShortcuts() const { return false; } int ClonedView::groupId() const { if (!m_originalView->containment()) { return -1; } return m_originalView->containment()->id(); } Latte::Types::ScreensGroup ClonedView::screensGroup() const { return Latte::Types::SingleScreenGroup; } ViewPart::Indicator *ClonedView::indicator() const { return m_originalView->indicator(); } bool ClonedView::hasOriginalAppletId(const int &clonedid) { if (clonedid < 0) { return false; } QHash::const_iterator i = m_currentAppletIds.constBegin(); while (i != m_currentAppletIds.constEnd()) { if (i.value() == clonedid) { return true; } ++i; } return false; } int ClonedView::originalAppletId(const int &clonedid) { if (clonedid < 0) { return -1; } QHash::const_iterator i = m_currentAppletIds.constBegin(); while (i != m_currentAppletIds.constEnd()) { if (i.value() == clonedid) { return i.key(); } ++i; } return -1; } bool ClonedView::isTranslatableToClonesOrder(const QList &originalOrder) { for(int i=0; icontainment()->id(); return vdata; } void ClonedView::updateAppletIdsHash() { QList originalids = m_originalView->extendedInterface()->appletsOrder(); QList clonedids = extendedInterface()->appletsOrder(); for (int i=0; i 0)) { continue; } int oindex = m_originalView->extendedInterface()->indexOfApplet(oid); ViewPart::AppletInterfaceData originalapplet = m_originalView->extendedInterface()->appletDataForId(oid); ViewPart::AppletInterfaceData clonedapplet = extendedInterface()->appletDataAtIndex(oindex); bool registeredclonedid = (originalAppletId(clonedapplet.id) > 0); if (originalapplet.id>0 && clonedapplet.id>0 && originalapplet.plugin == clonedapplet.plugin && !registeredclonedid) { m_currentAppletIds[originalapplet.id] = clonedapplet.id; } } } QList ClonedView::translateToClonesOrder(const QList &originalIds) { QList ids; for (int i=0; i(applet); if (Layouts::Storage::self()->isLatteContainment(c)) { m_originalView->showSettingsWindow(); } else { View::showConfigurationInterface(applet); } } void ClonedView::onOriginalAppletRemoved(const int &id) { if (!m_currentAppletIds.contains(id)) { return; } extendedInterface()->removeApplet(m_currentAppletIds[id]); m_currentAppletIds.remove(id); } void ClonedView::onOriginalAppletConfigPropertyChanged(const int &id, const QString &key, const QVariant &value) { if (!m_currentAppletIds.contains(id)) { return; } extendedInterface()->updateAppletConfigProperty(m_currentAppletIds[id], key, value); } void ClonedView::onOriginalAppletInScheduledDestructionChanged(const int &id, const bool &enabled) { if (!m_currentAppletIds.contains(id)) { return; } extendedInterface()->setAppletInScheduledDestruction(m_currentAppletIds[id], enabled); } void ClonedView::updateContainmentConfigProperty(const QString &key, const QVariant &value) { if (!CONTAINMENTMANUALSYNCEDPROPERTIES.contains(key)) { extendedInterface()->updateContainmentConfigProperty(key, value); } else { //qDebug() << "org.kde.sync :: containment config value syncing blocked :: " << key; } } void ClonedView::updateOriginalAppletConfigProperty(const int &clonedid, const QString &key, const QVariant &value) { if (!hasOriginalAppletId(clonedid)) { return; } m_originalView->extendedInterface()->updateAppletConfigProperty(originalAppletId(clonedid), key, value); } void ClonedView::onOriginalAppletsOrderChanged() { updateAppletIdsHash(); QList originalorder = m_originalView->extendedInterface()->appletsOrder(); if (originalorder.count() != extendedInterface()->appletsOrder().count()) { //probably an applet was removed or added and clone has not been updated yet return; } if (!isTranslatableToClonesOrder(originalorder)) { qDebug() << "org.kde.sync ::: original applets order changed but unfortunately original order can not be translated to cloned ids..."; return; } QList newclonesorder = translateToClonesOrder(originalorder); if (newclonesorder.contains(ERRORAPPLETID)) { qDebug() << "org.kde.sync ::: original applets order changed but unfortunately original and clones order map can not be generated..."; return; } extendedInterface()->setAppletsOrder(newclonesorder); } void ClonedView::onOriginalAppletsInLockedZoomChanged(const QList &originalapplets) { if (!isTranslatableToClonesOrder(originalapplets)) { qDebug() << "org.kde.sync ::: original applets order changed but unfortunately original order can not be translated to cloned ids..."; return; } QList newclonesorder = translateToClonesOrder(originalapplets); if (newclonesorder.contains(ERRORAPPLETID)) { qDebug() << "org.kde.sync ::: original applets order changed but unfortunately original and clones order map can not be generated..."; return; } extendedInterface()->setAppletsInLockedZoom(newclonesorder); } void ClonedView::onOriginalAppletsDisabledColoringChanged(const QList &originalapplets) { if (!isTranslatableToClonesOrder(originalapplets)) { qDebug() << "org.kde.sync ::: original applets order changed but unfortunately original order can not be translated to cloned ids..."; return; } QList newclonesorder = translateToClonesOrder(originalapplets); if (newclonesorder.contains(ERRORAPPLETID)) { qDebug() << "org.kde.sync ::: original applets order changed but unfortunately original and clones order map can not be generated..."; return; } extendedInterface()->setAppletsDisabledColoring(newclonesorder); } }