1 /*
2     SPDX-FileCopyrightText: 2017 Klarälvdalens Datakonsult AB a KDAB Group company <info@kdab.com>
3 
4     Work sponsored by the LiMux project of the city of Munich.
5     SPDX-FileContributor: Andras Mantia <andras.mantia@kdab.com>
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 #ifndef SCREENMAPPER_H
10 #define SCREENMAPPER_H
11 
12 #include <QObject>
13 #include <QVariantHash>
14 #include <QVector>
15 
16 #include "folderplugin_private_export.h"
17 
18 class QTimer;
19 
20 namespace Plasma
21 {
22 class Corona;
23 }
24 
25 class FOLDERPLUGIN_TESTS_EXPORT ScreenMapper : public QObject
26 {
27     Q_OBJECT
28 
29 public:
30     enum MappingSignalBehavior {
31         DelayedSignal = 0,
32         ImmediateSignal,
33     };
34 
35     static ScreenMapper *instance();
36     ~ScreenMapper() override = default;
37 
38     QStringList screenMapping() const;
39     void setScreenMapping(const QStringList &mapping);
40 
41     int screenForItem(const QUrl &url) const;
42     void addMapping(const QUrl &url, int screen, MappingSignalBehavior behavior = ImmediateSignal);
43     void removeFromMap(const QUrl &url);
44     void setCorona(Plasma::Corona *corona);
45 
46     void addScreen(int screenId, const QUrl &screenUrl);
47     void removeScreen(int screenId, const QUrl &screenUrl);
48     int firstAvailableScreen(const QUrl &screenUrl) const;
49     void removeItemFromDisabledScreen(const QUrl &url);
50 
sharedDesktops()51     bool sharedDesktops() const
52     {
53         return m_sharedDesktops;
54     }
55     void setSharedDesktop(bool sharedDesktops);
56 
57 #ifdef BUILD_TESTING
58     void cleanup();
59 #endif
60 
61     static QUrl stringToUrl(const QString &path);
62 
63 Q_SIGNALS:
64     void screenMappingChanged() const;
65     void screensChanged() const;
66 
67 private:
68     void saveDisabledScreensMap() const;
69     void readDisabledScreensMap();
70 
71     ScreenMapper(QObject *parent = nullptr);
72 
73     QHash<QUrl, int> m_screenItemMap;
74     QHash<int, QVector<QUrl>> m_itemsOnDisabledScreensMap;
75     QHash<QUrl, QVector<int>> m_screensPerPath; // screens per registered path
76     QVector<int> m_availableScreens;
77     Plasma::Corona *m_corona = nullptr;
78     QTimer *m_screenMappingChangedTimer = nullptr;
79     bool m_sharedDesktops = false; // all screens share the same desktops, disabling the screen mapping
80 };
81 
82 #endif // SCREENMAPPER_H
83