File indexing completed on 2024-12-01 11:10:27

0001 /*
0002     SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #ifndef LAYOUTSSYNCHRONIZER_H
0007 #define LAYOUTSSYNCHRONIZER_H
0008 
0009 // local
0010 #include "../apptypes.h"
0011 #include "../data/layoutdata.h"
0012 #include "../data/layoutstable.h"
0013 
0014 // Qt
0015 #include <QObject>
0016 #include <QHash>
0017 #include <QTimer>
0018 #include <QStringList>
0019 
0020 
0021 namespace Latte {
0022 class CentralLayout;
0023 class View;
0024 namespace Layout{
0025 class GenericLayout;
0026 }
0027 namespace Layouts {
0028 class Manager;
0029 }
0030 }
0031 
0032 namespace Plasma {
0033 class Containment;
0034 }
0035 
0036 namespace KActivities {
0037 class Controller;
0038 }
0039 
0040 namespace Latte {
0041 namespace Layouts {
0042 
0043 //! This is a Layouts map in the following structure:
0044 //! ACTIVITY ID -> Layout Names for that activity
0045 typedef QHash<QString, QStringList> AssignedLayoutsHash;
0046 
0047 //! Layouts::Synchronizer is a very IMPORTANT class which is responsible
0048 //! for all ACTIVE layouts, meaning layouts that have been loaded
0049 //! in memory.
0050 //!
0051 //! The main task of Synchronizer is to load/unload layouts based
0052 //! on "user preferences"/"activities settings"/"application current
0053 //! phase" (e.g. startup/closing)
0054 //!
0055 
0056 class Synchronizer : public QObject {
0057     Q_OBJECT
0058 
0059 public:
0060     Synchronizer(QObject *parent);
0061     ~Synchronizer() override;
0062 
0063     void unloadLayouts();
0064 
0065     void hideAllViews();
0066     void pauseLayout(QString layoutName);
0067     void syncActiveLayoutsToOriginalFiles();
0068     void syncLatteViewsToScreens();
0069     void syncMultipleLayoutsToActivities(QStringList preloadedLayouts = QStringList());
0070 
0071     //! In that case single layout file must be removed after loading the new layout
0072     void setIsSingleLayoutInDeprecatedRenaming(const bool &enabled);
0073 
0074     bool latteViewExists(Latte::View *view) const;
0075     bool layoutExists(QString layoutName) const;
0076     //! switch to specified layout, default previousMemoryUsage means that it didn't change
0077     bool switchToLayout(QString layoutName,  MemoryUsage::LayoutsMemory newMemoryUsage = MemoryUsage::Current);
0078 
0079     int centralLayoutPos(QString id) const;
0080 
0081     QStringList centralLayoutsNames();
0082     QStringList currentLayoutsNames() const;
0083     QStringList layouts() const;
0084     QStringList menuLayouts() const;
0085 
0086     QStringList activities();
0087     QStringList freeActivities();
0088     QStringList runningActivities();
0089     QStringList freeRunningActivities(); //! These are activities that haven't been assigned to specific layout
0090     QStringList validActivities(const QStringList &layoutActivities);
0091 
0092     int screenForContainment(Plasma::Containment *containment);
0093     Latte::View *viewForContainment(Plasma::Containment *containment);
0094     Latte::View *viewForContainment(uint id);
0095 
0096     QList<CentralLayout *> currentLayouts() const;
0097     QList<Latte::View *> currentViews() const;
0098     QList<Latte::View *> currentViewsWithPlasmaShortcuts() const;
0099     QList<Latte::View *> currentOriginalViews() const;
0100     QList<Latte::View *> sortedCurrentViews() const;
0101     QList<Latte::View *> sortedCurrentOriginalViews() const;
0102     QList<Latte::View *> viewsBasedOnActivityId(const QString &id) const;
0103 
0104     CentralLayout *centralLayout(QString layoutname) const;
0105     Layout::GenericLayout *layout(QString layoutname) const;
0106 
0107     QList<CentralLayout *> centralLayoutsForActivity(const QString activityid) const;
0108 
0109     KActivities::Controller *activitiesController() const;
0110 
0111     Data::Layout data(const QString &storedLayoutName) const;
0112     Data::LayoutsTable layoutsTable() const;
0113     void setLayoutsTable(const Data::LayoutsTable &table);
0114 
0115 public slots:
0116     void initLayouts();
0117     void updateKWinDisabledBorders();
0118 
0119     void updateLayoutsTable();
0120 
0121 signals:
0122     void centralLayoutsChanged();
0123     void layoutsChanged();
0124     void runningActicitiesChanged();
0125     void initializationFinished();
0126 
0127     void currentLayoutIsSwitching(QString layoutName);
0128 
0129     void newLayoutAdded(const Data::Layout &layout);
0130     void layoutActivitiesChanged(const Data::Layout &layout);
0131 
0132 private slots:
0133     void onActivityRemoved(const QString &activityid);
0134     void onLayoutAdded(const QString &layoutpath);
0135 
0136     void unloadPreloadedLayouts();
0137     void reloadAssignedLayouts();
0138     void updateBorderlessMaximizedAfterTimer();
0139 
0140 private:
0141     void addLayout(CentralLayout *layout);
0142     void unloadCentralLayout(CentralLayout *layout);
0143     void unloadLayouts(const QStringList &layoutNames, const QStringList &preloadedLayouts);
0144 
0145     bool initSingleMode(QString layoutName);
0146     bool initMultipleMode(QString layoutName);
0147 
0148     bool switchToLayoutInMultipleMode(QString layoutName);
0149     bool switchToLayoutInSingleMode(QString layoutName);
0150     bool switchToLayoutInMultipleModeBasedOnActivities(const QString &layoutName);
0151 
0152     bool isAssigned(QString layoutName) const;
0153     bool memoryInitialized() const;
0154 
0155     QString layoutPath(QString layoutName);
0156 
0157 private:
0158     bool m_multipleModeInitialized{false};
0159     bool m_isLoaded{false};
0160     bool m_isSingleLayoutInDeprecatedRenaming{false};
0161 
0162     QTimer m_updateBorderlessMaximized;
0163 
0164     Data::LayoutsTable m_layouts;
0165     QList<CentralLayout *> m_centralLayouts;
0166     AssignedLayoutsHash m_assignedLayouts;
0167 
0168     Layouts::Manager *m_manager;
0169     KActivities::Controller *m_activitiesController;
0170 };
0171 
0172 }
0173 }
0174 
0175 
0176 #endif