summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/Settings/DesktopWidgetSettings/PluginDesktopWidgetSettings.qml
blob: 949e33faed9970fa226472a33a5a9cdbe445e562 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
pragma ComponentBehavior: Bound

import QtQuick
import qs.Common
import qs.Services
import qs.Widgets
import qs.Modules.Settings.Widgets

Column {
    id: root

    property string instanceId: ""
    property var instanceData: null
    property string widgetType: ""
    property var widgetDef: null

    readonly property var cfg: instanceData?.config ?? {}
    readonly property string settingsPath: widgetDef?.settingsComponent ?? ""

    function updateConfig(key, value) {
        if (!instanceId)
            return;
        var updates = {};
        updates[key] = value;
        SettingsData.updateDesktopWidgetInstanceConfig(instanceId, updates);
    }

    QtObject {
        id: instanceScopedPluginService

        readonly property var availablePlugins: PluginService.availablePlugins
        readonly property var loadedPlugins: PluginService.loadedPlugins
        readonly property var pluginDesktopComponents: PluginService.pluginDesktopComponents

        signal pluginDataChanged(string pluginId)
        signal pluginLoaded(string pluginId)
        signal pluginUnloaded(string pluginId)

        function loadPluginData(pluginId, key, defaultValue) {
            const cfg = root.instanceData?.config;
            if (cfg && key in cfg)
                return cfg[key];
            return SettingsData.getPluginSetting(root.widgetType, key, defaultValue);
        }

        function savePluginData(pluginId, key, value) {
            root.updateConfig(key, value);
            Qt.callLater(() => pluginDataChanged(root.widgetType));
            return true;
        }

        function getPluginVariants(pluginId) {
            return PluginService.getPluginVariants(pluginId);
        }

        function isPluginLoaded(pluginId) {
            return PluginService.isPluginLoaded(pluginId);
        }
    }

    width: parent?.width ?? 400
    spacing: 0

    Loader {
        id: pluginSettingsLoader
        width: parent.width
        active: root.settingsPath !== ""

        source: root.settingsPath

        onLoaded: {
            if (!item)
                return;
            if (item.instanceId !== undefined)
                item.instanceId = root.instanceId;
            if (item.instanceData !== undefined)
                item.instanceData = Qt.binding(() => root.instanceData);
            if (item.pluginService !== undefined)
                item.pluginService = instanceScopedPluginService;
            if (item.reloadChildValues)
                Qt.callLater(item.reloadChildValues);
        }
    }

    Column {
        width: parent.width
        spacing: 0
        visible: root.settingsPath === ""

        SettingsDisplayPicker {
            displayPreferences: cfg.displayPreferences ?? ["all"]
            onPreferencesChanged: prefs => root.updateConfig("displayPreferences", prefs)
        }

        SettingsDivider {}

        Item {
            width: parent.width
            height: resetRow.height + Theme.spacingM * 2

            Row {
                id: resetRow
                x: Theme.spacingM
                anchors.verticalCenter: parent.verticalCenter
                spacing: Theme.spacingM

                DankButton {
                    text: I18n.tr("Reset Position")
                    backgroundColor: Theme.surfaceHover
                    textColor: Theme.surfaceText
                    buttonHeight: 36
                    onClicked: {
                        if (!root.instanceId)
                            return;
                        SettingsData.updateDesktopWidgetInstance(root.instanceId, {
                            positions: {}
                        });
                    }
                }

                DankButton {
                    text: I18n.tr("Reset Size")
                    backgroundColor: Theme.surfaceHover
                    textColor: Theme.surfaceText
                    buttonHeight: 36
                    onClicked: {
                        if (!root.instanceId)
                            return;
                        SettingsData.updateDesktopWidgetInstance(root.instanceId, {
                            positions: {}
                        });
                    }
                }
            }
        }
    }
}