File indexing completed on 2024-04-14 05:24:23

0001 /*
0002     SPDX-FileCopyrightText: 2017 Smith AR <audoban@openmailbox.org>
0003     SPDX-FileCopyrightText: 2017 Michail Vourlakos <mvourlakos@gmail.com>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "centrallayout.h"
0009 
0010 // local
0011 #include <coretypes.h>
0012 #include "../apptypes.h"
0013 #include "../lattecorona.h"
0014 #include "../screenpool.h"
0015 #include "../layouts/importer.h"
0016 #include "../layouts/manager.h"
0017 #include "../layouts/synchronizer.h"
0018 #include "../settings/universalsettings.h"
0019 #include "../view/view.h"
0020 #include "../wm/tracker/schemes.h"
0021 
0022 // KDE
0023 #include <KConfigGroup>
0024 #include <KActivities/Consumer>
0025 
0026 
0027 namespace Latte {
0028 
0029 CentralLayout::CentralLayout(QObject *parent, QString layoutFile, QString assignedName)
0030     : Layout::GenericLayout(parent, layoutFile, assignedName)
0031 {
0032     if (m_loadedCorrectly) {
0033         loadConfig();
0034         init();
0035     }
0036 }
0037 
0038 CentralLayout::~CentralLayout()
0039 {
0040 }
0041 
0042 void CentralLayout::init()
0043 {
0044     connect(this, &GenericLayout::activitiesChanged, this, &CentralLayout::saveConfig);
0045     connect(this, &CentralLayout::disableBordersForMaximizedWindowsChanged, this, &CentralLayout::saveConfig);
0046     connect(this, &CentralLayout::showInMenuChanged, this, &CentralLayout::saveConfig);
0047 }
0048 
0049 bool CentralLayout::initCorona()
0050 {
0051     if (GenericLayout::initCorona()) {
0052         onSchemeFileChanged();
0053 
0054         connect(this, &CentralLayout::disableBordersForMaximizedWindowsChanged,
0055                 m_corona->layoutsManager()->synchronizer(), &Layouts::Synchronizer::updateKWinDisabledBorders);
0056 
0057         connect(this, &Layout::AbstractLayout::schemeFileChanged, this, &CentralLayout::onSchemeFileChanged);
0058         connect(m_corona->wm()->schemesTracker(), &WindowSystem::Tracker::Schemes::defaultSchemeChanged, this, &CentralLayout::onSchemeFileChanged);
0059         return true;
0060     }
0061 
0062     return false;
0063 }
0064 
0065 bool CentralLayout::disableBordersForMaximizedWindows() const
0066 {
0067     return m_disableBordersForMaximizedWindows;
0068 }
0069 
0070 void CentralLayout::setDisableBordersForMaximizedWindows(bool disable)
0071 {
0072     if (m_disableBordersForMaximizedWindows == disable) {
0073         return;
0074     }
0075 
0076     m_disableBordersForMaximizedWindows = disable;
0077 
0078     emit disableBordersForMaximizedWindowsChanged();
0079 }
0080 
0081 bool CentralLayout::showInMenu() const
0082 {
0083     return m_showInMenu;
0084 }
0085 
0086 void CentralLayout::setShowInMenu(bool show)
0087 {
0088     if (m_showInMenu == show) {
0089         return;
0090     }
0091 
0092     m_showInMenu = show;
0093     emit showInMenuChanged();
0094 }
0095 
0096 bool CentralLayout::isCurrent()
0097 {
0098    QStringList appliedactivities = appliedActivities();
0099 
0100     return (appliedactivities.contains(Data::Layout::ALLACTIVITIESID)
0101             || appliedactivities.contains(m_corona->activitiesConsumer()->currentActivity()));
0102 }
0103 
0104 bool CentralLayout::isOnAllActivities() const
0105 {
0106     return (m_activities.count() == 1 && m_activities[0] == Data::Layout::ALLACTIVITIESID);
0107 }
0108 
0109 bool CentralLayout::isForFreeActivities() const
0110 {
0111     return (m_activities.count() == 1 && m_activities[0] == Data::Layout::FREEACTIVITIESID);
0112 }
0113 
0114 Layout::Type CentralLayout::type() const
0115 {
0116     return Layout::Type::Central;
0117 }
0118 
0119 QStringList CentralLayout::activities() const
0120 {
0121     return m_activities;
0122 }
0123 
0124 void CentralLayout::setActivities(QStringList activities)
0125 {
0126     if (m_activities == activities) {
0127         return;
0128     }
0129 
0130     m_activities = activities;
0131 
0132     emit activitiesChanged();
0133 }
0134 
0135 Latte::WindowSystem::SchemeColors *CentralLayout::scheme() const
0136 {
0137     return m_scheme;
0138 }
0139 
0140 void CentralLayout::setScheme(Latte::WindowSystem::SchemeColors *_scheme)
0141 {
0142     if (m_scheme == _scheme) {
0143         return;
0144     }
0145 
0146     m_scheme = _scheme;
0147     emit schemeChanged();
0148 }
0149 
0150 Data::Layout CentralLayout::data() const
0151 {
0152     Data::Layout cdata;
0153 
0154     cdata.id = file();
0155     cdata.name = name();
0156     cdata.icon = icon();
0157     cdata.backgroundStyle = backgroundStyle();
0158     cdata.color = color();
0159     cdata.background = customBackground();
0160     cdata.textColor = customTextColor();
0161     cdata.isActive = (m_corona != nullptr);
0162     cdata.isLocked = !isWritable();
0163     cdata.isShownInMenu = showInMenu();
0164     cdata.hasDisabledBorders = disableBordersForMaximizedWindows();
0165     cdata.popUpMargin = popUpMargin();
0166     cdata.schemeFile = schemeFile();
0167     cdata.activities = activities();
0168     cdata.lastUsedActivity = lastUsedActivity();
0169 
0170     cdata.errors = errors().count();
0171     cdata.warnings = warnings().count();
0172 
0173     return cdata;
0174 }
0175 
0176 void CentralLayout::onSchemeFileChanged()
0177 {
0178     setScheme(m_corona->wm()->schemesTracker()->schemeForFile(schemeFile()));
0179 }
0180 
0181 void CentralLayout::loadConfig()
0182 {
0183     m_disableBordersForMaximizedWindows = m_layoutGroup.readEntry("disableBordersForMaximizedWindows", false);
0184     m_showInMenu = m_layoutGroup.readEntry("showInMenu", false);     
0185     m_activities = m_layoutGroup.readEntry("activities", QStringList());
0186 
0187     emit activitiesChanged();
0188 }
0189 
0190 void CentralLayout::saveConfig()
0191 {
0192     qDebug() << "CENTRAL layout is saving... for layout:" << m_layoutName;
0193     m_layoutGroup.writeEntry("showInMenu", m_showInMenu);
0194     m_layoutGroup.writeEntry("disableBordersForMaximizedWindows", m_disableBordersForMaximizedWindows);
0195     m_layoutGroup.writeEntry("activities", m_activities);
0196     m_layoutGroup.sync();
0197 }
0198 
0199 //! OVERRIDES
0200 
0201 const QStringList CentralLayout::appliedActivities()
0202 {
0203     if (!m_corona) {
0204         return {};
0205     }
0206 
0207     if (isOnAllActivities() || m_corona->layoutsManager()->memoryUsage() == MemoryUsage::SingleLayout) {
0208         return QStringList(Data::Layout::ALLACTIVITIESID);
0209     } else if (isForFreeActivities()) {
0210         return m_corona->layoutsManager()->synchronizer()->freeRunningActivities();
0211     } else {
0212         return m_corona->layoutsManager()->synchronizer()->validActivities(m_activities);
0213     }
0214 }
0215 
0216 Types::ViewType CentralLayout::latteViewType(uint containmentId) const
0217 {
0218     for (const auto view : m_latteViews) {
0219         if (view->containment() && view->containment()->id() == (uint)containmentId) {
0220             return view->type();
0221         }
0222     }
0223 
0224     return Types::DockView;
0225 }
0226 
0227 }