diff options
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Modules/Settings/DisplayWidgetsTab.qml')
| -rw-r--r-- | raveos-hyprland-theme/theme-data/dms/Modules/Settings/DisplayWidgetsTab.qml | 522 |
1 files changed, 522 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DisplayWidgetsTab.qml b/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DisplayWidgetsTab.qml new file mode 100644 index 0000000..59f6513 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/dms/Modules/Settings/DisplayWidgetsTab.qml @@ -0,0 +1,522 @@ +import QtQuick +import QtQuick.Layouts +import Quickshell +import qs.Common +import qs.Services +import qs.Widgets + +Item { + id: root + + LayoutMirroring.enabled: I18n.isRtl + LayoutMirroring.childrenInherit: true + + function getBarComponentsFromSettings() { + const bars = SettingsData.barConfigs || []; + return bars.map(bar => ({ + "id": "bar:" + bar.id, + "name": bar.name || "Bar", + "description": I18n.tr("Individual bar configuration"), + "icon": "toolbar", + "barId": bar.id + })); + } + + property var variantComponents: getVariantComponentsList() + + function getVariantComponentsList() { + return [...getBarComponentsFromSettings(), + { + "id": "dock", + "name": I18n.tr("Application Dock"), + "description": I18n.tr("Bottom dock for pinned and running applications"), + "icon": "dock" + }, + { + "id": "notifications", + "name": I18n.tr("Notification Popups"), + "description": I18n.tr("Notification toast popups"), + "icon": "notifications" + }, + { + "id": "wallpaper", + "name": I18n.tr("Wallpaper"), + "description": I18n.tr("Desktop background images"), + "icon": "wallpaper" + }, + { + "id": "osd", + "name": I18n.tr("On-Screen Displays"), + "description": I18n.tr("Volume, brightness, and other system OSDs"), + "icon": "picture_in_picture" + }, + { + "id": "toast", + "name": I18n.tr("Toast Messages"), + "description": I18n.tr("System toast notifications"), + "icon": "campaign" + }, + { + "id": "notepad", + "name": I18n.tr("Notepad Slideout"), + "description": I18n.tr("Quick note-taking slideout panel"), + "icon": "sticky_note_2" + } + ]; + } + + Connections { + target: SettingsData + function onBarConfigsChanged() { + variantComponents = getVariantComponentsList(); + } + } + + function getScreenPreferences(componentId) { + if (componentId.startsWith("bar:")) { + const barId = componentId.substring(4); + const barConfig = SettingsData.getBarConfig(barId); + return barConfig?.screenPreferences || ["all"]; + } + return SettingsData.screenPreferences && SettingsData.screenPreferences[componentId] || ["all"]; + } + + function setScreenPreferences(componentId, screenNames) { + if (componentId.startsWith("bar:")) { + const barId = componentId.substring(4); + SettingsData.updateBarConfig(barId, { + "screenPreferences": screenNames + }); + return; + } + var prefs = SettingsData.screenPreferences || {}; + var newPrefs = Object.assign({}, prefs); + newPrefs[componentId] = screenNames; + SettingsData.set("screenPreferences", newPrefs); + } + + function getShowOnLastDisplay(componentId) { + if (componentId.startsWith("bar:")) { + const barId = componentId.substring(4); + const barConfig = SettingsData.getBarConfig(barId); + return barConfig?.showOnLastDisplay ?? true; + } + return SettingsData.showOnLastDisplay && SettingsData.showOnLastDisplay[componentId] || false; + } + + function setShowOnLastDisplay(componentId, enabled) { + if (componentId.startsWith("bar:")) { + const barId = componentId.substring(4); + SettingsData.updateBarConfig(barId, { + "showOnLastDisplay": enabled + }); + return; + } + var prefs = SettingsData.showOnLastDisplay || {}; + var newPrefs = Object.assign({}, prefs); + newPrefs[componentId] = enabled; + SettingsData.set("showOnLastDisplay", newPrefs); + } + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + topPadding: 4 + + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + StyledRect { + width: parent.width + height: screensInfoSection.implicitHeight + Theme.spacingL * 2 + radius: Theme.cornerRadius + color: Theme.surfaceContainerHigh + border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) + border.width: 0 + + Column { + id: screensInfoSection + + anchors.fill: parent + anchors.margins: Theme.spacingL + spacing: Theme.spacingM + + Row { + width: parent.width + spacing: Theme.spacingM + + DankIcon { + name: "monitor" + size: Theme.iconSize + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + + Column { + width: parent.width - Theme.iconSize - Theme.spacingM + spacing: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: I18n.tr("Connected Displays") + font.pixelSize: Theme.fontSizeLarge + font.weight: Font.Medium + color: Theme.surfaceText + width: parent.width + horizontalAlignment: Text.AlignLeft + } + + StyledText { + text: I18n.tr("Configure which displays show shell components") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + horizontalAlignment: Text.AlignLeft + } + } + } + + Column { + width: parent.width + spacing: Theme.spacingS + + Column { + width: parent.width + spacing: Theme.spacingXS + + Row { + width: parent.width + spacing: Theme.spacingM + + StyledText { + text: I18n.tr("Available Screens (%1)").arg(Quickshell.screens.length) + font.pixelSize: Theme.fontSizeMedium + font.weight: Font.Medium + color: Theme.surfaceText + horizontalAlignment: Text.AlignLeft + } + + Item { + width: 1 + height: 1 + Layout.fillWidth: true + } + + Column { + spacing: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: I18n.tr("Display Name Format") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + anchors.horizontalCenter: parent.horizontalCenter + } + + DankButtonGroup { + id: displayModeGroup + model: [I18n.tr("Name"), I18n.tr("Model")] + currentIndex: SettingsData.displayNameMode === "model" ? 1 : 0 + onSelectionChanged: (index, selected) => { + if (!selected) + return; + SettingsData.displayNameMode = index === 1 ? "model" : "system"; + SettingsData.saveSettings(); + } + + Connections { + target: SettingsData + function onDisplayNameModeChanged() { + displayModeGroup.currentIndex = SettingsData.displayNameMode === "model" ? 1 : 0; + } + } + } + } + } + } + + Repeater { + model: Quickshell.screens + + delegate: Rectangle { + width: parent.width + height: screenRow.implicitHeight + Theme.spacingS * 2 + radius: Theme.cornerRadius + color: Theme.surfaceContainerHigh + border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.3) + border.width: 0 + + Row { + id: screenRow + + anchors.fill: parent + anchors.margins: Theme.spacingS + spacing: Theme.spacingM + + DankIcon { + name: "desktop_windows" + size: Theme.iconSize - 4 + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + + Column { + width: parent.width - Theme.iconSize - Theme.spacingM * 2 + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingXS / 2 + + StyledText { + text: SettingsData.getScreenDisplayName(modelData) + font.pixelSize: Theme.fontSizeMedium + font.weight: Font.Medium + color: Theme.surfaceText + width: parent.width + horizontalAlignment: Text.AlignLeft + } + + Row { + width: parent.width + spacing: Theme.spacingS + + property var wlrOutput: WlrOutputService.wlrOutputAvailable ? WlrOutputService.getOutput(modelData.name) : null + property var currentMode: wlrOutput?.currentMode + + StyledText { + text: { + if (parent.currentMode) { + return parent.currentMode.width + "×" + parent.currentMode.height + "@" + Math.round(parent.currentMode.refresh / 1000) + "Hz"; + } + return modelData.width + "×" + modelData.height; + } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + + StyledText { + text: "•" + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + + StyledText { + text: SettingsData.displayNameMode === "system" ? (modelData.model || "Unknown Model") : modelData.name + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + } + } + } + } + } + } + } + } + + Column { + width: parent.width + spacing: Theme.spacingL + + Repeater { + model: root.variantComponents + + delegate: StyledRect { + width: parent.width + height: componentSection.implicitHeight + Theme.spacingL * 2 + radius: Theme.cornerRadius + color: Theme.surfaceContainerHigh + border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) + border.width: 0 + + Column { + id: componentSection + + anchors.fill: parent + anchors.margins: Theme.spacingL + spacing: Theme.spacingM + + Row { + width: parent.width + spacing: Theme.spacingM + + DankIcon { + name: modelData.icon + size: Theme.iconSize + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + + Column { + width: parent.width - Theme.iconSize - Theme.spacingM + spacing: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: modelData.name + font.pixelSize: Theme.fontSizeLarge + font.weight: Font.Medium + color: Theme.surfaceText + width: parent.width + horizontalAlignment: Text.AlignLeft + } + + StyledText { + text: modelData.description + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + horizontalAlignment: Text.AlignLeft + } + } + } + + Column { + width: parent.width + spacing: Theme.spacingS + + StyledText { + text: I18n.tr("Show on screens:") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + font.weight: Font.Medium + width: parent.width + horizontalAlignment: Text.AlignLeft + } + + Column { + property string componentId: modelData.id + + width: parent.width + spacing: Theme.spacingXS + + DankToggle { + width: parent.width + text: I18n.tr("All displays") + description: I18n.tr("Show on all connected displays") + checked: { + var prefs = root.getScreenPreferences(parent.componentId); + return prefs.includes("all") || (typeof prefs[0] === "string" && prefs[0] === "all"); + } + onToggled: checked => { + if (checked) { + root.setScreenPreferences(parent.componentId, ["all"]); + } else { + root.setScreenPreferences(parent.componentId, []); + const cid = parent.componentId; + if (["dankBar", "dock", "notifications", "osd", "toast"].includes(cid) || cid.startsWith("bar:")) { + root.setShowOnLastDisplay(cid, true); + } + } + } + } + + DankToggle { + width: parent.width + text: I18n.tr("Focused monitor only") + description: I18n.tr("Show notifications only on the currently focused monitor") + visible: parent.componentId === "notifications" + checked: SettingsData.notificationFocusedMonitor + onToggled: checked => SettingsData.set("notificationFocusedMonitor", checked) + } + + DankToggle { + width: parent.width + text: I18n.tr("Show on Last Display") + description: I18n.tr("Always show when there's only one connected display") + checked: root.getShowOnLastDisplay(parent.componentId) + visible: { + const prefs = root.getScreenPreferences(parent.componentId); + const isAll = prefs.includes("all") || (typeof prefs[0] === "string" && prefs[0] === "all"); + const cid = parent.componentId; + const isRelevantComponent = ["dankBar", "dock", "notifications", "osd", "toast", "notepad"].includes(cid) || cid.startsWith("bar:"); + return !isAll && isRelevantComponent; + } + onToggled: checked => { + root.setShowOnLastDisplay(parent.componentId, checked); + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + visible: { + var prefs = root.getScreenPreferences(parent.componentId); + return !prefs.includes("all") && !(typeof prefs[0] === "string" && prefs[0] === "all"); + } + } + + Column { + width: parent.width + spacing: Theme.spacingXS + visible: { + var prefs = root.getScreenPreferences(parent.componentId); + return !prefs.includes("all") && !(typeof prefs[0] === "string" && prefs[0] === "all"); + } + + Repeater { + model: Quickshell.screens + + delegate: DankToggle { + property var screenData: modelData + property string componentId: parent.parent.componentId + + width: parent.width + text: SettingsData.getScreenDisplayName(screenData) + description: screenData.width + "×" + screenData.height + " • " + (SettingsData.displayNameMode === "system" ? (screenData.model || "Unknown Model") : screenData.name) + checked: { + var prefs = root.getScreenPreferences(componentId); + if (typeof prefs[0] === "string" && prefs[0] === "all") + return false; + return SettingsData.isScreenInPreferences(screenData, prefs); + } + onToggled: checked => { + var currentPrefs = root.getScreenPreferences(componentId); + if (typeof currentPrefs[0] === "string" && currentPrefs[0] === "all") { + currentPrefs = []; + } + + const screenModelIndex = SettingsData.getScreenModelIndex(screenData); + + var newPrefs = currentPrefs.filter(pref => { + if (typeof pref === "string") + return false; + if (pref.modelIndex !== undefined && screenModelIndex >= 0) { + return !(pref.model === screenData.model && pref.modelIndex === screenModelIndex); + } + return pref.name !== screenData.name || pref.model !== screenData.model; + }); + + if (checked) { + const prefObj = { + "name": screenData.name, + "model": screenData.model || "" + }; + if (screenModelIndex >= 0) { + prefObj.modelIndex = screenModelIndex; + } + newPrefs.push(prefObj); + } + + root.setScreenPreferences(componentId, newPrefs); + } + } + } + } + } + } + } + } + } + } + } + } +} |