1 /*
2     SPDX-FileCopyrightText: 2017 Smith AR <audoban@openmailbox.org>
3     SPDX-FileCopyrightText: 2017 Michail Vourlakos <mvourlakos@gmail.com>
4 
5     SPDX-License-Identifier: GPL-2.0-or-later
6 */
7 
8 #ifndef UNIVERSALSETTINGS_H
9 #define UNIVERSALSETTINGS_H
10 
11 // local
12 #include <coretypes.h>
13 #include "../apptypes.h"
14 #include "../lattecorona.h"
15 
16 // Qt
17 #include <QObject>
18 #include <QAbstractItemModel>
19 #include <QHash>
20 #include <QPair>
21 #include <QPointer>
22 #include <QQmlListProperty>
23 #include <QScreen>
24 
25 // KDE
26 #include <KConfigGroup>
27 #include <KSharedConfig>
28 
29 namespace Latte {
30 namespace Layouts {
31 class Manager;
32 }
33 }
34 
35 namespace Latte {
36 //width_scale, height_scale
37 typedef QPair<float, float> ScreenScales;
38 
39 //! This class holds all the settings that are universally available
40 //! independent of layouts
41 class UniversalSettings : public QObject
42 {
43     Q_OBJECT
44     Q_PROPERTY(bool autostart READ autostart WRITE setAutostart NOTIFY autostartChanged)
45     Q_PROPERTY(bool badges3DStyle READ badges3DStyle WRITE setBadges3DStyle NOTIFY badges3DStyleChanged)
46     Q_PROPERTY(bool inAdvancedModeForEditSettings READ inAdvancedModeForEditSettings WRITE setInAdvancedModeForEditSettings NOTIFY inAdvancedModeForEditSettingsChanged)
47     Q_PROPERTY(bool colorsScriptIsPresent READ colorsScriptIsPresent NOTIFY colorsScriptIsPresentChanged)
48     Q_PROPERTY(bool showInfoWindow READ showInfoWindow WRITE setShowInfoWindow NOTIFY showInfoWindowChanged)
49 
50     Q_PROPERTY(QString singleModeLayoutName READ singleModeLayoutName WRITE setSingleModeLayoutName NOTIFY singleModeLayoutNameChanged)
51 
52     Q_PROPERTY(QStringList launchers READ launchers WRITE setLaunchers NOTIFY launchersChanged)
53     Q_PROPERTY(QStringList contextMenuActionsAlwaysShown READ contextMenuActionsAlwaysShown WRITE setContextMenuActionsAlwaysShown NOTIFY actionsChanged)
54 
55     Q_PROPERTY(Latte::Settings::MouseSensitivity sensitivity READ sensitivity WRITE setSensitivity NOTIFY sensitivityChanged)
56 
57     Q_PROPERTY(QQmlListProperty<QScreen> screens READ screens)
58 
59 public:
60     UniversalSettings(KSharedConfig::Ptr config, QObject *parent = nullptr);
61     ~UniversalSettings() override;
62 
63     void load();
64 
65     bool autostart() const;
66     void setAutostart(bool state);
67 
68     bool badges3DStyle() const;
69     void setBadges3DStyle(bool enable);
70 
71     bool canDisableBorders() const;
72     void setCanDisableBorders(bool enable);
73 
74     bool colorsScriptIsPresent() const;
75 
76     bool inAdvancedModeForEditSettings() const;
77     void setInAdvancedModeForEditSettings(const bool &inAdvanced);
78 
79     bool isAvailableGeometryBroadcastedToPlasma() const;
80     void setIsAvailableGeometryBroadcastedToPlasma(const bool &isBroadcasted);
81 
82     bool kwin_metaForwardedToLatte() const;
83     void kwin_forwardMetaToLatte(bool forward);
84 
85     bool kwin_borderlessMaximizedWindowsEnabled() const;
86     void kwin_setDisabledMaximizedBorders(bool disable);
87 
88     bool metaPressAndHoldEnabled() const;
89     void setMetaPressAndHoldEnabled(bool enabled);
90 
91     bool showInfoWindow() const;
92     void setShowInfoWindow(bool show);
93 
94     int version() const;
95     void setVersion(int ver);
96 
97     int screenTrackerInterval() const;
98     void setScreenTrackerInterval(int duration);
99 
100     QString singleModeLayoutName() const;
101     void setSingleModeLayoutName(QString layoutName);
102 
103     QStringList contextMenuActionsAlwaysShown() const;
104     void setContextMenuActionsAlwaysShown(const QStringList &actions);
105 
106     QStringList launchers() const;
107     void setLaunchers(QStringList launcherList);
108 
109     Settings::MouseSensitivity sensitivity();
110     void setSensitivity(Settings::MouseSensitivity sense);
111 
112     QQmlListProperty<QScreen> screens();
113     static int countScreens(QQmlListProperty<QScreen> *property); //! is needed by screens()
114     static QScreen *atScreens(QQmlListProperty<QScreen> *property, int index); //! is needed by screens()
115 
116 public slots:
117     Q_INVOKABLE QString splitterIconPath();
118     Q_INVOKABLE QString trademarkPath();
119     Q_INVOKABLE QString trademarkIconPath();
120 
121     Q_INVOKABLE float screenWidthScale(QString screenName) const;
122     Q_INVOKABLE float screenHeightScale(QString screenName) const;
123     Q_INVOKABLE void setScreenScales(QString screenName, float widthScale, float heightScale);
124 
125     void syncSettings();
126 
127 signals:
128     void actionsChanged();
129     void autostartChanged();
130     void badges3DStyleChanged();
131     void canDisableBordersChanged();
132     void colorsScriptIsPresentChanged();
133     void downloadWindowSizeChanged();
134     void inAdvancedModeForEditSettingsChanged();
135     void layoutsColumnWidthsChanged();
136     void layoutsWindowSizeChanged();
137     void launchersChanged();
138     void layoutsMemoryUsageChanged();
139     void isAvailableGeometryBroadcastedToPlasmaChanged();
140     void metaPressAndHoldEnabledChanged();
141     void sensitivityChanged();
142     void screensCountChanged();
143     void screenScalesChanged();
144     void screenTrackerIntervalChanged();
145     void showInfoWindowChanged();
146     void singleModeLayoutNameChanged();
147     void versionChanged();
148 
149 private slots:
150     void loadConfig();
151     void loadScalesConfig();
152     void saveConfig();
153     void saveScalesConfig();
154 
155     void recoverKWinOptions();
156     void updateColorsScriptIsPresent();
157     void trackedFileChanged(const QString &file);
158 
159     void upgrade_v010();
160 private:
161     void cleanupSettings();
162 
163     void setColorsScriptIsPresent(bool present);
164 
165     MemoryUsage::LayoutsMemory layoutsMemoryUsage() const;
166     void setLayoutsMemoryUsage(MemoryUsage::LayoutsMemory layoutsMemoryUsage);
167 
168 private:
169     bool m_badges3DStyle{false};
170     bool m_canDisableBorders{false};
171     bool m_colorsScriptIsPresent{false};
172     bool m_inAdvancedModeForEditSettings{false};
173     bool m_isAvailableGeometryBroadcastedToPlasma{true};
174     bool m_metaPressAndHoldEnabled{true};
175     bool m_showInfoWindow{true};
176 
177     //!kwinrc tracking
178     bool m_kwinMetaForwardedToLatte{false};
179     bool m_kwinBorderlessMaximizedWindows{false};
180 
181     //when there isnt a version it is an old universal file
182     int m_version{1};
183 
184     int m_screenTrackerInterval{2500};
185 
186     QString m_singleModeLayoutName;
187 
188     QStringList m_launchers;
189     QStringList m_contextMenuActionsAlwaysShown;
190 
191     MemoryUsage::LayoutsMemory m_memoryUsage;
192     Settings::MouseSensitivity m_sensitivity{Settings::HighMouseSensitivity};
193 
194     //! ScreenName, <width_scale, height_scale>
195     QHash<QString, ScreenScales> m_screenScales;
196 
197     QPointer<Latte::Corona> m_corona;
198 
199     KConfigGroup m_screenScalesGroup;
200     KConfigGroup m_universalGroup;
201     KSharedConfig::Ptr m_config;
202 
203     //! reading kwinrc values is costly; a tracker protects from
204     //! reading too many times with no real reason
205     QTimer m_kwinrcTrackerTimer;
206     KSharedConfigPtr m_kwinrcPtr;
207     KConfigGroup m_kwinrcModifierOnlyShortcutsGroup;
208     KConfigGroup m_kwinrcWindowsGroup;
209 
210     friend class Layouts::Manager;
211     friend class Latte::Corona;
212 };
213 
214 }
215 
216 #endif //UNIVERSALSETTINGS_H
217