1
0
mirror of https://github.com/KDE/latte-dock.git synced 2025-01-03 09:17:50 +03:00
latte-dock/app/layouts/synchronizer.h
Michail Vourlakos c7bb46b217 introduce new MultipleLayouts mechanism
--the new approach does not load/unload layouts
during startup/exit. When the user loads layouts
in multiple layouts mode the layouts are inserted
and when exit they still remain in the hidden
multiple layouts file. These layouts present in the
multiple layouts file from now are called preloaded
layouts.
--the new approach fixes also the wayland exit
issue and in general the message for Latte not
closed properly has been totally dropped.

BUG:448702
BUG:446205
2022-01-25 09:58:44 +02:00

177 lines
5.1 KiB
C++

/*
SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef LAYOUTSSYNCHRONIZER_H
#define LAYOUTSSYNCHRONIZER_H
// local
#include "../apptypes.h"
#include "../data/layoutdata.h"
#include "../data/layoutstable.h"
// Qt
#include <QObject>
#include <QHash>
#include <QTimer>
#include <QStringList>
namespace Latte {
class CentralLayout;
class View;
namespace Layout{
class GenericLayout;
}
namespace Layouts {
class Manager;
}
}
namespace Plasma {
class Containment;
}
namespace KActivities {
class Controller;
}
namespace Latte {
namespace Layouts {
//! This is a Layouts map in the following structure:
//! ACTIVITY ID -> Layout Names for that activity
typedef QHash<QString, QStringList> AssignedLayoutsHash;
//! Layouts::Synchronizer is a very IMPORTANT class which is responsible
//! for all ACTIVE layouts, meaning layouts that have been loaded
//! in memory.
//!
//! The main task of Synchronizer is to load/unload layouts based
//! on "user preferences"/"activities settings"/"application current
//! phase" (e.g. startup/closing)
//!
class Synchronizer : public QObject {
Q_OBJECT
public:
Synchronizer(QObject *parent);
~Synchronizer() override;
void unloadLayouts();
void hideAllViews();
void pauseLayout(QString layoutName);
void syncActiveLayoutsToOriginalFiles();
void syncLatteViewsToScreens();
void syncMultipleLayoutsToActivities(QStringList preloadedLayouts = QStringList());
//! In that case single layout file must be removed after loading the new layout
void setIsSingleLayoutInDeprecatedRenaming(const bool &enabled);
bool latteViewExists(Latte::View *view) const;
bool layoutExists(QString layoutName) const;
//! switch to specified layout, default previousMemoryUsage means that it didn't change
bool switchToLayout(QString layoutName, MemoryUsage::LayoutsMemory newMemoryUsage = MemoryUsage::Current);
int centralLayoutPos(QString id) const;
QStringList centralLayoutsNames();
QStringList currentLayoutsNames() const;
QStringList layouts() const;
QStringList menuLayouts() const;
QStringList activities();
QStringList freeActivities();
QStringList runningActivities();
QStringList freeRunningActivities(); //! These are activities that haven't been assigned to specific layout
QStringList validActivities(const QStringList &layoutActivities);
int screenForContainment(Plasma::Containment *containment);
Latte::View *viewForContainment(Plasma::Containment *containment);
Latte::View *viewForContainment(uint id);
QList<CentralLayout *> currentLayouts() const;
QList<Latte::View *> currentViews() const;
QList<Latte::View *> currentViewsWithPlasmaShortcuts() const;
QList<Latte::View *> currentOriginalViews() const;
QList<Latte::View *> sortedCurrentViews() const;
QList<Latte::View *> sortedCurrentOriginalViews() const;
QList<Latte::View *> viewsBasedOnActivityId(const QString &id) const;
CentralLayout *centralLayout(QString layoutname) const;
Layout::GenericLayout *layout(QString layoutname) const;
QList<CentralLayout *> centralLayoutsForActivity(const QString activityid) const;
KActivities::Controller *activitiesController() const;
Data::Layout data(const QString &storedLayoutName) const;
Data::LayoutsTable layoutsTable() const;
void setLayoutsTable(const Data::LayoutsTable &table);
public slots:
void initLayouts();
void updateKWinDisabledBorders();
void updateLayoutsTable();
signals:
void centralLayoutsChanged();
void layoutsChanged();
void runningActicitiesChanged();
void initializationFinished();
void currentLayoutIsSwitching(QString layoutName);
void newLayoutAdded(const Data::Layout &layout);
void layoutActivitiesChanged(const Data::Layout &layout);
private slots:
void onActivityRemoved(const QString &activityid);
void onLayoutAdded(const QString &layoutpath);
void unloadPreloadedLayouts();
void reloadAssignedLayouts();
void updateBorderlessMaximizedAfterTimer();
private:
void addLayout(CentralLayout *layout);
void unloadCentralLayout(CentralLayout *layout);
void unloadLayouts(const QStringList &layoutNames, const QStringList &preloadedLayouts);
bool initSingleMode(QString layoutName);
bool initMultipleMode(QString layoutName);
bool switchToLayoutInMultipleMode(QString layoutName);
bool switchToLayoutInSingleMode(QString layoutName);
bool switchToLayoutInMultipleModeBasedOnActivities(const QString &layoutName);
bool isAssigned(QString layoutName) const;
bool memoryInitialized() const;
QString layoutPath(QString layoutName);
private:
bool m_multipleModeInitialized{false};
bool m_isLoaded{false};
bool m_isSingleLayoutInDeprecatedRenaming{false};
QTimer m_updateBorderlessMaximized;
Data::LayoutsTable m_layouts;
QList<CentralLayout *> m_centralLayouts;
AssignedLayoutsHash m_assignedLayouts;
Layouts::Manager *m_manager;
KActivities::Controller *m_activitiesController;
};
}
}
#endif