summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml
diff options
context:
space:
mode:
authorNippy <nippy@rp1.hu>2026-05-08 19:50:49 +0200
committerNippy <nippy@rp1.hu>2026-05-08 19:50:49 +0200
commit3462bcc46ecf74f576ea4397f16492c16bd75b10 (patch)
treec5ab7aef4498647e057bda8d49c11e5f9dda74c9 /raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml
parent56616f693b4f263cbf0d47da43b67424efa6022d (diff)
downloadRaveOS-PKGBUILD-3462bcc46ecf74f576ea4397f16492c16bd75b10.tar.gz
RaveOS-PKGBUILD-3462bcc46ecf74f576ea4397f16492c16bd75b10.zip
raveos update
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml460
1 files changed, 460 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml b/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml
new file mode 100644
index 0000000..4852d6b
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DesktopWidgetInstanceCard.qml
@@ -0,0 +1,460 @@
+pragma ComponentBehavior: Bound
+
+import QtQuick
+import QtQuick.Controls
+import Quickshell
+import qs.Common
+import qs.Services
+import qs.Widgets
+import qs.Modules.Settings.Widgets
+import qs.Modules.Settings.DesktopWidgetSettings as DWS
+
+SettingsCard {
+ id: root
+
+ required property var instanceData
+ property bool isExpanded: false
+ property bool confirmingDelete: false
+
+ readonly property string instanceId: instanceData?.id ?? ""
+ readonly property string widgetType: instanceData?.widgetType ?? ""
+ readonly property var widgetDef: DesktopWidgetRegistry.getWidget(widgetType)
+ readonly property string widgetName: instanceData?.name ?? widgetDef?.name ?? widgetType
+
+ signal deleteRequested
+ signal duplicateRequested
+
+ property Component clockSettingsComponent: Component {
+ DWS.ClockSettings {}
+ }
+
+ property Component systemMonitorSettingsComponent: Component {
+ DWS.SystemMonitorSettings {}
+ }
+
+ property Component pluginSettingsComponent: Component {
+ DWS.PluginDesktopWidgetSettings {
+ instanceId: root.instanceId
+ instanceData: root.instanceData
+ widgetType: root.widgetType
+ widgetDef: root.widgetDef
+ }
+ }
+
+ width: parent?.width ?? 400
+ iconName: widgetDef?.icon ?? "widgets"
+ title: widgetName
+ collapsible: true
+ expanded: isExpanded
+
+ onExpandedChanged: isExpanded = expanded
+
+ headerActions: [
+ DankToggle {
+ checked: instanceData?.enabled ?? true
+ onToggled: isChecked => {
+ if (!root.instanceId)
+ return;
+ SettingsData.updateDesktopWidgetInstance(root.instanceId, {
+ enabled: isChecked
+ });
+ }
+ },
+ DankActionButton {
+ id: menuButton
+ iconName: "more_vert"
+ onClicked: {
+ if (actionsMenu.opened) {
+ actionsMenu.close();
+ return;
+ }
+ actionsMenu.open();
+ }
+
+ Popup {
+ id: actionsMenu
+ x: -width + parent.width
+ y: parent.height + Theme.spacingXS
+ width: 160
+ padding: Theme.spacingXS
+ modal: false
+ focus: true
+ closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
+
+ onClosed: root.confirmingDelete = false
+
+ background: Rectangle {
+ color: Theme.surfaceContainer
+ radius: Theme.cornerRadius
+ border.color: Theme.outlineLight
+ border.width: 1
+ }
+
+ contentItem: Column {
+ spacing: 2
+
+ Rectangle {
+ width: parent.width
+ height: Theme.iconSizeLarge
+ radius: Theme.cornerRadius
+ color: duplicateArea.containsMouse ? Theme.primaryHover : "transparent"
+
+ Row {
+ anchors.left: parent.left
+ anchors.leftMargin: Theme.spacingS
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: Theme.spacingS
+
+ DankIcon {
+ name: "content_copy"
+ size: Theme.iconSizeSmall
+ color: Theme.surfaceText
+ }
+
+ StyledText {
+ text: I18n.tr("Duplicate")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.surfaceText
+ }
+ }
+
+ MouseArea {
+ id: duplicateArea
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ actionsMenu.close();
+ root.duplicateRequested();
+ }
+ }
+ }
+
+ Rectangle {
+ width: parent.width
+ height: Theme.iconSizeLarge
+ radius: Theme.cornerRadius
+ color: deleteArea.containsMouse ? Theme.errorHover : "transparent"
+
+ Row {
+ anchors.left: parent.left
+ anchors.leftMargin: Theme.spacingS
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: Theme.spacingS
+
+ DankIcon {
+ name: root.confirmingDelete ? "warning" : "delete"
+ size: Theme.iconSizeSmall
+ color: Theme.error
+ }
+
+ StyledText {
+ text: root.confirmingDelete ? I18n.tr("Confirm Delete") : I18n.tr("Delete")
+ font.pixelSize: Theme.fontSizeSmall
+ color: Theme.error
+ }
+ }
+
+ MouseArea {
+ id: deleteArea
+ anchors.fill: parent
+ hoverEnabled: true
+ cursorShape: Qt.PointingHandCursor
+ onClicked: {
+ if (root.confirmingDelete) {
+ actionsMenu.close();
+ root.deleteRequested();
+ return;
+ }
+ root.confirmingDelete = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ ]
+
+ Column {
+ width: parent.width
+ spacing: 0
+ visible: root.isExpanded
+ opacity: visible ? 1 : 0
+
+ Behavior on opacity {
+ NumberAnimation {
+ duration: Theme.mediumDuration
+ easing.type: Theme.emphasizedEasing
+ }
+ }
+
+ Item {
+ width: parent.width
+ height: nameRow.height + Theme.spacingM * 2
+
+ Row {
+ id: nameRow
+ x: Theme.spacingM
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: Theme.spacingM
+ width: parent.width - Theme.spacingM * 2
+
+ StyledText {
+ text: I18n.tr("Name")
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.surfaceText
+ anchors.verticalCenter: parent.verticalCenter
+ width: 80
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ DankTextField {
+ width: parent.width - 80 - Theme.spacingM
+ text: root.widgetName
+ onEditingFinished: {
+ if (!root.instanceId)
+ return;
+ SettingsData.updateDesktopWidgetInstance(root.instanceId, {
+ name: text
+ });
+ }
+ }
+ }
+ }
+
+ SettingsDivider {}
+
+ Item {
+ width: parent.width
+ height: groupRow.height + Theme.spacingM * 2
+ visible: (SettingsData.desktopWidgetGroups || []).length > 0
+
+ Row {
+ id: groupRow
+ x: Theme.spacingM
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: Theme.spacingM
+ width: parent.width - Theme.spacingM * 2
+
+ StyledText {
+ text: I18n.tr("Group")
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.surfaceText
+ anchors.verticalCenter: parent.verticalCenter
+ width: 80
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ DankDropdown {
+ id: groupDropdown
+ width: parent.width - 80 - Theme.spacingM
+ compactMode: true
+
+ property var groupsData: {
+ const groups = SettingsData.desktopWidgetGroups || [];
+ const items = [
+ {
+ value: "",
+ label: I18n.tr("None")
+ }
+ ];
+ for (const g of groups) {
+ items.push({
+ value: g.id,
+ label: g.name
+ });
+ }
+ return items;
+ }
+
+ options: groupsData.map(g => g.label)
+ currentValue: {
+ const currentGroup = root.instanceData?.group ?? "";
+ const item = groupsData.find(g => g.value === currentGroup);
+ return item?.label ?? I18n.tr("None");
+ }
+
+ onValueChanged: value => {
+ if (!root.instanceId)
+ return;
+ const item = groupsData.find(g => g.label === value);
+ const groupId = item?.value ?? "";
+ SettingsData.updateDesktopWidgetInstance(root.instanceId, {
+ group: groupId || null
+ });
+ }
+ }
+ }
+ }
+
+ SettingsDivider {
+ visible: (SettingsData.desktopWidgetGroups || []).length > 0
+ }
+
+ SettingsToggleRow {
+ text: I18n.tr("Show on Overlay")
+ checked: instanceData?.config?.showOnOverlay ?? false
+ onToggled: isChecked => {
+ if (!root.instanceId)
+ return;
+ SettingsData.updateDesktopWidgetInstanceConfig(root.instanceId, {
+ showOnOverlay: isChecked
+ });
+ }
+ }
+
+ SettingsDivider {
+ visible: CompositorService.isNiri
+ }
+
+ SettingsToggleRow {
+ visible: CompositorService.isNiri
+ text: I18n.tr("Show on Overview")
+ checked: instanceData?.config?.showOnOverview ?? false
+ onToggled: isChecked => {
+ if (!root.instanceId)
+ return;
+ SettingsData.updateDesktopWidgetInstanceConfig(root.instanceId, {
+ showOnOverview: isChecked
+ });
+ }
+ }
+
+ SettingsDivider {
+ visible: CompositorService.isNiri
+ }
+
+ SettingsToggleRow {
+ visible: CompositorService.isNiri
+ text: I18n.tr("Show on Overview Only")
+ checked: instanceData?.config?.showOnOverviewOnly ?? false
+ onToggled: isChecked => {
+ if (!root.instanceId)
+ return;
+ SettingsData.updateDesktopWidgetInstanceConfig(root.instanceId, {
+ showOnOverviewOnly: isChecked
+ });
+ }
+ }
+
+ SettingsDivider {}
+
+ SettingsToggleRow {
+ text: I18n.tr("Click Through")
+ description: I18n.tr("Allow clicks to pass through the widget")
+ checked: instanceData?.config?.clickThrough ?? false
+ onToggled: isChecked => {
+ if (!root.instanceId)
+ return;
+ SettingsData.updateDesktopWidgetInstanceConfig(root.instanceId, {
+ clickThrough: isChecked
+ });
+ }
+ }
+
+ SettingsDivider {}
+
+ SettingsToggleRow {
+ text: I18n.tr("Sync Position Across Screens")
+ description: I18n.tr("Use the same position and size on all displays")
+ checked: instanceData?.config?.syncPositionAcrossScreens ?? false
+ onToggled: isChecked => {
+ if (!root.instanceId)
+ return;
+ if (isChecked)
+ SettingsData.syncDesktopWidgetPositionToAllScreens(root.instanceId);
+ SettingsData.updateDesktopWidgetInstanceConfig(root.instanceId, {
+ syncPositionAcrossScreens: isChecked
+ });
+ }
+ }
+
+ SettingsDivider {}
+
+ Item {
+ width: parent.width
+ height: ipcColumn.height + Theme.spacingM * 2
+
+ Column {
+ id: ipcColumn
+ x: Theme.spacingM
+ width: parent.width - Theme.spacingM * 2
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: Theme.spacingXS
+
+ StyledText {
+ text: I18n.tr("Command")
+ font.pixelSize: Theme.fontSizeMedium
+ color: Theme.surfaceText
+ width: parent.width
+ horizontalAlignment: Text.AlignLeft
+ }
+
+ Rectangle {
+ width: parent.width
+ height: ipcText.height + Theme.spacingS * 2
+ radius: Theme.cornerRadius / 2
+ color: Theme.surfaceHover
+
+ Row {
+ x: Theme.spacingS
+ anchors.verticalCenter: parent.verticalCenter
+ spacing: Theme.spacingS
+ width: parent.width - Theme.spacingS * 2
+
+ StyledText {
+ id: ipcText
+ text: "dms ipc call desktopWidget toggleOverlay " + root.instanceId
+ font.pixelSize: Theme.fontSizeSmall
+ font.family: Theme.monoFontFamily
+ color: Theme.surfaceVariantText
+ width: parent.width - copyBtn.width - Theme.spacingS
+ elide: Text.ElideMiddle
+ anchors.verticalCenter: parent.verticalCenter
+ }
+
+ DankButton {
+ id: copyBtn
+ iconName: "content_copy"
+ backgroundColor: "transparent"
+ textColor: Theme.surfaceText
+ buttonHeight: 28
+ horizontalPadding: 4
+ anchors.verticalCenter: parent.verticalCenter
+ onClicked: {
+ Quickshell.execDetached(["dms", "cl", "copy", "dms ipc call desktopWidget toggleOverlay " + root.instanceId]);
+ ToastService.showInfo(I18n.tr("Copied to clipboard"));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ SettingsDivider {}
+
+ Loader {
+ id: settingsLoader
+ width: parent.width
+ active: root.isExpanded && root.widgetType !== ""
+
+ sourceComponent: {
+ switch (root.widgetType) {
+ case "desktopClock":
+ return clockSettingsComponent;
+ case "systemMonitor":
+ return systemMonitorSettingsComponent;
+ default:
+ return pluginSettingsComponent;
+ }
+ }
+
+ onLoaded: {
+ if (!item)
+ return;
+ item.instanceId = root.instanceId;
+ item.instanceData = Qt.binding(() => root.instanceData);
+ }
+ }
+ }
+}