summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml
diff options
context:
space:
mode:
authorAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
committerAlexanderCurl <alexc@alexc.hu>2026-04-18 17:46:06 +0100
commit70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch)
treeab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml
parent5d94c0a7d44a2255b81815a52a7056a94a39842d (diff)
downloadRaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz
RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml311
1 files changed, 311 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml
new file mode 100644
index 0000000..2ba5d05
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/quickshell/Modules/Plugins/PluginSettings.qml
@@ -0,0 +1,311 @@
+import QtQuick
+import Quickshell
+import qs.Common
+import qs.Widgets
+
+Item {
+ id: root
+
+ required property string pluginId
+ property var pluginService: null
+ default property list<QtObject> content
+
+ signal settingChanged
+
+ property var variants: []
+ property alias variantsModel: variantsListModel
+
+ implicitHeight: hasPermission ? settingsColumn.implicitHeight : errorText.implicitHeight
+ height: implicitHeight
+
+ readonly property bool isDesktopPlugin: {
+ if (!pluginService?.availablePlugins || !pluginId)
+ return false;
+ const plugin = pluginService.availablePlugins[pluginId];
+ return plugin?.type === "desktop";
+ }
+
+ readonly property bool hasPermission: {
+ if (!pluginService?.availablePlugins || !pluginId)
+ return true;
+ const plugin = pluginService.availablePlugins[pluginId];
+ if (!plugin)
+ return true;
+ const permissions = Array.isArray(plugin.permissions) ? plugin.permissions : [];
+ return permissions.indexOf("settings_write") !== -1;
+ }
+
+ Component.onCompleted: {
+ loadVariants();
+ }
+
+ onPluginServiceChanged: {
+ if (pluginService) {
+ loadVariants();
+ for (let i = 0; i < content.length; i++) {
+ const child = content[i];
+ if (child.loadValue) {
+ child.loadValue();
+ }
+ }
+ }
+ }
+
+ onContentChanged: {
+ for (let i = 0; i < content.length; i++) {
+ const item = content[i];
+ if (item instanceof Item) {
+ item.parent = settingsColumn;
+ }
+ }
+ }
+
+ Connections {
+ target: pluginService
+ enabled: pluginService !== null
+
+ function onPluginDataChanged(changedPluginId) {
+ if (changedPluginId === pluginId) {
+ loadVariants();
+ reloadChildValues();
+ }
+ }
+ }
+
+ function reloadChildValues() {
+ for (let i = 0; i < content.length; i++) {
+ const child = content[i];
+ if (child.loadValue) {
+ child.loadValue();
+ }
+ }
+ }
+
+ function loadVariants() {
+ if (!pluginService?.getPluginVariants || !pluginId) {
+ variants = [];
+ return;
+ }
+ variants = pluginService.getPluginVariants(pluginId);
+ syncVariantsToModel();
+ }
+
+ function syncVariantsToModel() {
+ variantsListModel.clear();
+ for (let i = 0; i < variants.length; i++) {
+ variantsListModel.append(variants[i]);
+ }
+ }
+
+ onVariantsChanged: {
+ syncVariantsToModel();
+ }
+
+ ListModel {
+ id: variantsListModel
+ }
+
+ function createVariant(variantName, variantConfig) {
+ if (!pluginService?.createPluginVariant || !pluginId) {
+ return null;
+ }
+ return pluginService.createPluginVariant(pluginId, variantName, variantConfig);
+ }
+
+ function removeVariant(variantId) {
+ if (!pluginService?.removePluginVariant || !pluginId) {
+ return;
+ }
+ pluginService.removePluginVariant(pluginId, variantId);
+ }
+
+ function updateVariant(variantId, variantConfig) {
+ if (!pluginService?.updatePluginVariant || !pluginId) {
+ return;
+ }
+ pluginService.updatePluginVariant(pluginId, variantId, variantConfig);
+ }
+
+ function saveValue(key, value) {
+ if (!pluginService) {
+ return;
+ }
+ if (!hasPermission) {
+ console.warn("PluginSettings: Plugin", pluginId, "does not have settings_write permission");
+ return;
+ }
+ if (pluginService.savePluginData) {
+ pluginService.savePluginData(pluginId, key, value);
+ settingChanged();
+ }
+ }
+
+ function loadValue(key, defaultValue) {
+ if (pluginService && pluginService.loadPluginData) {
+ return pluginService.loadPluginData(pluginId, key, defaultValue);
+ }
+ return defaultValue;
+ }
+
+ function saveState(key, value) {
+ if (!pluginService)
+ return;
+ if (pluginService.savePluginState)
+ pluginService.savePluginState(pluginId, key, value);
+ }
+
+ function loadState(key, defaultValue) {
+ if (pluginService && pluginService.loadPluginState)
+ return pluginService.loadPluginState(pluginId, key, defaultValue);
+ return defaultValue;
+ }
+
+ function clearState() {
+ if (pluginService && pluginService.clearPluginState)
+ pluginService.clearPluginState(pluginId);
+ }
+
+ function findFlickable(item) {
+ var current = item?.parent;
+ while (current) {
+ if (current.contentY !== undefined && current.contentHeight !== undefined) {
+ return current;
+ }
+ current = current.parent;
+ }
+ return null;
+ }
+
+ function ensureItemVisible(item) {
+ if (!item)
+ return;
+ var flickable = findFlickable(root);
+ if (!flickable)
+ return;
+ var itemGlobalY = item.mapToItem(null, 0, 0).y;
+ var itemHeight = item.height;
+ var flickableGlobalY = flickable.mapToItem(null, 0, 0).y;
+ var viewportHeight = flickable.height;
+
+ var itemRelativeY = itemGlobalY - flickableGlobalY;
+ var viewportTop = 0;
+ var viewportBottom = viewportHeight;
+
+ if (itemRelativeY < viewportTop) {
+ flickable.contentY = Math.max(0, flickable.contentY - (viewportTop - itemRelativeY) - Theme.spacingL);
+ } else if (itemRelativeY + itemHeight > viewportBottom) {
+ flickable.contentY = Math.min(flickable.contentHeight - viewportHeight, flickable.contentY + (itemRelativeY + itemHeight - viewportBottom) + Theme.spacingL);
+ }
+ }
+
+ StyledText {
+ id: errorText
+ visible: pluginService && !root.hasPermission
+ anchors.fill: parent
+ text: I18n.tr("This plugin does not have 'settings_write' permission.\n\nAdd \"permissions\": [\"settings_read\", \"settings_write\"] to plugin.json")
+ color: Theme.error
+ font.pixelSize: Theme.fontSizeMedium
+ wrapMode: Text.WordWrap
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ }
+
+ Column {
+ id: settingsColumn
+ visible: root.hasPermission
+ width: parent.width
+ spacing: Theme.spacingM
+
+ Item {
+ id: desktopDisplaySettings
+ visible: root.isDesktopPlugin
+ width: parent.width
+ height: visible ? displaySettingsColumn.implicitHeight : 0
+
+ Column {
+ id: displaySettingsColumn
+ width: parent.width
+ spacing: Theme.spacingS
+
+ Rectangle {
+ width: parent.width
+ height: 1
+ color: Theme.outline
+ opacity: 0.3
+ visible: root.content.length > 0
+ }
+
+ StyledText {
+ text: I18n.tr("Display Settings")
+ font.pixelSize: Theme.fontSizeMedium
+ font.weight: Font.Medium
+ color: Theme.surfaceText
+ }
+
+ StyledText {
+ text: I18n.tr("Choose which displays show this widget")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceVariantText
+ width: parent.width
+ wrapMode: Text.WordWrap
+ }
+
+ DankToggle {
+ width: parent.width
+ text: I18n.tr("All displays")
+ checked: {
+ const prefs = root.loadValue("displayPreferences", ["all"]);
+ return Array.isArray(prefs) && (prefs.includes("all") || prefs.length === 0);
+ }
+ onToggled: isChecked => {
+ if (isChecked) {
+ root.saveValue("displayPreferences", ["all"]);
+ } else {
+ root.saveValue("displayPreferences", []);
+ }
+ }
+ }
+
+ Column {
+ width: parent.width
+ spacing: Theme.spacingXS
+ visible: {
+ const prefs = root.loadValue("displayPreferences", ["all"]);
+ return !Array.isArray(prefs) || (!prefs.includes("all") && prefs.length >= 0);
+ }
+
+ Repeater {
+ model: Quickshell.screens
+
+ DankToggle {
+ required property var modelData
+ width: parent.width
+ text: SettingsData.getScreenDisplayName(modelData)
+ description: modelData.width + "×" + modelData.height
+ checked: {
+ const prefs = root.loadValue("displayPreferences", ["all"]);
+ if (!Array.isArray(prefs) || prefs.includes("all"))
+ return false;
+ return prefs.some(p => p.name === modelData.name);
+ }
+ onToggled: isChecked => {
+ var prefs = root.loadValue("displayPreferences", ["all"]);
+ if (!Array.isArray(prefs) || prefs.includes("all")) {
+ prefs = [];
+ }
+ prefs = prefs.filter(p => p.name !== modelData.name);
+ if (isChecked) {
+ prefs.push({
+ name: modelData.name,
+ model: modelData.model || ""
+ });
+ }
+ root.saveValue("displayPreferences", prefs);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}