diff --git a/quickshell/Modals/Settings/PowerSettings.qml b/quickshell/Modals/Settings/PowerSettings.qml deleted file mode 100644 index 72b356d3..00000000 --- a/quickshell/Modals/Settings/PowerSettings.qml +++ /dev/null @@ -1,1008 +0,0 @@ -import QtQuick -import Quickshell -import qs.Common -import qs.Services -import qs.Widgets - -Item { - id: powerTab - - DankFlickable { - anchors.fill: parent - anchors.topMargin: Theme.spacingL - clip: true - contentHeight: mainColumn.height + Theme.spacingXL - contentWidth: width - - Column { - id: mainColumn - width: Math.min(550, parent.width - Theme.spacingL * 2) - anchors.horizontalCenter: parent.horizontalCenter - spacing: Theme.spacingXL - - StyledRect { - width: parent.width - height: lockScreenSection.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: lockScreenSection - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "lock" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Lock Screen") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Power Actions") - description: I18n.tr("Show power, restart, and logout buttons on the lock screen") - checked: SettingsData.lockScreenShowPowerActions - onToggled: checked => SettingsData.set("lockScreenShowPowerActions", checked) - } - - StyledText { - text: I18n.tr("loginctl not available - lock integration requires DMS socket connection") - font.pixelSize: Theme.fontSizeSmall - color: Theme.warning - visible: !SessionService.loginctlAvailable - width: parent.width - wrapMode: Text.Wrap - } - - DankToggle { - width: parent.width - text: I18n.tr("Enable loginctl lock integration") - description: I18n.tr("Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen") - checked: SessionService.loginctlAvailable && SettingsData.loginctlLockIntegration - enabled: SessionService.loginctlAvailable - onToggled: checked => { - if (SessionService.loginctlAvailable) { - SettingsData.set("loginctlLockIntegration", checked); - } - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Lock before suspend") - description: I18n.tr("Automatically lock the screen when the system prepares to suspend") - checked: SettingsData.lockBeforeSuspend - visible: SessionService.loginctlAvailable && SettingsData.loginctlLockIntegration - onToggled: checked => SettingsData.set("lockBeforeSuspend", checked) - } - - DankToggle { - width: parent.width - text: I18n.tr("Enable fingerprint authentication") - description: I18n.tr("Use fingerprint reader for lock screen authentication (requires enrolled fingerprints)") - checked: SettingsData.enableFprint - visible: SettingsData.fprintdAvailable - onToggled: checked => SettingsData.set("enableFprint", checked) - } - } - } - - StyledRect { - width: parent.width - height: lockDisplaySection.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 - visible: Quickshell.screens.length > 1 - - Column { - id: lockDisplaySection - 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 - } - - StyledText { - text: I18n.tr("Lock Screen Display") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - text: I18n.tr("Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - wrapMode: Text.Wrap - } - - DankDropdown { - id: lockScreenMonitorDropdown - width: parent.width - addHorizontalPadding: true - text: I18n.tr("Active Lock Screen Monitor") - options: { - var opts = [I18n.tr("All Monitors")]; - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - opts.push(SettingsData.getScreenDisplayName(screens[i])); - } - return opts; - } - - Component.onCompleted: { - if (SettingsData.lockScreenActiveMonitor === "all") { - currentValue = I18n.tr("All Monitors"); - return; - } - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - if (screens[i].name === SettingsData.lockScreenActiveMonitor) { - currentValue = SettingsData.getScreenDisplayName(screens[i]); - return; - } - } - currentValue = I18n.tr("All Monitors"); - } - - onValueChanged: value => { - if (value === I18n.tr("All Monitors")) { - SettingsData.set("lockScreenActiveMonitor", "all"); - return; - } - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - if (SettingsData.getScreenDisplayName(screens[i]) === value) { - SettingsData.set("lockScreenActiveMonitor", screens[i].name); - return; - } - } - } - } - - Row { - width: parent.width - spacing: Theme.spacingM - visible: SettingsData.lockScreenActiveMonitor !== "all" - - Column { - width: parent.width - inactiveColorPreview.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Inactive Monitor Color") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Color displayed on monitors without the lock screen") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - wrapMode: Text.Wrap - } - } - - Rectangle { - id: inactiveColorPreview - width: 48 - height: 48 - radius: Theme.cornerRadius - color: SettingsData.lockScreenInactiveColor - border.color: Theme.outline - border.width: 1 - anchors.verticalCenter: parent.verticalCenter - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (!PopoutService.colorPickerModal) - return; - PopoutService.colorPickerModal.selectedColor = SettingsData.lockScreenInactiveColor; - PopoutService.colorPickerModal.pickerTitle = I18n.tr("Inactive Monitor Color"); - PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { - SettingsData.set("lockScreenInactiveColor", selectedColor); - }; - PopoutService.colorPickerModal.show(); - } - } - } - } - } - } - - StyledRect { - width: parent.width - height: timeoutSection.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: timeoutSection - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "schedule" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Idle Settings") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: Math.max(0, parent.width - parent.children[0].width - parent.children[1].width - powerCategory.width - Theme.spacingM * 3) - height: parent.height - } - - DankButtonGroup { - id: powerCategory - anchors.verticalCenter: parent.verticalCenter - visible: BatteryService.batteryAvailable - model: ["AC Power", "Battery"] - currentIndex: 0 - selectionMode: "single" - checkEnabled: false - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Prevent idle for media") - description: I18n.tr("Inhibit idle timeout when audio or video is playing") - checked: SettingsData.preventIdleForMedia - visible: IdleService.idleMonitorAvailable - onToggled: checked => SettingsData.set("preventIdleForMedia", checked) - } - - DankToggle { - width: parent.width - text: I18n.tr("Fade to lock screen") - description: I18n.tr("Gradually fade the screen before locking with a configurable grace period") - checked: SettingsData.fadeToLockEnabled - onToggled: checked => SettingsData.set("fadeToLockEnabled", checked) - } - - DankDropdown { - id: fadeGracePeriodDropdown - property var periodOptions: ["1 second", "2 seconds", "3 seconds", "4 seconds", "5 seconds", "10 seconds", "15 seconds", "20 seconds", "30 seconds"] - property var periodValues: [1, 2, 3, 4, 5, 10, 15, 20, 30] - - width: parent.width - addHorizontalPadding: true - text: I18n.tr("Fade grace period") - options: periodOptions - visible: SettingsData.fadeToLockEnabled - enabled: SettingsData.fadeToLockEnabled - - Component.onCompleted: { - const currentPeriod = SettingsData.fadeToLockGracePeriod; - const index = periodValues.indexOf(currentPeriod); - currentValue = index >= 0 ? periodOptions[index] : "5 seconds"; - } - - onValueChanged: value => { - const index = periodOptions.indexOf(value); - if (index >= 0) { - SettingsData.set("fadeToLockGracePeriod", periodValues[index]); - } - } - } - - DankDropdown { - id: lockDropdown - property var timeoutOptions: ["Never", "1 minute", "2 minutes", "3 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes", "30 minutes", "1 hour", "1 hour 30 minutes", "2 hours", "3 hours"] - property var timeoutValues: [0, 60, 120, 180, 300, 600, 900, 1200, 1800, 3600, 5400, 7200, 10800] - - addHorizontalPadding: true - text: I18n.tr("Automatically lock after") - options: timeoutOptions - - Connections { - target: powerCategory - function onCurrentIndexChanged() { - const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acLockTimeout : SettingsData.batteryLockTimeout; - const index = lockDropdown.timeoutValues.indexOf(currentTimeout); - lockDropdown.currentValue = index >= 0 ? lockDropdown.timeoutOptions[index] : "Never"; - } - } - - Component.onCompleted: { - const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acLockTimeout : SettingsData.batteryLockTimeout; - const index = timeoutValues.indexOf(currentTimeout); - currentValue = index >= 0 ? timeoutOptions[index] : "Never"; - } - - onValueChanged: value => { - const index = timeoutOptions.indexOf(value); - if (index >= 0) { - const timeout = timeoutValues[index]; - if (powerCategory.currentIndex === 0) { - SettingsData.set("acLockTimeout", timeout); - } else { - SettingsData.set("batteryLockTimeout", timeout); - } - } - } - } - - DankDropdown { - id: monitorDropdown - property var timeoutOptions: ["Never", "1 minute", "2 minutes", "3 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes", "30 minutes", "1 hour", "1 hour 30 minutes", "2 hours", "3 hours"] - property var timeoutValues: [0, 60, 120, 180, 300, 600, 900, 1200, 1800, 3600, 5400, 7200, 10800] - - addHorizontalPadding: true - text: I18n.tr("Turn off monitors after") - options: timeoutOptions - - Connections { - target: powerCategory - function onCurrentIndexChanged() { - const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acMonitorTimeout : SettingsData.batteryMonitorTimeout; - const index = monitorDropdown.timeoutValues.indexOf(currentTimeout); - monitorDropdown.currentValue = index >= 0 ? monitorDropdown.timeoutOptions[index] : "Never"; - } - } - - Component.onCompleted: { - const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acMonitorTimeout : SettingsData.batteryMonitorTimeout; - const index = timeoutValues.indexOf(currentTimeout); - currentValue = index >= 0 ? timeoutOptions[index] : "Never"; - } - - onValueChanged: value => { - const index = timeoutOptions.indexOf(value); - if (index >= 0) { - const timeout = timeoutValues[index]; - if (powerCategory.currentIndex === 0) { - SettingsData.set("acMonitorTimeout", timeout); - } else { - SettingsData.set("batteryMonitorTimeout", timeout); - } - } - } - } - - DankDropdown { - id: suspendDropdown - property var timeoutOptions: ["Never", "1 minute", "2 minutes", "3 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes", "30 minutes", "1 hour", "1 hour 30 minutes", "2 hours", "3 hours"] - property var timeoutValues: [0, 60, 120, 180, 300, 600, 900, 1200, 1800, 3600, 5400, 7200, 10800] - - addHorizontalPadding: true - text: I18n.tr("Suspend system after") - options: timeoutOptions - - Connections { - target: powerCategory - function onCurrentIndexChanged() { - const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acSuspendTimeout : SettingsData.batterySuspendTimeout; - const index = suspendDropdown.timeoutValues.indexOf(currentTimeout); - suspendDropdown.currentValue = index >= 0 ? suspendDropdown.timeoutOptions[index] : "Never"; - } - } - - Component.onCompleted: { - const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acSuspendTimeout : SettingsData.batterySuspendTimeout; - const index = timeoutValues.indexOf(currentTimeout); - currentValue = index >= 0 ? timeoutOptions[index] : "Never"; - } - - onValueChanged: value => { - const index = timeoutOptions.indexOf(value); - if (index >= 0) { - const timeout = timeoutValues[index]; - if (powerCategory.currentIndex === 0) { - SettingsData.set("acSuspendTimeout", timeout); - } else { - SettingsData.set("batterySuspendTimeout", timeout); - } - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - visible: SessionService.hibernateSupported - - StyledText { - text: I18n.tr("Suspend behavior") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - leftPadding: Theme.spacingM - } - - DankButtonGroup { - id: suspendBehaviorSelector - anchors.horizontalCenter: parent.horizontalCenter - model: ["Suspend", "Hibernate", "Suspend then Hibernate"] - selectionMode: "single" - checkEnabled: false - - Connections { - target: powerCategory - function onCurrentIndexChanged() { - const behavior = powerCategory.currentIndex === 0 ? SettingsData.acSuspendBehavior : SettingsData.batterySuspendBehavior; - suspendBehaviorSelector.currentIndex = behavior; - } - } - - Component.onCompleted: { - const behavior = powerCategory.currentIndex === 0 ? SettingsData.acSuspendBehavior : SettingsData.batterySuspendBehavior; - currentIndex = behavior; - } - - onSelectionChanged: (index, selected) => { - if (selected) { - if (powerCategory.currentIndex === 0) { - SettingsData.set("acSuspendBehavior", index); - } else { - SettingsData.set("batterySuspendBehavior", index); - } - } - } - } - } - - StyledText { - text: I18n.tr("Idle monitoring not supported - requires newer Quickshell version") - font.pixelSize: Theme.fontSizeSmall - color: Theme.error - anchors.horizontalCenter: parent.horizontalCenter - visible: !IdleService.idleMonitorAvailable - } - } - } - - StyledRect { - width: parent.width - height: powerMenuCustomSection.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: powerMenuCustomSection - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "tune" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Power Menu Customization") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - text: I18n.tr("Customize which actions appear in the power menu") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - wrapMode: Text.Wrap - } - - DankToggle { - width: parent.width - text: I18n.tr("Use Grid Layout") - description: I18n.tr("Display power menu actions in a grid instead of a list") - checked: SettingsData.powerMenuGridLayout - onToggled: checked => SettingsData.set("powerMenuGridLayout", checked) - } - - DankDropdown { - id: defaultActionDropdown - width: parent.width - addHorizontalPadding: true - text: I18n.tr("Default selected action") - options: ["Reboot", "Log Out", "Power Off", "Lock", "Suspend", "Restart DMS", "Hibernate"] - property var actionValues: ["reboot", "logout", "poweroff", "lock", "suspend", "restart", "hibernate"] - - Component.onCompleted: { - const currentAction = SettingsData.powerMenuDefaultAction || "logout"; - const index = actionValues.indexOf(currentAction); - currentValue = index >= 0 ? options[index] : "Log Out"; - } - - onValueChanged: value => { - const index = options.indexOf(value); - if (index >= 0) { - SettingsData.set("powerMenuDefaultAction", actionValues[index]); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - DankToggle { - width: parent.width - text: I18n.tr("Show Reboot") - checked: SettingsData.powerMenuActions.includes("reboot") - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("reboot")) { - actions.push("reboot"); - } else if (!checked) { - actions = actions.filter(a => a !== "reboot"); - } - SettingsData.set("powerMenuActions", actions); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Log Out") - checked: SettingsData.powerMenuActions.includes("logout") - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("logout")) { - actions.push("logout"); - } else if (!checked) { - actions = actions.filter(a => a !== "logout"); - } - SettingsData.set("powerMenuActions", actions); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Power Off") - checked: SettingsData.powerMenuActions.includes("poweroff") - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("poweroff")) { - actions.push("poweroff"); - } else if (!checked) { - actions = actions.filter(a => a !== "poweroff"); - } - SettingsData.set("powerMenuActions", actions); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Lock") - checked: SettingsData.powerMenuActions.includes("lock") - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("lock")) { - actions.push("lock"); - } else if (!checked) { - actions = actions.filter(a => a !== "lock"); - } - SettingsData.set("powerMenuActions", actions); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Suspend") - checked: SettingsData.powerMenuActions.includes("suspend") - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("suspend")) { - actions.push("suspend"); - } else if (!checked) { - actions = actions.filter(a => a !== "suspend"); - } - SettingsData.set("powerMenuActions", actions); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Restart DMS") - description: I18n.tr("Restart the DankMaterialShell") - checked: SettingsData.powerMenuActions.includes("restart") - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("restart")) { - actions.push("restart"); - } else if (!checked) { - actions = actions.filter(a => a !== "restart"); - } - SettingsData.set("powerMenuActions", actions); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Hibernate") - description: I18n.tr("Only visible if hibernate is supported by your system") - checked: SettingsData.powerMenuActions.includes("hibernate") - visible: SessionService.hibernateSupported - onToggled: checked => { - let actions = [...SettingsData.powerMenuActions]; - if (checked && !actions.includes("hibernate")) { - actions.push("hibernate"); - } else if (!checked) { - actions = actions.filter(a => a !== "hibernate"); - } - SettingsData.set("powerMenuActions", actions); - } - } - } - } - } - - StyledRect { - width: parent.width - height: powerCommandConfirmSection.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: powerCommandConfirmSection - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "check_circle" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Power Action Confirmation") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Hold to Confirm Power Actions") - description: I18n.tr("Require holding button/key to confirm power off, restart, suspend, hibernate and logout") - checked: SettingsData.powerActionConfirm - onToggled: checked => SettingsData.set("powerActionConfirm", checked) - } - - Column { - width: parent.width - spacing: Theme.spacingS - visible: SettingsData.powerActionConfirm - - Item { - width: parent.width - Theme.spacingM * 2 - anchors.horizontalCenter: parent.horizontalCenter - height: holdDurationLabel.height - - StyledText { - id: holdDurationLabel - text: I18n.tr("Hold Duration") - font.pixelSize: Appearance.fontSize.normal - font.weight: Font.Medium - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: SettingsData.powerActionHoldDuration + "s" - font.pixelSize: Appearance.fontSize.normal - font.weight: Font.Medium - color: Theme.primary - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - } - } - - DankSlider { - width: parent.width - Theme.spacingM * 2 - anchors.horizontalCenter: parent.horizontalCenter - minimum: 1 - maximum: 10 - unit: "s" - wheelEnabled: false - showValue: false - thumbOutlineColor: Theme.surfaceContainerHigh - value: SettingsData.powerActionHoldDuration - onSliderValueChanged: newValue => SettingsData.set("powerActionHoldDuration", newValue) - } - } - } - } - - StyledRect { - width: parent.width - height: powerCommandCustomization.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: powerCommandCustomization - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingL - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "developer_mode" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Custom Power Actions") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Column { - width: parent.width - spacing: Theme.spacingXS - anchors.left: parent.left - - StyledText { - text: I18n.tr("Command or script to run instead of the standard lock procedure") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: customLockCommand - width: parent.width - height: 48 - placeholderText: "/usr/bin/myLock.sh" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.customPowerActionLock) { - text = SettingsData.customPowerActionLock; - } - } - - onTextEdited: { - SettingsData.set("customPowerActionLock", text.trim()); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingXS - anchors.left: parent.left - - StyledText { - text: I18n.tr("Command or script to run instead of the standard logout procedure") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: customLogoutCommand - width: parent.width - height: 48 - placeholderText: "/usr/bin/myLogout.sh" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.customPowerActionLogout) { - text = SettingsData.customPowerActionLogout; - } - } - - onTextEdited: { - SettingsData.set("customPowerActionLogout", text.trim()); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingXS - anchors.left: parent.left - - StyledText { - text: I18n.tr("Command or script to run instead of the standard suspend procedure") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: customSuspendCommand - width: parent.width - height: 48 - placeholderText: "/usr/bin/mySuspend.sh" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.customPowerActionSuspend) { - text = SettingsData.customPowerActionSuspend; - } - } - - onTextEdited: { - SettingsData.set("customPowerActionSuspend", text.trim()); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingXS - anchors.left: parent.left - - StyledText { - text: I18n.tr("Command or script to run instead of the standard hibernate procedure") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: customHibernateCommand - width: parent.width - height: 48 - placeholderText: "/usr/bin/myHibernate.sh" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.customPowerActionHibernate) { - text = SettingsData.customPowerActionHibernate; - } - } - - onTextEdited: { - SettingsData.set("customPowerActionHibernate", text.trim()); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingXS - anchors.left: parent.left - - StyledText { - text: I18n.tr("Command or script to run instead of the standard reboot procedure") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: customRebootCommand - width: parent.width - height: 48 - placeholderText: "/usr/bin/myReboot.sh" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.customPowerActionReboot) { - text = SettingsData.customPowerActionReboot; - } - } - - onTextEdited: { - SettingsData.set("customPowerActionReboot", text.trim()); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingXS - anchors.left: parent.left - - StyledText { - text: I18n.tr("Command or script to run instead of the standard power off procedure") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: customPowerOffCommand - width: parent.width - height: 48 - placeholderText: "/usr/bin/myPowerOff.sh" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.customPowerActionPowerOff) { - text = SettingsData.customPowerActionPowerOff; - } - } - - onTextEdited: { - SettingsData.set("customPowerActionPowerOff", text.trim()); - } - } - } - } - } - } - } -} diff --git a/quickshell/Modals/Settings/SettingsContent.qml b/quickshell/Modals/Settings/SettingsContent.qml index 9c071583..1cedfcf9 100644 --- a/quickshell/Modals/Settings/SettingsContent.qml +++ b/quickshell/Modals/Settings/SettingsContent.qml @@ -19,15 +19,14 @@ FocusScope { color: "transparent" Loader { - id: personalizationLoader - + id: wallpaperLoader anchors.fill: parent active: root.currentIndex === 0 visible: active focus: active sourceComponent: Component { - PersonalizationTab { + WallpaperTab { parentModal: root.parentModal } } @@ -41,7 +40,6 @@ FocusScope { Loader { id: timeWeatherLoader - anchors.fill: parent active: root.currentIndex === 1 visible: active @@ -58,7 +56,6 @@ FocusScope { Loader { id: keybindsLoader - anchors.fill: parent active: root.currentIndex === 2 visible: active @@ -77,7 +74,6 @@ FocusScope { Loader { id: topBarLoader - anchors.fill: parent active: root.currentIndex === 3 visible: active @@ -95,14 +91,13 @@ FocusScope { } Loader { - id: widgetsLoader - + id: workspacesLoader anchors.fill: parent active: root.currentIndex === 4 visible: active focus: active - sourceComponent: WidgetTweaksTab {} + sourceComponent: WorkspacesTab {} onActiveChanged: { if (active && item) { @@ -113,7 +108,6 @@ FocusScope { Loader { id: dockLoader - anchors.fill: parent active: root.currentIndex === 5 visible: active @@ -132,7 +126,6 @@ FocusScope { Loader { id: displaysLoader - anchors.fill: parent active: root.currentIndex === 6 visible: active @@ -149,7 +142,6 @@ FocusScope { Loader { id: networkLoader - anchors.fill: parent active: root.currentIndex === 7 visible: active @@ -166,7 +158,6 @@ FocusScope { Loader { id: printerLoader - anchors.fill: parent active: root.currentIndex === 8 visible: active @@ -183,7 +174,6 @@ FocusScope { Loader { id: launcherLoader - anchors.fill: parent active: root.currentIndex === 9 visible: active @@ -200,7 +190,6 @@ FocusScope { Loader { id: themeColorsLoader - anchors.fill: parent active: root.currentIndex === 10 visible: active @@ -216,14 +205,13 @@ FocusScope { } Loader { - id: powerLoader - + id: lockScreenLoader anchors.fill: parent active: root.currentIndex === 11 visible: active focus: active - sourceComponent: PowerSettings {} + sourceComponent: LockScreenTab {} onActiveChanged: { if (active && item) { @@ -234,7 +222,6 @@ FocusScope { Loader { id: pluginsLoader - anchors.fill: parent active: root.currentIndex === 12 visible: active @@ -253,7 +240,6 @@ FocusScope { Loader { id: aboutLoader - anchors.fill: parent active: root.currentIndex === 13 visible: active @@ -267,5 +253,133 @@ FocusScope { } } } + + Loader { + id: typographyMotionLoader + anchors.fill: parent + active: root.currentIndex === 14 + visible: active + focus: active + + sourceComponent: TypographyMotionTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: soundsLoader + anchors.fill: parent + active: root.currentIndex === 15 + visible: active + focus: active + + sourceComponent: SoundsTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: mediaPlayerLoader + anchors.fill: parent + active: root.currentIndex === 16 + visible: active + focus: active + + sourceComponent: MediaPlayerTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: notificationsLoader + anchors.fill: parent + active: root.currentIndex === 17 + visible: active + focus: active + + sourceComponent: NotificationsTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: osdLoader + anchors.fill: parent + active: root.currentIndex === 18 + visible: active + focus: active + + sourceComponent: OSDTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: runningAppsLoader + anchors.fill: parent + active: root.currentIndex === 19 + visible: active + focus: active + + sourceComponent: RunningAppsTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: systemUpdaterLoader + anchors.fill: parent + active: root.currentIndex === 20 + visible: active + focus: active + + sourceComponent: SystemUpdaterTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } + + Loader { + id: powerSleepLoader + anchors.fill: parent + active: root.currentIndex === 21 + visible: active + focus: active + + sourceComponent: PowerSleepTab {} + + onActiveChanged: { + if (active && item) { + Qt.callLater(() => item.forceActiveFocus()); + } + } + } } } diff --git a/quickshell/Modals/Settings/SettingsModal.qml b/quickshell/Modals/Settings/SettingsModal.qml index ee260e4f..5e2da495 100644 --- a/quickshell/Modals/Settings/SettingsModal.qml +++ b/quickshell/Modals/Settings/SettingsModal.qml @@ -41,7 +41,7 @@ FloatingWindow { title: I18n.tr("Settings", "settings window title") minimumSize: Qt.size(500, 400) implicitWidth: 800 - implicitHeight: 800 + implicitHeight: 875 color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) visible: false @@ -121,29 +121,18 @@ FloatingWindow { focus: true Keys.onPressed: event => { - const tabCount = 13; if (event.key === Qt.Key_Escape) { hide(); event.accepted = true; return; } - if (event.key === Qt.Key_Down) { - currentTabIndex = (currentTabIndex + 1) % tabCount; + if (event.key === Qt.Key_Down || (event.key === Qt.Key_Tab && !event.modifiers)) { + sidebar.navigateNext(); event.accepted = true; return; } - if (event.key === Qt.Key_Up) { - currentTabIndex = (currentTabIndex - 1 + tabCount) % tabCount; - event.accepted = true; - return; - } - if (event.key === Qt.Key_Tab && !event.modifiers) { - currentTabIndex = (currentTabIndex + 1) % tabCount; - event.accepted = true; - return; - } - if (event.key === Qt.Key_Backtab || (event.key === Qt.Key_Tab && event.modifiers & Qt.ShiftModifier)) { - currentTabIndex = (currentTabIndex - 1 + tabCount) % tabCount; + if (event.key === Qt.Key_Up || event.key === Qt.Key_Backtab || (event.key === Qt.Key_Tab && event.modifiers & Qt.ShiftModifier)) { + sidebar.navigatePrevious(); event.accepted = true; return; } diff --git a/quickshell/Modals/Settings/SettingsSidebar.qml b/quickshell/Modals/Settings/SettingsSidebar.qml index 2f3765bb..58efad36 100644 --- a/quickshell/Modals/Settings/SettingsSidebar.qml +++ b/quickshell/Modals/Settings/SettingsSidebar.qml @@ -7,105 +7,324 @@ import qs.Services import qs.Widgets Rectangle { - id: sidebarContainer + id: root property int currentIndex: 0 property var parentModal: null - readonly property var allSidebarItems: [ + property var expandedCategories: ({}) + property var autoExpandedCategories: ({}) + + readonly property var categoryStructure: [ { + "id": "personalization", "text": I18n.tr("Personalization"), - "icon": "person", - "tabIndex": 0 - }, - { - "text": I18n.tr("Time & Weather"), - "icon": "schedule", - "tabIndex": 1 - }, - { - "text": I18n.tr("Keyboard Shortcuts"), - "icon": "keyboard", - "shortcutsOnly": true, - "tabIndex": 2 + "icon": "palette", + "children": [ + { + "text": I18n.tr("Wallpaper"), + "icon": "wallpaper", + "tabIndex": 0 + }, + { + "text": I18n.tr("Theme & Colors"), + "icon": "format_paint", + "tabIndex": 10 + }, + { + "text": I18n.tr("Typography & Motion"), + "icon": "text_fields", + "tabIndex": 14 + }, + { + "text": I18n.tr("Time & Weather"), + "icon": "schedule", + "tabIndex": 1 + }, + { + "text": I18n.tr("Sounds"), + "icon": "volume_up", + "tabIndex": 15, + "soundsOnly": true + } + ] }, { + "id": "dankbar", "text": I18n.tr("Dank Bar"), "icon": "toolbar", "tabIndex": 3 }, { - "text": I18n.tr("Widgets"), - "icon": "widgets", - "tabIndex": 4 + "id": "workspaces_widgets", + "text": I18n.tr("Workspaces & Widgets"), + "icon": "dashboard", + "collapsedByDefault": true, + "children": [ + { + "text": I18n.tr("Workspaces"), + "icon": "view_module", + "tabIndex": 4 + }, + { + "text": I18n.tr("Media Player"), + "icon": "music_note", + "tabIndex": 16 + }, + { + "text": I18n.tr("Notifications"), + "icon": "notifications", + "tabIndex": 17 + }, + { + "text": I18n.tr("On-screen Displays"), + "icon": "tune", + "tabIndex": 18 + }, + { + "text": I18n.tr("Running Apps"), + "icon": "apps", + "tabIndex": 19, + "hyprlandNiriOnly": true + }, + { + "text": I18n.tr("System Updater"), + "icon": "refresh", + "tabIndex": 20 + } + ] }, { - "text": I18n.tr("Dock"), - "icon": "dock_to_bottom", - "tabIndex": 5 + "id": "dock_launcher", + "text": I18n.tr("Dock & Launcher"), + "icon": "apps", + "collapsedByDefault": true, + "children": [ + { + "text": I18n.tr("Dock"), + "icon": "dock_to_bottom", + "tabIndex": 5 + }, + { + "text": I18n.tr("Launcher"), + "icon": "grid_view", + "tabIndex": 9 + } + ] }, { + "id": "input", + "text": I18n.tr("Keyboard Shortcuts"), + "icon": "keyboard", + "tabIndex": 2, + "shortcutsOnly": true + }, + { + "id": "displays", "text": I18n.tr("Displays"), "icon": "monitor", "tabIndex": 6 }, { + "id": "network", "text": I18n.tr("Network"), "icon": "wifi", - "dmsOnly": true, - "tabIndex": 7 + "tabIndex": 7, + "dmsOnly": true }, { + "id": "printers", "text": I18n.tr("Printers"), "icon": "print", - "cupsOnly": true, - "tabIndex": 8 - }, - { - "text": I18n.tr("Launcher"), - "icon": "apps", - "tabIndex": 9 - }, - { - "text": I18n.tr("Theme & Colors"), - "icon": "palette", - "tabIndex": 10 + "tabIndex": 8, + "cupsOnly": true }, { + "id": "power_security", "text": I18n.tr("Power & Security"), - "icon": "power", - "tabIndex": 11 + "icon": "security", + "collapsedByDefault": true, + "children": [ + { + "text": I18n.tr("Lock Screen"), + "icon": "lock", + "tabIndex": 11 + }, + { + "text": I18n.tr("Power & Sleep"), + "icon": "power_settings_new", + "tabIndex": 21 + } + ] }, { + "id": "plugins", "text": I18n.tr("Plugins"), "icon": "extension", "tabIndex": 12 }, { + "id": "separator", + "separator": true + }, + { + "id": "about", "text": I18n.tr("About"), "icon": "info", "tabIndex": 13 } ] - readonly property var sidebarItems: allSidebarItems.filter(item => { + + function isItemVisible(item) { if (item.dmsOnly && NetworkService.usingLegacy) return false; if (item.cupsOnly && !CupsService.cupsAvailable) return false; if (item.shortcutsOnly && !KeybindsService.available) return false; + if (item.soundsOnly && !AudioService.soundsAvailable) + return false; + if (item.hyprlandNiriOnly && !CompositorService.isNiri && !CompositorService.isHyprland) + return false; return true; - }) + } + + function hasVisibleChildren(category) { + if (!category.children) + return false; + return category.children.some(child => isItemVisible(child)); + } + + function isCategoryVisible(category) { + if (category.separator) + return true; + if (!isItemVisible(category)) + return false; + if (category.children && !hasVisibleChildren(category)) + return false; + return true; + } + + function toggleCategory(categoryId) { + var newExpanded = Object.assign({}, expandedCategories); + newExpanded[categoryId] = !isCategoryExpanded(categoryId); + expandedCategories = newExpanded; + + var newAutoExpanded = Object.assign({}, autoExpandedCategories); + delete newAutoExpanded[categoryId]; + autoExpandedCategories = newAutoExpanded; + } + + function isCategoryExpanded(categoryId) { + if (expandedCategories[categoryId] !== undefined) { + return expandedCategories[categoryId]; + } + var category = categoryStructure.find(cat => cat.id === categoryId); + if (category && category.collapsedByDefault) { + return false; + } + return true; + } + + function isChildActive(category) { + if (!category.children) + return false; + return category.children.some(child => child.tabIndex === currentIndex); + } + + function findParentCategory(tabIndex) { + for (var i = 0; i < categoryStructure.length; i++) { + var cat = categoryStructure[i]; + if (cat.children) { + for (var j = 0; j < cat.children.length; j++) { + if (cat.children[j].tabIndex === tabIndex) { + return cat; + } + } + } + } + return null; + } + + function autoExpandForTab(tabIndex) { + var parent = findParentCategory(tabIndex); + if (!parent) + return; + + if (!isCategoryExpanded(parent.id)) { + var newExpanded = Object.assign({}, expandedCategories); + newExpanded[parent.id] = true; + expandedCategories = newExpanded; + + var newAutoExpanded = Object.assign({}, autoExpandedCategories); + newAutoExpanded[parent.id] = true; + autoExpandedCategories = newAutoExpanded; + } + } + + function autoCollapseIfNeeded(oldTabIndex, newTabIndex) { + var oldParent = findParentCategory(oldTabIndex); + var newParent = findParentCategory(newTabIndex); + + if (oldParent && oldParent !== newParent && autoExpandedCategories[oldParent.id]) { + var newExpanded = Object.assign({}, expandedCategories); + newExpanded[oldParent.id] = false; + expandedCategories = newExpanded; + + var newAutoExpanded = Object.assign({}, autoExpandedCategories); + delete newAutoExpanded[oldParent.id]; + autoExpandedCategories = newAutoExpanded; + } + } function navigateNext() { - const currentItemIndex = sidebarItems.findIndex(item => item.tabIndex === currentIndex); - const nextIndex = (currentItemIndex + 1) % sidebarItems.length; - currentIndex = sidebarItems[nextIndex].tabIndex; + var flatItems = getFlatNavigableItems(); + var currentPos = flatItems.findIndex(item => item.tabIndex === currentIndex); + var oldIndex = currentIndex; + if (currentPos === -1) { + currentIndex = flatItems[0]?.tabIndex ?? 0; + } else { + var nextPos = (currentPos + 1) % flatItems.length; + currentIndex = flatItems[nextPos].tabIndex; + } + autoCollapseIfNeeded(oldIndex, currentIndex); + autoExpandForTab(currentIndex); } function navigatePrevious() { - const currentItemIndex = sidebarItems.findIndex(item => item.tabIndex === currentIndex); - const prevIndex = (currentItemIndex - 1 + sidebarItems.length) % sidebarItems.length; - currentIndex = sidebarItems[prevIndex].tabIndex; + var flatItems = getFlatNavigableItems(); + var currentPos = flatItems.findIndex(item => item.tabIndex === currentIndex); + var oldIndex = currentIndex; + if (currentPos === -1) { + currentIndex = flatItems[0]?.tabIndex ?? 0; + } else { + var prevPos = (currentPos - 1 + flatItems.length) % flatItems.length; + currentIndex = flatItems[prevPos].tabIndex; + } + autoCollapseIfNeeded(oldIndex, currentIndex); + autoExpandForTab(currentIndex); + } + + function getFlatNavigableItems() { + var items = []; + for (var i = 0; i < categoryStructure.length; i++) { + var cat = categoryStructure[i]; + if (cat.separator || !isCategoryVisible(cat)) + continue; + + if (cat.tabIndex !== undefined && !cat.children) { + items.push(cat); + } + + if (cat.children) { + for (var j = 0; j < cat.children.length; j++) { + var child = cat.children[j]; + if (isItemVisible(child)) { + items.push(child); + } + } + } + } + return items; } width: 270 @@ -120,17 +339,16 @@ Rectangle { Column { id: sidebarColumn - width: parent.width leftPadding: Theme.spacingS rightPadding: Theme.spacingS bottomPadding: Theme.spacingL topPadding: Theme.spacingM + 2 - spacing: Theme.spacingXS + spacing: 2 ProfileSection { width: parent.width - parent.leftPadding - parent.rightPadding - parentModal: sidebarContainer.parentModal + parentModal: root.parentModal } Rectangle { @@ -142,62 +360,194 @@ Rectangle { Item { width: parent.width - parent.leftPadding - parent.rightPadding - height: Theme.spacingL + height: Theme.spacingM } Repeater { - id: sidebarRepeater + model: root.categoryStructure - model: sidebarContainer.sidebarItems - - delegate: Rectangle { + delegate: Column { + id: categoryDelegate required property int index required property var modelData - property bool isActive: sidebarContainer.currentIndex === modelData.tabIndex - width: parent.width - parent.leftPadding - parent.rightPadding - height: 44 - radius: Theme.cornerRadius - color: isActive ? Theme.primary : tabMouseArea.containsMouse ? Theme.surfaceHover : "transparent" + visible: root.isCategoryVisible(modelData) + spacing: 2 - Row { - anchors.left: parent.left - anchors.leftMargin: Theme.spacingM - anchors.verticalCenter: parent.verticalCenter - spacing: Theme.spacingM + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + visible: categoryDelegate.modelData.separator === true + } - DankIcon { - name: modelData.icon || "" - size: Theme.iconSize - 2 - color: parent.parent.isActive ? Theme.primaryText : Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter + Item { + width: parent.width + height: Theme.spacingS + visible: categoryDelegate.modelData.separator === true + } + + Rectangle { + id: categoryRow + width: parent.width + height: 40 + radius: Theme.cornerRadius + visible: categoryDelegate.modelData.separator !== true + color: { + var hasTab = categoryDelegate.modelData.tabIndex !== undefined && !categoryDelegate.modelData.children; + var isActive = hasTab && root.currentIndex === categoryDelegate.modelData.tabIndex; + if (isActive) + return Theme.primary; + if (categoryMouseArea.containsMouse) + return Theme.surfaceHover; + return "transparent"; } - StyledText { - text: modelData.text || "" - font.pixelSize: Theme.fontSizeMedium - color: parent.parent.isActive ? Theme.primaryText : Theme.surfaceText - font.weight: parent.parent.isActive ? Font.Medium : Font.Normal + Row { + anchors.left: parent.left + anchors.leftMargin: Theme.spacingM + anchors.right: parent.right + anchors.rightMargin: Theme.spacingM anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingM + + DankIcon { + name: categoryDelegate.modelData.icon || "" + size: Theme.iconSize - 2 + color: { + var hasTab = categoryDelegate.modelData.tabIndex !== undefined && !categoryDelegate.modelData.children; + var isActive = hasTab && root.currentIndex === categoryDelegate.modelData.tabIndex; + return isActive ? Theme.primaryText : Theme.surfaceText; + } + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + text: categoryDelegate.modelData.text || "" + font.pixelSize: Theme.fontSizeMedium + font.weight: { + var hasTab = categoryDelegate.modelData.tabIndex !== undefined && !categoryDelegate.modelData.children; + var isActive = hasTab && root.currentIndex === categoryDelegate.modelData.tabIndex; + var childActive = root.isChildActive(categoryDelegate.modelData); + return (isActive || childActive) ? Font.Medium : Font.Normal; + } + color: { + var hasTab = categoryDelegate.modelData.tabIndex !== undefined && !categoryDelegate.modelData.children; + var isActive = hasTab && root.currentIndex === categoryDelegate.modelData.tabIndex; + return isActive ? Theme.primaryText : Theme.surfaceText; + } + anchors.verticalCenter: parent.verticalCenter + width: parent.width - Theme.iconSize - Theme.spacingM - (categoryDelegate.modelData.children ? expandIcon.width + Theme.spacingS : 0) + elide: Text.ElideRight + } + + DankIcon { + id: expandIcon + name: root.isCategoryExpanded(categoryDelegate.modelData.id) ? "expand_less" : "expand_more" + size: Theme.iconSize - 4 + color: Theme.surfaceVariantText + anchors.verticalCenter: parent.verticalCenter + visible: categoryDelegate.modelData.children !== undefined && categoryDelegate.modelData.children.length > 0 + } + } + + MouseArea { + id: categoryMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: { + if (categoryDelegate.modelData.children) { + root.toggleCategory(categoryDelegate.modelData.id); + } else if (categoryDelegate.modelData.tabIndex !== undefined) { + root.currentIndex = categoryDelegate.modelData.tabIndex; + } + } + } + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } } } - MouseArea { - id: tabMouseArea + Column { + id: childrenColumn + width: parent.width + spacing: 2 + visible: categoryDelegate.modelData.children !== undefined && root.isCategoryExpanded(categoryDelegate.modelData.id) + clip: true - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: () => { - sidebarContainer.currentIndex = modelData.tabIndex; - } - } + Repeater { + model: categoryDelegate.modelData.children || [] - Behavior on color { - ColorAnimation { - duration: Theme.shortDuration - easing.type: Theme.standardEasing + delegate: Rectangle { + id: childDelegate + required property int index + required property var modelData + + width: childrenColumn.width + height: 36 + radius: Theme.cornerRadius + visible: root.isItemVisible(modelData) + color: { + var isActive = root.currentIndex === modelData.tabIndex; + if (isActive) + return Theme.primary; + if (childMouseArea.containsMouse) + return Theme.surfaceHover; + return "transparent"; + } + + Row { + anchors.left: parent.left + anchors.leftMargin: Theme.spacingL + Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingM + + DankIcon { + name: childDelegate.modelData.icon || "" + size: Theme.iconSize - 4 + color: { + var isActive = root.currentIndex === childDelegate.modelData.tabIndex; + return isActive ? Theme.primaryText : Theme.surfaceVariantText; + } + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + text: childDelegate.modelData.text || "" + font.pixelSize: Theme.fontSizeSmall + 1 + font.weight: root.currentIndex === childDelegate.modelData.tabIndex ? Font.Medium : Font.Normal + color: { + var isActive = root.currentIndex === childDelegate.modelData.tabIndex; + return isActive ? Theme.primaryText : Theme.surfaceText; + } + anchors.verticalCenter: parent.verticalCenter + } + } + + MouseArea { + id: childMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: { + root.currentIndex = childDelegate.modelData.tabIndex; + } + } + + Behavior on color { + ColorAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } } } } diff --git a/quickshell/Modules/Settings/AboutTab.qml b/quickshell/Modules/Settings/AboutTab.qml index 11dd1d86..40df5c30 100644 --- a/quickshell/Modules/Settings/AboutTab.qml +++ b/quickshell/Modules/Settings/AboutTab.qml @@ -3,6 +3,7 @@ import QtQuick.Effects import qs.Common import qs.Services import qs.Widgets +import qs.Modules.Settings.Widgets Item { id: aboutTab @@ -122,13 +123,17 @@ Item { Row { anchors.horizontalCenter: parent.horizontalCenter - spacing: Theme.spacingL + spacing: parent.width < 350 ? Theme.spacingM : Theme.spacingL + + property bool compactLogo: parent.width < 400 + property bool hideLogo: parent.width < 280 Image { id: logoImage + visible: !parent.hideLogo anchors.verticalCenter: parent.verticalCenter - width: 120 + width: parent.compactLogo ? 80 : 120 height: width * (569.94629 / 506.50931) fillMode: Image.PreserveAspectFit smooth: true @@ -148,7 +153,7 @@ Item { Text { anchors.verticalCenter: parent.verticalCenter text: "DANK LINUX" - font.pixelSize: 48 + font.pixelSize: parent.compactLogo ? 32 : 48 font.weight: Font.Bold font.family: interFont.name color: Theme.surfaceText @@ -163,7 +168,8 @@ Item { StyledText { text: { - if (!SystemUpdateService.shellVersion) return "dms"; + if (!SystemUpdateService.shellVersion) + return "dms"; let version = SystemUpdateService.shellVersion; @@ -179,7 +185,7 @@ Item { return `dms (git) v0.6.2-${match[1]}`; } - // Stable release format: 0.6.2 + // Stable release format: 0.6.2 match = version.match(/^([\d.]+)$/); if (match) { return `dms v${match[1]}`; @@ -194,6 +200,82 @@ Item { width: parent.width } + Row { + id: resourceButtonsRow + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingS + + property bool compactMode: parent.width < 400 + + DankButton { + id: docsButton + text: resourceButtonsRow.compactMode ? "" : I18n.tr("Docs") + iconName: "menu_book" + iconSize: 18 + backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08) + textColor: Theme.surfaceText + onClicked: Qt.openUrlExternally("https://danklinux.com/docs") + onHoveredChanged: { + if (hovered) + resourceTooltip.show(resourceButtonsRow.compactMode ? I18n.tr("Docs") + " - danklinux.com/docs" : "danklinux.com/docs", docsButton, 0, 0, "bottom"); + else + resourceTooltip.hide(); + } + } + + DankButton { + id: pluginsButton + text: resourceButtonsRow.compactMode ? "" : I18n.tr("Plugins") + iconName: "extension" + iconSize: 18 + backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08) + textColor: Theme.surfaceText + onClicked: Qt.openUrlExternally("https://plugins.danklinux.com") + onHoveredChanged: { + if (hovered) + resourceTooltip.show(resourceButtonsRow.compactMode ? I18n.tr("Plugins") + " - plugins.danklinux.com" : "plugins.danklinux.com", pluginsButton, 0, 0, "bottom"); + else + resourceTooltip.hide(); + } + } + + DankButton { + id: githubButton + text: resourceButtonsRow.compactMode ? "" : I18n.tr("GitHub") + iconName: "code" + iconSize: 18 + backgroundColor: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.08) + textColor: Theme.surfaceText + onClicked: Qt.openUrlExternally("https://github.com/AvengeMedia/DankMaterialShell") + onHoveredChanged: { + if (hovered) + resourceTooltip.show(resourceButtonsRow.compactMode ? "GitHub - AvengeMedia/DankMaterialShell" : "github.com/AvengeMedia/DankMaterialShell", githubButton, 0, 0, "bottom"); + else + resourceTooltip.hide(); + } + } + + DankButton { + id: kofiButton + text: resourceButtonsRow.compactMode ? "" : I18n.tr("Ko-fi") + iconName: "favorite" + iconSize: 18 + backgroundColor: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) + textColor: Theme.primary + onClicked: Qt.openUrlExternally("https://ko-fi.com/danklinux") + onHoveredChanged: { + if (hovered) + resourceTooltip.show(resourceButtonsRow.compactMode ? I18n.tr("Ko-fi") + " - ko-fi.com/danklinux" : "ko-fi.com/danklinux", kofiButton, 0, 0, "bottom"); + else + resourceTooltip.hide(); + } + } + } + + DankTooltipV2 { + id: resourceTooltip + } + Item { id: communityIcons anchors.horizontalCenter: parent.horizontalCenter @@ -459,166 +541,6 @@ Item { } } - StyledRect { - width: parent.width - height: techSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: techSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "code" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Resources") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Grid { - width: parent.width - columns: 2 - columnSpacing: Theme.spacingL - rowSpacing: Theme.spacingS - - StyledText { - text: I18n.tr("Website:") - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: `danklinux.com` - linkColor: Theme.primary - textFormat: Text.RichText - onLinkActivated: url => Qt.openUrlExternally(url) - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - - MouseArea { - anchors.fill: parent - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - acceptedButtons: Qt.NoButton - propagateComposedEvents: true - } - } - - StyledText { - text: I18n.tr("Plugins:") - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: `plugins.danklinux.com` - linkColor: Theme.primary - textFormat: Text.RichText - onLinkActivated: url => Qt.openUrlExternally(url) - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - - MouseArea { - anchors.fill: parent - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - acceptedButtons: Qt.NoButton - propagateComposedEvents: true - } - } - - StyledText { - text: I18n.tr("Github:") - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - } - - Row { - spacing: 4 - - StyledText { - text: `DankMaterialShell` - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - linkColor: Theme.primary - textFormat: Text.RichText - onLinkActivated: url => Qt.openUrlExternally(url) - anchors.verticalCenter: parent.verticalCenter - - MouseArea { - anchors.fill: parent - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - acceptedButtons: Qt.NoButton - propagateComposedEvents: true - } - } - - StyledText { - text: I18n.tr("- Support Us With a Star ⭐") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - text: I18n.tr("System Monitoring:") - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - } - - Row { - spacing: 4 - - StyledText { - text: `dgop` - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - linkColor: Theme.primary - textFormat: Text.RichText - onLinkActivated: url => Qt.openUrlExternally(url) - anchors.verticalCenter: parent.verticalCenter - - MouseArea { - anchors.fill: parent - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - acceptedButtons: Qt.NoButton - propagateComposedEvents: true - } - } - - StyledText { - text: I18n.tr("- Stateless System Monitoring") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - } - } - } - } - StyledRect { visible: DMSService.isConnected width: parent.width @@ -772,57 +694,20 @@ Item { } } - // Support Section - StyledRect { - width: parent.width - height: supportSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Row { - id: supportSection + StyledText { + anchors.horizontalCenter: parent.horizontalCenter + text: `MIT License` + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceVariantText + textFormat: Text.RichText + wrapMode: Text.NoWrap + onLinkActivated: url => Qt.openUrlExternally(url) + MouseArea { anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - spacing: Theme.spacingM - anchors.verticalCenter: parent.verticalCenter - - DankIcon { - name: "volunteer_activism" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Support Development") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Item { - width: parent.width - parent.spacing - kofiButton.width - supportSection.children[0].width - height: 1 - } - - DankButton { - id: kofiButton - text: I18n.tr("Donate on Ko-fi") - iconName: "favorite" - iconSize: 20 - backgroundColor: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.08) - textColor: Theme.primary - anchors.verticalCenter: parent.verticalCenter - onClicked: Qt.openUrlExternally("https://ko-fi.com/danklinux") - } + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + acceptedButtons: Qt.NoButton + propagateComposedEvents: true } } } diff --git a/quickshell/Modules/Settings/DockTab.qml b/quickshell/Modules/Settings/DockTab.qml index 817321da..bed94a84 100644 --- a/quickshell/Modules/Settings/DockTab.qml +++ b/quickshell/Modules/Settings/DockTab.qml @@ -2,9 +2,10 @@ import QtQuick import qs.Common import qs.Services import qs.Widgets +import qs.Modules.Settings.Widgets Item { - id: dockTab + id: root DankFlickable { anchors.fill: parent @@ -18,971 +19,232 @@ Item { anchors.horizontalCenter: parent.horizontalCenter spacing: Theme.spacingXL - // Dock Position - StyledRect { + SettingsCard { width: parent.width - height: dockPositionSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "swap_vert" + title: I18n.tr("Dock Position") - Column { - id: dockPositionSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "swap_vert" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter + SettingsButtonGroupRow { + text: I18n.tr("Position") + model: ["Top", "Bottom", "Left", "Right"] + currentIndex: { + switch (SettingsData.dockPosition) { + case SettingsData.Position.Top: + return 0; + case SettingsData.Position.Bottom: + return 1; + case SettingsData.Position.Left: + return 2; + case SettingsData.Position.Right: + return 3; + default: + return 1; } - - Column { - width: Math.max(0, parent.width - Theme.iconSize - Theme.spacingM - positionButtonGroup.width - Theme.spacingM) - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Dock Position") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - elide: Text.ElideRight - width: parent.width - } - } - - DankButtonGroup { - id: positionButtonGroup - anchors.verticalCenter: parent.verticalCenter - model: ["Top", "Bottom", "Left", "Right"] - currentIndex: { - switch (SettingsData.dockPosition) { - case SettingsData.Position.Top: - return 0; - case SettingsData.Position.Bottom: - return 1; - case SettingsData.Position.Left: - return 2; - case SettingsData.Position.Right: - return 3; - default: - return 1; - } - } - onSelectionChanged: (index, selected) => { - if (selected) { - switch (index) { - case 0: - SettingsData.setDockPosition(SettingsData.Position.Top); - break; - case 1: - SettingsData.setDockPosition(SettingsData.Position.Bottom); - break; - case 2: - SettingsData.setDockPosition(SettingsData.Position.Left); - break; - case 3: - SettingsData.setDockPosition(SettingsData.Position.Right); - break; - } - } - } + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + switch (index) { + case 0: + SettingsData.setDockPosition(SettingsData.Position.Top); + break; + case 1: + SettingsData.setDockPosition(SettingsData.Position.Bottom); + break; + case 2: + SettingsData.setDockPosition(SettingsData.Position.Left); + break; + case 3: + SettingsData.setDockPosition(SettingsData.Position.Right); + break; } } } } - // Dock Visibility Section - StyledRect { + SettingsCard { width: parent.width - height: dockVisibilitySection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "dock_to_bottom" + title: I18n.tr("Dock Visibility") - Column { - id: dockVisibilitySection + SettingsToggleRow { + text: I18n.tr("Show Dock") + description: I18n.tr("Display a dock with pinned and running applications") + checked: SettingsData.showDock + onToggled: checked => SettingsData.setShowDock(checked) + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM + SettingsToggleRow { + text: I18n.tr("Auto-hide Dock") + description: I18n.tr("Hide the dock when not in use and reveal it when hovering near the dock area") + checked: SettingsData.dockAutoHide + visible: SettingsData.showDock + onToggled: checked => SettingsData.set("dockAutoHide", checked) + } - Row { - width: parent.width - spacing: Theme.spacingM + SettingsToggleRow { + text: I18n.tr("Show on Overview") + description: I18n.tr("Always show the dock when niri's overview is open") + checked: SettingsData.dockOpenOnOverview + visible: CompositorService.isNiri + onToggled: checked => SettingsData.set("dockOpenOnOverview", checked) + } + } - DankIcon { - name: "dock_to_bottom" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } + SettingsCard { + width: parent.width + iconName: "apps" + title: I18n.tr("Behavior") - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - enableToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter + SettingsToggleRow { + text: I18n.tr("Group by App") + description: I18n.tr("Group multiple windows of the same app together with a window count indicator") + checked: SettingsData.dockGroupByApp + onToggled: checked => SettingsData.set("dockGroupByApp", checked) + } - StyledText { - text: I18n.tr("Show Dock") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: enableToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.showDock - onToggled: checked => { - SettingsData.setShowDock(checked); - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - visible: SettingsData.showDock - } - - Row { - width: parent.width - spacing: Theme.spacingM - visible: SettingsData.showDock - opacity: visible ? 1 : 0 - - DankIcon { - name: "visibility_off" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - autoHideToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Auto-hide Dock") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Hide the dock when not in use and reveal it when hovering near the dock area") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: autoHideToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.dockAutoHide - onToggled: checked => { - SettingsData.set("dockAutoHide", checked); - } - } - - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - visible: CompositorService.isNiri - } - - Row { - width: parent.width - spacing: Theme.spacingM - visible: CompositorService.isNiri - - DankIcon { - name: "fullscreen" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - overviewToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Show on Overview") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Always show the dock when niri's overview is open") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: overviewToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.dockOpenOnOverview - onToggled: checked => { - SettingsData.set("dockOpenOnOverview", checked); - } + SettingsButtonGroupRow { + text: I18n.tr("Indicator Style") + model: ["Circle", "Line"] + currentIndex: SettingsData.dockIndicatorStyle === "circle" ? 0 : 1 + onSelectionChanged: (index, selected) => { + if (selected) { + SettingsData.set("dockIndicatorStyle", index === 0 ? "circle" : "line"); } } } } - // Group by App - StyledRect { + SettingsCard { width: parent.width - height: groupByAppSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "photo_size_select_large" + title: I18n.tr("Sizing") - Column { - id: groupByAppSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "apps" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - groupByAppToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Group by App") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Group multiple windows of the same app together with a window count indicator") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: groupByAppToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.dockGroupByApp - onToggled: checked => { - SettingsData.set("dockGroupByApp", checked); - } - } - } + SettingsSliderRow { + text: I18n.tr("Icon Size") + value: SettingsData.dockIconSize + minimum: 24 + maximum: 96 + defaultValue: 48 + onSliderValueChanged: newValue => SettingsData.set("dockIconSize", newValue) } } - // Indicator Style Section - StyledRect { + SettingsCard { width: parent.width - height: indicatorStyleSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "space_bar" + title: I18n.tr("Spacing") - Column { - id: indicatorStyleSection + SettingsSliderRow { + text: I18n.tr("Padding") + value: SettingsData.dockSpacing + minimum: 0 + maximum: 32 + defaultValue: 8 + onSliderValueChanged: newValue => SettingsData.set("dockSpacing", newValue) + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM + SettingsSliderRow { + text: I18n.tr("Exclusive Zone Offset") + value: SettingsData.dockBottomGap + minimum: -100 + maximum: 100 + defaultValue: 0 + onSliderValueChanged: newValue => SettingsData.set("dockBottomGap", newValue) + } - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "fiber_manual_record" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: Math.max(0, parent.width - Theme.iconSize - Theme.spacingM - indicatorStyleButtonGroup.width - Theme.spacingM) - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Indicator Style") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - elide: Text.ElideRight - width: parent.width - } - } - - DankButtonGroup { - id: indicatorStyleButtonGroup - anchors.verticalCenter: parent.verticalCenter - model: ["Circle", "Line"] - currentIndex: SettingsData.dockIndicatorStyle === "circle" ? 0 : 1 - onSelectionChanged: (index, selected) => { - if (selected) { - SettingsData.set("dockIndicatorStyle", index === 0 ? "circle" : "line"); - } - } - } - } + SettingsSliderRow { + text: I18n.tr("Margin") + value: SettingsData.dockMargin + minimum: 0 + maximum: 100 + defaultValue: 0 + onSliderValueChanged: newValue => SettingsData.set("dockMargin", newValue) } } - // Icon Size Section - StyledRect { + SettingsCard { width: parent.width - height: iconSizeSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "opacity" + title: I18n.tr("Transparency") - Column { - id: iconSizeSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "photo_size_select_large" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - id: iconSizeText - text: I18n.tr("Icon Size") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - Theme.iconSize - Theme.spacingM - iconSizeText.width - resetIconSizeBtn.width - Theme.spacingM * 2 - anchors.verticalCenter: parent.verticalCenter - } - - DankActionButton { - id: resetIconSizeBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockIconSize", 48); - } - } - } - - DankSlider { - width: parent.width - height: 24 - value: SettingsData.dockIconSize - minimum: 24 - maximum: 96 - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockIconSize", newValue); - } - } + SettingsSliderRow { + text: I18n.tr("Dock Transparency") + value: Math.round(SettingsData.dockTransparency * 100) + minimum: 0 + maximum: 100 + unit: "%" + defaultValue: 85 + onSliderValueChanged: newValue => SettingsData.set("dockTransparency", newValue / 100) } } - // Dock Spacing Section - StyledRect { + SettingsCard { width: parent.width - height: dockSpacingSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "border_style" + title: I18n.tr("Border") - Column { - id: dockSpacingSection + SettingsToggleRow { + text: I18n.tr("Border") + description: I18n.tr("Add a border around the dock") + checked: SettingsData.dockBorderEnabled + onToggled: checked => SettingsData.set("dockBorderEnabled", checked) + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "space_bar" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Spacing") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter + SettingsButtonGroupRow { + text: I18n.tr("Border Color") + description: I18n.tr("Choose the border accent color") + visible: SettingsData.dockBorderEnabled + model: ["Surface", "Secondary", "Primary"] + currentIndex: { + switch (SettingsData.dockBorderColor) { + case "surfaceText": + return 0; + case "secondary": + return 1; + case "primary": + return 2; + default: + return 0; } } - - Column { - width: parent.width - spacing: Theme.spacingS - - Row { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Padding") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - paddingText.implicitWidth - resetPaddingBtn.width - Theme.spacingS - Theme.spacingM - height: 1 - - StyledText { - id: paddingText - visible: false - text: I18n.tr("Padding") - font.pixelSize: Theme.fontSizeSmall - } - } - - DankActionButton { - id: resetPaddingBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockSpacing", 8); - } - } - - Item { - width: Theme.spacingS - height: 1 - } - } - - DankSlider { - width: parent.width - height: 24 - value: SettingsData.dockSpacing - minimum: 0 - maximum: 32 - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockSpacing", newValue); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - Row { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Exclusive Zone Offset") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - exclusiveZoneText.implicitWidth - resetExclusiveZoneBtn.width - Theme.spacingS - Theme.spacingM - height: 1 - - StyledText { - id: exclusiveZoneText - visible: false - text: I18n.tr("Exclusive Zone Offset") - font.pixelSize: Theme.fontSizeSmall - } - } - - DankActionButton { - id: resetExclusiveZoneBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockBottomGap", 0); - } - } - - Item { - width: Theme.spacingS - height: 1 - } - } - - DankSlider { - width: parent.width - height: 24 - value: SettingsData.dockBottomGap - minimum: -100 - maximum: 100 - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockBottomGap", newValue); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - Row { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Margin") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - marginText.implicitWidth - resetMarginBtn.width - Theme.spacingS - Theme.spacingM - height: 1 - - StyledText { - id: marginText - visible: false - text: I18n.tr("Margin") - font.pixelSize: Theme.fontSizeSmall - } - } - - DankActionButton { - id: resetMarginBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockMargin", 0); - } - } - - Item { - width: Theme.spacingS - height: 1 - } - } - - DankSlider { - width: parent.width - height: 24 - value: SettingsData.dockMargin - minimum: 0 - maximum: 100 - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockMargin", newValue); - } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + switch (index) { + case 0: + SettingsData.set("dockBorderColor", "surfaceText"); + break; + case 1: + SettingsData.set("dockBorderColor", "secondary"); + break; + case 2: + SettingsData.set("dockBorderColor", "primary"); + break; } } } - } - // Dock Transparency Section - StyledRect { - width: parent.width - height: transparencySection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: transparencySection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "opacity" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - id: transparencyText - text: I18n.tr("Dock Transparency") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - Theme.iconSize - Theme.spacingM - transparencyText.width - resetTransparencyBtn.width - Theme.spacingM * 2 - anchors.verticalCenter: parent.verticalCenter - } - - DankActionButton { - id: resetTransparencyBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockTransparency", 0.85); - } - } - } - - DankSlider { - width: parent.width - height: 32 - value: Math.round(SettingsData.dockTransparency * 100) - minimum: 0 - maximum: 100 - unit: "%" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockTransparency", newValue / 100); - } - } + SettingsSliderRow { + text: I18n.tr("Border Opacity") + visible: SettingsData.dockBorderEnabled + value: SettingsData.dockBorderOpacity * 100 + minimum: 0 + maximum: 100 + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => SettingsData.set("dockBorderOpacity", newValue / 100) } - } - StyledRect { - width: parent.width - height: borderSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.width: 0 - - Column { - id: borderSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - DankToggle { - width: parent.width - text: I18n.tr("Border") - description: I18n.tr("Add a border around the dock") - checked: SettingsData.dockBorderEnabled - onToggled: checked => { - SettingsData.set("dockBorderEnabled", checked); - } - } - - Column { - width: parent.width - leftPadding: Theme.spacingM - spacing: Theme.spacingM - visible: SettingsData.dockBorderEnabled - - Rectangle { - width: parent.width - parent.leftPadding - height: 1 - color: Theme.outline - opacity: 0.2 - } - - Row { - width: parent.width - parent.leftPadding - spacing: Theme.spacingM - - Column { - width: parent.width - dockBorderColorGroup.width - Theme.spacingM - spacing: Theme.spacingXS - - StyledText { - text: I18n.tr("Border Color") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledText { - text: I18n.tr("Choose the border accent color") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankButtonGroup { - id: dockBorderColorGroup - anchors.verticalCenter: parent.verticalCenter - model: ["Surface", "Secondary", "Primary"] - currentIndex: { - switch (SettingsData.dockBorderColor) { - case "surfaceText": - return 0; - case "secondary": - return 1; - case "primary": - return 2; - default: - return 0; - } - } - onSelectionChanged: (index, selected) => { - if (!selected) - return; - switch (index) { - case 0: - SettingsData.set("dockBorderColor", "surfaceText"); - break; - case 1: - SettingsData.set("dockBorderColor", "secondary"); - break; - case 2: - SettingsData.set("dockBorderColor", "primary"); - break; - } - } - } - } - - Column { - width: parent.width - parent.leftPadding - spacing: Theme.spacingS - - Row { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Border Opacity") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - dockBorderOpacityText.implicitWidth - resetDockBorderOpacityBtn.width - Theme.spacingS - Theme.spacingM - height: 1 - - StyledText { - id: dockBorderOpacityText - visible: false - text: I18n.tr("Border Opacity") - font.pixelSize: Theme.fontSizeSmall - } - } - - DankActionButton { - id: resetDockBorderOpacityBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockBorderOpacity", 1.0); - } - } - - Item { - width: Theme.spacingS - height: 1 - } - } - - DankSlider { - id: dockBorderOpacitySlider - width: parent.width - height: 24 - value: SettingsData.dockBorderOpacity * 100 - minimum: 0 - maximum: 100 - unit: "%" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockBorderOpacity", newValue / 100); - } - } - } - - Column { - width: parent.width - parent.leftPadding - spacing: Theme.spacingS - - Row { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Border Thickness") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - dockBorderThicknessText.implicitWidth - resetDockBorderThicknessBtn.width - Theme.spacingS - Theme.spacingM - height: 1 - - StyledText { - id: dockBorderThicknessText - visible: false - text: I18n.tr("Border Thickness") - font.pixelSize: Theme.fontSizeSmall - } - } - - DankActionButton { - id: resetDockBorderThicknessBtn - buttonSize: 20 - iconName: "refresh" - iconSize: 12 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - onClicked: { - SettingsData.set("dockBorderThickness", 1); - } - } - - Item { - width: Theme.spacingS - height: 1 - } - } - - DankSlider { - id: dockBorderThicknessSlider - width: parent.width - height: 24 - value: SettingsData.dockBorderThickness - minimum: 1 - maximum: 10 - unit: "px" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("dockBorderThickness", newValue); - } - } - } - } + SettingsSliderRow { + text: I18n.tr("Border Thickness") + visible: SettingsData.dockBorderEnabled + value: SettingsData.dockBorderThickness + minimum: 1 + maximum: 10 + unit: "px" + defaultValue: 1 + onSliderValueChanged: newValue => SettingsData.set("dockBorderThickness", newValue) } } } diff --git a/quickshell/Modules/Settings/KeybindsTab.qml b/quickshell/Modules/Settings/KeybindsTab.qml index 046d3cec..8952b48d 100644 --- a/quickshell/Modules/Settings/KeybindsTab.qml +++ b/quickshell/Modules/Settings/KeybindsTab.qml @@ -120,12 +120,10 @@ Item { function onBindSaved(key) { keybindsTab._savedScrollY = flickable.contentY; keybindsTab._preserveScroll = true; - keybindsTab._editingKey = key; } function onBindRemoved(key) { keybindsTab._savedScrollY = flickable.contentY; keybindsTab._preserveScroll = true; - keybindsTab._editingKey = ""; } } @@ -597,15 +595,50 @@ Item { anchors.horizontalCenter: parent.horizontalCenter bindData: modelData isExpanded: keybindsTab.expandedKey === modelData.action - restoreKey: isExpanded ? keybindsTab._editingKey : "" panelWindow: keybindsTab.parentModal onToggleExpand: keybindsTab.toggleExpanded(modelData.action) onSaveBind: (originalKey, newData) => { KeybindsService.saveBind(originalKey, newData); + keybindsTab._editingKey = newData.key; keybindsTab.expandedKey = modelData.action; } - onRemoveBind: key => KeybindsService.removeBind(key) - onRestoreKeyConsumed: keybindsTab._editingKey = "" + onRemoveBind: key => { + const remainingKey = bindItem.keys.find(k => k.key !== key)?.key ?? ""; + KeybindsService.removeBind(key); + keybindsTab._editingKey = remainingKey; + } + onIsExpandedChanged: { + if (!isExpanded || !keybindsTab._editingKey) + return; + const keyExists = keys.some(k => k.key === keybindsTab._editingKey); + if (keyExists) { + restoreKey = keybindsTab._editingKey; + keybindsTab._editingKey = ""; + } + } + + onKeysChanged: { + if (!isExpanded || !keybindsTab._editingKey) + return; + const keyExists = keys.some(k => k.key === keybindsTab._editingKey); + if (keyExists) { + restoreKey = keybindsTab._editingKey; + keybindsTab._editingKey = ""; + } + } + + Connections { + target: keybindsTab + function on_EditingKeyChanged() { + if (!bindItem.isExpanded || !keybindsTab._editingKey) + return; + const keyExists = bindItem.keys.some(k => k.key === keybindsTab._editingKey); + if (keyExists) { + bindItem.restoreKey = keybindsTab._editingKey; + keybindsTab._editingKey = ""; + } + } + } } } } diff --git a/quickshell/Modules/Settings/LauncherTab.qml b/quickshell/Modules/Settings/LauncherTab.qml index 0daf0ee8..31dab9b1 100644 --- a/quickshell/Modules/Settings/LauncherTab.qml +++ b/quickshell/Modules/Settings/LauncherTab.qml @@ -3,9 +3,10 @@ import qs.Common import qs.Modals.FileBrowser import qs.Services import qs.Widgets +import qs.Modules.Settings.Widgets Item { - id: recentAppsTab + id: root FileBrowserModal { id: logoFileBrowser @@ -13,9 +14,7 @@ Item { browserIcon: "image" browserType: "generic" filterExtensions: ["*.svg", "*.png", "*.jpg", "*.jpeg", "*.webp"] - onFileSelected: path => { - SettingsData.set("launcherLogoCustomPath", path.replace("file://", "")); - } + onFileSelected: path => SettingsData.set("launcherLogoCustomPath", path.replace("file://", "")) } DankFlickable { @@ -30,893 +29,479 @@ Item { anchors.horizontalCenter: parent.horizontalCenter spacing: Theme.spacingXL - StyledRect { + SettingsCard { width: parent.width - height: launcherLogoSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "apps" + title: I18n.tr("Launcher Button Logo") - Column { - id: launcherLogoSection + StyledText { + width: parent.width + text: I18n.tr("Choose the logo displayed on the launcher button in DankBar") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + } - anchors.fill: parent - anchors.margins: Theme.spacingL + Item { + width: parent.width + height: logoModeGroup.implicitHeight + + DankButtonGroup { + id: logoModeGroup + anchors.horizontalCenter: parent.horizontalCenter + model: { + const modes = [I18n.tr("Apps Icon"), I18n.tr("OS Logo"), I18n.tr("Dank")]; + if (CompositorService.isNiri) { + modes.push("niri"); + } else if (CompositorService.isHyprland) { + modes.push("Hyprland"); + } else if (CompositorService.isDwl) { + modes.push("mango"); + } else if (CompositorService.isSway) { + modes.push("Sway"); + } else { + modes.push(I18n.tr("Compositor")); + } + modes.push(I18n.tr("Custom")); + return modes; + } + currentIndex: { + if (SettingsData.launcherLogoMode === "apps") + return 0; + if (SettingsData.launcherLogoMode === "os") + return 1; + if (SettingsData.launcherLogoMode === "dank") + return 2; + if (SettingsData.launcherLogoMode === "compositor") + return 3; + if (SettingsData.launcherLogoMode === "custom") + return 4; + return 0; + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + switch (index) { + case 0: + SettingsData.set("launcherLogoMode", "apps"); + break; + case 1: + SettingsData.set("launcherLogoMode", "os"); + break; + case 2: + SettingsData.set("launcherLogoMode", "dank"); + break; + case 3: + SettingsData.set("launcherLogoMode", "compositor"); + break; + case 4: + SettingsData.set("launcherLogoMode", "custom"); + break; + } + } + } + } + + Row { + width: parent.width + visible: SettingsData.launcherLogoMode === "custom" spacing: Theme.spacingM - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "apps" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } + StyledRect { + width: parent.width - selectButton.width - Theme.spacingM + height: 36 + radius: Theme.cornerRadius + color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.9) + border.color: Theme.outlineStrong + border.width: 1 StyledText { - text: I18n.tr("Launcher Button Logo") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText + anchors.left: parent.left + anchors.leftMargin: Theme.spacingM anchors.verticalCenter: parent.verticalCenter + text: SettingsData.launcherLogoCustomPath || I18n.tr("Select an image file...") + font.pixelSize: Theme.fontSizeMedium + color: SettingsData.launcherLogoCustomPath ? Theme.surfaceText : Theme.outlineButton + width: parent.width - Theme.spacingM * 2 + elide: Text.ElideMiddle } } - StyledText { - width: parent.width - text: I18n.tr("Choose the logo displayed on the launcher button in DankBar") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap + DankActionButton { + id: selectButton + iconName: "folder_open" + width: 36 + height: 36 + onClicked: logoFileBrowser.open() } + } - Item { - width: parent.width - height: logoModeGroup.height - - DankButtonGroup { - id: logoModeGroup - anchors.horizontalCenter: parent.horizontalCenter - model: { - const modes = [I18n.tr("Apps Icon"), I18n.tr("OS Logo"), I18n.tr("Dank")]; - if (CompositorService.isNiri) { - modes.push("niri"); - } else if (CompositorService.isHyprland) { - modes.push("Hyprland"); - } else if (CompositorService.isDwl) { - modes.push("mango"); - } else if (CompositorService.isSway) { - modes.push("Sway"); - } else { - modes.push(I18n.tr("Compositor")); - } - modes.push(I18n.tr("Custom")); - return modes; - } - currentIndex: { - if (SettingsData.launcherLogoMode === "apps") - return 0; - if (SettingsData.launcherLogoMode === "os") - return 1; - if (SettingsData.launcherLogoMode === "dank") - return 2; - if (SettingsData.launcherLogoMode === "compositor") - return 3; - if (SettingsData.launcherLogoMode === "custom") - return 4; - return 0; - } - onSelectionChanged: (index, selected) => { - if (!selected) - return; - if (index === 0) { - SettingsData.set("launcherLogoMode", "apps"); - } else if (index === 1) { - SettingsData.set("launcherLogoMode", "os"); - } else if (index === 2) { - SettingsData.set("launcherLogoMode", "dank"); - } else if (index === 3) { - SettingsData.set("launcherLogoMode", "compositor"); - } else if (index === 4) { - SettingsData.set("launcherLogoMode", "custom"); - } - } - } - } - - Row { - width: parent.width - visible: SettingsData.launcherLogoMode === "custom" - opacity: visible ? 1 : 0 - spacing: Theme.spacingM - - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing - } - } - - StyledRect { - width: parent.width - selectButton.width - Theme.spacingM - height: 36 - radius: Theme.cornerRadius - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.9) - border.color: Theme.outlineStrong - border.width: 1 - - StyledText { - anchors.left: parent.left - anchors.leftMargin: Theme.spacingM - anchors.verticalCenter: parent.verticalCenter - text: SettingsData.launcherLogoCustomPath || I18n.tr("Select an image file...") - font.pixelSize: Theme.fontSizeMedium - color: SettingsData.launcherLogoCustomPath ? Theme.surfaceText : Theme.outlineButton - width: parent.width - Theme.spacingM * 2 - elide: Text.ElideMiddle - } - } - - DankActionButton { - id: selectButton - iconName: "folder_open" - width: 36 - height: 36 - onClicked: logoFileBrowser.open() - } - } + Column { + width: parent.width + spacing: Theme.spacingL + visible: SettingsData.launcherLogoMode !== "apps" Column { width: parent.width - spacing: Theme.spacingL - visible: SettingsData.launcherLogoMode !== "apps" - opacity: visible ? 1 : 0 + spacing: Theme.spacingM - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing - } + StyledText { + text: I18n.tr("Color Override") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + font.weight: Font.Medium + anchors.horizontalCenter: parent.horizontalCenter } - Column { - width: parent.width + Row { + anchors.horizontalCenter: parent.horizontalCenter spacing: Theme.spacingM - StyledText { - text: I18n.tr("Color Override") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter + DankButtonGroup { + id: colorModeGroup + model: [I18n.tr("Default"), I18n.tr("Primary"), I18n.tr("Surface"), I18n.tr("Custom")] + currentIndex: { + const override = SettingsData.launcherLogoColorOverride; + if (override === "") + return 0; + if (override === "primary") + return 1; + if (override === "surface") + return 2; + return 3; + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + switch (index) { + case 0: + SettingsData.set("launcherLogoColorOverride", ""); + break; + case 1: + SettingsData.set("launcherLogoColorOverride", "primary"); + break; + case 2: + SettingsData.set("launcherLogoColorOverride", "surface"); + break; + case 3: + const currentOverride = SettingsData.launcherLogoColorOverride; + const isPreset = currentOverride === "" || currentOverride === "primary" || currentOverride === "surface"; + if (isPreset) { + SettingsData.set("launcherLogoColorOverride", "#ffffff"); + } + break; + } + } } - Row { - anchors.horizontalCenter: parent.horizontalCenter - spacing: Theme.spacingM - - DankButtonGroup { - id: colorModeGroup - model: [I18n.tr("Default"), I18n.tr("Primary"), I18n.tr("Surface"), I18n.tr("Custom")] - currentIndex: { - const override = SettingsData.launcherLogoColorOverride; - if (override === "") - return 0; - if (override === "primary") - return 1; - if (override === "surface") - return 2; - return 3; + Rectangle { + visible: { + const override = SettingsData.launcherLogoColorOverride; + return override !== "" && override !== "primary" && override !== "surface"; + } + width: 36 + height: 36 + radius: 18 + color: { + const override = SettingsData.launcherLogoColorOverride; + if (override !== "" && override !== "primary" && override !== "surface") { + return override; } - onSelectionChanged: (index, selected) => { - if (!selected) + return "#ffffff"; + } + border.color: Theme.outline + border.width: 1 + anchors.verticalCenter: parent.verticalCenter + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (!PopoutService.colorPickerModal) return; - if (index === 0) { - SettingsData.set("launcherLogoColorOverride", ""); - } else if (index === 1) { - SettingsData.set("launcherLogoColorOverride", "primary"); - } else if (index === 2) { - SettingsData.set("launcherLogoColorOverride", "surface"); - } else if (index === 3) { - const currentOverride = SettingsData.launcherLogoColorOverride; - const isPreset = currentOverride === "" || currentOverride === "primary" || currentOverride === "surface"; - if (isPreset) { - SettingsData.set("launcherLogoColorOverride", "#ffffff"); - } - } - } - } - - Rectangle { - visible: { - const override = SettingsData.launcherLogoColorOverride; - return override !== "" && override !== "primary" && override !== "surface"; - } - width: 36 - height: 36 - radius: 18 - color: { - const override = SettingsData.launcherLogoColorOverride; - if (override !== "" && override !== "primary" && override !== "surface") { - return override; - } - return "#ffffff"; - } - border.color: Theme.outline - border.width: 1 - anchors.verticalCenter: parent.verticalCenter - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (PopoutService.colorPickerModal) { - PopoutService.colorPickerModal.selectedColor = SettingsData.launcherLogoColorOverride; - PopoutService.colorPickerModal.pickerTitle = I18n.tr("Choose Launcher Logo Color"); - PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { - SettingsData.set("launcherLogoColorOverride", selectedColor); - }; - PopoutService.colorPickerModal.show(); - } - } - } - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - Column { - width: 120 - spacing: Theme.spacingS - anchors.horizontalCenter: parent.horizontalCenter - - StyledText { - text: I18n.tr("Size Offset") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - - DankSlider { - width: 100 - height: 20 - minimum: -12 - maximum: 12 - value: SettingsData.launcherLogoSizeOffset - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - anchors.horizontalCenter: parent.horizontalCenter - onSliderValueChanged: newValue => { - SettingsData.set("launcherLogoSizeOffset", newValue); - } - } - } - } - - Item { - width: parent.width - height: customControlsFlow.height - visible: { - const override = SettingsData.launcherLogoColorOverride; - return override !== "" && override !== "primary" && override !== "surface"; - } - opacity: visible ? 1 : 0 - - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing - } - } - - Flow { - id: customControlsFlow - anchors.horizontalCenter: parent.horizontalCenter - spacing: Theme.spacingS - - Column { - width: 120 - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Brightness") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - - DankSlider { - width: 100 - height: 20 - minimum: 0 - maximum: 100 - value: Math.round(SettingsData.launcherLogoBrightness * 100) - unit: "%" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - anchors.horizontalCenter: parent.horizontalCenter - onSliderValueChanged: newValue => { - SettingsData.set("launcherLogoBrightness", newValue / 100); - } - } - } - - Column { - width: 120 - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Contrast") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - - DankSlider { - width: 100 - height: 20 - minimum: 0 - maximum: 200 - value: Math.round(SettingsData.launcherLogoContrast * 100) - unit: "%" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - anchors.horizontalCenter: parent.horizontalCenter - onSliderValueChanged: newValue => { - SettingsData.set("launcherLogoContrast", newValue / 100); - } - } - } - - Column { - width: 120 - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Invert on mode change") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - - DankToggle { - width: 32 - height: 18 - checked: SettingsData.launcherLogoColorInvertOnMode - anchors.horizontalCenter: parent.horizontalCenter - onToggled: checked => { - SettingsData.set("launcherLogoColorInvertOnMode", checked); - } + PopoutService.colorPickerModal.selectedColor = SettingsData.launcherLogoColorOverride; + PopoutService.colorPickerModal.pickerTitle = I18n.tr("Choose Launcher Logo Color"); + PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { + SettingsData.set("launcherLogoColorOverride", selectedColor); + }; + PopoutService.colorPickerModal.show(); } } } } } - } - } - StyledRect { - width: parent.width - height: launchPrefixSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: launchPrefixSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "terminal" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Launch Prefix") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - width: parent.width - text: I18n.tr("Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - } - - DankTextField { - width: parent.width - text: SettingsData.launchPrefix - placeholderText: I18n.tr("Enter launch prefix (e.g., 'uwsm-app')") - onTextEdited: { - SettingsData.set("launchPrefix", text); - } - } - } - } - - StyledRect { - width: parent.width - height: sortingSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: sortingSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "sort_by_alpha" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Sort Alphabetically") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - parent.children[0].width - parent.children[1].width - sortToggle.width - Theme.spacingM * 3 - height: 1 - } - - DankToggle { - id: sortToggle - - width: 32 - height: 18 - checked: SettingsData.sortAppsAlphabetically - anchors.verticalCenter: parent.verticalCenter - onToggled: checked => { - SettingsData.set("sortAppsAlphabetically", checked); - } - } - } - - StyledText { - width: parent.width - text: I18n.tr("When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - } - } - } - - StyledRect { - width: parent.width - height: gridColumnsSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: gridColumnsSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "grid_view" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Grid Columns") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - width: parent.width - text: I18n.tr("Adjust the number of columns in grid view mode.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap + SettingsSliderRow { + text: I18n.tr("Size Offset") + minimum: -12 + maximum: 12 + value: SettingsData.launcherLogoSizeOffset + defaultValue: 0 + onSliderValueChanged: newValue => SettingsData.set("launcherLogoSizeOffset", newValue) } Column { - width: 120 - spacing: Theme.spacingS - anchors.horizontalCenter: parent.horizontalCenter - - DankSlider { - width: 100 - height: 20 - minimum: 2 - maximum: 8 - value: SettingsData.appLauncherGridColumns - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - anchors.horizontalCenter: parent.horizontalCenter - onSliderValueChanged: newValue => { - SettingsData.set("appLauncherGridColumns", newValue); - } - } - } - } - } - - StyledRect { - width: parent.width - height: niriOverviewSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: CompositorService.isNiri - - Column { - id: niriOverviewSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { width: parent.width spacing: Theme.spacingM - - DankIcon { - name: "open_in_new" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter + visible: { + const override = SettingsData.launcherLogoColorOverride; + return override !== "" && override !== "primary" && override !== "surface"; } - StyledText { - text: I18n.tr("Close Overview on Launch") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter + SettingsSliderRow { + text: I18n.tr("Brightness") + minimum: 0 + maximum: 100 + value: Math.round(SettingsData.launcherLogoBrightness * 100) + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => SettingsData.set("launcherLogoBrightness", newValue / 100) } - Item { - width: parent.width - parent.children[0].width - parent.children[1].width - niriOverviewToggle.width - Theme.spacingM * 3 - height: 1 + SettingsSliderRow { + text: I18n.tr("Contrast") + minimum: 0 + maximum: 200 + value: Math.round(SettingsData.launcherLogoContrast * 100) + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => SettingsData.set("launcherLogoContrast", newValue / 100) } - DankToggle { - id: niriOverviewToggle - - width: 32 - height: 18 - checked: SettingsData.spotlightCloseNiriOverview - anchors.verticalCenter: parent.verticalCenter - onToggled: checked => { - SettingsData.set("spotlightCloseNiriOverview", checked); - } + SettingsToggleRow { + text: I18n.tr("Invert on mode change") + checked: SettingsData.launcherLogoColorInvertOnMode + onToggled: checked => SettingsData.set("launcherLogoColorInvertOnMode", checked) } } - - StyledText { - width: parent.width - text: I18n.tr("When enabled, launching an app from the launcher will automatically close the Niri overview if it's open.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - } } } - StyledRect { + SettingsCard { width: parent.width - height: niriOverlayEnabledSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "terminal" + title: I18n.tr("Launch Prefix") + + StyledText { + width: parent.width + text: I18n.tr("Add a custom prefix to all application launches. This can be used for things like 'uwsm-app', 'systemd-run', or other command wrappers.") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + } + + DankTextField { + width: parent.width + text: SettingsData.launchPrefix + placeholderText: I18n.tr("Enter launch prefix (e.g., 'uwsm-app')") + onTextEdited: SettingsData.set("launchPrefix", text) + } + } + + SettingsCard { + width: parent.width + iconName: "sort_by_alpha" + title: I18n.tr("Sorting & Layout") + + SettingsToggleRow { + text: I18n.tr("Sort Alphabetically") + description: I18n.tr("When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.") + checked: SettingsData.sortAppsAlphabetically + onToggled: checked => SettingsData.set("sortAppsAlphabetically", checked) + } + + SettingsSliderRow { + text: I18n.tr("Grid Columns") + description: I18n.tr("Adjust the number of columns in grid view mode.") + minimum: 2 + maximum: 8 + value: SettingsData.appLauncherGridColumns + defaultValue: 5 + onSliderValueChanged: newValue => SettingsData.set("appLauncherGridColumns", newValue) + } + } + + SettingsCard { + width: parent.width + iconName: "open_in_new" + title: I18n.tr("Niri Integration") visible: CompositorService.isNiri - Column { - id: niriOverlayEnabledSection + SettingsToggleRow { + text: I18n.tr("Close Overview on Launch") + description: I18n.tr("When enabled, launching an app from the launcher will automatically close the Niri overview if it's open.") + checked: SettingsData.spotlightCloseNiriOverview + onToggled: checked => SettingsData.set("spotlightCloseNiriOverview", checked) + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "layers" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Enable Overview Overlay") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - parent.children[0].width - parent.children[1].width - niriOverlayToggle.width - Theme.spacingM * 3 - height: 1 - } - - DankToggle { - id: niriOverlayToggle - - width: 32 - height: 18 - checked: SettingsData.niriOverviewOverlayEnabled - anchors.verticalCenter: parent.verticalCenter - onToggled: checked => { - SettingsData.set("niriOverviewOverlayEnabled", checked); - } - } - } - - StyledText { - width: parent.width - text: I18n.tr("When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - } + SettingsToggleRow { + text: I18n.tr("Enable Overview Overlay") + description: I18n.tr("When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.") + checked: SettingsData.niriOverviewOverlayEnabled + onToggled: checked => SettingsData.set("niriOverviewOverlayEnabled", checked) } } - StyledRect { + SettingsCard { width: parent.width - height: recentlyUsedSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + iconName: "history" + title: I18n.tr("Recently Used Apps") - Column { - id: recentlyUsedSection - - property var rankedAppsModel: { - var apps = []; - for (var appId in (AppUsageHistoryData.appUsageRanking || {})) { - var appData = (AppUsageHistoryData.appUsageRanking || {})[appId]; - apps.push({ - "id": appId, - "name": appData.name, - "exec": appData.exec, - "icon": appData.icon, - "comment": appData.comment, - "usageCount": appData.usageCount, - "lastUsed": appData.lastUsed - }); - } - apps.sort(function (a, b) { - if (a.usageCount !== b.usageCount) - return b.usageCount - a.usageCount; - - return a.name.localeCompare(b.name); + property var rankedAppsModel: { + var apps = []; + for (var appId in (AppUsageHistoryData.appUsageRanking || {})) { + var appData = (AppUsageHistoryData.appUsageRanking || {})[appId]; + apps.push({ + "id": appId, + "name": appData.name, + "exec": appData.exec, + "icon": appData.icon, + "comment": appData.comment, + "usageCount": appData.usageCount, + "lastUsed": appData.lastUsed }); - return apps.slice(0, 20); } + apps.sort(function (a, b) { + if (a.usageCount !== b.usageCount) + return b.usageCount - a.usageCount; + return a.name.localeCompare(b.name); + }); + return apps.slice(0, 20); + } - anchors.fill: parent - anchors.margins: Theme.spacingL + Row { + width: parent.width spacing: Theme.spacingM - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "history" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Recently Used Apps") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - parent.children[0].width - parent.children[1].width - clearAllButton.width - Theme.spacingM * 3 - height: 1 - } - - DankActionButton { - id: clearAllButton - - iconName: "delete_sweep" - iconSize: Theme.iconSize - 2 - iconColor: Theme.error - anchors.verticalCenter: parent.verticalCenter - onClicked: { - AppUsageHistoryData.appUsageRanking = {}; - AppUsageHistoryData.saveSettings(); - } - } - } - StyledText { - width: parent.width + width: parent.width - clearAllButton.width - Theme.spacingM text: I18n.tr("Apps are ordered by usage frequency, then last used, then alphabetically.") font.pixelSize: Theme.fontSizeSmall color: Theme.surfaceVariantText wrapMode: Text.WordWrap + anchors.verticalCenter: parent.verticalCenter } - Column { - id: rankedAppsList + DankActionButton { + id: clearAllButton + iconName: "delete_sweep" + iconSize: Theme.iconSize - 2 + iconColor: Theme.error + anchors.verticalCenter: parent.verticalCenter + onClicked: { + AppUsageHistoryData.appUsageRanking = {}; + AppUsageHistoryData.saveSettings(); + } + } + } - width: parent.width - spacing: Theme.spacingS + Column { + id: rankedAppsList + width: parent.width + spacing: Theme.spacingS - Repeater { - model: recentlyUsedSection.rankedAppsModel + Repeater { + model: parent.parent.rankedAppsModel - delegate: Rectangle { - width: rankedAppsList.width - height: 48 - radius: Theme.cornerRadius - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.3) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.1) - border.width: 0 + delegate: Rectangle { + width: rankedAppsList.width + height: 48 + radius: Theme.cornerRadius + color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.3) + border.width: 0 - Row { - anchors.left: parent.left - anchors.leftMargin: Theme.spacingM + Row { + anchors.left: parent.left + anchors.leftMargin: Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingM + + StyledText { + text: (index + 1).toString() + font.pixelSize: Theme.fontSizeSmall + font.weight: Font.Medium + color: Theme.primary + width: 20 anchors.verticalCenter: parent.verticalCenter - spacing: Theme.spacingM + } - StyledText { - text: (index + 1).toString() - font.pixelSize: Theme.fontSizeSmall - font.weight: Font.Medium - color: Theme.primary - width: 20 - anchors.verticalCenter: parent.verticalCenter - } - - Image { - width: 24 - height: 24 - source: modelData.icon ? "image://icon/" + modelData.icon : "image://icon/application-x-executable" - sourceSize.width: 24 - sourceSize.height: 24 - fillMode: Image.PreserveAspectFit - anchors.verticalCenter: parent.verticalCenter - onStatusChanged: { - if (status === Image.Error) - source = "image://icon/application-x-executable"; - } - } - - Column { - anchors.verticalCenter: parent.verticalCenter - spacing: 2 - - StyledText { - text: modelData.name || "Unknown App" - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: { - if (!modelData.lastUsed) - return "Never used"; - - var date = new Date(modelData.lastUsed); - var now = new Date(); - var diffMs = now - date; - var diffMins = Math.floor(diffMs / (1000 * 60)); - var diffHours = Math.floor(diffMs / (1000 * 60 * 60)); - var diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); - if (diffMins < 1) - return I18n.tr("Last launched just now"); - - if (diffMins < 60) - return I18n.tr("Last launched %1 minute%2 ago").arg(diffMins).arg(diffMins === 1 ? "" : "s"); - - if (diffHours < 24) - return I18n.tr("Last launched %1 hour%2 ago").arg(diffHours).arg(diffHours === 1 ? "" : "s"); - - if (diffDays < 7) - return I18n.tr("Last launched %1 day%2 ago").arg(diffDays).arg(diffDays === 1 ? "" : "s"); - - return I18n.tr("Last launched %1").arg(date.toLocaleDateString()); - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } + Image { + width: 24 + height: 24 + source: modelData.icon ? "image://icon/" + modelData.icon : "image://icon/application-x-executable" + sourceSize.width: 24 + sourceSize.height: 24 + fillMode: Image.PreserveAspectFit + anchors.verticalCenter: parent.verticalCenter + onStatusChanged: { + if (status === Image.Error) + source = "image://icon/application-x-executable"; } } - DankActionButton { - anchors.right: parent.right - anchors.rightMargin: Theme.spacingM + Column { anchors.verticalCenter: parent.verticalCenter - circular: true - iconName: "close" - iconSize: 16 - iconColor: Theme.error - onClicked: { - var currentRanking = Object.assign({}, AppUsageHistoryData.appUsageRanking || {}); - delete currentRanking[modelData.id]; - AppUsageHistoryData.appUsageRanking = currentRanking; - AppUsageHistoryData.saveSettings(); + spacing: 2 + + StyledText { + text: modelData.name || "Unknown App" + font.pixelSize: Theme.fontSizeMedium + font.weight: Font.Medium + color: Theme.surfaceText + } + + StyledText { + text: { + if (!modelData.lastUsed) + return "Never used"; + var date = new Date(modelData.lastUsed); + var now = new Date(); + var diffMs = now - date; + var diffMins = Math.floor(diffMs / (1000 * 60)); + var diffHours = Math.floor(diffMs / (1000 * 60 * 60)); + var diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24)); + if (diffMins < 1) + return I18n.tr("Last launched just now"); + if (diffMins < 60) + return I18n.tr("Last launched %1 minute%2 ago").arg(diffMins).arg(diffMins === 1 ? "" : "s"); + if (diffHours < 24) + return I18n.tr("Last launched %1 hour%2 ago").arg(diffHours).arg(diffHours === 1 ? "" : "s"); + if (diffDays < 7) + return I18n.tr("Last launched %1 day%2 ago").arg(diffDays).arg(diffDays === 1 ? "" : "s"); + return I18n.tr("Last launched %1").arg(date.toLocaleDateString()); + } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText } } } - } - StyledText { - width: parent.width - text: recentlyUsedSection.rankedAppsModel.length === 0 ? "No apps have been launched yet." : "" - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceVariantText - horizontalAlignment: Text.AlignHCenter - visible: recentlyUsedSection.rankedAppsModel.length === 0 + DankActionButton { + anchors.right: parent.right + anchors.rightMargin: Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + circular: true + iconName: "close" + iconSize: 16 + iconColor: Theme.error + onClicked: { + var currentRanking = Object.assign({}, AppUsageHistoryData.appUsageRanking || {}); + delete currentRanking[modelData.id]; + AppUsageHistoryData.appUsageRanking = currentRanking; + AppUsageHistoryData.saveSettings(); + } + } } } + + StyledText { + width: parent.width + text: parent.parent.rankedAppsModel.length === 0 ? "No apps have been launched yet." : "" + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceVariantText + horizontalAlignment: Text.AlignHCenter + visible: parent.parent.rankedAppsModel.length === 0 + } } } } diff --git a/quickshell/Modules/Settings/LockScreenTab.qml b/quickshell/Modules/Settings/LockScreenTab.qml new file mode 100644 index 00000000..13a4e370 --- /dev/null +++ b/quickshell/Modules/Settings/LockScreenTab.qml @@ -0,0 +1,183 @@ +import QtQuick +import Quickshell +import qs.Common +import qs.Services +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "lock" + title: I18n.tr("Lock Screen") + + SettingsToggleRow { + text: I18n.tr("Show Power Actions") + description: I18n.tr("Show power, restart, and logout buttons on the lock screen") + checked: SettingsData.lockScreenShowPowerActions + onToggled: checked => SettingsData.set("lockScreenShowPowerActions", checked) + } + + StyledText { + text: I18n.tr("loginctl not available - lock integration requires DMS socket connection") + font.pixelSize: Theme.fontSizeSmall + color: Theme.warning + visible: !SessionService.loginctlAvailable + width: parent.width + wrapMode: Text.Wrap + } + + SettingsToggleRow { + text: I18n.tr("Enable loginctl lock integration") + description: I18n.tr("Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen") + checked: SessionService.loginctlAvailable && SettingsData.loginctlLockIntegration + enabled: SessionService.loginctlAvailable + onToggled: checked => { + if (!SessionService.loginctlAvailable) + return; + SettingsData.set("loginctlLockIntegration", checked); + } + } + + SettingsToggleRow { + text: I18n.tr("Lock before suspend") + description: I18n.tr("Automatically lock the screen when the system prepares to suspend") + checked: SettingsData.lockBeforeSuspend + visible: SessionService.loginctlAvailable && SettingsData.loginctlLockIntegration + onToggled: checked => SettingsData.set("lockBeforeSuspend", checked) + } + + SettingsToggleRow { + text: I18n.tr("Enable fingerprint authentication") + description: I18n.tr("Use fingerprint reader for lock screen authentication (requires enrolled fingerprints)") + checked: SettingsData.enableFprint + visible: SettingsData.fprintdAvailable + onToggled: checked => SettingsData.set("enableFprint", checked) + } + } + + SettingsCard { + width: parent.width + iconName: "monitor" + title: I18n.tr("Lock Screen Display") + visible: Quickshell.screens.length > 1 + + StyledText { + text: I18n.tr("Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + width: parent.width + wrapMode: Text.Wrap + } + + SettingsDropdownRow { + id: lockScreenMonitorDropdown + text: I18n.tr("Active Lock Screen Monitor") + options: { + var opts = [I18n.tr("All Monitors")]; + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + opts.push(SettingsData.getScreenDisplayName(screens[i])); + } + return opts; + } + + Component.onCompleted: { + if (SettingsData.lockScreenActiveMonitor === "all") { + currentValue = I18n.tr("All Monitors"); + return; + } + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + if (screens[i].name === SettingsData.lockScreenActiveMonitor) { + currentValue = SettingsData.getScreenDisplayName(screens[i]); + return; + } + } + currentValue = I18n.tr("All Monitors"); + } + + onValueChanged: value => { + if (value === I18n.tr("All Monitors")) { + SettingsData.set("lockScreenActiveMonitor", "all"); + return; + } + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + if (SettingsData.getScreenDisplayName(screens[i]) === value) { + SettingsData.set("lockScreenActiveMonitor", screens[i].name); + return; + } + } + } + } + + Row { + width: parent.width + spacing: Theme.spacingM + visible: SettingsData.lockScreenActiveMonitor !== "all" + + Column { + width: parent.width - inactiveColorPreview.width - Theme.spacingM + spacing: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: I18n.tr("Inactive Monitor Color") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + } + + StyledText { + text: I18n.tr("Color displayed on monitors without the lock screen") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + width: parent.width + wrapMode: Text.Wrap + } + } + + Rectangle { + id: inactiveColorPreview + width: 48 + height: 48 + radius: Theme.cornerRadius + color: SettingsData.lockScreenInactiveColor + border.color: Theme.outline + border.width: 1 + anchors.verticalCenter: parent.verticalCenter + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (!PopoutService.colorPickerModal) + return; + PopoutService.colorPickerModal.selectedColor = SettingsData.lockScreenInactiveColor; + PopoutService.colorPickerModal.pickerTitle = I18n.tr("Inactive Monitor Color"); + PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { + SettingsData.set("lockScreenInactiveColor", selectedColor); + }; + PopoutService.colorPickerModal.show(); + } + } + } + } + } + } + } +} diff --git a/quickshell/Modules/Settings/MediaPlayerTab.qml b/quickshell/Modules/Settings/MediaPlayerTab.qml new file mode 100644 index 00000000..f9a91d06 --- /dev/null +++ b/quickshell/Modules/Settings/MediaPlayerTab.qml @@ -0,0 +1,42 @@ +import QtQuick +import qs.Common +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "music_note" + title: I18n.tr("Media Player Settings") + + SettingsToggleRow { + text: I18n.tr("Wave Progress Bars") + description: I18n.tr("Use animated wave progress bars for media playback") + checked: SettingsData.waveProgressEnabled + onToggled: checked => SettingsData.set("waveProgressEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Scroll song title") + description: I18n.tr("Scroll title if it doesn't fit in widget") + checked: SettingsData.scrollTitleEnabled + onToggled: checked => SettingsData.set("scrollTitleEnabled", checked) + } + } + } + } +} diff --git a/quickshell/Modules/Settings/NotificationsTab.qml b/quickshell/Modules/Settings/NotificationsTab.qml new file mode 100644 index 00000000..246acede --- /dev/null +++ b/quickshell/Modules/Settings/NotificationsTab.qml @@ -0,0 +1,208 @@ +import QtQuick +import qs.Common +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + readonly property var timeoutOptions: [ + { + text: I18n.tr("Never"), + value: 0 + }, + { + text: I18n.tr("1 second"), + value: 1000 + }, + { + text: I18n.tr("3 seconds"), + value: 3000 + }, + { + text: I18n.tr("5 seconds"), + value: 5000 + }, + { + text: I18n.tr("8 seconds"), + value: 8000 + }, + { + text: I18n.tr("10 seconds"), + value: 10000 + }, + { + text: I18n.tr("15 seconds"), + value: 15000 + }, + { + text: I18n.tr("30 seconds"), + value: 30000 + }, + { + text: I18n.tr("1 minute"), + value: 60000 + }, + { + text: I18n.tr("2 minutes"), + value: 120000 + }, + { + text: I18n.tr("5 minutes"), + value: 300000 + }, + { + text: I18n.tr("10 minutes"), + value: 600000 + } + ] + + function getTimeoutText(value) { + if (value === undefined || value === null || isNaN(value)) + return I18n.tr("5 seconds"); + for (let i = 0; i < timeoutOptions.length; i++) { + if (timeoutOptions[i].value === value) + return timeoutOptions[i].text; + } + if (value === 0) + return I18n.tr("Never"); + if (value < 1000) + return value + "ms"; + if (value < 60000) + return Math.round(value / 1000) + " " + I18n.tr("seconds"); + return Math.round(value / 60000) + " " + I18n.tr("minutes"); + } + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "notifications" + title: I18n.tr("Notification Popups") + + SettingsDropdownRow { + text: I18n.tr("Popup Position") + description: I18n.tr("Choose where notification popups appear on screen") + currentValue: { + if (SettingsData.notificationPopupPosition === -1) + return "Top Center"; + switch (SettingsData.notificationPopupPosition) { + case SettingsData.Position.Top: + return "Top Right"; + case SettingsData.Position.Bottom: + return "Bottom Left"; + case SettingsData.Position.Left: + return "Top Left"; + case SettingsData.Position.Right: + return "Bottom Right"; + default: + return "Top Right"; + } + } + options: ["Top Right", "Top Left", "Top Center", "Bottom Right", "Bottom Left"] + onValueChanged: value => { + switch (value) { + case "Top Right": + SettingsData.set("notificationPopupPosition", SettingsData.Position.Top); + break; + case "Top Left": + SettingsData.set("notificationPopupPosition", SettingsData.Position.Left); + break; + case "Top Center": + SettingsData.set("notificationPopupPosition", -1); + break; + case "Bottom Right": + SettingsData.set("notificationPopupPosition", SettingsData.Position.Right); + break; + case "Bottom Left": + SettingsData.set("notificationPopupPosition", SettingsData.Position.Bottom); + break; + } + SettingsData.sendTestNotifications(); + } + } + + SettingsToggleRow { + text: I18n.tr("Notification Overlay") + description: I18n.tr("Display all priorities over fullscreen apps") + checked: SettingsData.notificationOverlayEnabled + onToggled: checked => SettingsData.set("notificationOverlayEnabled", checked) + } + } + + SettingsCard { + width: parent.width + iconName: "notifications_off" + title: I18n.tr("Do Not Disturb") + + SettingsToggleRow { + text: I18n.tr("Enable Do Not Disturb") + description: I18n.tr("Suppress notification popups while enabled") + checked: SessionData.doNotDisturb + onToggled: checked => SessionData.setDoNotDisturb(checked) + } + } + + SettingsCard { + width: parent.width + iconName: "timer" + title: I18n.tr("Notification Timeouts") + + SettingsDropdownRow { + text: I18n.tr("Low Priority") + description: I18n.tr("Timeout for low priority notifications") + currentValue: root.getTimeoutText(SettingsData.notificationTimeoutLow) + options: root.timeoutOptions.map(opt => opt.text) + onValueChanged: value => { + for (let i = 0; i < root.timeoutOptions.length; i++) { + if (root.timeoutOptions[i].text === value) { + SettingsData.set("notificationTimeoutLow", root.timeoutOptions[i].value); + break; + } + } + } + } + + SettingsDropdownRow { + text: I18n.tr("Normal Priority") + description: I18n.tr("Timeout for normal priority notifications") + currentValue: root.getTimeoutText(SettingsData.notificationTimeoutNormal) + options: root.timeoutOptions.map(opt => opt.text) + onValueChanged: value => { + for (let i = 0; i < root.timeoutOptions.length; i++) { + if (root.timeoutOptions[i].text === value) { + SettingsData.set("notificationTimeoutNormal", root.timeoutOptions[i].value); + break; + } + } + } + } + + SettingsDropdownRow { + text: I18n.tr("Critical Priority") + description: I18n.tr("Timeout for critical priority notifications") + currentValue: root.getTimeoutText(SettingsData.notificationTimeoutCritical) + options: root.timeoutOptions.map(opt => opt.text) + onValueChanged: value => { + for (let i = 0; i < root.timeoutOptions.length; i++) { + if (root.timeoutOptions[i].text === value) { + SettingsData.set("notificationTimeoutCritical", root.timeoutOptions[i].value); + break; + } + } + } + } + } + } + } +} diff --git a/quickshell/Modules/Settings/OSDTab.qml b/quickshell/Modules/Settings/OSDTab.qml new file mode 100644 index 00000000..878ce0fa --- /dev/null +++ b/quickshell/Modules/Settings/OSDTab.qml @@ -0,0 +1,147 @@ +import QtQuick +import qs.Common +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "tune" + title: I18n.tr("On-screen Displays") + + SettingsDropdownRow { + text: I18n.tr("OSD Position") + description: I18n.tr("Choose where on-screen displays appear on screen") + currentValue: { + switch (SettingsData.osdPosition) { + case SettingsData.Position.Top: + return "Top Right"; + case SettingsData.Position.Left: + return "Top Left"; + case SettingsData.Position.TopCenter: + return "Top Center"; + case SettingsData.Position.Right: + return "Bottom Right"; + case SettingsData.Position.Bottom: + return "Bottom Left"; + case SettingsData.Position.BottomCenter: + return "Bottom Center"; + case SettingsData.Position.LeftCenter: + return "Left Center"; + case SettingsData.Position.RightCenter: + return "Right Center"; + default: + return "Bottom Center"; + } + } + options: ["Top Right", "Top Left", "Top Center", "Bottom Right", "Bottom Left", "Bottom Center", "Left Center", "Right Center"] + onValueChanged: value => { + switch (value) { + case "Top Right": + SettingsData.set("osdPosition", SettingsData.Position.Top); + break; + case "Top Left": + SettingsData.set("osdPosition", SettingsData.Position.Left); + break; + case "Top Center": + SettingsData.set("osdPosition", SettingsData.Position.TopCenter); + break; + case "Bottom Right": + SettingsData.set("osdPosition", SettingsData.Position.Right); + break; + case "Bottom Left": + SettingsData.set("osdPosition", SettingsData.Position.Bottom); + break; + case "Bottom Center": + SettingsData.set("osdPosition", SettingsData.Position.BottomCenter); + break; + case "Left Center": + SettingsData.set("osdPosition", SettingsData.Position.LeftCenter); + break; + case "Right Center": + SettingsData.set("osdPosition", SettingsData.Position.RightCenter); + break; + } + } + } + + SettingsToggleRow { + text: I18n.tr("Always Show Percentage") + description: I18n.tr("Display volume and brightness percentage values in OSD popups") + checked: SettingsData.osdAlwaysShowValue + onToggled: checked => SettingsData.set("osdAlwaysShowValue", checked) + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + SettingsToggleRow { + text: I18n.tr("Volume") + description: I18n.tr("Show on-screen display when volume changes") + checked: SettingsData.osdVolumeEnabled + onToggled: checked => SettingsData.set("osdVolumeEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Media Volume") + description: I18n.tr("Show on-screen display when media player volume changes") + checked: SettingsData.osdMediaVolumeEnabled + onToggled: checked => SettingsData.set("osdMediaVolumeEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Brightness") + description: I18n.tr("Show on-screen display when brightness changes") + checked: SettingsData.osdBrightnessEnabled + onToggled: checked => SettingsData.set("osdBrightnessEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Idle Inhibitor") + description: I18n.tr("Show on-screen display when idle inhibitor state changes") + checked: SettingsData.osdIdleInhibitorEnabled + onToggled: checked => SettingsData.set("osdIdleInhibitorEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Microphone Mute") + description: I18n.tr("Show on-screen display when microphone is muted/unmuted") + checked: SettingsData.osdMicMuteEnabled + onToggled: checked => SettingsData.set("osdMicMuteEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Caps Lock") + description: I18n.tr("Show on-screen display when caps lock state changes") + checked: SettingsData.osdCapsLockEnabled + onToggled: checked => SettingsData.set("osdCapsLockEnabled", checked) + } + + SettingsToggleRow { + text: I18n.tr("Power Profile") + description: I18n.tr("Show on-screen display when power profile changes") + checked: SettingsData.osdPowerProfileEnabled + onToggled: checked => SettingsData.set("osdPowerProfileEnabled", checked) + } + } + } + } +} diff --git a/quickshell/Modules/Settings/PersonalizationTab.qml b/quickshell/Modules/Settings/PersonalizationTab.qml deleted file mode 100644 index b19caa34..00000000 --- a/quickshell/Modules/Settings/PersonalizationTab.qml +++ /dev/null @@ -1,2192 +0,0 @@ -import QtQuick -import QtQuick.Effects -import Quickshell -import qs.Common -import qs.Modals.FileBrowser -import qs.Services -import qs.Widgets - -Item { - id: personalizationTab - - property var parentModal: null - property var cachedFontFamilies: [] - property bool fontsEnumerated: false - property string selectedMonitorName: { - var screens = Quickshell.screens; - return screens.length > 0 ? screens[0].name : ""; - } - - function enumerateFonts() { - var fonts = ["Default"]; - var availableFonts = Qt.fontFamilies(); - var rootFamilies = []; - var seenFamilies = new Set(); - for (var i = 0; i < availableFonts.length; i++) { - var fontName = availableFonts[i]; - if (fontName.startsWith(".")) - continue; - if (fontName === Theme.defaultFontFamily) - continue; - var rootName = fontName.replace(/ (Thin|Extra Light|Light|Regular|Medium|Semi Bold|Demi Bold|Bold|Extra Bold|Black|Heavy)$/i, "").replace(/ (Italic|Oblique|Condensed|Extended|Narrow|Wide)$/i, "").replace(/ (UI|Display|Text|Mono|Sans|Serif)$/i, function (match, suffix) { - return match; - }).trim(); - if (!seenFamilies.has(rootName) && rootName !== "") { - seenFamilies.add(rootName); - rootFamilies.push(rootName); - } - } - cachedFontFamilies = fonts.concat(rootFamilies.sort()); - } - - Timer { - id: fontEnumerationTimer - interval: 50 - running: false - onTriggered: { - if (!fontsEnumerated) { - enumerateFonts(); - fontsEnumerated = true; - } - } - } - - Component.onCompleted: { - WallpaperCyclingService.cyclingActive; - fontEnumerationTimer.start(); - if (AudioService.gsettingsAvailable) { - AudioService.scanSoundThemes(); - } - } - - DankFlickable { - anchors.fill: parent - clip: true - contentHeight: mainColumn.height + Theme.spacingXL - contentWidth: width - - Column { - id: mainColumn - - width: Math.min(550, parent.width - Theme.spacingL * 2) - anchors.horizontalCenter: parent.horizontalCenter - spacing: Theme.spacingXL - - // Wallpaper Section - StyledRect { - width: parent.width - height: wallpaperSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: wallpaperSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "wallpaper" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Wallpaper") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Row { - width: parent.width - spacing: Theme.spacingL - - StyledRect { - width: 160 - height: 90 - radius: Theme.cornerRadius - color: Theme.surfaceVariant - border.color: Theme.outline - border.width: 0 - - CachingImage { - anchors.fill: parent - anchors.margins: 1 - source: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return (currentWallpaper !== "" && !currentWallpaper.startsWith("#")) ? "file://" + currentWallpaper : ""; - } - fillMode: Image.PreserveAspectCrop - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper !== "" && !currentWallpaper.startsWith("#"); - } - maxCacheSize: 160 - layer.enabled: true - - layer.effect: MultiEffect { - maskEnabled: true - maskSource: wallpaperMask - maskThresholdMin: 0.5 - maskSpreadAtMin: 1 - } - } - - Rectangle { - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper.startsWith("#") ? currentWallpaper : "transparent"; - } - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper !== "" && currentWallpaper.startsWith("#"); - } - } - - Rectangle { - id: wallpaperMask - - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: "black" - visible: false - layer.enabled: true - } - - DankIcon { - anchors.centerIn: parent - name: "image" - size: Theme.iconSizeLarge + 8 - color: Theme.surfaceVariantText - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper === ""; - } - } - - Rectangle { - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: Qt.rgba(0, 0, 0, 0.7) - visible: wallpaperMouseArea.containsMouse - - Row { - anchors.centerIn: parent - spacing: 4 - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(255, 255, 255, 0.9) - - DankIcon { - anchors.centerIn: parent - name: "folder_open" - size: 18 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: mainWallpaperBrowser.open() - } - } - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(255, 255, 255, 0.9) - - DankIcon { - anchors.centerIn: parent - name: "palette" - size: 18 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (PopoutService.colorPickerModal) { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - PopoutService.colorPickerModal.selectedColor = currentWallpaper.startsWith("#") ? currentWallpaper : Theme.primary; - PopoutService.colorPickerModal.pickerTitle = "Choose Wallpaper Color"; - PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorWallpaper(selectedMonitorName, selectedColor); - } else { - SessionData.setWallpaperColor(selectedColor); - } - }; - PopoutService.colorPickerModal.show(); - } - } - } - } - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(255, 255, 255, 0.9) - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper !== ""; - } - - DankIcon { - anchors.centerIn: parent - name: "clear" - size: 18 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorWallpaper(selectedMonitorName, ""); - } else { - if (Theme.currentTheme === Theme.dynamic) - Theme.switchTheme("blue"); - SessionData.clearWallpaper(); - } - } - } - } - } - } - - MouseArea { - id: wallpaperMouseArea - - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - propagateComposedEvents: true - acceptedButtons: Qt.NoButton - } - } - - Column { - width: parent.width - 160 - Theme.spacingL - spacing: Theme.spacingS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper ? currentWallpaper.split('/').pop() : "No wallpaper selected"; - } - font.pixelSize: Theme.fontSizeLarge - color: Theme.surfaceText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - } - - StyledText { - text: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper ? currentWallpaper : ""; - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper !== ""; - } - } - - Row { - spacing: Theme.spacingS - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper !== ""; - } - - DankActionButton { - buttonSize: 32 - iconName: "skip_previous" - iconSize: Theme.iconSizeSmall - enabled: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper && !currentWallpaper.startsWith("#") && !currentWallpaper.startsWith("we"); - } - opacity: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return (currentWallpaper && !currentWallpaper.startsWith("#") && !currentWallpaper.startsWith("we")) ? 1 : 0.5; - } - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - onClicked: { - if (SessionData.perMonitorWallpaper) { - WallpaperCyclingService.cyclePrevForMonitor(selectedMonitorName); - } else { - WallpaperCyclingService.cyclePrevManually(); - } - } - } - - DankActionButton { - buttonSize: 32 - iconName: "skip_next" - iconSize: Theme.iconSizeSmall - enabled: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper && !currentWallpaper.startsWith("#") && !currentWallpaper.startsWith("we"); - } - opacity: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return (currentWallpaper && !currentWallpaper.startsWith("#") && !currentWallpaper.startsWith("we")) ? 1 : 0.5; - } - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - onClicked: { - if (SessionData.perMonitorWallpaper) { - WallpaperCyclingService.cycleNextForMonitor(selectedMonitorName); - } else { - WallpaperCyclingService.cycleNextManually(); - } - } - } - } - } - } - - Item { - width: parent.width - height: fillModeGroup.height - visible: { - var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; - return currentWallpaper !== "" && !currentWallpaper.startsWith("#"); - } - - DankButtonGroup { - id: fillModeGroup - anchors.horizontalCenter: parent.horizontalCenter - model: ["Stretch", "Fit", "Fill", "Tile", "Tile V", "Tile H", "Pad"] - selectionMode: "single" - buttonHeight: 28 - minButtonWidth: 48 - buttonPadding: Theme.spacingS - checkIconSize: 0 - textSize: Theme.fontSizeSmall - checkEnabled: false - currentIndex: { - const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; - return modes.indexOf(SettingsData.wallpaperFillMode); - } - onSelectionChanged: (index, selected) => { - if (selected) { - const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; - SettingsData.set("wallpaperFillMode", modes[index]); - } - } - - Connections { - target: SettingsData - function onWallpaperFillModeChanged() { - const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; - fillModeGroup.currentIndex = modes.indexOf(SettingsData.wallpaperFillMode); - } - } - - Connections { - target: personalizationTab - function onSelectedMonitorNameChanged() { - Qt.callLater(() => { - const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; - fillModeGroup.currentIndex = modes.indexOf(SettingsData.wallpaperFillMode); - }); - } - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - visible: SessionData.wallpaperPath !== "" - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: SessionData.wallpaperPath !== "" - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "brightness_6" - size: Theme.iconSize - color: SessionData.perModeWallpaper ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - perModeToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Per-Mode Wallpapers") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Set different wallpapers for light and dark mode") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: perModeToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SessionData.perModeWallpaper - onToggled: toggled => { - return SessionData.setPerModeWallpaper(toggled); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: SessionData.perModeWallpaper - - Row { - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width - spacing: Theme.spacingL - - Column { - width: (parent.width - Theme.spacingL) / 2 - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Light Mode") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledRect { - width: parent.width - height: width * 9 / 16 - radius: Theme.cornerRadius - color: Theme.surfaceVariant - border.color: Theme.outline - border.width: 0 - - CachingImage { - anchors.fill: parent - anchors.margins: 1 - source: { - var lightWallpaper = SessionData.wallpaperPathLight; - return (lightWallpaper !== "" && !lightWallpaper.startsWith("#")) ? "file://" + lightWallpaper : ""; - } - fillMode: Image.PreserveAspectCrop - visible: { - var lightWallpaper = SessionData.wallpaperPathLight; - return lightWallpaper !== "" && !lightWallpaper.startsWith("#"); - } - maxCacheSize: 160 - layer.enabled: true - - layer.effect: MultiEffect { - maskEnabled: true - maskSource: lightMask - maskThresholdMin: 0.5 - maskSpreadAtMin: 1 - } - } - - Rectangle { - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: { - var lightWallpaper = SessionData.wallpaperPathLight; - return lightWallpaper.startsWith("#") ? lightWallpaper : "transparent"; - } - visible: { - var lightWallpaper = SessionData.wallpaperPathLight; - return lightWallpaper !== "" && lightWallpaper.startsWith("#"); - } - } - - Rectangle { - id: lightMask - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: "black" - visible: false - layer.enabled: true - } - - DankIcon { - anchors.centerIn: parent - name: "light_mode" - size: Theme.iconSizeLarge - color: Theme.surfaceVariantText - visible: SessionData.wallpaperPathLight === "" - } - - Rectangle { - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: Qt.rgba(0, 0, 0, 0.7) - visible: lightModeMouseArea.containsMouse - - Row { - anchors.centerIn: parent - spacing: 4 - - Rectangle { - width: 28 - height: 28 - radius: 14 - color: Qt.rgba(255, 255, 255, 0.9) - - DankIcon { - anchors.centerIn: parent - name: "folder_open" - size: 16 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - lightWallpaperBrowser.open(); - } - } - } - - Rectangle { - width: 28 - height: 28 - radius: 14 - color: Qt.rgba(255, 255, 255, 0.9) - - DankIcon { - anchors.centerIn: parent - name: "palette" - size: 16 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (PopoutService.colorPickerModal) { - var lightWallpaper = SessionData.wallpaperPathLight; - PopoutService.colorPickerModal.selectedColor = lightWallpaper.startsWith("#") ? lightWallpaper : Theme.primary; - PopoutService.colorPickerModal.pickerTitle = "Choose Light Mode Color"; - PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { - SessionData.wallpaperPathLight = selectedColor; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - }; - PopoutService.colorPickerModal.show(); - } - } - } - } - - Rectangle { - width: 28 - height: 28 - radius: 14 - color: Qt.rgba(255, 255, 255, 0.9) - visible: SessionData.wallpaperPathLight !== "" - - DankIcon { - anchors.centerIn: parent - name: "clear" - size: 16 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - SessionData.wallpaperPathLight = ""; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - } - } - } - } - } - - MouseArea { - id: lightModeMouseArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - propagateComposedEvents: true - acceptedButtons: Qt.NoButton - } - } - - StyledText { - text: { - var lightWallpaper = SessionData.wallpaperPathLight; - return lightWallpaper ? lightWallpaper.split('/').pop() : "Not set"; - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - } - } - - Column { - width: (parent.width - Theme.spacingL) / 2 - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Dark Mode") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledRect { - width: parent.width - height: width * 9 / 16 - radius: Theme.cornerRadius - color: Theme.surfaceVariant - border.color: Theme.outline - border.width: 0 - - CachingImage { - anchors.fill: parent - anchors.margins: 1 - source: { - var darkWallpaper = SessionData.wallpaperPathDark; - return (darkWallpaper !== "" && !darkWallpaper.startsWith("#")) ? "file://" + darkWallpaper : ""; - } - fillMode: Image.PreserveAspectCrop - visible: { - var darkWallpaper = SessionData.wallpaperPathDark; - return darkWallpaper !== "" && !darkWallpaper.startsWith("#"); - } - maxCacheSize: 160 - layer.enabled: true - - layer.effect: MultiEffect { - maskEnabled: true - maskSource: darkMask - maskThresholdMin: 0.5 - maskSpreadAtMin: 1 - } - } - - Rectangle { - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: { - var darkWallpaper = SessionData.wallpaperPathDark; - return darkWallpaper.startsWith("#") ? darkWallpaper : "transparent"; - } - visible: { - var darkWallpaper = SessionData.wallpaperPathDark; - return darkWallpaper !== "" && darkWallpaper.startsWith("#"); - } - } - - Rectangle { - id: darkMask - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: "black" - visible: false - layer.enabled: true - } - - DankIcon { - anchors.centerIn: parent - name: "dark_mode" - size: Theme.iconSizeLarge - color: Theme.surfaceVariantText - visible: SessionData.wallpaperPathDark === "" - } - - Rectangle { - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: Qt.rgba(0, 0, 0, 0.7) - visible: darkModeMouseArea.containsMouse - - Row { - anchors.centerIn: parent - spacing: 4 - - Rectangle { - width: 28 - height: 28 - radius: 14 - color: Qt.rgba(255, 255, 255, 0.9) - - DankIcon { - anchors.centerIn: parent - name: "folder_open" - size: 16 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - darkWallpaperBrowser.open(); - } - } - } - - Rectangle { - width: 28 - height: 28 - radius: 14 - color: Qt.rgba(255, 255, 255, 0.9) - - DankIcon { - anchors.centerIn: parent - name: "palette" - size: 16 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - if (PopoutService.colorPickerModal) { - var darkWallpaper = SessionData.wallpaperPathDark; - PopoutService.colorPickerModal.selectedColor = darkWallpaper.startsWith("#") ? darkWallpaper : Theme.primary; - PopoutService.colorPickerModal.pickerTitle = "Choose Dark Mode Color"; - PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { - SessionData.wallpaperPathDark = selectedColor; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - }; - PopoutService.colorPickerModal.show(); - } - } - } - } - - Rectangle { - width: 28 - height: 28 - radius: 14 - color: Qt.rgba(255, 255, 255, 0.9) - visible: SessionData.wallpaperPathDark !== "" - - DankIcon { - anchors.centerIn: parent - name: "clear" - size: 16 - color: "black" - } - - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: { - SessionData.wallpaperPathDark = ""; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - } - } - } - } - } - - MouseArea { - id: darkModeMouseArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - propagateComposedEvents: true - acceptedButtons: Qt.NoButton - } - } - - StyledText { - text: { - var darkWallpaper = SessionData.wallpaperPathDark; - return darkWallpaper ? darkWallpaper.split('/').pop() : "Not set"; - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - } - } - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - visible: CompositorService.isNiri - } - - Row { - width: parent.width - spacing: Theme.spacingM - visible: CompositorService.isNiri - - DankIcon { - name: "blur_on" - size: Theme.iconSize - color: SettingsData.blurWallpaperOnOverview ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - blurOverviewToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Blur on Overview") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Blur wallpaper when niri overview is open") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: blurOverviewToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.blurWallpaperOnOverview - onToggled: checked => { - SettingsData.set("blurWallpaperOnOverview", checked); - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - visible: SessionData.wallpaperPath !== "" - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: SessionData.wallpaperPath !== "" - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "monitor" - size: Theme.iconSize - color: SessionData.perMonitorWallpaper ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - perMonitorToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Per-Monitor Wallpapers") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Set different wallpapers for each connected monitor") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: perMonitorToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SessionData.perMonitorWallpaper - onToggled: toggled => { - return SessionData.setPerMonitorWallpaper(toggled); - } - } - } - - Column { - width: parent.width - (Theme.iconSize + Theme.spacingM) - spacing: Theme.spacingS - visible: SessionData.perMonitorWallpaper - leftPadding: Theme.iconSize + Theme.spacingM - - StyledText { - text: I18n.tr("Monitor Selection:") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - } - - DankDropdown { - id: monitorDropdown - - text: I18n.tr("Wallpaper Monitor") - description: I18n.tr("Select monitor to configure wallpaper") - currentValue: { - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - if (screens[i].name === selectedMonitorName) { - return SettingsData.getScreenDisplayName(screens[i]); - } - } - return "No monitors"; - } - options: { - var screenNames = []; - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - screenNames.push(SettingsData.getScreenDisplayName(screens[i])); - } - return screenNames; - } - onValueChanged: value => { - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - if (SettingsData.getScreenDisplayName(screens[i]) === value) { - selectedMonitorName = screens[i].name; - return; - } - } - } - } - - DankDropdown { - id: matugenTargetDropdown - - text: I18n.tr("Matugen Target Monitor") - description: I18n.tr("Monitor whose wallpaper drives dynamic theming colors") - currentValue: { - var screens = Quickshell.screens; - if (!SettingsData.matugenTargetMonitor || SettingsData.matugenTargetMonitor === "") { - return screens.length > 0 ? SettingsData.getScreenDisplayName(screens[0]) + " (Default)" : "No monitors"; - } - for (var i = 0; i < screens.length; i++) { - if (screens[i].name === SettingsData.matugenTargetMonitor) { - return SettingsData.getScreenDisplayName(screens[i]); - } - } - return SettingsData.matugenTargetMonitor; - } - options: { - var screenNames = []; - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - var label = SettingsData.getScreenDisplayName(screens[i]); - if (i === 0 && (!SettingsData.matugenTargetMonitor || SettingsData.matugenTargetMonitor === "")) { - label += " (Default)"; - } - screenNames.push(label); - } - return screenNames; - } - onValueChanged: value => { - var cleanValue = value.replace(" (Default)", ""); - var screens = Quickshell.screens; - for (var i = 0; i < screens.length; i++) { - if (SettingsData.getScreenDisplayName(screens[i]) === cleanValue) { - SettingsData.setMatugenTargetMonitor(screens[i].name); - return; - } - } - } - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - visible: (SessionData.wallpaperPath !== "" || SessionData.perMonitorWallpaper) && !SessionData.perModeWallpaper - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: (SessionData.wallpaperPath !== "" || SessionData.perMonitorWallpaper) && !SessionData.perModeWallpaper - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "schedule" - size: Theme.iconSize - color: SessionData.wallpaperCyclingEnabled ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - cyclingToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Automatic Cycling") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Automatically cycle through wallpapers in the same folder") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: cyclingToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SessionData.perMonitorWallpaper ? SessionData.getMonitorCyclingSettings(selectedMonitorName).enabled : SessionData.wallpaperCyclingEnabled - onToggled: toggled => { - if (SessionData.perMonitorWallpaper) { - return SessionData.setMonitorCyclingEnabled(selectedMonitorName, toggled); - } else { - return SessionData.setWallpaperCyclingEnabled(toggled); - } - } - - Connections { - target: personalizationTab - function onSelectedMonitorNameChanged() { - cyclingToggle.checked = Qt.binding(() => { - return SessionData.perMonitorWallpaper ? SessionData.getMonitorCyclingSettings(selectedMonitorName).enabled : SessionData.wallpaperCyclingEnabled; - }); - } - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - visible: SessionData.perMonitorWallpaper ? SessionData.getMonitorCyclingSettings(selectedMonitorName).enabled : SessionData.wallpaperCyclingEnabled - leftPadding: Theme.iconSize + Theme.spacingM - - Row { - spacing: Theme.spacingL - width: parent.width - parent.leftPadding - - StyledText { - text: I18n.tr("Mode:") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: 200 - height: 45 + Theme.spacingM - - DankTabBar { - id: modeTabBar - - width: 200 - height: 45 - model: [ - { - "text": "Interval", - "icon": "schedule" - }, - { - "text": "Time", - "icon": "access_time" - } - ] - currentIndex: { - if (SessionData.perMonitorWallpaper) { - return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "time" ? 1 : 0; - } else { - return SessionData.wallpaperCyclingMode === "time" ? 1 : 0; - } - } - onTabClicked: index => { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorCyclingMode(selectedMonitorName, index === 1 ? "time" : "interval"); - } else { - SessionData.setWallpaperCyclingMode(index === 1 ? "time" : "interval"); - } - } - - Connections { - target: personalizationTab - function onSelectedMonitorNameChanged() { - modeTabBar.currentIndex = Qt.binding(() => { - if (SessionData.perMonitorWallpaper) { - return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "time" ? 1 : 0; - } else { - return SessionData.wallpaperCyclingMode === "time" ? 1 : 0; - } - }); - Qt.callLater(modeTabBar.updateIndicator); - } - } - } - } - } - - // Interval settings - DankDropdown { - id: intervalDropdown - property var intervalOptions: ["1 minute", "5 minutes", "15 minutes", "30 minutes", "1 hour", "1.5 hours", "2 hours", "3 hours", "4 hours", "6 hours", "8 hours", "12 hours"] - property var intervalValues: [60, 300, 900, 1800, 3600, 5400, 7200, 10800, 14400, 21600, 28800, 43200] - - width: parent.width - parent.leftPadding - visible: { - if (SessionData.perMonitorWallpaper) { - return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "interval"; - } else { - return SessionData.wallpaperCyclingMode === "interval"; - } - } - text: I18n.tr("Interval") - description: I18n.tr("How often to change wallpaper") - options: intervalOptions - currentValue: { - var currentSeconds; - if (SessionData.perMonitorWallpaper) { - currentSeconds = SessionData.getMonitorCyclingSettings(selectedMonitorName).interval; - } else { - currentSeconds = SessionData.wallpaperCyclingInterval; - } - const index = intervalValues.indexOf(currentSeconds); - return index >= 0 ? intervalOptions[index] : "5 minutes"; - } - onValueChanged: value => { - const index = intervalOptions.indexOf(value); - if (index >= 0) { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorCyclingInterval(selectedMonitorName, intervalValues[index]); - } else { - SessionData.setWallpaperCyclingInterval(intervalValues[index]); - } - } - } - - Connections { - target: personalizationTab - function onSelectedMonitorNameChanged() { - // Force dropdown to refresh its currentValue - Qt.callLater(() => { - var currentSeconds; - if (SessionData.perMonitorWallpaper) { - currentSeconds = SessionData.getMonitorCyclingSettings(selectedMonitorName).interval; - } else { - currentSeconds = SessionData.wallpaperCyclingInterval; - } - const index = intervalDropdown.intervalValues.indexOf(currentSeconds); - intervalDropdown.currentValue = index >= 0 ? intervalDropdown.intervalOptions[index] : "5 minutes"; - }); - } - } - } - - // Time settings - Row { - spacing: Theme.spacingM - visible: { - if (SessionData.perMonitorWallpaper) { - return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "time"; - } else { - return SessionData.wallpaperCyclingMode === "time"; - } - } - width: parent.width - parent.leftPadding - - StyledText { - text: I18n.tr("Daily at:") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - DankTextField { - id: timeTextField - width: 100 - height: 40 - text: { - if (SessionData.perMonitorWallpaper) { - return SessionData.getMonitorCyclingSettings(selectedMonitorName).time; - } else { - return SessionData.wallpaperCyclingTime; - } - } - placeholderText: "00:00" - maximumLength: 5 - topPadding: Theme.spacingS - bottomPadding: Theme.spacingS - onAccepted: { - var isValid = /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/.test(text); - if (isValid) { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorCyclingTime(selectedMonitorName, text); - } else { - SessionData.setWallpaperCyclingTime(text); - } - } else { - if (SessionData.perMonitorWallpaper) { - text = SessionData.getMonitorCyclingSettings(selectedMonitorName).time; - } else { - text = SessionData.wallpaperCyclingTime; - } - } - } - onEditingFinished: { - var isValid = /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/.test(text); - if (isValid) { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorCyclingTime(selectedMonitorName, text); - } else { - SessionData.setWallpaperCyclingTime(text); - } - } else { - if (SessionData.perMonitorWallpaper) { - text = SessionData.getMonitorCyclingSettings(selectedMonitorName).time; - } else { - text = SessionData.wallpaperCyclingTime; - } - } - } - anchors.verticalCenter: parent.verticalCenter - - validator: RegularExpressionValidator { - regularExpression: /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/ - } - - Connections { - target: personalizationTab - function onSelectedMonitorNameChanged() { - // Force text field to refresh its value - Qt.callLater(() => { - if (SessionData.perMonitorWallpaper) { - timeTextField.text = SessionData.getMonitorCyclingSettings(selectedMonitorName).time; - } else { - timeTextField.text = SessionData.wallpaperCyclingTime; - } - }); - } - } - } - - StyledText { - text: I18n.tr("24-hour format") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - } - - DankDropdown { - text: I18n.tr("Transition Effect") - description: I18n.tr("Visual effect used when wallpaper changes") - currentValue: { - if (SessionData.wallpaperTransition === "random") - return "Random"; - return SessionData.wallpaperTransition.charAt(0).toUpperCase() + SessionData.wallpaperTransition.slice(1); - } - options: ["Random"].concat(SessionData.availableWallpaperTransitions.map(t => t.charAt(0).toUpperCase() + t.slice(1))) - onValueChanged: value => { - var transition = value.toLowerCase(); - SessionData.setWallpaperTransition(transition); - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - visible: SessionData.wallpaperTransition === "random" - - StyledText { - text: I18n.tr("Include Transitions") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledText { - text: I18n.tr("Select which transitions to include in randomization") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - - DankButtonGroup { - id: transitionGroup - width: parent.width - selectionMode: "multi" - model: SessionData.availableWallpaperTransitions.filter(t => t !== "none") - initialSelection: SessionData.includedTransitions - currentSelection: SessionData.includedTransitions - - onSelectionChanged: (index, selected) => { - const transition = model[index]; - let newIncluded = [...SessionData.includedTransitions]; - - if (selected && !newIncluded.includes(transition)) { - newIncluded.push(transition); - } else if (!selected && newIncluded.includes(transition)) { - newIncluded = newIncluded.filter(t => t !== transition); - } - - SessionData.includedTransitions = newIncluded; - } - } - } - } - } - - StyledRect { - width: parent.width - height: blurLayerColumn.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: CompositorService.isNiri - - Column { - id: blurLayerColumn - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "blur_on" - size: Theme.iconSize - color: SettingsData.blurredWallpaperLayer ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - blurLayerToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Duplicate Wallpaper with Blur") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: blurLayerToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.blurredWallpaperLayer - onToggled: checked => { - SettingsData.set("blurredWallpaperLayer", checked); - } - } - } - } - } - - StyledRect { - width: parent.width - height: lightModeRow.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Row { - id: lightModeRow - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - DankIcon { - name: "contrast" - size: Theme.iconSize - color: Theme.primary - rotation: SessionData.isLightMode ? 180 : 0 - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - lightModeToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Light Mode") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Use light theme instead of dark theme") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: lightModeToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SessionData.isLightMode - onToggled: checked => { - Theme.screenTransition(); - Theme.setLightMode(checked); - } - } - } - } - - // Animation Settings - StyledRect { - width: parent.width - height: animationSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: animationSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "animation" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Animation Speed") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Item { - width: parent.width - height: childrenRect.height - - DankButtonGroup { - id: animationSpeedGroup - x: (parent.width - width) / 2 - model: ["None", "Short", "Medium", "Long", "Custom"] - selectionMode: "single" - currentIndex: SettingsData.animationSpeed - onSelectionChanged: (index, selected) => { - if (selected) { - SettingsData.set("animationSpeed", index); - } - } - - Connections { - target: SettingsData - function onAnimationSpeedChanged() { - animationSpeedGroup.currentIndex = SettingsData.animationSpeed; - } - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingM - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - } - - Column { - width: parent.width - spacing: Theme.spacingS - - Row { - width: parent.width - spacing: Theme.spacingM - - StyledText { - text: I18n.tr("Duration") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: 1 - height: 1 - } - - StyledText { - text: Theme.currentAnimationBaseDuration + "ms" - font.pixelSize: Theme.fontSizeMedium - color: Theme.primary - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - } - - Row { - width: parent.width - height: 40 - spacing: Theme.spacingM - - StyledText { - text: "0ms" - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Item { - width: parent.width - 100 - height: 40 - anchors.verticalCenter: parent.verticalCenter - - DankSlider { - id: customDurationSlider - anchors.fill: parent - minimum: 0 - maximum: 750 - value: Theme.currentAnimationBaseDuration - unit: "ms" - showValue: false - wheelEnabled: false - - onSliderValueChanged: newValue => { - SettingsData.set("animationSpeed", SettingsData.AnimationSpeed.Custom); - SettingsData.set("customAnimationDuration", newValue); - } - - Connections { - target: SettingsData - function onAnimationSpeedChanged() { - if (SettingsData.animationSpeed !== SettingsData.AnimationSpeed.Custom) { - customDurationSlider.value = Theme.currentAnimationBaseDuration; - } - } - } - - Connections { - target: Theme - function onCurrentAnimationBaseDurationChanged() { - if (SettingsData.animationSpeed !== SettingsData.AnimationSpeed.Custom) { - customDurationSlider.value = Theme.currentAnimationBaseDuration; - } - } - } - } - } - - StyledText { - text: "750ms" - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - text: I18n.tr("Select a preset or drag the slider to customize") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - } - } - } - - StyledRect { - width: parent.width - height: dynamicThemeSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: dynamicThemeSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "palette" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Matugen Settings") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "auto_awesome" - size: Theme.iconSize - color: Theme.currentTheme === Theme.dynamic ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - toggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Dynamic Theming") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Automatically extract colors from wallpaper") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: toggle - - anchors.verticalCenter: parent.verticalCenter - checked: Theme.wallpaperPath !== "" && Theme.currentTheme === Theme.dynamic - enabled: ToastService.wallpaperErrorStatus !== "matugen_missing" && Theme.wallpaperPath !== "" - onToggled: toggled => { - if (toggled) - Theme.switchTheme(Theme.dynamic); - else - Theme.switchTheme("blue"); - } - } - } - - DankDropdown { - id: personalizationMatugenPaletteDropdown - text: I18n.tr("Matugen Palette") - description: I18n.tr("Select the palette algorithm used for wallpaper-based colors") - options: Theme.availableMatugenSchemes.map(function (option) { - return option.label; - }) - currentValue: Theme.getMatugenScheme(SettingsData.matugenScheme).label - enabled: Theme.matugenAvailable - opacity: enabled ? 1 : 0.4 - onValueChanged: value => { - for (var i = 0; i < Theme.availableMatugenSchemes.length; i++) { - var option = Theme.availableMatugenSchemes[i]; - if (option.label === value) { - SettingsData.setMatugenScheme(option.value); - break; - } - } - } - } - - StyledText { - text: { - var scheme = Theme.getMatugenScheme(SettingsData.matugenScheme); - return scheme.description + " (" + scheme.value + ")"; - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - } - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "code" - size: Theme.iconSize - color: SettingsData.runUserMatugenTemplates ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - runUserTemplatesToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Run User Templates") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Execute templates from ~/.config/matugen/config.toml") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: runUserTemplatesToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.runUserMatugenTemplates - enabled: Theme.matugenAvailable - onToggled: checked => { - SettingsData.setRunUserMatugenTemplates(checked); - } - } - } - - StyledText { - text: I18n.tr("matugen not detected - dynamic theming unavailable") - font.pixelSize: Theme.fontSizeSmall - color: Theme.error - visible: ToastService.wallpaperErrorStatus === "matugen_missing" - width: parent.width - leftPadding: Theme.iconSize + Theme.spacingM - } - } - } - - StyledRect { - width: parent.width - height: soundsSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: AudioService.soundsAvailable - - Column { - id: soundsSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "volume_up" - size: Theme.iconSize - color: SettingsData.soundsEnabled ? Theme.primary : Theme.surfaceVariantText - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - soundsToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Enable System Sounds") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Play sounds for system events") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: soundsToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.soundsEnabled - onToggled: checked => { - SettingsData.set("soundsEnabled", checked); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: SettingsData.soundsEnabled - leftPadding: Theme.iconSize + Theme.spacingM - - Rectangle { - width: parent.width - parent.leftPadding - height: 1 - color: Theme.outline - opacity: 0.2 - } - - Row { - width: parent.width - parent.leftPadding - spacing: Theme.spacingM - visible: AudioService.gsettingsAvailable - - Column { - width: parent.width - useSystemSoundThemeToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Use System Theme") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Use sound theme from system settings") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: useSystemSoundThemeToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.useSystemSoundTheme - onToggled: checked => { - SettingsData.set("useSystemSoundTheme", checked); - } - } - } - - DankDropdown { - id: soundThemeDropdown - - width: parent.width - parent.leftPadding - text: I18n.tr("Sound Theme") - description: I18n.tr("Select system sound theme") - visible: SettingsData.useSystemSoundTheme && AudioService.availableSoundThemes.length > 0 - enabled: SettingsData.useSystemSoundTheme && AudioService.availableSoundThemes.length > 0 - options: AudioService.availableSoundThemes - currentValue: { - const theme = AudioService.currentSoundTheme; - if (theme && AudioService.availableSoundThemes.includes(theme)) { - return theme; - } - return AudioService.availableSoundThemes.length > 0 ? AudioService.availableSoundThemes[0] : ""; - } - onValueChanged: value => { - if (value && value !== AudioService.currentSoundTheme) { - AudioService.setSoundTheme(value); - } - } - } - - Rectangle { - width: parent.width - parent.leftPadding - height: 1 - color: Theme.outline - opacity: 0.2 - visible: AudioService.gsettingsAvailable - } - - Row { - width: parent.width - parent.leftPadding - spacing: Theme.spacingM - - Column { - width: parent.width - notificationSoundToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("New Notification") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Play sound when new notification arrives") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: notificationSoundToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.soundNewNotification - onToggled: checked => { - SettingsData.set("soundNewNotification", checked); - } - } - } - - Row { - width: parent.width - parent.leftPadding - spacing: Theme.spacingM - - Column { - width: parent.width - volumeSoundToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Volume Changed") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Play sound when volume is adjusted") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: volumeSoundToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.soundVolumeChanged - onToggled: checked => { - SettingsData.set("soundVolumeChanged", checked); - } - } - } - - Row { - width: parent.width - parent.leftPadding - spacing: Theme.spacingM - visible: BatteryService.batteryAvailable - - Column { - width: parent.width - pluggedInSoundToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Plugged In") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Play sound when power cable is connected") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } - } - - DankToggle { - id: pluggedInSoundToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.soundPluggedIn - onToggled: checked => { - SettingsData.set("soundPluggedIn", checked); - } - } - } - } - } - } - } - } - - FileBrowserModal { - id: mainWallpaperBrowser - - parentModal: personalizationTab.parentModal - browserTitle: I18n.tr("Select Wallpaper", "wallpaper file browser title") - browserIcon: "wallpaper" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorWallpaper(selectedMonitorName, path); - } else { - SessionData.setWallpaper(path); - } - close(); - } - } - - FileBrowserModal { - id: lightWallpaperBrowser - - parentModal: personalizationTab.parentModal - browserTitle: I18n.tr("Select Wallpaper", "light mode wallpaper file browser title") - browserIcon: "light_mode" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - SessionData.wallpaperPathLight = path; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - close(); - } - } - - FileBrowserModal { - id: darkWallpaperBrowser - - parentModal: personalizationTab.parentModal - browserTitle: I18n.tr("Select Wallpaper", "dark mode wallpaper file browser title") - browserIcon: "dark_mode" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - SessionData.wallpaperPathDark = path; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - close(); - } - } -} diff --git a/quickshell/Modules/Settings/PowerSleepTab.qml b/quickshell/Modules/Settings/PowerSleepTab.qml new file mode 100644 index 00000000..26087aa3 --- /dev/null +++ b/quickshell/Modules/Settings/PowerSleepTab.qml @@ -0,0 +1,459 @@ +import QtQuick +import qs.Common +import qs.Services +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + readonly property var timeoutOptions: ["Never", "1 minute", "2 minutes", "3 minutes", "5 minutes", "10 minutes", "15 minutes", "20 minutes", "30 minutes", "1 hour", "1 hour 30 minutes", "2 hours", "3 hours"] + readonly property var timeoutValues: [0, 60, 120, 180, 300, 600, 900, 1200, 1800, 3600, 5400, 7200, 10800] + + function getTimeoutIndex(timeout) { + var idx = timeoutValues.indexOf(timeout); + return idx >= 0 ? idx : 0; + } + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "schedule" + title: I18n.tr("Idle Settings") + + Row { + width: parent.width + spacing: Theme.spacingM + + StyledText { + text: I18n.tr("Power source") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + anchors.verticalCenter: parent.verticalCenter + visible: BatteryService.batteryAvailable + } + + Item { + width: Theme.spacingS + height: 1 + visible: BatteryService.batteryAvailable + } + + DankButtonGroup { + id: powerCategory + anchors.verticalCenter: parent.verticalCenter + visible: BatteryService.batteryAvailable + model: ["AC Power", "Battery"] + currentIndex: 0 + selectionMode: "single" + checkEnabled: false + } + } + + SettingsToggleRow { + text: I18n.tr("Prevent idle for media") + description: I18n.tr("Inhibit idle timeout when audio or video is playing") + checked: SettingsData.preventIdleForMedia + visible: IdleService.idleMonitorAvailable + onToggled: checked => SettingsData.set("preventIdleForMedia", checked) + } + + SettingsToggleRow { + text: I18n.tr("Fade to lock screen") + description: I18n.tr("Gradually fade the screen before locking with a configurable grace period") + checked: SettingsData.fadeToLockEnabled + onToggled: checked => SettingsData.set("fadeToLockEnabled", checked) + } + + SettingsDropdownRow { + id: fadeGracePeriodDropdown + property var periodOptions: ["1 second", "2 seconds", "3 seconds", "4 seconds", "5 seconds", "10 seconds", "15 seconds", "20 seconds", "30 seconds"] + property var periodValues: [1, 2, 3, 4, 5, 10, 15, 20, 30] + + text: I18n.tr("Fade grace period") + options: periodOptions + visible: SettingsData.fadeToLockEnabled + enabled: SettingsData.fadeToLockEnabled + + Component.onCompleted: { + const currentPeriod = SettingsData.fadeToLockGracePeriod; + const index = periodValues.indexOf(currentPeriod); + currentValue = index >= 0 ? periodOptions[index] : "5 seconds"; + } + + onValueChanged: value => { + const index = periodOptions.indexOf(value); + if (index < 0) + return; + SettingsData.set("fadeToLockGracePeriod", periodValues[index]); + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + SettingsDropdownRow { + id: lockDropdown + text: I18n.tr("Automatically lock after") + options: root.timeoutOptions + + Connections { + target: powerCategory + function onCurrentIndexChanged() { + const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acLockTimeout : SettingsData.batteryLockTimeout; + lockDropdown.currentValue = root.timeoutOptions[root.getTimeoutIndex(currentTimeout)]; + } + } + + Component.onCompleted: { + const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acLockTimeout : SettingsData.batteryLockTimeout; + currentValue = root.timeoutOptions[root.getTimeoutIndex(currentTimeout)]; + } + + onValueChanged: value => { + const index = root.timeoutOptions.indexOf(value); + if (index < 0) + return; + const timeout = root.timeoutValues[index]; + if (powerCategory.currentIndex === 0) { + SettingsData.set("acLockTimeout", timeout); + } else { + SettingsData.set("batteryLockTimeout", timeout); + } + } + } + + SettingsDropdownRow { + id: monitorDropdown + text: I18n.tr("Turn off monitors after") + options: root.timeoutOptions + + Connections { + target: powerCategory + function onCurrentIndexChanged() { + const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acMonitorTimeout : SettingsData.batteryMonitorTimeout; + monitorDropdown.currentValue = root.timeoutOptions[root.getTimeoutIndex(currentTimeout)]; + } + } + + Component.onCompleted: { + const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acMonitorTimeout : SettingsData.batteryMonitorTimeout; + currentValue = root.timeoutOptions[root.getTimeoutIndex(currentTimeout)]; + } + + onValueChanged: value => { + const index = root.timeoutOptions.indexOf(value); + if (index < 0) + return; + const timeout = root.timeoutValues[index]; + if (powerCategory.currentIndex === 0) { + SettingsData.set("acMonitorTimeout", timeout); + } else { + SettingsData.set("batteryMonitorTimeout", timeout); + } + } + } + + SettingsDropdownRow { + id: suspendDropdown + text: I18n.tr("Suspend system after") + options: root.timeoutOptions + + Connections { + target: powerCategory + function onCurrentIndexChanged() { + const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acSuspendTimeout : SettingsData.batterySuspendTimeout; + suspendDropdown.currentValue = root.timeoutOptions[root.getTimeoutIndex(currentTimeout)]; + } + } + + Component.onCompleted: { + const currentTimeout = powerCategory.currentIndex === 0 ? SettingsData.acSuspendTimeout : SettingsData.batterySuspendTimeout; + currentValue = root.timeoutOptions[root.getTimeoutIndex(currentTimeout)]; + } + + onValueChanged: value => { + const index = root.timeoutOptions.indexOf(value); + if (index < 0) + return; + const timeout = root.timeoutValues[index]; + if (powerCategory.currentIndex === 0) { + SettingsData.set("acSuspendTimeout", timeout); + } else { + SettingsData.set("batterySuspendTimeout", timeout); + } + } + } + + Column { + width: parent.width + spacing: Theme.spacingS + visible: SessionService.hibernateSupported + + StyledText { + text: I18n.tr("Suspend behavior") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + leftPadding: Theme.spacingM + } + + DankButtonGroup { + id: suspendBehaviorSelector + anchors.horizontalCenter: parent.horizontalCenter + model: ["Suspend", "Hibernate", "Suspend then Hibernate"] + selectionMode: "single" + checkEnabled: false + + Connections { + target: powerCategory + function onCurrentIndexChanged() { + const behavior = powerCategory.currentIndex === 0 ? SettingsData.acSuspendBehavior : SettingsData.batterySuspendBehavior; + suspendBehaviorSelector.currentIndex = behavior; + } + } + + Component.onCompleted: { + const behavior = powerCategory.currentIndex === 0 ? SettingsData.acSuspendBehavior : SettingsData.batterySuspendBehavior; + currentIndex = behavior; + } + + onSelectionChanged: (index, selected) => { + if (!selected) + return; + if (powerCategory.currentIndex === 0) { + SettingsData.set("acSuspendBehavior", index); + } else { + SettingsData.set("batterySuspendBehavior", index); + } + } + } + } + + StyledText { + text: I18n.tr("Idle monitoring not supported - requires newer Quickshell version") + font.pixelSize: Theme.fontSizeSmall + color: Theme.error + anchors.horizontalCenter: parent.horizontalCenter + visible: !IdleService.idleMonitorAvailable + } + } + + SettingsCard { + width: parent.width + iconName: "tune" + title: I18n.tr("Power Menu Customization") + + StyledText { + text: I18n.tr("Customize which actions appear in the power menu") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + width: parent.width + wrapMode: Text.Wrap + } + + SettingsToggleRow { + text: I18n.tr("Use Grid Layout") + description: I18n.tr("Display power menu actions in a grid instead of a list") + checked: SettingsData.powerMenuGridLayout + onToggled: checked => SettingsData.set("powerMenuGridLayout", checked) + } + + SettingsDropdownRow { + id: defaultActionDropdown + text: I18n.tr("Default selected action") + options: ["Reboot", "Log Out", "Power Off", "Lock", "Suspend", "Restart DMS", "Hibernate"] + property var actionValues: ["reboot", "logout", "poweroff", "lock", "suspend", "restart", "hibernate"] + + Component.onCompleted: { + const currentAction = SettingsData.powerMenuDefaultAction || "logout"; + const index = actionValues.indexOf(currentAction); + currentValue = index >= 0 ? options[index] : "Log Out"; + } + + onValueChanged: value => { + const index = options.indexOf(value); + if (index < 0) + return; + SettingsData.set("powerMenuDefaultAction", actionValues[index]); + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + Column { + width: parent.width + spacing: Theme.spacingS + + Repeater { + model: [ + { + key: "reboot", + label: I18n.tr("Show Reboot") + }, + { + key: "logout", + label: I18n.tr("Show Log Out") + }, + { + key: "poweroff", + label: I18n.tr("Show Power Off") + }, + { + key: "lock", + label: I18n.tr("Show Lock") + }, + { + key: "suspend", + label: I18n.tr("Show Suspend") + }, + { + key: "restart", + label: I18n.tr("Show Restart DMS"), + desc: I18n.tr("Restart the DankMaterialShell") + }, + { + key: "hibernate", + label: I18n.tr("Show Hibernate"), + desc: I18n.tr("Only visible if hibernate is supported by your system"), + hibernate: true + } + ] + + SettingsToggleRow { + required property var modelData + text: modelData.label + description: modelData.desc || "" + visible: !modelData.hibernate || SessionService.hibernateSupported + checked: SettingsData.powerMenuActions.includes(modelData.key) + onToggled: checked => { + let actions = [...SettingsData.powerMenuActions]; + if (checked && !actions.includes(modelData.key)) { + actions.push(modelData.key); + } else if (!checked) { + actions = actions.filter(a => a !== modelData.key); + } + SettingsData.set("powerMenuActions", actions); + } + } + } + } + } + + SettingsCard { + width: parent.width + iconName: "check_circle" + title: I18n.tr("Power Action Confirmation") + + SettingsToggleRow { + text: I18n.tr("Hold to Confirm Power Actions") + description: I18n.tr("Require holding button/key to confirm power off, restart, suspend, hibernate and logout") + checked: SettingsData.powerActionConfirm + onToggled: checked => SettingsData.set("powerActionConfirm", checked) + } + + SettingsSliderRow { + text: I18n.tr("Hold Duration") + description: I18n.tr("How long to hold the button to confirm the action") + minimum: 1 + maximum: 10 + unit: "s" + visible: SettingsData.powerActionConfirm + value: SettingsData.powerActionHoldDuration + onSliderValueChanged: newValue => SettingsData.set("powerActionHoldDuration", newValue) + } + } + + SettingsCard { + width: parent.width + iconName: "developer_mode" + title: I18n.tr("Custom Power Actions") + + Repeater { + model: [ + { + key: "customPowerActionLock", + label: I18n.tr("Custom Lock Command"), + placeholder: "/usr/bin/myLock.sh" + }, + { + key: "customPowerActionLogout", + label: I18n.tr("Custom Logout Command"), + placeholder: "/usr/bin/myLogout.sh" + }, + { + key: "customPowerActionSuspend", + label: I18n.tr("Custom Suspend Command"), + placeholder: "/usr/bin/mySuspend.sh" + }, + { + key: "customPowerActionHibernate", + label: I18n.tr("Custom Hibernate Command"), + placeholder: "/usr/bin/myHibernate.sh" + }, + { + key: "customPowerActionReboot", + label: I18n.tr("Custom Reboot Command"), + placeholder: "/usr/bin/myReboot.sh" + }, + { + key: "customPowerActionPowerOff", + label: I18n.tr("Custom Power Off Command"), + placeholder: "/usr/bin/myPowerOff.sh" + } + ] + + Column { + required property var modelData + width: parent.width + spacing: Theme.spacingXS + + StyledText { + text: modelData.label + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + + DankTextField { + width: parent.width + height: 48 + placeholderText: modelData.placeholder + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) + normalBorderColor: Theme.outlineMedium + focusedBorderColor: Theme.primary + + Component.onCompleted: { + var val = SettingsData[modelData.key]; + if (val) + text = val; + } + + onTextEdited: { + SettingsData.set(modelData.key, text.trim()); + } + } + } + } + } + } + } +} diff --git a/quickshell/Modules/Settings/RunningAppsTab.qml b/quickshell/Modules/Settings/RunningAppsTab.qml new file mode 100644 index 00000000..8d70481d --- /dev/null +++ b/quickshell/Modules/Settings/RunningAppsTab.qml @@ -0,0 +1,35 @@ +import QtQuick +import qs.Common +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "apps" + title: I18n.tr("Running Apps Settings") + + SettingsToggleRow { + text: I18n.tr("Running Apps Only In Current Workspace") + description: I18n.tr("Show only apps running in current workspace") + checked: SettingsData.runningAppsCurrentWorkspace + onToggled: checked => SettingsData.set("runningAppsCurrentWorkspace", checked) + } + } + } + } +} diff --git a/quickshell/Modules/Settings/SettingsSection.qml b/quickshell/Modules/Settings/SettingsSection.qml deleted file mode 100644 index e511fa20..00000000 --- a/quickshell/Modules/Settings/SettingsSection.qml +++ /dev/null @@ -1,103 +0,0 @@ -import QtQuick -import qs.Common -import qs.Widgets - -Column { - id: root - - property string title: "" - property string iconName: "" - property alias content: contentLoader.sourceComponent - property bool expanded: false - property bool collapsible: true - property bool lazyLoad: true - - width: parent.width - spacing: expanded ? Theme.spacingM : 0 - Component.onCompleted: { - if (!collapsible) - expanded = true; - } - - MouseArea { - width: parent.width - height: headerRow.height - enabled: collapsible - hoverEnabled: collapsible - onClicked: { - if (collapsible) - expanded = !expanded; - } - - Rectangle { - anchors.fill: parent - color: parent.containsMouse ? Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.08) : "transparent" - radius: Theme.radiusS - } - - Row { - id: headerRow - - width: parent.width - spacing: Theme.spacingS - topPadding: Theme.spacingS - bottomPadding: Theme.spacingS - - DankIcon { - name: root.collapsible ? (root.expanded ? "expand_less" : "expand_more") : root.iconName - size: Theme.iconSize - 2 - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - - Behavior on rotation { - NumberAnimation { - duration: Appearance.anim.durations.fast - easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard - } - } - } - - DankIcon { - name: root.iconName - size: Theme.iconSize - 4 - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - visible: root.collapsible - } - - StyledText { - text: root.title - font.pixelSize: Theme.fontSizeLarge - color: Theme.surfaceText - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.12) - visible: expanded || !collapsible - } - - Loader { - id: contentLoader - - width: parent.width - active: lazyLoad ? expanded || !collapsible : true - visible: expanded || !collapsible - asynchronous: true - opacity: visible ? 1 : 0 - - Behavior on opacity { - NumberAnimation { - duration: Appearance.anim.durations.normal - easing.type: Easing.BezierSpline - easing.bezierCurve: Appearance.anim.curves.standard - } - } - } -} diff --git a/quickshell/Modules/Settings/SoundsTab.qml b/quickshell/Modules/Settings/SoundsTab.qml new file mode 100644 index 00000000..60f7c59e --- /dev/null +++ b/quickshell/Modules/Settings/SoundsTab.qml @@ -0,0 +1,156 @@ +import QtQuick +import qs.Common +import qs.Services +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + tab: "sounds" + tags: ["sound", "audio", "notification", "volume"] + title: I18n.tr("System Sounds") + iconName: SettingsData.soundsEnabled ? "volume_up" : "volume_off" + visible: AudioService.soundsAvailable + + SettingsToggleRow { + tab: "sounds" + tags: ["sound", "enable", "system"] + settingKey: "soundsEnabled" + text: I18n.tr("Enable System Sounds") + description: I18n.tr("Play sounds for system events") + checked: SettingsData.soundsEnabled + onToggled: checked => SettingsData.set("soundsEnabled", checked) + } + + Column { + width: parent.width + spacing: Theme.spacingM + visible: SettingsData.soundsEnabled + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + } + + SettingsToggleRow { + tab: "sounds" + tags: ["sound", "theme", "system"] + settingKey: "useSystemSoundTheme" + visible: AudioService.gsettingsAvailable + text: I18n.tr("Use System Theme") + description: I18n.tr("Use sound theme from system settings") + checked: SettingsData.useSystemSoundTheme + onToggled: checked => SettingsData.set("useSystemSoundTheme", checked) + } + + SettingsDropdownRow { + tab: "sounds" + tags: ["sound", "theme", "select"] + settingKey: "soundTheme" + visible: SettingsData.useSystemSoundTheme && AudioService.availableSoundThemes.length > 0 + enabled: SettingsData.useSystemSoundTheme && AudioService.availableSoundThemes.length > 0 + text: I18n.tr("Sound Theme") + description: I18n.tr("Select system sound theme") + options: AudioService.availableSoundThemes + currentValue: { + const theme = AudioService.currentSoundTheme; + if (theme && AudioService.availableSoundThemes.includes(theme)) + return theme; + return AudioService.availableSoundThemes.length > 0 ? AudioService.availableSoundThemes[0] : ""; + } + onValueChanged: value => { + if (value && value !== AudioService.currentSoundTheme) + AudioService.setSoundTheme(value); + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + visible: AudioService.gsettingsAvailable + } + + SettingsToggleRow { + tab: "sounds" + tags: ["sound", "notification", "new"] + settingKey: "soundNewNotification" + text: I18n.tr("New Notification") + description: I18n.tr("Play sound when new notification arrives") + checked: SettingsData.soundNewNotification + onToggled: checked => SettingsData.set("soundNewNotification", checked) + } + + SettingsToggleRow { + tab: "sounds" + tags: ["sound", "volume", "changed"] + settingKey: "soundVolumeChanged" + text: I18n.tr("Volume Changed") + description: I18n.tr("Play sound when volume is adjusted") + checked: SettingsData.soundVolumeChanged + onToggled: checked => SettingsData.set("soundVolumeChanged", checked) + } + + SettingsToggleRow { + tab: "sounds" + tags: ["sound", "power", "plugged"] + settingKey: "soundPluggedIn" + visible: BatteryService.batteryAvailable + text: I18n.tr("Plugged In") + description: I18n.tr("Play sound when power cable is connected") + checked: SettingsData.soundPluggedIn + onToggled: checked => SettingsData.set("soundPluggedIn", checked) + } + } + } + + Rectangle { + width: parent.width + height: notAvailableText.implicitHeight + Theme.spacingM * 2 + radius: Theme.cornerRadius + color: Qt.rgba(Theme.warning.r, Theme.warning.g, Theme.warning.b, 0.12) + visible: !AudioService.soundsAvailable + + Row { + anchors.fill: parent + anchors.margins: Theme.spacingM + spacing: Theme.spacingM + + DankIcon { + name: "info" + size: Theme.iconSizeSmall + color: Theme.warning + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + id: notAvailableText + font.pixelSize: Theme.fontSizeSmall + text: I18n.tr("System sounds are not available. Install canberra-gtk-play for sound support.") + wrapMode: Text.WordWrap + width: parent.width - Theme.iconSizeSmall - Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + } + } + } + } + } +} diff --git a/quickshell/Modules/Settings/SystemUpdaterTab.qml b/quickshell/Modules/Settings/SystemUpdaterTab.qml new file mode 100644 index 00000000..ddcd8d17 --- /dev/null +++ b/quickshell/Modules/Settings/SystemUpdaterTab.qml @@ -0,0 +1,133 @@ +import QtQuick +import qs.Common +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "refresh" + title: I18n.tr("System Updater") + + SettingsToggleRow { + text: I18n.tr("Use Custom Command") + description: I18n.tr("Use custom command for update your system") + checked: SettingsData.updaterUseCustomCommand + onToggled: checked => { + if (!checked) { + updaterCustomCommand.text = ""; + updaterTerminalCustomClass.text = ""; + SettingsData.set("updaterCustomCommand", ""); + SettingsData.set("updaterTerminalAdditionalParams", ""); + } + SettingsData.set("updaterUseCustomCommand", checked); + } + } + + FocusScope { + width: parent.width - Theme.spacingM * 2 + height: customCommandColumn.implicitHeight + anchors.left: parent.left + anchors.leftMargin: Theme.spacingM + + Column { + id: customCommandColumn + width: parent.width + spacing: Theme.spacingXS + + StyledText { + text: I18n.tr("System update custom command") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + + DankTextField { + id: updaterCustomCommand + width: parent.width + height: 48 + placeholderText: "myPkgMngr --sysupdate" + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) + normalBorderColor: Theme.outlineMedium + focusedBorderColor: Theme.primary + + Component.onCompleted: { + if (SettingsData.updaterCustomCommand) { + text = SettingsData.updaterCustomCommand; + } + } + + onTextEdited: SettingsData.set("updaterCustomCommand", text.trim()) + + MouseArea { + anchors.fill: parent + onPressed: mouse => { + updaterCustomCommand.forceActiveFocus(); + mouse.accepted = false; + } + } + } + } + } + + FocusScope { + width: parent.width - Theme.spacingM * 2 + height: terminalParamsColumn.implicitHeight + anchors.left: parent.left + anchors.leftMargin: Theme.spacingM + + Column { + id: terminalParamsColumn + width: parent.width + spacing: Theme.spacingXS + + StyledText { + text: I18n.tr("Terminal custom additional parameters") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + + DankTextField { + id: updaterTerminalCustomClass + width: parent.width + height: 48 + placeholderText: "-T udpClass" + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) + normalBorderColor: Theme.outlineMedium + focusedBorderColor: Theme.primary + + Component.onCompleted: { + if (SettingsData.updaterTerminalAdditionalParams) { + text = SettingsData.updaterTerminalAdditionalParams; + } + } + + onTextEdited: SettingsData.set("updaterTerminalAdditionalParams", text.trim()) + + MouseArea { + anchors.fill: parent + onPressed: mouse => { + updaterTerminalCustomClass.forceActiveFocus(); + mouse.accepted = false; + } + } + } + } + } + } + } + } +} diff --git a/quickshell/Modules/Settings/ThemeColorsTab.qml b/quickshell/Modules/Settings/ThemeColorsTab.qml index 05df9c24..e9c49d7f 100644 --- a/quickshell/Modules/Settings/ThemeColorsTab.qml +++ b/quickshell/Modules/Settings/ThemeColorsTab.qml @@ -5,50 +5,15 @@ import qs.Common import qs.Modals.FileBrowser import qs.Services import qs.Widgets +import qs.Modules.Settings.Widgets Item { id: themeColorsTab - property var cachedFontFamilies: [] - property var cachedMonoFamilies: [] property var cachedIconThemes: [] property var cachedMatugenSchemes: [] - property bool fontsEnumerated: false - - function enumerateFonts() { - var fonts = []; - var availableFonts = Qt.fontFamilies(); - - for (var i = 0; i < availableFonts.length; i++) { - var fontName = availableFonts[i]; - if (fontName.startsWith(".")) - continue; - fonts.push(fontName); - } - fonts.sort(); - fonts.unshift("Default"); - cachedFontFamilies = fonts; - - var monoFonts = []; - for (var j = 0; j < availableFonts.length; j++) { - var fontName2 = availableFonts[j]; - if (fontName2.startsWith(".")) - continue; - var lowerName = fontName2.toLowerCase(); - if (lowerName.includes("mono") || lowerName.includes("code") || lowerName.includes("console") || lowerName.includes("terminal") || lowerName.includes("courier") || lowerName.includes("jetbrains") || lowerName.includes("fira") || lowerName.includes("hack") || lowerName.includes("source code") || lowerName.includes("cascadia")) { - monoFonts.push(fontName2); - } - } - monoFonts.sort(); - monoFonts.unshift("Default"); - cachedMonoFamilies = monoFonts; - } Component.onCompleted: { - if (!fontsEnumerated) { - enumerateFonts(); - fontsEnumerated = true; - } SettingsData.detectAvailableIconThemes(); cachedIconThemes = SettingsData.availableIconThemes; cachedMatugenSchemes = Theme.availableMatugenSchemes.map(function (option) { @@ -69,1101 +34,532 @@ Item { anchors.horizontalCenter: parent.horizontalCenter spacing: Theme.spacingXL - // Theme Color - StyledRect { - width: parent.width - height: themeSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "theme" + tags: ["color", "palette", "theme", "appearance"] + title: I18n.tr("Theme Color") + iconName: "palette" Column { - id: themeSection + width: parent.width + spacing: Theme.spacingS - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "palette" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter + StyledText { + text: { + if (Theme.currentTheme === Theme.dynamic) + return "Current Theme: Dynamic"; + if (Theme.currentThemeCategory === "catppuccin") + return "Current Theme: Catppuccin " + Theme.getThemeColors(Theme.currentThemeName).name; + return "Current Theme: " + Theme.getThemeColors(Theme.currentThemeName).name; } - - StyledText { - text: I18n.tr("Theme Color") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: { - if (Theme.currentTheme === Theme.dynamic) { - return "Current Theme: Dynamic"; - } else if (Theme.currentThemeCategory === "catppuccin") { - return "Current Theme: Catppuccin " + Theme.getThemeColors(Theme.currentThemeName).name; - } else { - return "Current Theme: " + Theme.getThemeColors(Theme.currentThemeName).name; - } - } - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: { - if (Theme.currentTheme === Theme.dynamic) { - return "Material colors generated from wallpaper"; - } - if (Theme.currentThemeCategory === "catppuccin") { - return "Soothing pastel theme based on Catppuccin"; - } - if (Theme.currentTheme === Theme.custom) { - return "Custom theme loaded from JSON file"; - } - return "Material Design inspired color themes"; - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - anchors.horizontalCenter: parent.horizontalCenter - wrapMode: Text.WordWrap - width: Math.min(parent.width, 400) - horizontalAlignment: Text.AlignHCenter - } - } - - Column { - spacing: Theme.spacingM + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + font.weight: Font.Medium anchors.horizontalCenter: parent.horizontalCenter + } - DankButtonGroup { - property int currentThemeIndex: { - if (Theme.currentTheme === Theme.dynamic) - return 2; - if (Theme.currentThemeName === "custom") - return 3; - if (Theme.currentThemeCategory === "catppuccin") - return 1; - return 0; - } - property int pendingThemeIndex: -1 - - model: ["Generic", "Catppuccin", "Auto", "Custom"] - currentIndex: currentThemeIndex - selectionMode: "single" - anchors.horizontalCenter: parent.horizontalCenter - onSelectionChanged: (index, selected) => { - if (!selected) - return; - pendingThemeIndex = index; - } - onAnimationCompleted: { - if (pendingThemeIndex === -1) - return; - switch (pendingThemeIndex) { - case 0: - Theme.switchThemeCategory("generic", "blue"); - break; - case 1: - Theme.switchThemeCategory("catppuccin", "cat-mauve"); - break; - case 2: - if (ToastService.wallpaperErrorStatus === "matugen_missing") - ToastService.showError("matugen not found - install matugen package for dynamic theming"); - else if (ToastService.wallpaperErrorStatus === "error") - ToastService.showError("Wallpaper processing failed - check wallpaper path"); - else - Theme.switchTheme(Theme.dynamic, true, true); - break; - case 3: - if (Theme.currentThemeName !== "custom") { - Theme.switchTheme("custom", true, true); - } - break; - } - pendingThemeIndex = -1; - } + StyledText { + text: { + if (Theme.currentTheme === Theme.dynamic) + return "Material colors generated from wallpaper"; + if (Theme.currentThemeCategory === "catppuccin") + return "Soothing pastel theme based on Catppuccin"; + if (Theme.currentTheme === Theme.custom) + return "Custom theme loaded from JSON file"; + return "Material Design inspired color themes"; } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + anchors.horizontalCenter: parent.horizontalCenter + wrapMode: Text.WordWrap + width: Math.min(parent.width, 400) + horizontalAlignment: Text.AlignHCenter + } + } - Column { - spacing: Theme.spacingS - anchors.horizontalCenter: parent.horizontalCenter - visible: Theme.currentThemeCategory === "generic" && Theme.currentTheme !== Theme.dynamic && Theme.currentThemeName !== "custom" + Column { + spacing: Theme.spacingM + anchors.horizontalCenter: parent.horizontalCenter - Row { - spacing: Theme.spacingM - anchors.horizontalCenter: parent.horizontalCenter - - Repeater { - model: ["blue", "purple", "green", "orange", "red"] - - Rectangle { - property string themeName: modelData - width: 32 - height: 32 - radius: 16 - color: Theme.getThemeColors(themeName).primary - border.color: Theme.outline - border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 - scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 - - Rectangle { - width: nameText.contentWidth + Theme.spacingS * 2 - height: nameText.contentHeight + Theme.spacingXS * 2 - color: Theme.surfaceContainer - border.color: Theme.outline - border.width: 0 - radius: Theme.cornerRadius - anchors.bottom: parent.top - anchors.bottomMargin: Theme.spacingXS - anchors.horizontalCenter: parent.horizontalCenter - visible: mouseArea.containsMouse - - StyledText { - id: nameText - text: Theme.getThemeColors(themeName).name - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - anchors.centerIn: parent - } - } - - MouseArea { - id: mouseArea - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - Theme.switchTheme(themeName); - } - } - - Behavior on scale { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - - Behavior on border.width { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - } - } - } - - Row { - spacing: Theme.spacingM - anchors.horizontalCenter: parent.horizontalCenter - - Repeater { - model: ["cyan", "pink", "amber", "coral", "monochrome"] - - Rectangle { - property string themeName: modelData - width: 32 - height: 32 - radius: 16 - color: Theme.getThemeColors(themeName).primary - border.color: Theme.outline - border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 - scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 - - Rectangle { - width: nameText2.contentWidth + Theme.spacingS * 2 - height: nameText2.contentHeight + Theme.spacingXS * 2 - color: Theme.surfaceContainer - border.color: Theme.outline - border.width: 0 - radius: Theme.cornerRadius - anchors.bottom: parent.top - anchors.bottomMargin: Theme.spacingXS - anchors.horizontalCenter: parent.horizontalCenter - visible: mouseArea2.containsMouse - - StyledText { - id: nameText2 - text: Theme.getThemeColors(themeName).name - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - anchors.centerIn: parent - } - } - - MouseArea { - id: mouseArea2 - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - Theme.switchTheme(themeName); - } - } - - Behavior on scale { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - - Behavior on border.width { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - } - } - } + DankButtonGroup { + property int currentThemeIndex: { + if (Theme.currentTheme === Theme.dynamic) + return 2; + if (Theme.currentThemeName === "custom") + return 3; + if (Theme.currentThemeCategory === "catppuccin") + return 1; + return 0; } + property int pendingThemeIndex: -1 - Column { - spacing: Theme.spacingS - anchors.horizontalCenter: parent.horizontalCenter - visible: Theme.currentThemeCategory === "catppuccin" && Theme.currentTheme !== Theme.dynamic && Theme.currentThemeName !== "custom" - - Row { - spacing: Theme.spacingM - anchors.horizontalCenter: parent.horizontalCenter - - Repeater { - model: ["cat-rosewater", "cat-flamingo", "cat-pink", "cat-mauve", "cat-red", "cat-maroon", "cat-peach"] - - Rectangle { - property string themeName: modelData - width: 32 - height: 32 - radius: 16 - color: Theme.getCatppuccinColor(themeName) - border.color: Theme.outline - border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 - scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 - - Rectangle { - width: nameTextCat.contentWidth + Theme.spacingS * 2 - height: nameTextCat.contentHeight + Theme.spacingXS * 2 - color: Theme.surfaceContainer - border.color: Theme.outline - border.width: 0 - radius: Theme.cornerRadius - anchors.bottom: parent.top - anchors.bottomMargin: Theme.spacingXS - anchors.horizontalCenter: parent.horizontalCenter - visible: mouseAreaCat.containsMouse - - StyledText { - id: nameTextCat - text: Theme.getCatppuccinVariantName(themeName) - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - anchors.centerIn: parent - } - } - - MouseArea { - id: mouseAreaCat - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - Theme.switchTheme(themeName); - } - } - - Behavior on scale { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - - Behavior on border.width { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - } - } - } - - Row { - spacing: Theme.spacingM - anchors.horizontalCenter: parent.horizontalCenter - - Repeater { - model: ["cat-yellow", "cat-green", "cat-teal", "cat-sky", "cat-sapphire", "cat-blue", "cat-lavender"] - - Rectangle { - property string themeName: modelData - width: 32 - height: 32 - radius: 16 - color: Theme.getCatppuccinColor(themeName) - border.color: Theme.outline - border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 - scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 - - Rectangle { - width: nameTextCat2.contentWidth + Theme.spacingS * 2 - height: nameTextCat2.contentHeight + Theme.spacingXS * 2 - color: Theme.surfaceContainer - border.color: Theme.outline - border.width: 0 - radius: Theme.cornerRadius - anchors.bottom: parent.top - anchors.bottomMargin: Theme.spacingXS - anchors.horizontalCenter: parent.horizontalCenter - visible: mouseAreaCat2.containsMouse - - StyledText { - id: nameTextCat2 - text: Theme.getCatppuccinVariantName(themeName) - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - anchors.centerIn: parent - } - } - - MouseArea { - id: mouseAreaCat2 - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - Theme.switchTheme(themeName); - } - } - - Behavior on scale { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - - Behavior on border.width { - NumberAnimation { - duration: Theme.shortDuration - easing.type: Theme.emphasizedEasing - } - } - } - } - } + model: ["Generic", "Catppuccin", "Auto", "Custom"] + currentIndex: currentThemeIndex + selectionMode: "single" + anchors.horizontalCenter: parent.horizontalCenter + onSelectionChanged: (index, selected) => { + if (!selected) + return; + pendingThemeIndex = index; } + onAnimationCompleted: { + if (pendingThemeIndex === -1) + return; + switch (pendingThemeIndex) { + case 0: + Theme.switchThemeCategory("generic", "blue"); + break; + case 1: + Theme.switchThemeCategory("catppuccin", "cat-mauve"); + break; + case 2: + if (ToastService.wallpaperErrorStatus === "matugen_missing") + ToastService.showError("matugen not found - install matugen package for dynamic theming"); + else if (ToastService.wallpaperErrorStatus === "error") + ToastService.showError("Wallpaper processing failed - check wallpaper path"); + else + Theme.switchTheme(Theme.dynamic, true, true); + break; + case 3: + if (Theme.currentThemeName !== "custom") + Theme.switchTheme("custom", true, true); + break; + } + pendingThemeIndex = -1; + } + } - Column { - width: parent.width + Column { + spacing: Theme.spacingS + anchors.horizontalCenter: parent.horizontalCenter + visible: Theme.currentThemeCategory === "generic" && Theme.currentTheme !== Theme.dynamic && Theme.currentThemeName !== "custom" + + Row { spacing: Theme.spacingM - visible: Theme.currentTheme === Theme.dynamic + anchors.horizontalCenter: parent.horizontalCenter - Row { - width: parent.width - spacing: Theme.spacingM + Repeater { + model: ["blue", "purple", "green", "orange", "red"] - StyledRect { - width: 120 - height: 90 - radius: Theme.cornerRadius - color: Theme.surfaceVariant + Rectangle { + required property string modelData + property string themeName: modelData + width: 32 + height: 32 + radius: 16 + color: Theme.getThemeColors(themeName).primary border.color: Theme.outline - border.width: 0 - - CachingImage { - anchors.fill: parent - anchors.margins: 1 - source: Theme.wallpaperPath ? "file://" + Theme.wallpaperPath : "" - fillMode: Image.PreserveAspectCrop - visible: Theme.wallpaperPath && !Theme.wallpaperPath.startsWith("#") - layer.enabled: true - layer.effect: MultiEffect { - maskEnabled: true - maskSource: autoWallpaperMask - maskThresholdMin: 0.5 - maskSpreadAtMin: 1 - } - } + border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 + scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 Rectangle { + width: nameText.contentWidth + Theme.spacingS * 2 + height: nameText.contentHeight + Theme.spacingXS * 2 + color: Theme.surfaceContainer + radius: Theme.cornerRadius + anchors.bottom: parent.top + anchors.bottomMargin: Theme.spacingXS + anchors.horizontalCenter: parent.horizontalCenter + visible: mouseArea.containsMouse + + StyledText { + id: nameText + text: Theme.getThemeColors(parent.parent.themeName).name + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + anchors.centerIn: parent + } + } + + MouseArea { + id: mouseArea anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: Theme.wallpaperPath && Theme.wallpaperPath.startsWith("#") ? Theme.wallpaperPath : "transparent" - visible: Theme.wallpaperPath && Theme.wallpaperPath.startsWith("#") + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: Theme.switchTheme(parent.themeName) } - Rectangle { - id: autoWallpaperMask - anchors.fill: parent - anchors.margins: 1 - radius: Theme.cornerRadius - 1 - color: "black" - visible: false - layer.enabled: true + Behavior on scale { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } } - DankIcon { - anchors.centerIn: parent - name: { - if (ToastService.wallpaperErrorStatus === "error" || ToastService.wallpaperErrorStatus === "matugen_missing") - return "error"; - else - return "palette"; - } - size: Theme.iconSizeLarge - color: { - if (ToastService.wallpaperErrorStatus === "error" || ToastService.wallpaperErrorStatus === "matugen_missing") - return Theme.error; - else - return Theme.surfaceVariantText; - } - visible: !Theme.wallpaperPath - } - } - - Column { - width: parent.width - 120 - Theme.spacingM - spacing: Theme.spacingS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: { - if (ToastService.wallpaperErrorStatus === "error") - return "Wallpaper Error"; - else if (ToastService.wallpaperErrorStatus === "matugen_missing") - return "Matugen Missing"; - else if (Theme.wallpaperPath) - return Theme.wallpaperPath.split('/').pop(); - else - return "No wallpaper selected"; - } - font.pixelSize: Theme.fontSizeLarge - color: Theme.surfaceText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - } - - StyledText { - text: { - if (ToastService.wallpaperErrorStatus === "error") - return "Wallpaper processing failed"; - else if (ToastService.wallpaperErrorStatus === "matugen_missing") - return "Install matugen package for dynamic theming"; - else if (Theme.wallpaperPath) - return Theme.wallpaperPath; - else - return "Dynamic colors from wallpaper"; - } - font.pixelSize: Theme.fontSizeSmall - color: { - if (ToastService.wallpaperErrorStatus === "error" || ToastService.wallpaperErrorStatus === "matugen_missing") - return Theme.error; - else - return Theme.surfaceVariantText; - } - elide: Text.ElideMiddle - maximumLineCount: 2 - width: parent.width - wrapMode: Text.WordWrap - } - } - } - - DankDropdown { - id: matugenPaletteDropdown - text: I18n.tr("Matugen Palette") - description: I18n.tr("Select the palette algorithm used for wallpaper-based colors") - options: cachedMatugenSchemes - currentValue: Theme.getMatugenScheme(SettingsData.matugenScheme).label - enabled: Theme.matugenAvailable - opacity: enabled ? 1 : 0.4 - onValueChanged: value => { - for (var i = 0; i < Theme.availableMatugenSchemes.length; i++) { - var option = Theme.availableMatugenSchemes[i]; - if (option.label === value) { - SettingsData.setMatugenScheme(option.value); - break; + Behavior on border.width { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing } } } } - - StyledText { - text: { - var scheme = Theme.getMatugenScheme(SettingsData.matugenScheme); - return scheme.description + " (" + scheme.value + ")"; - } - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: Theme.currentThemeName === "custom" - - Row { - width: parent.width - spacing: Theme.spacingM - - DankActionButton { - buttonSize: 48 - iconName: "folder_open" - iconSize: Theme.iconSize - backgroundColor: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) - iconColor: Theme.primary - onClicked: fileBrowserModal.open() - } - - Column { - width: parent.width - 48 - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: SettingsData.customThemeFile ? SettingsData.customThemeFile.split('/').pop() : "No custom theme file" - font.pixelSize: Theme.fontSizeLarge - color: Theme.surfaceText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - } - - StyledText { - text: SettingsData.customThemeFile || "Click to select a custom theme JSON file" - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - elide: Text.ElideMiddle - maximumLineCount: 1 - width: parent.width - } - } - } - } - } - } - } - - // Transparency Settings - StyledRect { - width: parent.width - height: transparencySection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: transparencySection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "opacity" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Widget Styling") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Row { - width: parent.width - height: 40 - spacing: Theme.spacingM - - Column { - width: parent.width - widgetColorModeGroup.width - parent.spacing - anchors.verticalCenter: parent.verticalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Widget Style") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - elide: Text.ElideRight - width: parent.width - } - - StyledText { - text: I18n.tr("Change bar appearance") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - elide: Text.ElideRight - width: parent.width - } - } - - DankButtonGroup { - id: widgetColorModeGroup - property int currentColorModeIndex: { - switch (SettingsData.widgetColorMode) { - case "default": - return 0; - case "colorful": - return 1; - default: - return 0; - } - } - - model: ["default", "colorful"] - currentIndex: currentColorModeIndex - selectionMode: "single" - anchors.verticalCenter: parent.verticalCenter - - onSelectionChanged: (index, selected) => { - if (!selected) - return; - const colorModeOptions = ["default", "colorful"]; - SettingsData.set("widgetColorMode", colorModeOptions[index]); - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - Item { - width: parent.width - height: Math.max(transparencyLabel.height, widgetColorGroup.height) - - Column { - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - width: parent.width - widgetColorGroup.width - Theme.spacingM - spacing: 2 - - StyledText { - id: transparencyLabel - text: I18n.tr("Widget Background Color") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledText { - text: I18n.tr("Choose the background color for widgets") - font.pixelSize: Theme.fontSizeSmall - 2 - color: Theme.surfaceVariantText - width: parent.width - wrapMode: Text.WordWrap - } - } - - DankButtonGroup { - id: widgetColorGroup - property int currentColorIndex: { - switch (SettingsData.widgetBackgroundColor) { - case "sth": - return 0; - case "s": - return 1; - case "sc": - return 2; - case "sch": - return 3; - default: - return 0; - } - } - - model: ["sth", "s", "sc", "sch"] - currentIndex: currentColorIndex - selectionMode: "single" - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - - buttonHeight: 20 - minButtonWidth: 32 - buttonPadding: Theme.spacingS - checkIconSize: Theme.iconSizeSmall - 2 - textSize: Theme.fontSizeSmall - 2 - spacing: 1 - - onSelectionChanged: (index, selected) => { - if (!selected) - return; - const colorOptions = ["sth", "s", "sc", "sch"]; - SettingsData.set("widgetBackgroundColor", colorOptions[index]); - } - } - } - } - - Column { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Popup Transparency") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledText { - text: I18n.tr("Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)") - font.pixelSize: Theme.fontSizeSmall - 2 - color: Theme.surfaceVariantText - width: parent.width - wrapMode: Text.WordWrap - } - - DankSlider { - width: parent.width - height: 24 - value: Math.round(SettingsData.popupTransparency * 100) - minimum: 0 - maximum: 100 - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.set("popupTransparency", newValue / 100); - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - } - - Column { - width: parent.width - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Corner Radius (0 = square corners)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - } - - DankSlider { - width: parent.width - height: 24 - value: SettingsData.cornerRadius - minimum: 0 - maximum: 32 - unit: "" - showValue: true - wheelEnabled: false - thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - onSliderValueChanged: newValue => { - SettingsData.setCornerRadius(newValue); - } - } - } - - Rectangle { - width: parent.width - height: 1 - color: Theme.outline - opacity: 0.2 - } - - Row { - width: parent.width - height: 40 - spacing: Theme.spacingM - - Column { - width: parent.width - modalBackgroundToggle.width - parent.spacing - anchors.verticalCenter: parent.verticalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Darken Modal Background") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - } - - StyledText { - text: I18n.tr("Show darkened overlay behind modal dialogs") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - } - - DankToggle { - id: modalBackgroundToggle - width: 48 - height: 24 - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.modalDarkenBackground - onToggled: checked => { - SettingsData.set("modalDarkenBackground", checked); - } - } - } - } - } - - StyledRect { - width: parent.width - height: fontSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: fontSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "font_download" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Font Settings") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankDropdown { - text: I18n.tr("Font Family") - description: I18n.tr("Select system font family") - currentValue: { - if (SettingsData.fontFamily === Theme.defaultFontFamily) - return "Default"; - else - return SettingsData.fontFamily || "Default"; - } - enableFuzzySearch: true - popupWidthOffset: 100 - maxPopupHeight: 400 - options: cachedFontFamilies - onValueChanged: value => { - if (value.startsWith("Default")) - SettingsData.set("fontFamily", Theme.defaultFontFamily); - else - SettingsData.set("fontFamily", value); - } - } - - DankDropdown { - text: I18n.tr("Font Weight") - description: I18n.tr("Select font weight") - currentValue: { - switch (SettingsData.fontWeight) { - case Font.Thin: - return "Thin"; - case Font.ExtraLight: - return "Extra Light"; - case Font.Light: - return "Light"; - case Font.Normal: - return "Regular"; - case Font.Medium: - return "Medium"; - case Font.DemiBold: - return "Demi Bold"; - case Font.Bold: - return "Bold"; - case Font.ExtraBold: - return "Extra Bold"; - case Font.Black: - return "Black"; - default: - return "Regular"; - } - } - options: ["Thin", "Extra Light", "Light", "Regular", "Medium", "Demi Bold", "Bold", "Extra Bold", "Black"] - onValueChanged: value => { - var weight; - switch (value) { - case "Thin": - weight = Font.Thin; - break; - case "Extra Light": - weight = Font.ExtraLight; - break; - case "Light": - weight = Font.Light; - break; - case "Regular": - weight = Font.Normal; - break; - case "Medium": - weight = Font.Medium; - break; - case "Demi Bold": - weight = Font.DemiBold; - break; - case "Bold": - weight = Font.Bold; - break; - case "Extra Bold": - weight = Font.ExtraBold; - break; - case "Black": - weight = Font.Black; - break; - default: - weight = Font.Normal; - break; - } - SettingsData.set("fontWeight", weight); - } - } - - DankDropdown { - text: I18n.tr("Monospace Font") - description: I18n.tr("Select monospace font for process list and technical displays") - currentValue: { - if (SettingsData.monoFontFamily === SettingsData.defaultMonoFontFamily) - return "Default"; - - return SettingsData.monoFontFamily || "Default"; - } - enableFuzzySearch: true - popupWidthOffset: 100 - maxPopupHeight: 400 - options: cachedMonoFamilies - onValueChanged: value => { - if (value === "Default") - SettingsData.set("monoFontFamily", SettingsData.defaultMonoFontFamily); - else - SettingsData.set("monoFontFamily", value); - } - } - - Rectangle { - width: parent.width - height: 60 - radius: Theme.cornerRadius - color: "transparent" - - Column { - anchors.left: parent.left - anchors.right: fontScaleControls.left - anchors.verticalCenter: parent.verticalCenter - spacing: Theme.spacingXS - - StyledText { - text: I18n.tr("Font Scale") - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Scale all font sizes") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - width: parent.width - } } Row { - id: fontScaleControls + spacing: Theme.spacingM + anchors.horizontalCenter: parent.horizontalCenter - width: 180 - height: 36 - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.verticalCenter: parent.verticalCenter - spacing: Theme.spacingS + Repeater { + model: ["cyan", "pink", "amber", "coral", "monochrome"] - DankActionButton { - buttonSize: 32 - iconName: "remove" - iconSize: Theme.iconSizeSmall - enabled: SettingsData.fontScale > 1.0 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - onClicked: { - var newScale = Math.max(1.0, SettingsData.fontScale - 0.05); - SettingsData.set("fontScale", newScale); + Rectangle { + required property string modelData + property string themeName: modelData + width: 32 + height: 32 + radius: 16 + color: Theme.getThemeColors(themeName).primary + border.color: Theme.outline + border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 + scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 + + Rectangle { + width: nameText2.contentWidth + Theme.spacingS * 2 + height: nameText2.contentHeight + Theme.spacingXS * 2 + color: Theme.surfaceContainer + radius: Theme.cornerRadius + anchors.bottom: parent.top + anchors.bottomMargin: Theme.spacingXS + anchors.horizontalCenter: parent.horizontalCenter + visible: mouseArea2.containsMouse + + StyledText { + id: nameText2 + text: Theme.getThemeColors(parent.parent.themeName).name + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + anchors.centerIn: parent + } + } + + MouseArea { + id: mouseArea2 + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: Theme.switchTheme(parent.themeName) + } + + Behavior on scale { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } + } + + Behavior on border.width { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } + } } } + } + } + + Column { + spacing: Theme.spacingS + anchors.horizontalCenter: parent.horizontalCenter + visible: Theme.currentThemeCategory === "catppuccin" && Theme.currentTheme !== Theme.dynamic && Theme.currentThemeName !== "custom" + + Row { + spacing: Theme.spacingM + anchors.horizontalCenter: parent.horizontalCenter + + Repeater { + model: ["cat-rosewater", "cat-flamingo", "cat-pink", "cat-mauve", "cat-red", "cat-maroon", "cat-peach"] + + Rectangle { + required property string modelData + property string themeName: modelData + width: 32 + height: 32 + radius: 16 + color: Theme.getCatppuccinColor(themeName) + border.color: Theme.outline + border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 + scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 + + Rectangle { + width: nameTextCat.contentWidth + Theme.spacingS * 2 + height: nameTextCat.contentHeight + Theme.spacingXS * 2 + color: Theme.surfaceContainer + radius: Theme.cornerRadius + anchors.bottom: parent.top + anchors.bottomMargin: Theme.spacingXS + anchors.horizontalCenter: parent.horizontalCenter + visible: mouseAreaCat.containsMouse + + StyledText { + id: nameTextCat + text: Theme.getCatppuccinVariantName(parent.parent.themeName) + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + anchors.centerIn: parent + } + } + + MouseArea { + id: mouseAreaCat + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: Theme.switchTheme(parent.themeName) + } + + Behavior on scale { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } + } + + Behavior on border.width { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } + } + } + } + } + + Row { + spacing: Theme.spacingM + anchors.horizontalCenter: parent.horizontalCenter + + Repeater { + model: ["cat-yellow", "cat-green", "cat-teal", "cat-sky", "cat-sapphire", "cat-blue", "cat-lavender"] + + Rectangle { + required property string modelData + property string themeName: modelData + width: 32 + height: 32 + radius: 16 + color: Theme.getCatppuccinColor(themeName) + border.color: Theme.outline + border.width: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 2 : 1 + scale: (Theme.currentThemeName === themeName && Theme.currentTheme !== Theme.dynamic) ? 1.1 : 1 + + Rectangle { + width: nameTextCat2.contentWidth + Theme.spacingS * 2 + height: nameTextCat2.contentHeight + Theme.spacingXS * 2 + color: Theme.surfaceContainer + radius: Theme.cornerRadius + anchors.bottom: parent.top + anchors.bottomMargin: Theme.spacingXS + anchors.horizontalCenter: parent.horizontalCenter + visible: mouseAreaCat2.containsMouse + + StyledText { + id: nameTextCat2 + text: Theme.getCatppuccinVariantName(parent.parent.themeName) + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + anchors.centerIn: parent + } + } + + MouseArea { + id: mouseAreaCat2 + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: Theme.switchTheme(parent.themeName) + } + + Behavior on scale { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } + } + + Behavior on border.width { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.emphasizedEasing + } + } + } + } + } + } + + Column { + width: parent.width + spacing: Theme.spacingM + visible: Theme.currentTheme === Theme.dynamic + + Row { + width: parent.width + spacing: Theme.spacingM StyledRect { - width: 60 - height: 32 + width: 120 + height: 90 radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + color: Theme.surfaceVariant - StyledText { + CachingImage { + anchors.fill: parent + anchors.margins: 1 + source: Theme.wallpaperPath ? "file://" + Theme.wallpaperPath : "" + fillMode: Image.PreserveAspectCrop + visible: Theme.wallpaperPath && !Theme.wallpaperPath.startsWith("#") + layer.enabled: true + layer.effect: MultiEffect { + maskEnabled: true + maskSource: autoWallpaperMask + maskThresholdMin: 0.5 + maskSpreadAtMin: 1 + } + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: Theme.wallpaperPath && Theme.wallpaperPath.startsWith("#") ? Theme.wallpaperPath : "transparent" + visible: Theme.wallpaperPath && Theme.wallpaperPath.startsWith("#") + } + + Rectangle { + id: autoWallpaperMask + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: "black" + visible: false + layer.enabled: true + } + + DankIcon { anchors.centerIn: parent - text: (SettingsData.fontScale * 100).toFixed(0) + "%" - font.pixelSize: Theme.fontSizeSmall - font.weight: Font.Medium - color: Theme.surfaceText + name: (ToastService.wallpaperErrorStatus === "error" || ToastService.wallpaperErrorStatus === "matugen_missing") ? "error" : "palette" + size: Theme.iconSizeLarge + color: (ToastService.wallpaperErrorStatus === "error" || ToastService.wallpaperErrorStatus === "matugen_missing") ? Theme.error : Theme.surfaceVariantText + visible: !Theme.wallpaperPath } } + Column { + width: parent.width - 120 - Theme.spacingM + spacing: Theme.spacingS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: { + if (ToastService.wallpaperErrorStatus === "error") + return "Wallpaper Error"; + if (ToastService.wallpaperErrorStatus === "matugen_missing") + return "Matugen Missing"; + if (Theme.wallpaperPath) + return Theme.wallpaperPath.split('/').pop(); + return "No wallpaper selected"; + } + font.pixelSize: Theme.fontSizeLarge + color: Theme.surfaceText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width + } + + StyledText { + text: { + if (ToastService.wallpaperErrorStatus === "error") + return "Wallpaper processing failed"; + if (ToastService.wallpaperErrorStatus === "matugen_missing") + return "Install matugen package for dynamic theming"; + if (Theme.wallpaperPath) + return Theme.wallpaperPath; + return "Dynamic colors from wallpaper"; + } + font.pixelSize: Theme.fontSizeSmall + color: (ToastService.wallpaperErrorStatus === "error" || ToastService.wallpaperErrorStatus === "matugen_missing") ? Theme.error : Theme.surfaceVariantText + elide: Text.ElideMiddle + maximumLineCount: 2 + width: parent.width + wrapMode: Text.WordWrap + } + } + } + + SettingsDropdownRow { + tab: "theme" + tags: ["matugen", "palette", "algorithm", "dynamic"] + settingKey: "matugenScheme" + text: I18n.tr("Matugen Palette") + description: I18n.tr("Select the palette algorithm used for wallpaper-based colors") + options: cachedMatugenSchemes + currentValue: Theme.getMatugenScheme(SettingsData.matugenScheme).label + enabled: Theme.matugenAvailable + opacity: enabled ? 1 : 0.4 + onValueChanged: value => { + for (var i = 0; i < Theme.availableMatugenSchemes.length; i++) { + var option = Theme.availableMatugenSchemes[i]; + if (option.label === value) { + SettingsData.setMatugenScheme(option.value); + break; + } + } + } + } + + StyledText { + text: { + var scheme = Theme.getMatugenScheme(SettingsData.matugenScheme); + return scheme.description + " (" + scheme.value + ")"; + } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + } + } + + Column { + width: parent.width + spacing: Theme.spacingM + visible: Theme.currentThemeName === "custom" + + Row { + width: parent.width + spacing: Theme.spacingM + DankActionButton { - buttonSize: 32 - iconName: "add" - iconSize: Theme.iconSizeSmall - enabled: SettingsData.fontScale < 2.0 - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - iconColor: Theme.surfaceText - onClicked: { - var newScale = Math.min(2.0, SettingsData.fontScale + 0.05); - SettingsData.set("fontScale", newScale); + buttonSize: 48 + iconName: "folder_open" + iconSize: Theme.iconSize + backgroundColor: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) + iconColor: Theme.primary + onClicked: fileBrowserModal.open() + } + + Column { + width: parent.width - 48 - Theme.spacingM + spacing: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: SettingsData.customThemeFile ? SettingsData.customThemeFile.split('/').pop() : "No custom theme file" + font.pixelSize: Theme.fontSizeLarge + color: Theme.surfaceText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width + } + + StyledText { + text: SettingsData.customThemeFile || "Click to select a custom theme JSON file" + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width } } } @@ -1171,60 +567,150 @@ Item { } } - StyledRect { - width: parent.width - height: applicationsSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "theme" + tags: ["light", "dark", "mode", "appearance"] + title: I18n.tr("Color Mode") + iconName: "contrast" - Column { - id: applicationsSection + SettingsToggleRow { + tab: "theme" + tags: ["light", "dark", "mode"] + settingKey: "isLightMode" + text: I18n.tr("Light Mode") + description: I18n.tr("Use light theme instead of dark theme") + checked: SessionData.isLightMode + onToggled: checked => { + Theme.screenTransition(); + Theme.setLightMode(checked); + } + } + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM + SettingsCard { + tab: "theme" + tags: ["transparency", "opacity", "widget", "styling"] + title: I18n.tr("Widget Styling") + iconName: "opacity" - Row { - width: parent.width - spacing: Theme.spacingM + SettingsButtonGroupRow { + tab: "theme" + tags: ["widget", "style", "colorful", "default"] + settingKey: "widgetColorMode" + text: I18n.tr("Widget Style") + description: I18n.tr("Change bar appearance") + model: ["default", "colorful"] + currentIndex: SettingsData.widgetColorMode === "colorful" ? 1 : 0 + onSelectionChanged: (index, selected) => { + if (!selected) + return; + SettingsData.set("widgetColorMode", index === 1 ? "colorful" : "default"); + } + } - DankIcon { - name: "terminal" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Applications") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter + SettingsButtonGroupRow { + tab: "theme" + tags: ["widget", "background", "color"] + settingKey: "widgetBackgroundColor" + text: I18n.tr("Widget Background Color") + description: I18n.tr("Choose the background color for widgets") + model: ["sth", "s", "sc", "sch"] + buttonHeight: 20 + minButtonWidth: 32 + buttonPadding: Theme.spacingS + checkIconSize: Theme.iconSizeSmall - 2 + textSize: Theme.fontSizeSmall - 2 + spacing: 1 + currentIndex: { + switch (SettingsData.widgetBackgroundColor) { + case "sth": + return 0; + case "s": + return 1; + case "sc": + return 2; + case "sch": + return 3; + default: + return 0; } } - - DankToggle { - width: parent.width - text: I18n.tr("Sync Mode with Portal") - description: I18n.tr("Sync dark mode with settings portals for system-wide theme hints") - checked: SettingsData.syncModeWithPortal - onToggled: checked => { - return SettingsData.set("syncModeWithPortal", checked); - } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + const colorOptions = ["sth", "s", "sc", "sch"]; + SettingsData.set("widgetBackgroundColor", colorOptions[index]); } + } - DankToggle { - width: parent.width - text: I18n.tr("Terminals - Always use Dark Theme") - description: I18n.tr("Force terminal applications to always use dark color schemes") - checked: SettingsData.terminalsAlwaysDark - onToggled: checked => { - return SettingsData.set("terminalsAlwaysDark", checked); - } - } + SettingsSliderRow { + tab: "theme" + tags: ["popup", "transparency", "opacity", "modal"] + settingKey: "popupTransparency" + text: I18n.tr("Popup Transparency") + description: I18n.tr("Controls opacity of all popouts, modals, and their content layers") + value: Math.round(SettingsData.popupTransparency * 100) + minimum: 0 + maximum: 100 + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => SettingsData.set("popupTransparency", newValue / 100) + } + + SettingsSliderRow { + tab: "theme" + tags: ["corner", "radius", "rounded", "square"] + settingKey: "cornerRadius" + text: I18n.tr("Corner Radius") + description: I18n.tr("0 = square corners") + value: SettingsData.cornerRadius + minimum: 0 + maximum: 32 + unit: "px" + defaultValue: 12 + onSliderValueChanged: newValue => SettingsData.setCornerRadius(newValue) + } + } + + SettingsCard { + tab: "theme" + tags: ["modal", "darken", "background", "overlay"] + + SettingsToggleRow { + tab: "theme" + tags: ["modal", "darken", "background", "overlay"] + settingKey: "modalDarkenBackground" + text: I18n.tr("Darken Modal Background") + description: I18n.tr("Show darkened overlay behind modal dialogs") + checked: SettingsData.modalDarkenBackground + onToggled: checked => SettingsData.set("modalDarkenBackground", checked) + } + } + + SettingsCard { + tab: "theme" + tags: ["applications", "portal", "dark", "terminal"] + title: I18n.tr("Applications") + iconName: "terminal" + + SettingsToggleRow { + tab: "theme" + tags: ["portal", "sync", "dark", "mode"] + settingKey: "syncModeWithPortal" + text: I18n.tr("Sync Mode with Portal") + description: I18n.tr("Sync dark mode with settings portals for system-wide theme hints") + checked: SettingsData.syncModeWithPortal + onToggled: checked => SettingsData.set("syncModeWithPortal", checked) + } + + SettingsToggleRow { + tab: "theme" + tags: ["terminal", "dark", "always"] + settingKey: "terminalsAlwaysDark" + text: I18n.tr("Terminals - Always use Dark Theme") + description: I18n.tr("Force terminal applications to always use dark color schemes") + checked: SettingsData.terminalsAlwaysDark + onToggled: checked => SettingsData.set("terminalsAlwaysDark", checked) } } @@ -1233,8 +719,6 @@ Item { height: warningText.implicitHeight + Theme.spacingM * 2 radius: Theme.cornerRadius color: Qt.rgba(Theme.warning.r, Theme.warning.g, Theme.warning.b, 0.12) - border.color: Qt.rgba(Theme.warning.r, Theme.warning.g, Theme.warning.b, 0.3) - border.width: 0 Row { anchors.fill: parent @@ -1259,186 +743,127 @@ Item { } } - // Icon Theme - StyledRect { - width: parent.width - height: iconThemeSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "theme" + tags: ["icon", "theme", "system"] - Column { - id: iconThemeSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingXS - - DankIcon { - name: "image" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - DankDropdown { - width: parent.width - Theme.iconSize - Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - text: I18n.tr("Icon Theme") - description: "DankShell & System Icons\n(requires restart)" - currentValue: SettingsData.iconTheme - enableFuzzySearch: true - popupWidthOffset: 100 - maxPopupHeight: 236 - options: cachedIconThemes - onValueChanged: value => { - SettingsData.setIconTheme(value); - if (Quickshell.env("QT_QPA_PLATFORMTHEME") != "gtk3" && Quickshell.env("QT_QPA_PLATFORMTHEME") != "qt6ct" && Quickshell.env("QT_QPA_PLATFORMTHEME_QT6") != "qt6ct") { - ToastService.showError("Missing Environment Variables", "You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed."); - } - } + SettingsDropdownRow { + tab: "theme" + tags: ["icon", "theme", "system"] + settingKey: "iconTheme" + text: I18n.tr("Icon Theme") + description: I18n.tr("DankShell & System Icons (requires restart)") + currentValue: SettingsData.iconTheme + enableFuzzySearch: true + popupWidthOffset: 100 + maxPopupHeight: 236 + options: cachedIconThemes + onValueChanged: value => { + SettingsData.setIconTheme(value); + if (Quickshell.env("QT_QPA_PLATFORMTHEME") != "gtk3" && Quickshell.env("QT_QPA_PLATFORMTHEME") != "qt6ct" && Quickshell.env("QT_QPA_PLATFORMTHEME_QT6") != "qt6ct") { + ToastService.showError("Missing Environment Variables", "You need to set either:\nQT_QPA_PLATFORMTHEME=gtk3 OR\nQT_QPA_PLATFORMTHEME=qt6ct\nas environment variables, and then restart the shell.\n\nqt6ct requires qt6ct-kde to be installed."); } } } } - // System App Theming - StyledRect { - width: parent.width - height: systemThemingSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "theme" + tags: ["system", "app", "theming", "gtk", "qt"] + title: I18n.tr("System App Theming") + iconName: "extension" visible: Theme.matugenAvailable - Column { - id: systemThemingSection - - anchors.fill: parent - anchors.margins: Theme.spacingL + Row { + width: parent.width spacing: Theme.spacingM - Row { - width: parent.width - spacing: Theme.spacingM + Rectangle { + width: (parent.width - Theme.spacingM) / 2 + height: 48 + radius: Theme.cornerRadius + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) - DankIcon { - name: "extension" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } + Row { + anchors.centerIn: parent + spacing: Theme.spacingS - StyledText { - text: I18n.tr("System App Theming") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Row { - width: parent.width - spacing: Theme.spacingM - - Rectangle { - width: (parent.width - Theme.spacingM) / 2 - height: 48 - radius: Theme.cornerRadius - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) - border.color: Theme.primary - border.width: 0 - - Row { - anchors.centerIn: parent - spacing: Theme.spacingS - - DankIcon { - name: "folder" - size: 16 - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Apply GTK Colors") - font.pixelSize: Theme.fontSizeMedium - color: Theme.primary - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } + DankIcon { + name: "folder" + size: 16 + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter } - MouseArea { - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: Theme.applyGtkColors() + StyledText { + text: I18n.tr("Apply GTK Colors") + font.pixelSize: Theme.fontSizeMedium + color: Theme.primary + font.weight: Font.Medium + anchors.verticalCenter: parent.verticalCenter } } - Rectangle { - width: (parent.width - Theme.spacingM) / 2 - height: 48 - radius: Theme.cornerRadius - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) - border.color: Theme.primary - border.width: 0 - - Row { - anchors.centerIn: parent - spacing: Theme.spacingS - - DankIcon { - name: "settings" - size: 16 - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Apply Qt Colors") - font.pixelSize: Theme.fontSizeMedium - color: Theme.primary - font.weight: Font.Medium - anchors.verticalCenter: parent.verticalCenter - } - } - - MouseArea { - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: Theme.applyQtColors() - } - } - } - - StyledText { - text: I18n.tr(`Generate baseline GTK3/4 or QT5/QT6 (requires qt6ct-kde) configurations to follow DMS colors. Only needed once.

It is recommended to configure adw-gtk3 prior to applying GTK themes.`) - textFormat: Text.RichText - linkColor: Theme.primary - onLinkActivated: url => Qt.openUrlExternally(url) - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - horizontalAlignment: Text.AlignHCenter - MouseArea { anchors.fill: parent - cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor - acceptedButtons: Qt.NoButton - propagateComposedEvents: true + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: Theme.applyGtkColors() } } + + Rectangle { + width: (parent.width - Theme.spacingM) / 2 + height: 48 + radius: Theme.cornerRadius + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.12) + + Row { + anchors.centerIn: parent + spacing: Theme.spacingS + + DankIcon { + name: "settings" + size: 16 + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + text: I18n.tr("Apply Qt Colors") + font.pixelSize: Theme.fontSizeMedium + color: Theme.primary + font.weight: Font.Medium + anchors.verticalCenter: parent.verticalCenter + } + } + + MouseArea { + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: Theme.applyQtColors() + } + } + } + + StyledText { + text: I18n.tr(`Generate baseline GTK3/4 or QT5/QT6 (requires qt6ct-kde) configurations to follow DMS colors. Only needed once.

It is recommended to configure adw-gtk3 prior to applying GTK themes.`) + textFormat: Text.RichText + linkColor: Theme.primary + onLinkActivated: url => Qt.openUrlExternally(url) + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + horizontalAlignment: Text.AlignHCenter + + MouseArea { + anchors.fill: parent + cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor + acceptedButtons: Qt.NoButton + propagateComposedEvents: true + } } } } diff --git a/quickshell/Modules/Settings/TimeWeatherTab.qml b/quickshell/Modules/Settings/TimeWeatherTab.qml index 0ad813e0..d56709c5 100644 --- a/quickshell/Modules/Settings/TimeWeatherTab.qml +++ b/quickshell/Modules/Settings/TimeWeatherTab.qml @@ -4,6 +4,7 @@ import QtQuick.Layouts import qs.Common import qs.Services import qs.Widgets +import qs.Modules.Settings.Widgets Item { id: root @@ -21,1343 +22,1026 @@ Item { anchors.horizontalCenter: parent.horizontalCenter spacing: Theme.spacingXL - StyledRect { - width: parent.width - height: timeSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "time" + tags: ["time", "clock", "format", "24hour"] + title: I18n.tr("Time Format") + iconName: "schedule" - Column { - id: timeSection + SettingsToggleRow { + tab: "time" + tags: ["time", "24hour", "format"] + settingKey: "use24HourClock" + text: I18n.tr("24-Hour Format") + description: I18n.tr("Use 24-hour time format instead of 12-hour AM/PM") + checked: SettingsData.use24HourClock + onToggled: checked => SettingsData.set("use24HourClock", checked) + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "schedule" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - toggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("24-Hour Format") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Use 24-hour time format instead of 12-hour AM/PM") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: toggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.use24HourClock - onToggled: checked => { - return SettingsData.set("use24HourClock", checked); - } - } - } + SettingsToggleRow { + tab: "time" + tags: ["time", "seconds", "clock"] + settingKey: "showSeconds" + text: I18n.tr("Show Seconds") + description: I18n.tr("Display seconds in the clock") + checked: SettingsData.showSeconds + onToggled: checked => SettingsData.set("showSeconds", checked) } } - StyledRect { - width: parent.width - height: timeSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "time" + tags: ["date", "format", "calendar"] + title: I18n.tr("Date Format") + iconName: "calendar_today" - Column { - id: secondsSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "schedule" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - toggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Show seconds") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Clock show seconds") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: toggleSec - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.showSeconds - onToggled: checked => { - return SettingsData.set("showSeconds", checked); + SettingsDropdownRow { + tab: "time" + tags: ["date", "format", "topbar"] + settingKey: "clockDateFormat" + text: I18n.tr("Top Bar Format") + description: "Preview: " + (SettingsData.clockDateFormat ? new Date().toLocaleDateString(Qt.locale(), SettingsData.clockDateFormat) : new Date().toLocaleDateString(Qt.locale(), "ddd d")) + options: ["System Default", "Day Date", "Day Month Date", "Month Date", "Numeric (M/D)", "Numeric (D/M)", "Full with Year", "ISO Date", "Full Day & Month", "Custom..."] + currentValue: { + if (!SettingsData.clockDateFormat || SettingsData.clockDateFormat.length === 0) + return "System Default"; + const presets = [ + { + "format": "ddd d", + "label": "Day Date" + }, + { + "format": "ddd MMM d", + "label": "Day Month Date" + }, + { + "format": "MMM d", + "label": "Month Date" + }, + { + "format": "M/d", + "label": "Numeric (M/D)" + }, + { + "format": "d/M", + "label": "Numeric (D/M)" + }, + { + "format": "ddd d MMM yyyy", + "label": "Full with Year" + }, + { + "format": "yyyy-MM-dd", + "label": "ISO Date" + }, + { + "format": "dddd, MMMM d", + "label": "Full Day & Month" } + ]; + const match = presets.find(p => p.format === SettingsData.clockDateFormat); + return match ? match.label : I18n.tr("Custom: ") + SettingsData.clockDateFormat; + } + onValueChanged: value => { + const formatMap = { + "System Default": "", + "Day Date": "ddd d", + "Day Month Date": "ddd MMM d", + "Month Date": "MMM d", + "Numeric (M/D)": "M/d", + "Numeric (D/M)": "d/M", + "Full with Year": "ddd d MMM yyyy", + "ISO Date": "yyyy-MM-dd", + "Full Day & Month": "dddd, MMMM d" + }; + if (value === "Custom...") { + customFormatInput.visible = true; + } else { + customFormatInput.visible = false; + SettingsData.set("clockDateFormat", formatMap[value]); } } } - } - StyledRect { - width: parent.width - height: dateSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + DankTextField { + id: customFormatInput + width: parent.width - Theme.spacingM * 2 + x: Theme.spacingM + visible: false + placeholderText: I18n.tr("Enter custom top bar format (e.g., ddd MMM d)") + text: SettingsData.clockDateFormat + onTextChanged: { + if (visible && text) + SettingsData.set("clockDateFormat", text); + } + } - Column { - id: dateSection + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "calendar_today" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter + SettingsDropdownRow { + tab: "time" + tags: ["date", "format", "lock", "screen"] + settingKey: "lockDateFormat" + text: I18n.tr("Lock Screen Format") + description: "Preview: " + (SettingsData.lockDateFormat ? new Date().toLocaleDateString(Qt.locale(), SettingsData.lockDateFormat) : new Date().toLocaleDateString(Qt.locale(), Locale.LongFormat)) + options: ["System Default", "Day Date", "Day Month Date", "Month Date", "Numeric (M/D)", "Numeric (D/M)", "Full with Year", "ISO Date", "Full Day & Month", "Custom..."] + currentValue: { + if (!SettingsData.lockDateFormat || SettingsData.lockDateFormat.length === 0) + return "System Default"; + const presets = [ + { + "format": "ddd d", + "label": "Day Date" + }, + { + "format": "ddd MMM d", + "label": "Day Month Date" + }, + { + "format": "MMM d", + "label": "Month Date" + }, + { + "format": "M/d", + "label": "Numeric (M/D)" + }, + { + "format": "d/M", + "label": "Numeric (D/M)" + }, + { + "format": "ddd d MMM yyyy", + "label": "Full with Year" + }, + { + "format": "yyyy-MM-dd", + "label": "ISO Date" + }, + { + "format": "dddd, MMMM d", + "label": "Full Day & Month" + } + ]; + const match = presets.find(p => p.format === SettingsData.lockDateFormat); + return match ? match.label : I18n.tr("Custom: ") + SettingsData.lockDateFormat; + } + onValueChanged: value => { + const formatMap = { + "System Default": "", + "Day Date": "ddd d", + "Day Month Date": "ddd MMM d", + "Month Date": "MMM d", + "Numeric (M/D)": "M/d", + "Numeric (D/M)": "d/M", + "Full with Year": "ddd d MMM yyyy", + "ISO Date": "yyyy-MM-dd", + "Full Day & Month": "dddd, MMMM d" + }; + if (value === "Custom...") { + customLockFormatInput.visible = true; + } else { + customLockFormatInput.visible = false; + SettingsData.set("lockDateFormat", formatMap[value]); } + } + } + + DankTextField { + id: customLockFormatInput + width: parent.width - Theme.spacingM * 2 + x: Theme.spacingM + visible: false + placeholderText: I18n.tr("Enter custom lock screen format (e.g., dddd, MMMM d)") + text: SettingsData.lockDateFormat + onTextChanged: { + if (visible && text) + SettingsData.set("lockDateFormat", text); + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + Rectangle { + width: parent.width - Theme.spacingM * 2 + x: Theme.spacingM + height: formatHelp.implicitHeight + Theme.spacingM * 2 + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + Column { + id: formatHelp + anchors.fill: parent + anchors.margins: Theme.spacingM + spacing: Theme.spacingXS StyledText { - text: I18n.tr("Date Format") - font.pixelSize: Theme.fontSizeLarge + text: I18n.tr("Format Legend") + font.pixelSize: Theme.fontSizeSmall + color: Theme.primary font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter } - } - DankDropdown { - height: 50 - text: I18n.tr("Top Bar Format") - description: "Preview: " + (SettingsData.clockDateFormat ? new Date().toLocaleDateString(Qt.locale(), SettingsData.clockDateFormat) : new Date().toLocaleDateString(Qt.locale(), "ddd d")) - currentValue: { - if (!SettingsData.clockDateFormat || SettingsData.clockDateFormat.length === 0) { - return "System Default"; - } - const presets = [ - { - "format": "ddd d", - "label": "Day Date" - }, - { - "format": "ddd MMM d", - "label": "Day Month Date" - }, - { - "format": "MMM d", - "label": "Month Date" - }, - { - "format": "M/d", - "label": "Numeric (M/D)" - }, - { - "format": "d/M", - "label": "Numeric (D/M)" - }, - { - "format": "ddd d MMM yyyy", - "label": "Full with Year" - }, - { - "format": "yyyy-MM-dd", - "label": "ISO Date" - }, - { - "format": "dddd, MMMM d", - "label": "Full Day & Month" + Row { + width: parent.width + spacing: Theme.spacingL + + Column { + width: (parent.width - Theme.spacingL) / 2 + spacing: 2 + + StyledText { + text: I18n.tr("• d - Day (1-31)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText } - ]; - const match = presets.find(p => { - return p.format === SettingsData.clockDateFormat; - }); - return match ? match.label : I18n.tr("Custom: ") + SettingsData.clockDateFormat; - } - options: ["System Default", "Day Date", "Day Month Date", "Month Date", "Numeric (M/D)", "Numeric (D/M)", "Full with Year", "ISO Date", "Full Day & Month", "Custom..."] - onValueChanged: value => { - const formatMap = { - "System Default": "", - "Day Date": "ddd d", - "Day Month Date": "ddd MMM d", - "Month Date": "MMM d", - "Numeric (M/D)": "M/d", - "Numeric (D/M)": "d/M", - "Full with Year": "ddd d MMM yyyy", - "ISO Date": "yyyy-MM-dd", - "Full Day & Month": "dddd, MMMM d" - }; - if (value === "Custom...") { - customFormatInput.visible = true; - } else { - customFormatInput.visible = false; - SettingsData.set("clockDateFormat", formatMap[value]); - } - } - } - - DankDropdown { - height: 50 - text: I18n.tr("Lock Screen Format") - description: "Preview: " + (SettingsData.lockDateFormat ? new Date().toLocaleDateString(Qt.locale(), SettingsData.lockDateFormat) : new Date().toLocaleDateString(Qt.locale(), Locale.LongFormat)) - currentValue: { - if (!SettingsData.lockDateFormat || SettingsData.lockDateFormat.length === 0) { - return "System Default"; - } - const presets = [ - { - "format": "ddd d", - "label": "Day Date" - }, - { - "format": "ddd MMM d", - "label": "Day Month Date" - }, - { - "format": "MMM d", - "label": "Month Date" - }, - { - "format": "M/d", - "label": "Numeric (M/D)" - }, - { - "format": "d/M", - "label": "Numeric (D/M)" - }, - { - "format": "ddd d MMM yyyy", - "label": "Full with Year" - }, - { - "format": "yyyy-MM-dd", - "label": "ISO Date" - }, - { - "format": "dddd, MMMM d", - "label": "Full Day & Month" + StyledText { + text: I18n.tr("• dd - Day (01-31)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• ddd - Day name (Mon)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• dddd - Day name (Monday)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• M - Month (1-12)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + } + + Column { + width: (parent.width - Theme.spacingL) / 2 + spacing: 2 + + StyledText { + text: I18n.tr("• MM - Month (01-12)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• MMM - Month (Jan)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• MMMM - Month (January)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• yy - Year (24)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + } + StyledText { + text: I18n.tr("• yyyy - Year (2024)") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText } - ]; - const match = presets.find(p => { - return p.format === SettingsData.lockDateFormat; - }); - return match ? match.label : I18n.tr("Custom: ") + SettingsData.lockDateFormat; - } - options: ["System Default", "Day Date", "Day Month Date", "Month Date", "Numeric (M/D)", "Numeric (D/M)", "Full with Year", "ISO Date", "Full Day & Month", "Custom..."] - onValueChanged: value => { - const formatMap = { - "System Default": "", - "Day Date": "ddd d", - "Day Month Date": "ddd MMM d", - "Month Date": "MMM d", - "Numeric (M/D)": "M/d", - "Numeric (D/M)": "d/M", - "Full with Year": "ddd d MMM yyyy", - "ISO Date": "yyyy-MM-dd", - "Full Day & Month": "dddd, MMMM d" - }; - if (value === "Custom...") { - customLockFormatInput.visible = true; - } else { - customLockFormatInput.visible = false; - SettingsData.set("lockDateFormat", formatMap[value]); } } } + } + } - DankTextField { - id: customFormatInput + SettingsCard { + tab: "time" + tags: ["weather", "enable", "forecast"] + title: I18n.tr("Weather") + iconName: "cloud" + SettingsToggleRow { + tab: "time" + tags: ["weather", "enable"] + settingKey: "weatherEnabled" + text: I18n.tr("Enable Weather") + description: I18n.tr("Show weather information in top bar and control center") + checked: SettingsData.weatherEnabled + onToggled: checked => SettingsData.set("weatherEnabled", checked) + } + + Column { + width: parent.width + spacing: 0 + visible: SettingsData.weatherEnabled + + Rectangle { width: parent.width - visible: false - placeholderText: I18n.tr("Enter custom top bar format (e.g., ddd MMM d)") - text: SettingsData.clockDateFormat - onTextChanged: { - if (visible && text) - SettingsData.set("clockDateFormat", text); - } + height: 1 + color: Theme.outline + opacity: 0.15 } - DankTextField { - id: customLockFormatInput - - width: parent.width - visible: false - placeholderText: I18n.tr("Enter custom lock screen format (e.g., dddd, MMMM d)") - text: SettingsData.lockDateFormat - onTextChanged: { - if (visible && text) - SettingsData.set("lockDateFormat", text); - } + SettingsToggleRow { + tab: "time" + tags: ["weather", "imperial", "fahrenheit", "units"] + settingKey: "useFahrenheit" + text: I18n.tr("Use Imperial Units") + description: I18n.tr("Use Imperial units (°F, mph, inHg) instead of Metric (°C, km/h, hPa)") + checked: SettingsData.useFahrenheit + onToggled: checked => SettingsData.set("useFahrenheit", checked) } Rectangle { width: parent.width - height: formatHelp.implicitHeight + Theme.spacingM * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.1) - border.width: 0 - - Column { - id: formatHelp - - anchors.fill: parent - anchors.margins: Theme.spacingM - spacing: Theme.spacingXS - - StyledText { - text: I18n.tr("Format Legend") - font.pixelSize: Theme.fontSizeSmall - color: Theme.primary - font.weight: Font.Medium - } - - Row { - width: parent.width - spacing: Theme.spacingL - - Column { - width: (parent.width - Theme.spacingL) / 2 - spacing: 2 - - StyledText { - text: I18n.tr("• d - Day (1-31)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• dd - Day (01-31)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• ddd - Day name (Mon)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• dddd - Day name (Monday)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• M - Month (1-12)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - } - - Column { - width: (parent.width - Theme.spacingL) / 2 - spacing: 2 - - StyledText { - text: I18n.tr("• MM - Month (01-12)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• MMM - Month (Jan)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• MMMM - Month (January)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• yy - Year (24)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - StyledText { - text: I18n.tr("• yyyy - Year (2024)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - } - } - } + height: 1 + color: Theme.outline + opacity: 0.15 } - } - } - StyledRect { - width: parent.width - height: enableWeatherSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: enableWeatherSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "cloud" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - enableToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Enable Weather") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Show weather information in top bar and control center") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: enableToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.weatherEnabled - onToggled: checked => { - return SettingsData.set("weatherEnabled", checked); - } - } - } - } - } - - StyledRect { - width: parent.width - height: temperatureSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: SettingsData.weatherEnabled - opacity: visible ? 1 : 0 - - Column { - id: temperatureSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "thermostat" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - temperatureToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Use Imperial Units") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Use Imperial units (°F, mph, inHg) instead of Metric (°C, km/h, hPa)") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: temperatureToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.useFahrenheit - onToggled: checked => { - return SettingsData.set("useFahrenheit", checked); - } - } - } - } - - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing - } - } - } - - StyledRect { - width: parent.width - height: locationSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: SettingsData.weatherEnabled - opacity: visible ? 1 : 0 - - Column { - id: locationSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "location_on" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - autoLocationToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Auto Location") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Automatically determine your location using your IP address") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: autoLocationToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.useAutoLocation - onToggled: checked => { - return SettingsData.set("useAutoLocation", checked); - } - } + SettingsToggleRow { + tab: "time" + tags: ["weather", "location", "auto", "gps"] + settingKey: "useAutoLocation" + text: I18n.tr("Auto Location") + description: I18n.tr("Automatically determine your location using your IP address") + checked: SettingsData.useAutoLocation + onToggled: checked => SettingsData.set("useAutoLocation", checked) } Column { width: parent.width - spacing: Theme.spacingXS + spacing: Theme.spacingM visible: !SettingsData.useAutoLocation Rectangle { width: parent.width height: 1 color: Theme.outline - opacity: 0.2 + opacity: 0.15 } - StyledText { - text: I18n.tr("Custom Location") - font.pixelSize: Theme.fontSizeMedium - color: Theme.surfaceText - font.weight: Font.Medium - } - - Row { + Item { width: parent.width - spacing: Theme.spacingM + height: locationContent.height Column { - width: (parent.width - Theme.spacingM) / 2 - spacing: Theme.spacingXS + id: locationContent + width: parent.width - Theme.spacingM * 2 + x: Theme.spacingM + spacing: Theme.spacingM StyledText { - text: I18n.tr("Latitude") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText + text: I18n.tr("Custom Location") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + font.weight: Font.Medium } - DankTextField { - id: latitudeInput + Row { width: parent.width - height: 48 - placeholderText: "40.7128" - backgroundColor: Theme.surfaceVariant - normalBorderColor: Theme.primarySelected - focusedBorderColor: Theme.primary - keyNavigationTab: longitudeInput + spacing: Theme.spacingM - Component.onCompleted: { - if (SettingsData.weatherCoordinates) { - const coords = SettingsData.weatherCoordinates.split(','); - if (coords.length > 0) { - text = coords[0].trim(); - } + Column { + width: (parent.width - Theme.spacingM) / 2 + spacing: Theme.spacingXS + + StyledText { + text: I18n.tr("Latitude") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText } - } - Connections { - target: SettingsData - function onWeatherCoordinatesChanged() { - if (SettingsData.weatherCoordinates) { - const coords = SettingsData.weatherCoordinates.split(','); - if (coords.length > 0) { - latitudeInput.text = coords[0].trim(); + DankTextField { + id: latitudeInput + width: parent.width + height: 48 + placeholderText: "40.7128" + backgroundColor: Theme.surfaceVariant + normalBorderColor: Theme.primarySelected + focusedBorderColor: Theme.primary + keyNavigationTab: longitudeInput + + Component.onCompleted: { + if (SettingsData.weatherCoordinates) { + const coords = SettingsData.weatherCoordinates.split(','); + if (coords.length > 0) + text = coords[0].trim(); + } + } + + Connections { + target: SettingsData + function onWeatherCoordinatesChanged() { + if (SettingsData.weatherCoordinates) { + const coords = SettingsData.weatherCoordinates.split(','); + if (coords.length > 0) + latitudeInput.text = coords[0].trim(); + } + } + } + + onTextEdited: { + if (text && longitudeInput.text) { + const coords = text + "," + longitudeInput.text; + SettingsData.weatherCoordinates = coords; + SettingsData.saveSettings(); } } } } - onTextEdited: { - if (text && longitudeInput.text) { - const coords = text + "," + longitudeInput.text; - SettingsData.weatherCoordinates = coords; - SettingsData.saveSettings(); + Column { + width: (parent.width - Theme.spacingM) / 2 + spacing: Theme.spacingXS + + StyledText { + text: I18n.tr("Longitude") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText } - } - } - } - Column { - width: (parent.width - Theme.spacingM) / 2 - spacing: Theme.spacingXS + DankTextField { + id: longitudeInput + width: parent.width + height: 48 + placeholderText: "-74.0060" + backgroundColor: Theme.surfaceVariant + normalBorderColor: Theme.primarySelected + focusedBorderColor: Theme.primary + keyNavigationTab: locationSearchInput + keyNavigationBacktab: latitudeInput - StyledText { - text: I18n.tr("Longitude") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: longitudeInput - width: parent.width - height: 48 - placeholderText: "-74.0060" - backgroundColor: Theme.surfaceVariant - normalBorderColor: Theme.primarySelected - focusedBorderColor: Theme.primary - keyNavigationTab: locationSearchInput - keyNavigationBacktab: latitudeInput - - Component.onCompleted: { - if (SettingsData.weatherCoordinates) { - const coords = SettingsData.weatherCoordinates.split(','); - if (coords.length > 1) { - text = coords[1].trim(); + Component.onCompleted: { + if (SettingsData.weatherCoordinates) { + const coords = SettingsData.weatherCoordinates.split(','); + if (coords.length > 1) + text = coords[1].trim(); + } } - } - } - Connections { - target: SettingsData - function onWeatherCoordinatesChanged() { - if (SettingsData.weatherCoordinates) { - const coords = SettingsData.weatherCoordinates.split(','); - if (coords.length > 1) { - longitudeInput.text = coords[1].trim(); + Connections { + target: SettingsData + function onWeatherCoordinatesChanged() { + if (SettingsData.weatherCoordinates) { + const coords = SettingsData.weatherCoordinates.split(','); + if (coords.length > 1) + longitudeInput.text = coords[1].trim(); + } + } + } + + onTextEdited: { + if (text && latitudeInput.text) { + const coords = latitudeInput.text + "," + text; + SettingsData.weatherCoordinates = coords; + SettingsData.saveSettings(); } } } } + } - onTextEdited: { - if (text && latitudeInput.text) { - const coords = latitudeInput.text + "," + text; - SettingsData.weatherCoordinates = coords; - SettingsData.saveSettings(); + Column { + width: parent.width + spacing: Theme.spacingXS + + StyledText { + text: I18n.tr("Location Search") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + font.weight: Font.Medium + } + + DankLocationSearch { + id: locationSearchInput + width: parent.width + currentLocation: "" + placeholderText: I18n.tr("New York, NY") + keyNavigationBacktab: longitudeInput + onLocationSelected: (displayName, coordinates) => { + SettingsData.setWeatherLocation(displayName, coordinates); + const coords = coordinates.split(','); + if (coords.length >= 2) { + latitudeInput.text = coords[0].trim(); + longitudeInput.text = coords[1].trim(); + } } } } } } - - Column { - width: parent.width - spacing: Theme.spacingXS - - StyledText { - text: I18n.tr("Location Search") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - font.weight: Font.Medium - } - - DankLocationSearch { - id: locationSearchInput - width: parent.width - currentLocation: "" - placeholderText: I18n.tr("New York, NY") - keyNavigationBacktab: longitudeInput - onLocationSelected: (displayName, coordinates) => { - SettingsData.setWeatherLocation(displayName, coordinates); - - const coords = coordinates.split(','); - if (coords.length >= 2) { - latitudeInput.text = coords[0].trim(); - longitudeInput.text = coords[1].trim(); - } - } - } - } - } - } - - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing } } } - StyledRect { - width: parent.width - height: weatherDisplaySection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 + SettingsCard { + tab: "time" + tags: ["weather", "current", "display"] + title: I18n.tr("Current Weather") + iconName: "visibility" visible: SettingsData.weatherEnabled - opacity: visible ? 1 : 0 Column { - id: weatherDisplaySection + width: parent.width + spacing: Theme.spacingL + visible: !WeatherService.weather.available - anchors.fill: parent - anchors.margins: Theme.spacingL + DankIcon { + name: "cloud_off" + size: Theme.iconSize * 2 + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.5) + anchors.horizontalCenter: parent.horizontalCenter + } + + StyledText { + text: I18n.tr("No Weather Data Available") + font.pixelSize: Theme.fontSizeLarge + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + anchors.horizontalCenter: parent.horizontalCenter + } + } + + Column { + width: parent.width spacing: Theme.spacingM + visible: WeatherService.weather.available - Row { + Item { width: parent.width - spacing: Theme.spacingM + height: 70 DankIcon { - name: "visibility" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter + id: refreshButton + name: "refresh" + size: Theme.iconSize - 4 + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.4) + anchors.right: parent.right + anchors.top: parent.top + + property bool isRefreshing: false + enabled: !isRefreshing + + MouseArea { + anchors.fill: parent + hoverEnabled: true + cursorShape: parent.enabled ? Qt.PointingHandCursor : Qt.ForbiddenCursor + onClicked: { + refreshButton.isRefreshing = true; + WeatherService.forceRefresh(); + refreshTimer.restart(); + } + enabled: parent.enabled + } + + Timer { + id: refreshTimer + interval: 2000 + onTriggered: refreshButton.isRefreshing = false + } + + NumberAnimation on rotation { + running: refreshButton.isRefreshing + from: 0 + to: 360 + duration: 1000 + loops: Animation.Infinite + } } - StyledText { - text: I18n.tr("Current Weather") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Column { - width: parent.width - spacing: Theme.spacingL - visible: !WeatherService.weather.available - - DankIcon { - name: "cloud_off" - size: Theme.iconSize * 2 - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.5) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: I18n.tr("No Weather Data Available") - font.pixelSize: Theme.fontSizeLarge - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - } - - Column { - width: parent.width - spacing: Theme.spacingM - visible: WeatherService.weather.available - Item { - width: parent.width + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + width: weatherIcon.width + tempColumn.width + sunriseColumn.width + Theme.spacingM * 2 height: 70 DankIcon { - id: refreshButton - name: "refresh" - size: Theme.iconSize - 4 - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.4) - anchors.right: parent.right - anchors.top: parent.top + id: weatherIcon + name: WeatherService.getWeatherIcon(WeatherService.weather.wCode) + size: Theme.iconSize * 1.5 + color: Theme.primary + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter - property bool isRefreshing: false - enabled: !isRefreshing - - MouseArea { - anchors.fill: parent - hoverEnabled: true - cursorShape: parent.enabled ? Qt.PointingHandCursor : Qt.ForbiddenCursor - onClicked: { - refreshButton.isRefreshing = true; - WeatherService.forceRefresh(); - refreshTimer.restart(); - } - enabled: parent.enabled - } - - Timer { - id: refreshTimer - interval: 2000 - onTriggered: refreshButton.isRefreshing = false - } - - NumberAnimation on rotation { - running: refreshButton.isRefreshing - from: 0 - to: 360 - duration: 1000 - loops: Animation.Infinite + layer.enabled: true + layer.effect: MultiEffect { + shadowEnabled: true + shadowHorizontalOffset: 0 + shadowVerticalOffset: 4 + shadowBlur: 0.8 + shadowColor: Qt.rgba(0, 0, 0, 0.2) + shadowOpacity: 0.2 } } - Item { - anchors.horizontalCenter: parent.horizontalCenter + Column { + id: tempColumn + spacing: Theme.spacingXS + anchors.left: weatherIcon.right + anchors.leftMargin: Theme.spacingM anchors.verticalCenter: parent.verticalCenter - width: weatherIcon.width + tempColumn.width + sunriseColumn.width + Theme.spacingM * 2 - height: 70 - DankIcon { - id: weatherIcon - name: WeatherService.getWeatherIcon(WeatherService.weather.wCode) - size: Theme.iconSize * 1.5 - color: Theme.primary - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter + Item { + width: tempText.width + unitText.width + Theme.spacingXS + height: tempText.height - layer.enabled: true - layer.effect: MultiEffect { - shadowEnabled: true - shadowHorizontalOffset: 0 - shadowVerticalOffset: 4 - shadowBlur: 0.8 - shadowColor: Qt.rgba(0, 0, 0, 0.2) - shadowOpacity: 0.2 - } - } - - Column { - id: tempColumn - spacing: Theme.spacingXS - anchors.left: weatherIcon.right - anchors.leftMargin: Theme.spacingM - anchors.verticalCenter: parent.verticalCenter - - Item { - width: tempText.width + unitText.width + Theme.spacingXS - height: tempText.height - - StyledText { - id: tempText - text: (SettingsData.useFahrenheit ? WeatherService.weather.tempF : WeatherService.weather.temp) + "°" - font.pixelSize: Theme.fontSizeLarge + 4 - color: Theme.surfaceText - font.weight: Font.Light - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - id: unitText - text: SettingsData.useFahrenheit ? "F" : "C" - font.pixelSize: Theme.fontSizeMedium - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.left: tempText.right - anchors.leftMargin: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - MouseArea { - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - if (WeatherService.weather.available) { - SettingsData.set("useFahrenheit", !SettingsData.useFahrenheit); - } - } - enabled: WeatherService.weather.available - } - } + StyledText { + id: tempText + text: (SettingsData.useFahrenheit ? WeatherService.weather.tempF : WeatherService.weather.temp) + "°" + font.pixelSize: Theme.fontSizeLarge + 4 + color: Theme.surfaceText + font.weight: Font.Light + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter } StyledText { - text: WeatherService.weather.city || "" + id: unitText + text: SettingsData.useFahrenheit ? "F" : "C" font.pixelSize: Theme.fontSizeMedium color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - visible: text.length > 0 + anchors.left: tempText.right + anchors.leftMargin: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + + MouseArea { + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: { + if (WeatherService.weather.available) + SettingsData.set("useFahrenheit", !SettingsData.useFahrenheit); + } + enabled: WeatherService.weather.available + } + } + } + + StyledText { + text: WeatherService.weather.city || "" + font.pixelSize: Theme.fontSizeMedium + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + visible: text.length > 0 + } + } + + Column { + id: sunriseColumn + spacing: Theme.spacingXS + anchors.left: tempColumn.right + anchors.leftMargin: Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + visible: WeatherService.weather.sunrise && WeatherService.weather.sunset + + Item { + width: sunriseIcon.width + sunriseText.width + Theme.spacingXS + height: sunriseIcon.height + + DankIcon { + id: sunriseIcon + name: "wb_twilight" + size: Theme.iconSize - 6 + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + id: sunriseText + text: WeatherService.weather.sunrise || "" + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) + anchors.left: sunriseIcon.right + anchors.leftMargin: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + } + } + + Item { + width: sunsetIcon.width + sunsetText.width + Theme.spacingXS + height: sunsetIcon.height + + DankIcon { + id: sunsetIcon + name: "bedtime" + size: Theme.iconSize - 6 + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + } + + StyledText { + id: sunsetText + text: WeatherService.weather.sunset || "" + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) + anchors.left: sunsetIcon.right + anchors.leftMargin: Theme.spacingXS + anchors.verticalCenter: parent.verticalCenter + } + } + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.1) + } + + GridLayout { + width: parent.width + height: 95 + columns: 6 + columnSpacing: Theme.spacingS + rowSpacing: 0 + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + Column { + anchors.centerIn: parent + spacing: Theme.spacingXS + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + DankIcon { + anchors.centerIn: parent + name: "device_thermostat" + size: Theme.iconSize - 4 + color: Theme.primary } } Column { - id: sunriseColumn - spacing: Theme.spacingXS - anchors.left: tempColumn.right - anchors.leftMargin: Theme.spacingM - anchors.verticalCenter: parent.verticalCenter - visible: WeatherService.weather.sunrise && WeatherService.weather.sunset - - Item { - width: sunriseIcon.width + sunriseText.width + Theme.spacingXS - height: sunriseIcon.height - - DankIcon { - id: sunriseIcon - name: "wb_twilight" - size: Theme.iconSize - 6 - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - id: sunriseText - text: WeatherService.weather.sunrise || "" - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) - anchors.left: sunriseIcon.right - anchors.leftMargin: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - } + anchors.horizontalCenter: parent.horizontalCenter + spacing: 2 + StyledText { + text: I18n.tr("Feels Like") + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + anchors.horizontalCenter: parent.horizontalCenter } - - Item { - width: sunsetIcon.width + sunsetText.width + Theme.spacingXS - height: sunsetIcon.height - - DankIcon { - id: sunsetIcon - name: "bedtime" - size: Theme.iconSize - 6 - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - id: sunsetText - text: WeatherService.weather.sunset || "" - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.6) - anchors.left: sunsetIcon.right - anchors.leftMargin: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - } + StyledText { + text: (SettingsData.useFahrenheit ? (WeatherService.weather.feelsLikeF || WeatherService.weather.tempF) : (WeatherService.weather.feelsLike || WeatherService.weather.temp)) + "°" + font.pixelSize: Theme.fontSizeSmall + 1 + color: Theme.surfaceText + font.weight: Font.Medium + anchors.horizontalCenter: parent.horizontalCenter } } } } Rectangle { - width: parent.width - height: 1 - color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.1) + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + Column { + anchors.centerIn: parent + spacing: Theme.spacingXS + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + DankIcon { + anchors.centerIn: parent + name: "humidity_low" + size: Theme.iconSize - 4 + color: Theme.primary + } + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 2 + StyledText { + text: I18n.tr("Humidity") + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + anchors.horizontalCenter: parent.horizontalCenter + } + StyledText { + text: WeatherService.weather.humidity ? WeatherService.weather.humidity + "%" : "--" + font.pixelSize: Theme.fontSizeSmall + 1 + color: Theme.surfaceText + font.weight: Font.Medium + anchors.horizontalCenter: parent.horizontalCenter + } + } + } } - GridLayout { - width: parent.width - height: 95 - columns: 6 - columnSpacing: Theme.spacingS - rowSpacing: 0 + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - Rectangle { - Layout.fillWidth: true - Layout.fillHeight: true - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + Column { + anchors.centerIn: parent + spacing: Theme.spacingXS - Column { - anchors.centerIn: parent - spacing: Theme.spacingXS - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) - anchors.horizontalCenter: parent.horizontalCenter - - DankIcon { - anchors.centerIn: parent - name: "device_thermostat" - size: Theme.iconSize - 4 - color: Theme.primary - } - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Feels Like") - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: (SettingsData.useFahrenheit ? (WeatherService.weather.feelsLikeF || WeatherService.weather.tempF) : (WeatherService.weather.feelsLike || WeatherService.weather.temp)) + "°" - font.pixelSize: Theme.fontSizeSmall + 1 - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + DankIcon { + anchors.centerIn: parent + name: "air" + size: Theme.iconSize - 4 + color: Theme.primary } } - } - - Rectangle { - Layout.fillWidth: true - Layout.fillHeight: true - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) Column { - anchors.centerIn: parent - spacing: Theme.spacingXS - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + spacing: 2 + StyledText { + text: I18n.tr("Wind") + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) anchors.horizontalCenter: parent.horizontalCenter - - DankIcon { - anchors.centerIn: parent - name: "humidity_low" - size: Theme.iconSize - 4 - color: Theme.primary - } } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Humidity") - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: WeatherService.weather.humidity ? WeatherService.weather.humidity + "%" : "--" - font.pixelSize: Theme.fontSizeSmall + 1 - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - } - } - } - - Rectangle { - Layout.fillWidth: true - Layout.fillHeight: true - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - - Column { - anchors.centerIn: parent - spacing: Theme.spacingXS - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) - anchors.horizontalCenter: parent.horizontalCenter - - DankIcon { - anchors.centerIn: parent - name: "air" - size: Theme.iconSize - 4 - color: Theme.primary - } - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Wind") - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: { - if (!WeatherService.weather.wind) - return "--"; - const windKmh = parseFloat(WeatherService.weather.wind); - if (isNaN(windKmh)) - return WeatherService.weather.wind; - if (SettingsData.useFahrenheit) { - const windMph = Math.round(windKmh * 0.621371); - return windMph + " mph"; - } + StyledText { + text: { + if (!WeatherService.weather.wind) + return "--"; + const windKmh = parseFloat(WeatherService.weather.wind); + if (isNaN(windKmh)) return WeatherService.weather.wind; - } - font.pixelSize: Theme.fontSizeSmall + 1 - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter + if (SettingsData.useFahrenheit) + return Math.round(windKmh * 0.621371) + " mph"; + return WeatherService.weather.wind; } - } - } - } - - Rectangle { - Layout.fillWidth: true - Layout.fillHeight: true - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - - Column { - anchors.centerIn: parent - spacing: Theme.spacingXS - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + font.pixelSize: Theme.fontSizeSmall + 1 + color: Theme.surfaceText + font.weight: Font.Medium anchors.horizontalCenter: parent.horizontalCenter - - DankIcon { - anchors.centerIn: parent - name: "speed" - size: Theme.iconSize - 4 - color: Theme.primary - } - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Pressure") - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: { - if (!WeatherService.weather.pressure) - return "--"; - const pressureHpa = WeatherService.weather.pressure; - if (SettingsData.useFahrenheit) { - const pressureInHg = (pressureHpa * 0.02953).toFixed(2); - return pressureInHg + " inHg"; - } - return pressureHpa + " hPa"; - } - font.pixelSize: Theme.fontSizeSmall + 1 - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - } - } - } - - Rectangle { - Layout.fillWidth: true - Layout.fillHeight: true - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - - Column { - anchors.centerIn: parent - spacing: Theme.spacingXS - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) - anchors.horizontalCenter: parent.horizontalCenter - - DankIcon { - anchors.centerIn: parent - name: "rainy" - size: Theme.iconSize - 4 - color: Theme.primary - } - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Rain Chance") - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: WeatherService.weather.precipitationProbability ? WeatherService.weather.precipitationProbability + "%" : "0%" - font.pixelSize: Theme.fontSizeSmall + 1 - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } - } - } - } - - Rectangle { - Layout.fillWidth: true - Layout.fillHeight: true - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - - Column { - anchors.centerIn: parent - spacing: Theme.spacingXS - - Rectangle { - width: 32 - height: 32 - radius: 16 - color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) - anchors.horizontalCenter: parent.horizontalCenter - - DankIcon { - anchors.centerIn: parent - name: "wb_sunny" - size: Theme.iconSize - 4 - color: Theme.primary - } - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 2 - - StyledText { - text: I18n.tr("Visibility") - font.pixelSize: Theme.fontSizeSmall - color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) - anchors.horizontalCenter: parent.horizontalCenter - } - - StyledText { - text: I18n.tr("Good") - font.pixelSize: Theme.fontSizeSmall + 1 - color: Theme.surfaceText - font.weight: Font.Medium - anchors.horizontalCenter: parent.horizontalCenter - } } } } } - } - } - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + Column { + anchors.centerIn: parent + spacing: Theme.spacingXS + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + DankIcon { + anchors.centerIn: parent + name: "speed" + size: Theme.iconSize - 4 + color: Theme.primary + } + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 2 + StyledText { + text: I18n.tr("Pressure") + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + anchors.horizontalCenter: parent.horizontalCenter + } + StyledText { + text: { + if (!WeatherService.weather.pressure) + return "--"; + if (SettingsData.useFahrenheit) + return (WeatherService.weather.pressure * 0.02953).toFixed(2) + " inHg"; + return WeatherService.weather.pressure + " hPa"; + } + font.pixelSize: Theme.fontSizeSmall + 1 + color: Theme.surfaceText + font.weight: Font.Medium + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + Column { + anchors.centerIn: parent + spacing: Theme.spacingXS + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + DankIcon { + anchors.centerIn: parent + name: "rainy" + size: Theme.iconSize - 4 + color: Theme.primary + } + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 2 + StyledText { + text: I18n.tr("Rain Chance") + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + anchors.horizontalCenter: parent.horizontalCenter + } + StyledText { + text: WeatherService.weather.precipitationProbability ? WeatherService.weather.precipitationProbability + "%" : "0%" + font.pixelSize: Theme.fontSizeSmall + 1 + color: Theme.surfaceText + font.weight: Font.Medium + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + } + + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + Column { + anchors.centerIn: parent + spacing: Theme.spacingXS + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.1) + anchors.horizontalCenter: parent.horizontalCenter + DankIcon { + anchors.centerIn: parent + name: "wb_sunny" + size: Theme.iconSize - 4 + color: Theme.primary + } + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 2 + StyledText { + text: I18n.tr("Visibility") + font.pixelSize: Theme.fontSizeSmall + color: Qt.rgba(Theme.surfaceText.r, Theme.surfaceText.g, Theme.surfaceText.b, 0.7) + anchors.horizontalCenter: parent.horizontalCenter + } + StyledText { + text: I18n.tr("Good") + font.pixelSize: Theme.fontSizeSmall + 1 + color: Theme.surfaceText + font.weight: Font.Medium + anchors.horizontalCenter: parent.horizontalCenter + } + } + } + } } } } diff --git a/quickshell/Modules/Settings/TypographyMotionTab.qml b/quickshell/Modules/Settings/TypographyMotionTab.qml new file mode 100644 index 00000000..f12d790b --- /dev/null +++ b/quickshell/Modules/Settings/TypographyMotionTab.qml @@ -0,0 +1,285 @@ +import QtQuick +import qs.Common +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + property var cachedFontFamilies: [] + property var cachedMonoFamilies: [] + property bool fontsEnumerated: false + + function enumerateFonts() { + var fonts = []; + var availableFonts = Qt.fontFamilies(); + + for (var i = 0; i < availableFonts.length; i++) { + var fontName = availableFonts[i]; + if (fontName.startsWith(".")) + continue; + fonts.push(fontName); + } + fonts.sort(); + fonts.unshift("Default"); + cachedFontFamilies = fonts; + + var monoFonts = []; + for (var j = 0; j < availableFonts.length; j++) { + var fontName2 = availableFonts[j]; + if (fontName2.startsWith(".")) + continue; + var lowerName = fontName2.toLowerCase(); + if (lowerName.includes("mono") || lowerName.includes("code") || lowerName.includes("console") || lowerName.includes("terminal") || lowerName.includes("courier") || lowerName.includes("jetbrains") || lowerName.includes("fira") || lowerName.includes("hack") || lowerName.includes("source code") || lowerName.includes("cascadia")) { + monoFonts.push(fontName2); + } + } + monoFonts.sort(); + monoFonts.unshift("Default"); + cachedMonoFamilies = monoFonts; + } + + Timer { + id: fontEnumerationTimer + interval: 50 + running: false + onTriggered: { + if (fontsEnumerated) + return; + enumerateFonts(); + fontsEnumerated = true; + } + } + + Component.onCompleted: { + fontEnumerationTimer.start(); + } + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + tab: "typography" + tags: ["font", "family", "text", "typography"] + title: I18n.tr("Typography") + iconName: "text_fields" + + SettingsDropdownRow { + tab: "typography" + tags: ["font", "family", "normal", "text"] + settingKey: "fontFamily" + text: I18n.tr("Normal Font") + description: I18n.tr("Select the font family for UI text") + options: root.fontsEnumerated ? root.cachedFontFamilies : ["Default"] + currentValue: SettingsData.fontFamily === Theme.defaultFontFamily ? "Default" : (SettingsData.fontFamily || "Default") + enableFuzzySearch: true + popupWidthOffset: 100 + maxPopupHeight: 400 + onValueChanged: value => { + if (value === "Default") + SettingsData.set("fontFamily", Theme.defaultFontFamily); + else + SettingsData.set("fontFamily", value); + } + } + + SettingsDropdownRow { + tab: "typography" + tags: ["font", "monospace", "code", "terminal"] + settingKey: "monoFontFamily" + text: I18n.tr("Monospace Font") + description: I18n.tr("Select monospace font for process list and technical displays") + options: root.fontsEnumerated ? root.cachedMonoFamilies : ["Default"] + currentValue: SettingsData.monoFontFamily === SettingsData.defaultMonoFontFamily ? "Default" : (SettingsData.monoFontFamily || "Default") + enableFuzzySearch: true + popupWidthOffset: 100 + maxPopupHeight: 400 + onValueChanged: value => { + if (value === "Default") + SettingsData.set("monoFontFamily", SettingsData.defaultMonoFontFamily); + else + SettingsData.set("monoFontFamily", value); + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + SettingsDropdownRow { + tab: "typography" + tags: ["font", "weight", "bold", "light"] + settingKey: "fontWeight" + text: I18n.tr("Font Weight") + description: I18n.tr("Select font weight for UI text") + options: ["Thin", "Extra Light", "Light", "Regular", "Medium", "Demi Bold", "Bold", "Extra Bold", "Black"] + currentValue: { + switch (SettingsData.fontWeight) { + case Font.Thin: + return "Thin"; + case Font.ExtraLight: + return "Extra Light"; + case Font.Light: + return "Light"; + case Font.Normal: + return "Regular"; + case Font.Medium: + return "Medium"; + case Font.DemiBold: + return "Demi Bold"; + case Font.Bold: + return "Bold"; + case Font.ExtraBold: + return "Extra Bold"; + case Font.Black: + return "Black"; + default: + return "Regular"; + } + } + onValueChanged: value => { + var weight; + switch (value) { + case "Thin": + weight = Font.Thin; + break; + case "Extra Light": + weight = Font.ExtraLight; + break; + case "Light": + weight = Font.Light; + break; + case "Regular": + weight = Font.Normal; + break; + case "Medium": + weight = Font.Medium; + break; + case "Demi Bold": + weight = Font.DemiBold; + break; + case "Bold": + weight = Font.Bold; + break; + case "Extra Bold": + weight = Font.ExtraBold; + break; + case "Black": + weight = Font.Black; + break; + default: + weight = Font.Normal; + break; + } + SettingsData.set("fontWeight", weight); + } + } + + SettingsSliderRow { + tab: "typography" + tags: ["font", "scale", "size", "zoom"] + settingKey: "fontScale" + text: I18n.tr("Font Scale") + description: I18n.tr("Scale all font sizes throughout the shell") + minimum: 75 + maximum: 150 + value: Math.round(SettingsData.fontScale * 100) + unit: "%" + defaultValue: 100 + onSliderValueChanged: newValue => SettingsData.set("fontScale", newValue / 100) + } + } + + SettingsCard { + tab: "typography" + tags: ["animation", "speed", "motion", "duration"] + title: I18n.tr("Animation Speed") + iconName: "animation" + + Item { + width: parent.width + height: animationSpeedGroup.implicitHeight + clip: true + + DankButtonGroup { + id: animationSpeedGroup + anchors.horizontalCenter: parent.horizontalCenter + buttonPadding: parent.width < 480 ? Theme.spacingS : Theme.spacingL + minButtonWidth: parent.width < 480 ? 44 : 64 + textSize: parent.width < 480 ? Theme.fontSizeSmall : Theme.fontSizeMedium + model: [I18n.tr("None"), I18n.tr("Short"), I18n.tr("Medium"), I18n.tr("Long"), I18n.tr("Custom")] + selectionMode: "single" + currentIndex: SettingsData.animationSpeed + onSelectionChanged: (index, selected) => { + if (!selected) + return; + SettingsData.set("animationSpeed", index); + } + + Connections { + target: SettingsData + function onAnimationSpeedChanged() { + animationSpeedGroup.currentIndex = SettingsData.animationSpeed; + } + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.15 + } + + SettingsSliderRow { + id: durationSlider + tab: "typography" + tags: ["animation", "duration", "custom", "speed"] + settingKey: "customAnimationDuration" + text: I18n.tr("Custom Duration") + description: I18n.tr("Fine-tune animation timing in milliseconds") + minimum: 0 + maximum: 750 + value: Theme.currentAnimationBaseDuration + unit: "ms" + defaultValue: 200 + onSliderValueChanged: newValue => { + SettingsData.set("animationSpeed", SettingsData.AnimationSpeed.Custom); + SettingsData.set("customAnimationDuration", newValue); + } + + Connections { + target: SettingsData + function onAnimationSpeedChanged() { + if (SettingsData.animationSpeed === SettingsData.AnimationSpeed.Custom) + return; + durationSlider.value = Theme.currentAnimationBaseDuration; + } + } + + Connections { + target: Theme + function onCurrentAnimationBaseDurationChanged() { + if (SettingsData.animationSpeed === SettingsData.AnimationSpeed.Custom) + return; + durationSlider.value = Theme.currentAnimationBaseDuration; + } + } + } + } + } + } +} diff --git a/quickshell/Modules/Settings/WallpaperTab.qml b/quickshell/Modules/Settings/WallpaperTab.qml new file mode 100644 index 00000000..391a3d0a --- /dev/null +++ b/quickshell/Modules/Settings/WallpaperTab.qml @@ -0,0 +1,1282 @@ +import QtQuick +import QtQuick.Effects +import Quickshell +import qs.Common +import qs.Modals.FileBrowser +import qs.Services +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + property var parentModal: null + property string selectedMonitorName: { + var screens = Quickshell.screens; + return screens.length > 0 ? screens[0].name : ""; + } + + Component.onCompleted: { + WallpaperCyclingService.cyclingActive; + } + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + tab: "wallpaper" + tags: ["background", "image", "picture"] + title: I18n.tr("Wallpaper") + iconName: "wallpaper" + + Row { + width: parent.width + spacing: Theme.spacingL + + StyledRect { + id: wallpaperPreview + width: 160 + height: 90 + radius: Theme.cornerRadius + color: Theme.surfaceVariant + + CachingImage { + anchors.fill: parent + anchors.margins: 1 + source: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return (currentWallpaper !== "" && !currentWallpaper.startsWith("#")) ? "file://" + currentWallpaper : ""; + } + fillMode: Image.PreserveAspectCrop + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper !== "" && !currentWallpaper.startsWith("#"); + } + maxCacheSize: 160 + layer.enabled: true + layer.effect: MultiEffect { + maskEnabled: true + maskSource: wallpaperMask + maskThresholdMin: 0.5 + maskSpreadAtMin: 1 + } + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper.startsWith("#") ? currentWallpaper : "transparent"; + } + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper !== "" && currentWallpaper.startsWith("#"); + } + } + + Rectangle { + id: wallpaperMask + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: "black" + visible: false + layer.enabled: true + } + + DankIcon { + anchors.centerIn: parent + name: "image" + size: Theme.iconSizeLarge + 8 + color: Theme.surfaceVariantText + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper === ""; + } + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: Qt.rgba(0, 0, 0, 0.7) + visible: wallpaperMouseArea.containsMouse + + Row { + anchors.centerIn: parent + spacing: 4 + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(255, 255, 255, 0.9) + + DankIcon { + anchors.centerIn: parent + name: "folder_open" + size: 18 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: mainWallpaperBrowser.open() + } + } + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(255, 255, 255, 0.9) + + DankIcon { + anchors.centerIn: parent + name: "palette" + size: 18 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (!PopoutService.colorPickerModal) + return; + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + PopoutService.colorPickerModal.selectedColor = currentWallpaper.startsWith("#") ? currentWallpaper : Theme.primary; + PopoutService.colorPickerModal.pickerTitle = "Choose Wallpaper Color"; + PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorWallpaper(selectedMonitorName, selectedColor); + } else { + SessionData.setWallpaperColor(selectedColor); + } + }; + PopoutService.colorPickerModal.show(); + } + } + } + + Rectangle { + width: 32 + height: 32 + radius: 16 + color: Qt.rgba(255, 255, 255, 0.9) + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper !== ""; + } + + DankIcon { + anchors.centerIn: parent + name: "clear" + size: 18 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorWallpaper(selectedMonitorName, ""); + } else { + if (Theme.currentTheme === Theme.dynamic) + Theme.switchTheme("blue"); + SessionData.clearWallpaper(); + } + } + } + } + } + } + + MouseArea { + id: wallpaperMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + propagateComposedEvents: true + acceptedButtons: Qt.NoButton + } + } + + Column { + width: parent.width - 160 - Theme.spacingL + spacing: Theme.spacingS + anchors.verticalCenter: parent.verticalCenter + + StyledText { + text: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper ? currentWallpaper.split('/').pop() : "No wallpaper selected"; + } + font.pixelSize: Theme.fontSizeLarge + color: Theme.surfaceText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width + } + + StyledText { + text: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper ? currentWallpaper : ""; + } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper !== ""; + } + } + + Row { + spacing: Theme.spacingS + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper !== ""; + } + + DankActionButton { + buttonSize: 32 + iconName: "skip_previous" + iconSize: Theme.iconSizeSmall + enabled: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper && !currentWallpaper.startsWith("#") && !currentWallpaper.startsWith("we"); + } + opacity: enabled ? 1 : 0.5 + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + iconColor: Theme.surfaceText + onClicked: { + if (SessionData.perMonitorWallpaper) { + WallpaperCyclingService.cyclePrevForMonitor(selectedMonitorName); + } else { + WallpaperCyclingService.cyclePrevManually(); + } + } + } + + DankActionButton { + buttonSize: 32 + iconName: "skip_next" + iconSize: Theme.iconSizeSmall + enabled: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper && !currentWallpaper.startsWith("#") && !currentWallpaper.startsWith("we"); + } + opacity: enabled ? 1 : 0.5 + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + iconColor: Theme.surfaceText + onClicked: { + if (SessionData.perMonitorWallpaper) { + WallpaperCyclingService.cycleNextForMonitor(selectedMonitorName); + } else { + WallpaperCyclingService.cycleNextManually(); + } + } + } + } + } + } + + Item { + width: parent.width + height: fillModeGroup.height + visible: { + var currentWallpaper = SessionData.perMonitorWallpaper ? SessionData.getMonitorWallpaper(selectedMonitorName) : SessionData.wallpaperPath; + return currentWallpaper !== "" && !currentWallpaper.startsWith("#"); + } + + DankButtonGroup { + id: fillModeGroup + anchors.horizontalCenter: parent.horizontalCenter + model: ["Stretch", "Fit", "Fill", "Tile", "Tile V", "Tile H", "Pad"] + selectionMode: "single" + buttonHeight: 28 + minButtonWidth: 48 + buttonPadding: Theme.spacingS + checkIconSize: 0 + textSize: Theme.fontSizeSmall + checkEnabled: false + currentIndex: { + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; + return modes.indexOf(SettingsData.wallpaperFillMode); + } + onSelectionChanged: (index, selected) => { + if (!selected) + return; + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; + SettingsData.set("wallpaperFillMode", modes[index]); + } + + Connections { + target: SettingsData + function onWallpaperFillModeChanged() { + const modes = ["Stretch", "Fit", "Fill", "Tile", "TileVertically", "TileHorizontally", "Pad"]; + fillModeGroup.currentIndex = modes.indexOf(SettingsData.wallpaperFillMode); + } + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + visible: SessionData.wallpaperPath !== "" + } + + SettingsToggleRow { + tab: "wallpaper" + tags: ["per-mode", "light", "dark", "theme"] + settingKey: "perModeWallpaper" + visible: SessionData.wallpaperPath !== "" + text: I18n.tr("Per-Mode Wallpapers") + description: I18n.tr("Set different wallpapers for light and dark mode") + checked: SessionData.perModeWallpaper + onToggled: toggled => SessionData.setPerModeWallpaper(toggled) + } + + Column { + width: parent.width + spacing: Theme.spacingM + visible: SessionData.perModeWallpaper + leftPadding: Theme.spacingM + rightPadding: Theme.spacingM + + Row { + width: parent.width - Theme.spacingM * 2 + spacing: Theme.spacingL + + Column { + width: (parent.width - Theme.spacingL) / 2 + spacing: Theme.spacingS + + StyledText { + text: I18n.tr("Light Mode") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + font.weight: Font.Medium + } + + StyledRect { + width: parent.width + height: width * 9 / 16 + radius: Theme.cornerRadius + color: Theme.surfaceVariant + + CachingImage { + anchors.fill: parent + anchors.margins: 1 + source: { + var lightWallpaper = SessionData.wallpaperPathLight; + return (lightWallpaper !== "" && !lightWallpaper.startsWith("#")) ? "file://" + lightWallpaper : ""; + } + fillMode: Image.PreserveAspectCrop + visible: { + var lightWallpaper = SessionData.wallpaperPathLight; + return lightWallpaper !== "" && !lightWallpaper.startsWith("#"); + } + maxCacheSize: 160 + layer.enabled: true + layer.effect: MultiEffect { + maskEnabled: true + maskSource: lightMask + maskThresholdMin: 0.5 + maskSpreadAtMin: 1 + } + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: { + var lightWallpaper = SessionData.wallpaperPathLight; + return lightWallpaper.startsWith("#") ? lightWallpaper : "transparent"; + } + visible: { + var lightWallpaper = SessionData.wallpaperPathLight; + return lightWallpaper !== "" && lightWallpaper.startsWith("#"); + } + } + + Rectangle { + id: lightMask + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: "black" + visible: false + layer.enabled: true + } + + DankIcon { + anchors.centerIn: parent + name: "light_mode" + size: Theme.iconSizeLarge + color: Theme.surfaceVariantText + visible: SessionData.wallpaperPathLight === "" + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: Qt.rgba(0, 0, 0, 0.7) + visible: lightModeMouseArea.containsMouse + + Row { + anchors.centerIn: parent + spacing: 4 + + Rectangle { + width: 28 + height: 28 + radius: 14 + color: Qt.rgba(255, 255, 255, 0.9) + + DankIcon { + anchors.centerIn: parent + name: "folder_open" + size: 16 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: lightWallpaperBrowser.open() + } + } + + Rectangle { + width: 28 + height: 28 + radius: 14 + color: Qt.rgba(255, 255, 255, 0.9) + + DankIcon { + anchors.centerIn: parent + name: "palette" + size: 16 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (!PopoutService.colorPickerModal) + return; + var lightWallpaper = SessionData.wallpaperPathLight; + PopoutService.colorPickerModal.selectedColor = lightWallpaper.startsWith("#") ? lightWallpaper : Theme.primary; + PopoutService.colorPickerModal.pickerTitle = "Choose Light Mode Color"; + PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { + SessionData.wallpaperPathLight = selectedColor; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + }; + PopoutService.colorPickerModal.show(); + } + } + } + + Rectangle { + width: 28 + height: 28 + radius: 14 + color: Qt.rgba(255, 255, 255, 0.9) + visible: SessionData.wallpaperPathLight !== "" + + DankIcon { + anchors.centerIn: parent + name: "clear" + size: 16 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + SessionData.wallpaperPathLight = ""; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + } + } + } + } + } + + MouseArea { + id: lightModeMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + propagateComposedEvents: true + acceptedButtons: Qt.NoButton + } + } + + StyledText { + text: { + var lightWallpaper = SessionData.wallpaperPathLight; + return lightWallpaper ? lightWallpaper.split('/').pop() : "Not set"; + } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width + } + } + + Column { + width: (parent.width - Theme.spacingL) / 2 + spacing: Theme.spacingS + + StyledText { + text: I18n.tr("Dark Mode") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + font.weight: Font.Medium + } + + StyledRect { + width: parent.width + height: width * 9 / 16 + radius: Theme.cornerRadius + color: Theme.surfaceVariant + + CachingImage { + anchors.fill: parent + anchors.margins: 1 + source: { + var darkWallpaper = SessionData.wallpaperPathDark; + return (darkWallpaper !== "" && !darkWallpaper.startsWith("#")) ? "file://" + darkWallpaper : ""; + } + fillMode: Image.PreserveAspectCrop + visible: { + var darkWallpaper = SessionData.wallpaperPathDark; + return darkWallpaper !== "" && !darkWallpaper.startsWith("#"); + } + maxCacheSize: 160 + layer.enabled: true + layer.effect: MultiEffect { + maskEnabled: true + maskSource: darkMask + maskThresholdMin: 0.5 + maskSpreadAtMin: 1 + } + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: { + var darkWallpaper = SessionData.wallpaperPathDark; + return darkWallpaper.startsWith("#") ? darkWallpaper : "transparent"; + } + visible: { + var darkWallpaper = SessionData.wallpaperPathDark; + return darkWallpaper !== "" && darkWallpaper.startsWith("#"); + } + } + + Rectangle { + id: darkMask + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: "black" + visible: false + layer.enabled: true + } + + DankIcon { + anchors.centerIn: parent + name: "dark_mode" + size: Theme.iconSizeLarge + color: Theme.surfaceVariantText + visible: SessionData.wallpaperPathDark === "" + } + + Rectangle { + anchors.fill: parent + anchors.margins: 1 + radius: Theme.cornerRadius - 1 + color: Qt.rgba(0, 0, 0, 0.7) + visible: darkModeMouseArea.containsMouse + + Row { + anchors.centerIn: parent + spacing: 4 + + Rectangle { + width: 28 + height: 28 + radius: 14 + color: Qt.rgba(255, 255, 255, 0.9) + + DankIcon { + anchors.centerIn: parent + name: "folder_open" + size: 16 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: darkWallpaperBrowser.open() + } + } + + Rectangle { + width: 28 + height: 28 + radius: 14 + color: Qt.rgba(255, 255, 255, 0.9) + + DankIcon { + anchors.centerIn: parent + name: "palette" + size: 16 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + if (!PopoutService.colorPickerModal) + return; + var darkWallpaper = SessionData.wallpaperPathDark; + PopoutService.colorPickerModal.selectedColor = darkWallpaper.startsWith("#") ? darkWallpaper : Theme.primary; + PopoutService.colorPickerModal.pickerTitle = "Choose Dark Mode Color"; + PopoutService.colorPickerModal.onColorSelectedCallback = function (selectedColor) { + SessionData.wallpaperPathDark = selectedColor; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + }; + PopoutService.colorPickerModal.show(); + } + } + } + + Rectangle { + width: 28 + height: 28 + radius: 14 + color: Qt.rgba(255, 255, 255, 0.9) + visible: SessionData.wallpaperPathDark !== "" + + DankIcon { + anchors.centerIn: parent + name: "clear" + size: 16 + color: "black" + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + SessionData.wallpaperPathDark = ""; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + } + } + } + } + } + + MouseArea { + id: darkModeMouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + propagateComposedEvents: true + acceptedButtons: Qt.NoButton + } + } + + StyledText { + text: { + var darkWallpaper = SessionData.wallpaperPathDark; + return darkWallpaper ? darkWallpaper.split('/').pop() : "Not set"; + } + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + elide: Text.ElideMiddle + maximumLineCount: 1 + width: parent.width + } + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + visible: CompositorService.isNiri + } + + SettingsToggleRow { + tab: "wallpaper" + tags: ["blur", "overview", "niri"] + settingKey: "blurWallpaperOnOverview" + visible: CompositorService.isNiri + text: I18n.tr("Blur on Overview") + description: I18n.tr("Blur wallpaper when niri overview is open") + checked: SettingsData.blurWallpaperOnOverview + onToggled: checked => SettingsData.set("blurWallpaperOnOverview", checked) + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + visible: SessionData.wallpaperPath !== "" + } + + SettingsToggleRow { + tab: "wallpaper" + tags: ["per-monitor", "multi-monitor", "display"] + settingKey: "perMonitorWallpaper" + visible: SessionData.wallpaperPath !== "" + text: I18n.tr("Per-Monitor Wallpapers") + description: I18n.tr("Set different wallpapers for each connected monitor") + checked: SessionData.perMonitorWallpaper + onToggled: toggled => SessionData.setPerMonitorWallpaper(toggled) + } + + Column { + width: parent.width + spacing: Theme.spacingM + visible: SessionData.perMonitorWallpaper + leftPadding: Theme.spacingM + rightPadding: Theme.spacingM + + SettingsDropdownRow { + tab: "wallpaper" + tags: ["monitor", "display", "screen"] + settingKey: "selectedMonitor" + width: parent.width - Theme.spacingM * 2 + text: I18n.tr("Wallpaper Monitor") + description: I18n.tr("Select monitor to configure wallpaper") + currentValue: { + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + if (screens[i].name === selectedMonitorName) { + return SettingsData.getScreenDisplayName(screens[i]); + } + } + return "No monitors"; + } + options: { + var screenNames = []; + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + screenNames.push(SettingsData.getScreenDisplayName(screens[i])); + } + return screenNames; + } + onValueChanged: value => { + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + if (SettingsData.getScreenDisplayName(screens[i]) === value) { + selectedMonitorName = screens[i].name; + return; + } + } + } + } + + SettingsDropdownRow { + tab: "wallpaper" + tags: ["matugen", "target", "monitor", "theming"] + settingKey: "matugenTargetMonitor" + width: parent.width - Theme.spacingM * 2 + text: I18n.tr("Matugen Target Monitor") + description: I18n.tr("Monitor whose wallpaper drives dynamic theming colors") + currentValue: { + var screens = Quickshell.screens; + if (!SettingsData.matugenTargetMonitor || SettingsData.matugenTargetMonitor === "") { + return screens.length > 0 ? SettingsData.getScreenDisplayName(screens[0]) + " (Default)" : "No monitors"; + } + for (var i = 0; i < screens.length; i++) { + if (screens[i].name === SettingsData.matugenTargetMonitor) { + return SettingsData.getScreenDisplayName(screens[i]); + } + } + return SettingsData.matugenTargetMonitor; + } + options: { + var screenNames = []; + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + var label = SettingsData.getScreenDisplayName(screens[i]); + if (i === 0 && (!SettingsData.matugenTargetMonitor || SettingsData.matugenTargetMonitor === "")) { + label += " (Default)"; + } + screenNames.push(label); + } + return screenNames; + } + onValueChanged: value => { + var cleanValue = value.replace(" (Default)", ""); + var screens = Quickshell.screens; + for (var i = 0; i < screens.length; i++) { + if (SettingsData.getScreenDisplayName(screens[i]) === cleanValue) { + SettingsData.setMatugenTargetMonitor(screens[i].name); + return; + } + } + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + visible: (SessionData.wallpaperPath !== "" || SessionData.perMonitorWallpaper) && !SessionData.perModeWallpaper + } + + SettingsToggleRow { + id: cyclingToggle + tab: "wallpaper" + tags: ["cycling", "automatic", "rotate", "slideshow"] + settingKey: "wallpaperCyclingEnabled" + visible: (SessionData.wallpaperPath !== "" || SessionData.perMonitorWallpaper) && !SessionData.perModeWallpaper + text: I18n.tr("Automatic Cycling") + description: I18n.tr("Automatically cycle through wallpapers in the same folder") + checked: SessionData.perMonitorWallpaper ? SessionData.getMonitorCyclingSettings(selectedMonitorName).enabled : SessionData.wallpaperCyclingEnabled + onToggled: toggled => { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorCyclingEnabled(selectedMonitorName, toggled); + } else { + SessionData.setWallpaperCyclingEnabled(toggled); + } + } + + Connections { + target: root + function onSelectedMonitorNameChanged() { + cyclingToggle.checked = Qt.binding(() => { + return SessionData.perMonitorWallpaper ? SessionData.getMonitorCyclingSettings(selectedMonitorName).enabled : SessionData.wallpaperCyclingEnabled; + }); + } + } + } + + Column { + width: parent.width + spacing: Theme.spacingM + visible: SessionData.perMonitorWallpaper ? SessionData.getMonitorCyclingSettings(selectedMonitorName).enabled : SessionData.wallpaperCyclingEnabled + leftPadding: Theme.spacingM + rightPadding: Theme.spacingM + + Row { + spacing: Theme.spacingL + width: parent.width - Theme.spacingM * 2 + + StyledText { + text: I18n.tr("Mode:") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + anchors.verticalCenter: parent.verticalCenter + } + + Item { + width: 200 + height: 45 + Theme.spacingM + + DankTabBar { + id: modeTabBar + width: 200 + height: 45 + model: [ + { + "text": "Interval", + "icon": "schedule" + }, + { + "text": "Time", + "icon": "access_time" + } + ] + currentIndex: { + if (SessionData.perMonitorWallpaper) { + return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "time" ? 1 : 0; + } + return SessionData.wallpaperCyclingMode === "time" ? 1 : 0; + } + onTabClicked: index => { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorCyclingMode(selectedMonitorName, index === 1 ? "time" : "interval"); + } else { + SessionData.setWallpaperCyclingMode(index === 1 ? "time" : "interval"); + } + } + + Connections { + target: root + function onSelectedMonitorNameChanged() { + modeTabBar.currentIndex = Qt.binding(() => { + if (SessionData.perMonitorWallpaper) { + return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "time" ? 1 : 0; + } + return SessionData.wallpaperCyclingMode === "time" ? 1 : 0; + }); + Qt.callLater(modeTabBar.updateIndicator); + } + } + } + } + } + + SettingsDropdownRow { + id: intervalDropdown + property var intervalOptions: ["1 minute", "5 minutes", "15 minutes", "30 minutes", "1 hour", "1.5 hours", "2 hours", "3 hours", "4 hours", "6 hours", "8 hours", "12 hours"] + property var intervalValues: [60, 300, 900, 1800, 3600, 5400, 7200, 10800, 14400, 21600, 28800, 43200] + + tab: "wallpaper" + tags: ["interval", "cycling", "time", "frequency"] + settingKey: "wallpaperCyclingInterval" + width: parent.width - Theme.spacingM * 2 + visible: { + if (SessionData.perMonitorWallpaper) { + return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "interval"; + } + return SessionData.wallpaperCyclingMode === "interval"; + } + text: I18n.tr("Interval") + description: I18n.tr("How often to change wallpaper") + options: intervalOptions + currentValue: { + var currentSeconds; + if (SessionData.perMonitorWallpaper) { + currentSeconds = SessionData.getMonitorCyclingSettings(selectedMonitorName).interval; + } else { + currentSeconds = SessionData.wallpaperCyclingInterval; + } + const index = intervalValues.indexOf(currentSeconds); + return index >= 0 ? intervalOptions[index] : "5 minutes"; + } + onValueChanged: value => { + const index = intervalOptions.indexOf(value); + if (index < 0) + return; + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorCyclingInterval(selectedMonitorName, intervalValues[index]); + } else { + SessionData.setWallpaperCyclingInterval(intervalValues[index]); + } + } + + Connections { + target: root + function onSelectedMonitorNameChanged() { + Qt.callLater(() => { + var currentSeconds; + if (SessionData.perMonitorWallpaper) { + currentSeconds = SessionData.getMonitorCyclingSettings(selectedMonitorName).interval; + } else { + currentSeconds = SessionData.wallpaperCyclingInterval; + } + const index = intervalDropdown.intervalValues.indexOf(currentSeconds); + intervalDropdown.currentValue = index >= 0 ? intervalDropdown.intervalOptions[index] : "5 minutes"; + }); + } + } + } + + Row { + spacing: Theme.spacingM + visible: { + if (SessionData.perMonitorWallpaper) { + return SessionData.getMonitorCyclingSettings(selectedMonitorName).mode === "time"; + } + return SessionData.wallpaperCyclingMode === "time"; + } + width: parent.width - Theme.spacingM * 2 + + StyledText { + text: I18n.tr("Daily at:") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + anchors.verticalCenter: parent.verticalCenter + } + + DankTextField { + id: timeTextField + width: 100 + height: 40 + text: { + if (SessionData.perMonitorWallpaper) { + return SessionData.getMonitorCyclingSettings(selectedMonitorName).time; + } + return SessionData.wallpaperCyclingTime; + } + placeholderText: "00:00" + maximumLength: 5 + topPadding: Theme.spacingS + bottomPadding: Theme.spacingS + onAccepted: { + var isValid = /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/.test(text); + if (isValid) { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorCyclingTime(selectedMonitorName, text); + } else { + SessionData.setWallpaperCyclingTime(text); + } + } else { + if (SessionData.perMonitorWallpaper) { + text = SessionData.getMonitorCyclingSettings(selectedMonitorName).time; + } else { + text = SessionData.wallpaperCyclingTime; + } + } + } + onEditingFinished: { + var isValid = /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/.test(text); + if (isValid) { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorCyclingTime(selectedMonitorName, text); + } else { + SessionData.setWallpaperCyclingTime(text); + } + } else { + if (SessionData.perMonitorWallpaper) { + text = SessionData.getMonitorCyclingSettings(selectedMonitorName).time; + } else { + text = SessionData.wallpaperCyclingTime; + } + } + } + anchors.verticalCenter: parent.verticalCenter + + validator: RegularExpressionValidator { + regularExpression: /^([0-1][0-9]|2[0-3]):[0-5][0-9]$/ + } + + Connections { + target: root + function onSelectedMonitorNameChanged() { + Qt.callLater(() => { + if (SessionData.perMonitorWallpaper) { + timeTextField.text = SessionData.getMonitorCyclingSettings(selectedMonitorName).time; + } else { + timeTextField.text = SessionData.wallpaperCyclingTime; + } + }); + } + } + } + + StyledText { + text: I18n.tr("24-hour format") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + anchors.verticalCenter: parent.verticalCenter + } + } + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.outline + opacity: 0.2 + } + + SettingsDropdownRow { + tab: "wallpaper" + tags: ["transition", "effect", "animation", "change"] + settingKey: "wallpaperTransition" + text: I18n.tr("Transition Effect") + description: I18n.tr("Visual effect used when wallpaper changes") + currentValue: { + if (SessionData.wallpaperTransition === "random") + return "Random"; + return SessionData.wallpaperTransition.charAt(0).toUpperCase() + SessionData.wallpaperTransition.slice(1); + } + options: ["Random"].concat(SessionData.availableWallpaperTransitions.map(t => t.charAt(0).toUpperCase() + t.slice(1))) + onValueChanged: value => { + var transition = value.toLowerCase(); + SessionData.setWallpaperTransition(transition); + } + } + + Column { + width: parent.width + spacing: Theme.spacingS + visible: SessionData.wallpaperTransition === "random" + leftPadding: Theme.spacingM + rightPadding: Theme.spacingM + + StyledText { + text: I18n.tr("Include Transitions") + font.pixelSize: Theme.fontSizeMedium + color: Theme.surfaceText + font.weight: Font.Medium + } + + StyledText { + text: I18n.tr("Select which transitions to include in randomization") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width - Theme.spacingM * 2 + } + + DankButtonGroup { + id: transitionGroup + width: parent.width - Theme.spacingM * 2 + selectionMode: "multi" + model: SessionData.availableWallpaperTransitions.filter(t => t !== "none") + initialSelection: SessionData.includedTransitions + currentSelection: SessionData.includedTransitions + + onSelectionChanged: (index, selected) => { + const transition = model[index]; + let newIncluded = SessionData.includedTransitions.slice(); + + if (selected && !newIncluded.includes(transition)) { + newIncluded.push(transition); + } else if (!selected && newIncluded.includes(transition)) { + newIncluded = newIncluded.filter(t => t !== transition); + } + + SessionData.includedTransitions = newIncluded; + } + } + } + } + + SettingsCard { + tab: "wallpaper" + tags: ["external", "disable", "swww", "hyprpaper", "swaybg"] + iconName: "wallpaper" + title: I18n.tr("External Wallpaper Management", "wallpaper settings external management") + + SettingsToggleRow { + tab: "wallpaper" + tags: ["disable", "external", "management"] + settingKey: "disableWallpapers" + text: I18n.tr("Disable Built-in Wallpapers", "wallpaper settings disable toggle") + description: I18n.tr("Use an external wallpaper manager like swww, hyprpaper, or swaybg.", "wallpaper settings disable description") + checked: { + var prefs = SettingsData.screenPreferences?.wallpaper; + if (!prefs) + return false; + if (Array.isArray(prefs) && prefs.length === 0) + return true; + return false; + } + onToggled: checked => { + var prefs = SettingsData.screenPreferences || {}; + var newPrefs = Object.assign({}, prefs); + newPrefs.wallpaper = checked ? [] : ["all"]; + SettingsData.set("screenPreferences", newPrefs); + } + } + } + + SettingsCard { + tab: "wallpaper" + tags: ["blur", "layer", "niri", "compositor"] + visible: CompositorService.isNiri + + SettingsToggleRow { + tab: "wallpaper" + tags: ["blur", "duplicate", "layer", "compositor"] + settingKey: "blurredWallpaperLayer" + text: I18n.tr("Duplicate Wallpaper with Blur") + description: I18n.tr("Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.") + checked: SettingsData.blurredWallpaperLayer + onToggled: checked => SettingsData.set("blurredWallpaperLayer", checked) + } + } + } + } + + FileBrowserModal { + id: mainWallpaperBrowser + parentModal: root.parentModal + browserTitle: I18n.tr("Select Wallpaper", "wallpaper file browser title") + browserIcon: "wallpaper" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorWallpaper(selectedMonitorName, path); + } else { + SessionData.setWallpaper(path); + } + close(); + } + } + + FileBrowserModal { + id: lightWallpaperBrowser + parentModal: root.parentModal + browserTitle: I18n.tr("Select Wallpaper", "light mode wallpaper file browser title") + browserIcon: "light_mode" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + SessionData.wallpaperPathLight = path; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + close(); + } + } + + FileBrowserModal { + id: darkWallpaperBrowser + parentModal: root.parentModal + browserTitle: I18n.tr("Select Wallpaper", "dark mode wallpaper file browser title") + browserIcon: "dark_mode" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + SessionData.wallpaperPathDark = path; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + close(); + } + } +} diff --git a/quickshell/Modules/Settings/WidgetTweaksTab.qml b/quickshell/Modules/Settings/WidgetTweaksTab.qml deleted file mode 100644 index 9789c24a..00000000 --- a/quickshell/Modules/Settings/WidgetTweaksTab.qml +++ /dev/null @@ -1,873 +0,0 @@ -import QtQuick -import qs.Common -import qs.Services -import qs.Widgets - -Item { - id: widgetTweaksTab - - DankFlickable { - anchors.fill: parent - clip: true - contentHeight: mainColumn.height + Theme.spacingXL - contentWidth: width - - Column { - id: mainColumn - width: Math.min(550, parent.width - Theme.spacingL * 2) - anchors.horizontalCenter: parent.horizontalCenter - spacing: Theme.spacingXL - - StyledRect { - width: parent.width - height: workspaceSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: workspaceSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "view_module" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Workspace Settings") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Workspace Index Numbers") - description: I18n.tr("Show workspace index numbers in the top bar workspace switcher") - checked: SettingsData.showWorkspaceIndex - onToggled: checked => { - return SettingsData.set("showWorkspaceIndex", checked); - } - } - DankToggle { - width: parent.width - text: I18n.tr("Workspace Padding") - description: I18n.tr("Always show a minimum of 3 workspaces, even if fewer are available") - checked: SettingsData.showWorkspacePadding - onToggled: checked => { - return SettingsData.set("showWorkspacePadding", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Workspace Apps") - description: I18n.tr("Display application icons in workspace indicators") - checked: SettingsData.showWorkspaceApps - visible: CompositorService.isNiri || CompositorService.isHyprland - onToggled: checked => { - return SettingsData.set("showWorkspaceApps", checked); - } - } - - Row { - width: parent.width - Theme.spacingL - spacing: Theme.spacingL - visible: SettingsData.showWorkspaceApps - opacity: visible ? 1 : 0 - anchors.left: parent.left - anchors.leftMargin: Theme.spacingL - - Column { - width: 120 - spacing: Theme.spacingS - - StyledText { - text: I18n.tr("Max apps to show") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceText - font.weight: Font.Medium - } - - DankTextField { - width: 100 - height: 28 - placeholderText: "#ffffff" - text: SettingsData.maxWorkspaceIcons - maximumLength: 7 - font.pixelSize: Theme.fontSizeSmall - topPadding: Theme.spacingXS - bottomPadding: Theme.spacingXS - onEditingFinished: { - SettingsData.set("maxWorkspaceIcons", parseInt(text, 10)); - } - } - } - - Behavior on opacity { - NumberAnimation { - duration: Theme.mediumDuration - easing.type: Theme.emphasizedEasing - } - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Per-Monitor Workspaces") - description: I18n.tr("Show only workspaces belonging to each specific monitor.") - checked: SettingsData.workspacesPerMonitor - onToggled: checked => { - return SettingsData.set("workspacesPerMonitor", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show Occupied Workspaces Only") - description: I18n.tr("Display only workspaces that contain windows") - checked: SettingsData.showOccupiedWorkspacesOnly - visible: CompositorService.isNiri || CompositorService.isHyprland - onToggled: checked => { - return SettingsData.set("showOccupiedWorkspacesOnly", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Show All Tags") - description: I18n.tr("Show all 9 tags instead of only occupied tags (DWL only)") - checked: SettingsData.dwlShowAllTags - visible: CompositorService.isDwl - onToggled: checked => { - return SettingsData.set("dwlShowAllTags", checked); - } - } - } - } - - StyledRect { - width: parent.width - height: mediaSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: mediaSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "music_note" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Media Player Settings") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Wave Progress Bars") - description: I18n.tr("Use animated wave progress bars for media playback") - checked: SettingsData.waveProgressEnabled - onToggled: checked => { - return SettingsData.set("waveProgressEnabled", checked); - } - } - DankToggle { - width: parent.width - text: I18n.tr("Scroll song title") - description: I18n.tr("Scroll title if it doesn't fit in widget") - checked: SettingsData.scrollTitleEnabled - onToggled: checked => { - return SettingsData.set("scrollTitleEnabled", checked); - } - } - } - } - - StyledRect { - width: parent.width - height: updaterSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: updaterSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "refresh" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("System Updater") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Use Custom Command") - description: I18n.tr("Use custom command for update your system") - checked: SettingsData.updaterUseCustomCommand - onToggled: checked => { - if (!checked) { - updaterCustomCommand.text = ""; - updaterTerminalCustomClass.text = ""; - SettingsData.set("updaterCustomCommand", ""); - SettingsData.set("updaterTerminalAdditionalParams", ""); - } - return SettingsData.set("updaterUseCustomCommand", checked); - } - } - - FocusScope { - width: parent.width - Theme.spacingM * 2 - height: customCommandColumn.implicitHeight - anchors.left: parent.left - anchors.leftMargin: Theme.spacingM - - Column { - id: customCommandColumn - width: parent.width - spacing: Theme.spacingXS - - StyledText { - text: I18n.tr("System update custom command") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: updaterCustomCommand - width: parent.width - height: 48 - placeholderText: "myPkgMngr --sysupdate" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.updaterCustomCommand) { - text = SettingsData.updaterCustomCommand; - } - } - - onTextEdited: { - SettingsData.set("updaterCustomCommand", text.trim()); - } - - MouseArea { - anchors.fill: parent - onPressed: mouse => { - updaterCustomCommand.forceActiveFocus(); - mouse.accepted = false; - } - } - } - } - } - - FocusScope { - width: parent.width - Theme.spacingM * 2 - height: terminalParamsColumn.implicitHeight - anchors.left: parent.left - anchors.leftMargin: Theme.spacingM - - Column { - id: terminalParamsColumn - width: parent.width - spacing: Theme.spacingXS - - StyledText { - text: I18n.tr("Terminal custom additional parameters") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - } - - DankTextField { - id: updaterTerminalCustomClass - width: parent.width - height: 48 - placeholderText: "-T udpClass" - backgroundColor: Theme.withAlpha(Theme.surfaceContainerHighest, Theme.popupTransparency) - normalBorderColor: Theme.outlineMedium - focusedBorderColor: Theme.primary - - Component.onCompleted: { - if (SettingsData.updaterTerminalAdditionalParams) { - text = SettingsData.updaterTerminalAdditionalParams; - } - } - - onTextEdited: { - SettingsData.set("updaterTerminalAdditionalParams", text.trim()); - } - - MouseArea { - anchors.fill: parent - onPressed: mouse => { - updaterTerminalCustomClass.forceActiveFocus(); - mouse.accepted = false; - } - } - } - } - } - } - } - - StyledRect { - width: parent.width - height: runningAppsSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: CompositorService.isNiri || CompositorService.isHyprland - - Column { - id: runningAppsSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "apps" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Running Apps Settings") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Running Apps Only In Current Workspace") - description: I18n.tr("Show only apps running in current workspace") - checked: SettingsData.runningAppsCurrentWorkspace - onToggled: checked => { - return SettingsData.set("runningAppsCurrentWorkspace", checked); - } - } - } - } - - StyledRect { - width: parent.width - height: workspaceIconsSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - visible: SettingsData.hasNamedWorkspaces() - - Column { - id: workspaceIconsSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "label" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Named Workspace Icons") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - StyledText { - width: parent.width - text: I18n.tr("Configure icons for named workspaces. Icons take priority over numbers when both are enabled.") - font.pixelSize: Theme.fontSizeSmall - color: Theme.outline - wrapMode: Text.WordWrap - } - - Repeater { - model: SettingsData.getNamedWorkspaces() - - Rectangle { - width: parent.width - height: workspaceIconRow.implicitHeight + Theme.spacingM - radius: Theme.cornerRadius - color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.5) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.3) - border.width: 0 - - Row { - id: workspaceIconRow - - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: Theme.spacingM - anchors.rightMargin: Theme.spacingM - spacing: Theme.spacingM - - StyledText { - text: "\"" + modelData + "\"" - font.pixelSize: Theme.fontSizeMedium - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - width: 150 - elide: Text.ElideRight - } - - DankIconPicker { - id: iconPicker - anchors.verticalCenter: parent.verticalCenter - - Component.onCompleted: { - var iconData = SettingsData.getWorkspaceNameIcon(modelData); - if (iconData) { - setIcon(iconData.value, iconData.type); - } - } - - onIconSelected: (iconName, iconType) => { - SettingsData.setWorkspaceNameIcon(modelData, { - "type": iconType, - "value": iconName - }); - setIcon(iconName, iconType); - } - - Connections { - target: SettingsData - function onWorkspaceIconsUpdated() { - var iconData = SettingsData.getWorkspaceNameIcon(modelData); - if (iconData) { - iconPicker.setIcon(iconData.value, iconData.type); - } else { - iconPicker.setIcon("", "icon"); - } - } - } - } - - Rectangle { - width: 28 - height: 28 - radius: Theme.cornerRadius - color: clearMouseArea.containsMouse ? Theme.errorHover : Theme.surfaceContainer - border.color: clearMouseArea.containsMouse ? Theme.error : Theme.outline - border.width: 0 - anchors.verticalCenter: parent.verticalCenter - - DankIcon { - name: "close" - size: 16 - color: clearMouseArea.containsMouse ? Theme.error : Theme.outline - anchors.centerIn: parent - } - - MouseArea { - id: clearMouseArea - - anchors.fill: parent - hoverEnabled: true - cursorShape: Qt.PointingHandCursor - onClicked: { - SettingsData.removeWorkspaceNameIcon(modelData); - } - } - } - - Item { - width: parent.width - 150 - 240 - 28 - Theme.spacingM * 4 - height: 1 - } - } - } - } - } - } - - StyledRect { - width: parent.width - height: notificationSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: notificationSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "notifications" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("Notification Popups") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Column { - width: parent.width - spacing: 0 - leftPadding: Theme.spacingM - rightPadding: Theme.spacingM - - DankDropdown { - width: parent.width - parent.leftPadding - parent.rightPadding - text: I18n.tr("Popup Position") - description: I18n.tr("Choose where notification popups appear on screen") - currentValue: { - if (SettingsData.notificationPopupPosition === -1) { - return "Top Center"; - } - switch (SettingsData.notificationPopupPosition) { - case SettingsData.Position.Top: - return "Top Right"; - case SettingsData.Position.Bottom: - return "Bottom Left"; - case SettingsData.Position.Left: - return "Top Left"; - case SettingsData.Position.Right: - return "Bottom Right"; - default: - return "Top Right"; - } - } - options: ["Top Right", "Top Left", "Top Center", "Bottom Right", "Bottom Left"] - onValueChanged: value => { - switch (value) { - case "Top Right": - SettingsData.set("notificationPopupPosition", SettingsData.Position.Top); - break; - case "Top Left": - SettingsData.set("notificationPopupPosition", SettingsData.Position.Left); - break; - case "Top Center": - SettingsData.set("notificationPopupPosition", -1); - break; - case "Bottom Right": - SettingsData.set("notificationPopupPosition", SettingsData.Position.Right); - break; - case "Bottom Left": - SettingsData.set("notificationPopupPosition", SettingsData.Position.Bottom); - break; - } - SettingsData.sendTestNotifications(); - } - } - } - } - } - - StyledRect { - width: parent.width - height: osdRow.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Row { - id: osdRow - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - DankIcon { - name: "tune" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - Column { - width: parent.width - Theme.iconSize - Theme.spacingM - osdToggle.width - Theme.spacingM - spacing: Theme.spacingXS - anchors.verticalCenter: parent.verticalCenter - - StyledText { - text: I18n.tr("Always Show OSD Percentage") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - } - - StyledText { - text: I18n.tr("Display volume and brightness percentage values by default in OSD popups") - font.pixelSize: Theme.fontSizeSmall - color: Theme.surfaceVariantText - wrapMode: Text.WordWrap - width: parent.width - } - } - - DankToggle { - id: osdToggle - - anchors.verticalCenter: parent.verticalCenter - checked: SettingsData.osdAlwaysShowValue - onToggled: checked => { - SettingsData.set("osdAlwaysShowValue", checked); - } - } - } - } - - StyledRect { - width: parent.width - height: osdSection.implicitHeight + Theme.spacingL * 2 - radius: Theme.cornerRadius - color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) - border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2) - border.width: 0 - - Column { - id: osdSection - - anchors.fill: parent - anchors.margins: Theme.spacingL - spacing: Theme.spacingM - - Row { - width: parent.width - spacing: Theme.spacingM - - DankIcon { - name: "notification_important" - size: Theme.iconSize - color: Theme.primary - anchors.verticalCenter: parent.verticalCenter - } - - StyledText { - text: I18n.tr("On-screen Displays") - font.pixelSize: Theme.fontSizeLarge - font.weight: Font.Medium - color: Theme.surfaceText - anchors.verticalCenter: parent.verticalCenter - } - } - - Column { - width: parent.width - spacing: 0 - leftPadding: Theme.spacingM - rightPadding: Theme.spacingM - - DankDropdown { - width: parent.width - parent.leftPadding - parent.rightPadding - text: I18n.tr("OSD Position") - description: I18n.tr("Choose where on-screen displays appear on screen") - currentValue: { - switch (SettingsData.osdPosition) { - case SettingsData.Position.Top: - return "Top Right"; - case SettingsData.Position.Left: - return "Top Left"; - case SettingsData.Position.TopCenter: - return "Top Center"; - case SettingsData.Position.Right: - return "Bottom Right"; - case SettingsData.Position.Bottom: - return "Bottom Left"; - case SettingsData.Position.BottomCenter: - return "Bottom Center"; - case SettingsData.Position.LeftCenter: - return "Left Center"; - case SettingsData.Position.RightCenter: - return "Right Center"; - default: - return "Bottom Center"; - } - } - options: ["Top Right", "Top Left", "Top Center", "Bottom Right", "Bottom Left", "Bottom Center", "Left Center", "Right Center"] - onValueChanged: value => { - switch (value) { - case "Top Right": - SettingsData.set("osdPosition", SettingsData.Position.Top); - break; - case "Top Left": - SettingsData.set("osdPosition", SettingsData.Position.Left); - break; - case "Top Center": - SettingsData.set("osdPosition", SettingsData.Position.TopCenter); - break; - case "Bottom Right": - SettingsData.set("osdPosition", SettingsData.Position.Right); - break; - case "Bottom Left": - SettingsData.set("osdPosition", SettingsData.Position.Bottom); - break; - case "Bottom Center": - SettingsData.set("osdPosition", SettingsData.Position.BottomCenter); - break; - case "Left Center": - SettingsData.set("osdPosition", SettingsData.Position.LeftCenter); - break; - case "Right Center": - SettingsData.set("osdPosition", SettingsData.Position.RightCenter); - break; - } - } - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Volume OSD") - description: I18n.tr("Show on-screen display when volume changes") - checked: SettingsData.osdVolumeEnabled - onToggled: checked => { - return SettingsData.set("osdVolumeEnabled", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Media Volume OSD") - description: I18n.tr("Show on-screen display when media player volume changes") - checked: SettingsData.osdMediaVolumeEnabled - onToggled: checked => { - return SettingsData.set("osdMediaVolumeEnabled", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Brightness OSD") - description: I18n.tr("Show on-screen display when brightness changes") - checked: SettingsData.osdBrightnessEnabled - onToggled: checked => { - return SettingsData.set("osdBrightnessEnabled", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Idle Inhibitor OSD") - description: I18n.tr("Show on-screen display when idle inhibitor state changes") - checked: SettingsData.osdIdleInhibitorEnabled - onToggled: checked => { - return SettingsData.set("osdIdleInhibitorEnabled", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Microphone Mute OSD") - description: I18n.tr("Show on-screen display when microphone is muted/unmuted") - checked: SettingsData.osdMicMuteEnabled - onToggled: checked => { - return SettingsData.set("osdMicMuteEnabled", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Caps Lock OSD") - description: I18n.tr("Show on-screen display when caps lock state changes") - checked: SettingsData.osdCapsLockEnabled - onToggled: checked => { - return SettingsData.set("osdCapsLockEnabled", checked); - } - } - - DankToggle { - width: parent.width - text: I18n.tr("Power Profile OSD") - description: I18n.tr("Show on-screen display when power profile changes") - checked: SettingsData.osdPowerProfileEnabled - onToggled: checked => { - return SettingsData.set("osdPowerProfileEnabled", checked); - } - } - } - } - } - } -} diff --git a/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml b/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml new file mode 100644 index 00000000..8ba75f19 --- /dev/null +++ b/quickshell/Modules/Settings/Widgets/SettingsButtonGroupRow.qml @@ -0,0 +1,71 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Common +import qs.Widgets + +Item { + id: root + + property string tab: "" + property var tags: [] + property string settingKey: "" + + property string text: "" + property string description: "" + property alias model: buttonGroup.model + property alias currentIndex: buttonGroup.currentIndex + property alias selectionMode: buttonGroup.selectionMode + property alias buttonHeight: buttonGroup.buttonHeight + property alias minButtonWidth: buttonGroup.minButtonWidth + property alias buttonPadding: buttonGroup.buttonPadding + property alias checkIconSize: buttonGroup.checkIconSize + property alias textSize: buttonGroup.textSize + property alias spacing: buttonGroup.spacing + property alias checkEnabled: buttonGroup.checkEnabled + + signal selectionChanged(int index, bool selected) + + width: parent?.width ?? 0 + height: 60 + + Row { + id: contentRow + width: parent.width - Theme.spacingM * 2 + x: Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingM + + Column { + width: parent.width - buttonGroup.width - Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingXS + + StyledText { + text: root.text + font.pixelSize: Theme.fontSizeMedium + font.weight: Font.Medium + color: Theme.surfaceText + elide: Text.ElideRight + width: parent.width + visible: root.text !== "" + } + + StyledText { + text: root.description + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + visible: root.description !== "" + } + } + + DankButtonGroup { + id: buttonGroup + anchors.verticalCenter: parent.verticalCenter + selectionMode: "single" + onSelectionChanged: (index, selected) => root.selectionChanged(index, selected) + } + } +} diff --git a/quickshell/Modules/Settings/Widgets/SettingsCard.qml b/quickshell/Modules/Settings/Widgets/SettingsCard.qml new file mode 100644 index 00000000..fffcbeb6 --- /dev/null +++ b/quickshell/Modules/Settings/Widgets/SettingsCard.qml @@ -0,0 +1,121 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Common +import qs.Widgets + +StyledRect { + id: root + + property string tab: "" + property var tags: [] + + property string title: "" + property string iconName: "" + property bool collapsible: false + property bool expanded: true + + default property alias content: contentColumn.children + + width: parent?.width ?? 0 + height: { + var hasHeader = root.title !== "" || root.iconName !== ""; + if (collapsed) + return headerRow.height + Theme.spacingL * 2; + var h = Theme.spacingL * 2 + contentColumn.height; + if (hasHeader) + h += headerRow.height + Theme.spacingM; + return h; + } + radius: Theme.cornerRadius + color: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + + readonly property bool collapsed: collapsible && !expanded + readonly property bool hasHeader: root.title !== "" || root.iconName !== "" + property bool animationsEnabled: false + + Component.onCompleted: Qt.callLater(() => animationsEnabled = true) + + Behavior on height { + enabled: root.animationsEnabled + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + + Column { + id: mainColumn + anchors.fill: parent + anchors.margins: Theme.spacingL + spacing: root.hasHeader ? Theme.spacingM : 0 + clip: true + + Item { + id: headerRow + width: parent.width + height: root.hasHeader ? Math.max(headerIcon.height, headerText.height) : 0 + visible: root.hasHeader + + Row { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingM + + DankIcon { + id: headerIcon + name: root.iconName + size: Theme.iconSize + color: Theme.primary + anchors.verticalCenter: parent.verticalCenter + visible: root.iconName !== "" + } + + StyledText { + id: headerText + text: root.title + font.pixelSize: Theme.fontSizeLarge + font.weight: Font.Medium + color: Theme.surfaceText + anchors.verticalCenter: parent.verticalCenter + visible: root.title !== "" + } + } + + DankIcon { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + name: root.expanded ? "expand_less" : "expand_more" + size: Theme.iconSize - 2 + color: Theme.surfaceVariantText + visible: root.collapsible + } + + MouseArea { + anchors.fill: parent + enabled: root.collapsible + cursorShape: root.collapsible ? Qt.PointingHandCursor : Qt.ArrowCursor + onClicked: { + if (!root.collapsible) + return; + root.expanded = !root.expanded; + } + } + } + + Column { + id: contentColumn + width: parent.width + spacing: Theme.spacingM + visible: !root.collapsed + opacity: root.collapsed ? 0 : 1 + + Behavior on opacity { + NumberAnimation { + duration: Theme.shortDuration + easing.type: Theme.standardEasing + } + } + } + } +} diff --git a/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml b/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml new file mode 100644 index 00000000..a5bbba16 --- /dev/null +++ b/quickshell/Modules/Settings/Widgets/SettingsDropdownRow.qml @@ -0,0 +1,15 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Widgets + +DankDropdown { + id: root + + property string tab: "" + property var tags: [] + property string settingKey: "" + + width: parent?.width ?? 0 + addHorizontalPadding: true +} diff --git a/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml b/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml new file mode 100644 index 00000000..ca949fcb --- /dev/null +++ b/quickshell/Modules/Settings/Widgets/SettingsSliderRow.qml @@ -0,0 +1,99 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Common +import qs.Widgets + +Item { + id: root + + property string tab: "" + property var tags: [] + property string settingKey: "" + + property string text: "" + property string description: "" + property alias value: slider.value + property alias minimum: slider.minimum + property alias maximum: slider.maximum + property alias unit: slider.unit + property alias wheelEnabled: slider.wheelEnabled + property alias thumbOutlineColor: slider.thumbOutlineColor + property int defaultValue: -1 + + signal sliderValueChanged(int newValue) + + width: parent?.width ?? 0 + height: headerRow.height + Theme.spacingXS + slider.height + + Column { + id: contentColumn + width: parent.width - Theme.spacingM * 2 + x: Theme.spacingM + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingXS + + Row { + id: headerRow + width: parent.width + height: labelColumn.height + spacing: Theme.spacingS + + Column { + id: labelColumn + anchors.verticalCenter: parent.verticalCenter + spacing: Theme.spacingXS + width: parent.width - resetButtonContainer.width - Theme.spacingS + + StyledText { + text: root.text + font.pixelSize: Theme.fontSizeMedium + font.weight: Font.Medium + color: Theme.surfaceText + visible: root.text !== "" + } + + StyledText { + text: root.description + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceVariantText + wrapMode: Text.WordWrap + width: parent.width + visible: root.description !== "" + } + } + + Item { + id: resetButtonContainer + width: root.defaultValue >= 0 ? 36 : 0 + height: 36 + anchors.verticalCenter: parent.verticalCenter + + DankActionButton { + id: resetButton + anchors.centerIn: parent + buttonSize: 36 + iconName: "restart_alt" + iconSize: 20 + visible: root.defaultValue >= 0 && slider.value !== root.defaultValue + backgroundColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + iconColor: Theme.surfaceVariantText + onClicked: { + slider.value = root.defaultValue; + root.sliderValueChanged(root.defaultValue); + } + } + } + } + + DankSlider { + id: slider + width: parent.width + height: 32 + showValue: true + wheelEnabled: false + thumbOutlineColor: Theme.withAlpha(Theme.surfaceContainerHigh, Theme.popupTransparency) + onSliderValueChanged: newValue => root.sliderValueChanged(newValue) + } + } +} diff --git a/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml b/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml new file mode 100644 index 00000000..baa10d87 --- /dev/null +++ b/quickshell/Modules/Settings/Widgets/SettingsToggleRow.qml @@ -0,0 +1,14 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Widgets + +DankToggle { + id: root + + property string tab: "" + property var tags: [] + property string settingKey: "" + + width: parent?.width ?? 0 +} diff --git a/quickshell/Modules/Settings/WorkspacesTab.qml b/quickshell/Modules/Settings/WorkspacesTab.qml new file mode 100644 index 00000000..4b3d35b5 --- /dev/null +++ b/quickshell/Modules/Settings/WorkspacesTab.qml @@ -0,0 +1,224 @@ +import QtQuick +import qs.Common +import qs.Services +import qs.Widgets +import qs.Modules.Settings.Widgets + +Item { + id: root + + DankFlickable { + anchors.fill: parent + clip: true + contentHeight: mainColumn.height + Theme.spacingXL + contentWidth: width + + Column { + id: mainColumn + width: Math.min(550, parent.width - Theme.spacingL * 2) + anchors.horizontalCenter: parent.horizontalCenter + spacing: Theme.spacingXL + + SettingsCard { + width: parent.width + iconName: "view_module" + title: I18n.tr("Workspace Settings") + + SettingsToggleRow { + text: I18n.tr("Workspace Index Numbers") + description: I18n.tr("Show workspace index numbers in the top bar workspace switcher") + checked: SettingsData.showWorkspaceIndex + onToggled: checked => SettingsData.set("showWorkspaceIndex", checked) + } + + SettingsToggleRow { + text: I18n.tr("Workspace Padding") + description: I18n.tr("Always show a minimum of 3 workspaces, even if fewer are available") + checked: SettingsData.showWorkspacePadding + onToggled: checked => SettingsData.set("showWorkspacePadding", checked) + } + + SettingsToggleRow { + text: I18n.tr("Show Workspace Apps") + description: I18n.tr("Display application icons in workspace indicators") + checked: SettingsData.showWorkspaceApps + visible: CompositorService.isNiri || CompositorService.isHyprland + onToggled: checked => SettingsData.set("showWorkspaceApps", checked) + } + + Row { + width: parent.width - Theme.spacingL + spacing: Theme.spacingL + visible: SettingsData.showWorkspaceApps + opacity: visible ? 1 : 0 + anchors.left: parent.left + anchors.leftMargin: Theme.spacingL + + Column { + width: 120 + spacing: Theme.spacingS + + StyledText { + text: I18n.tr("Max apps to show") + font.pixelSize: Theme.fontSizeSmall + color: Theme.surfaceText + font.weight: Font.Medium + } + + DankTextField { + width: 100 + height: 28 + placeholderText: "#ffffff" + text: SettingsData.maxWorkspaceIcons + maximumLength: 7 + font.pixelSize: Theme.fontSizeSmall + topPadding: Theme.spacingXS + bottomPadding: Theme.spacingXS + onEditingFinished: SettingsData.set("maxWorkspaceIcons", parseInt(text, 10)) + } + } + + Behavior on opacity { + NumberAnimation { + duration: Theme.mediumDuration + easing.type: Theme.emphasizedEasing + } + } + } + + SettingsToggleRow { + text: I18n.tr("Per-Monitor Workspaces") + description: I18n.tr("Show only workspaces belonging to each specific monitor.") + checked: SettingsData.workspacesPerMonitor + onToggled: checked => SettingsData.set("workspacesPerMonitor", checked) + } + + SettingsToggleRow { + text: I18n.tr("Show Occupied Workspaces Only") + description: I18n.tr("Display only workspaces that contain windows") + checked: SettingsData.showOccupiedWorkspacesOnly + visible: CompositorService.isNiri || CompositorService.isHyprland + onToggled: checked => SettingsData.set("showOccupiedWorkspacesOnly", checked) + } + + SettingsToggleRow { + text: I18n.tr("Show All Tags") + description: I18n.tr("Show all 9 tags instead of only occupied tags (DWL only)") + checked: SettingsData.dwlShowAllTags + visible: CompositorService.isDwl + onToggled: checked => SettingsData.set("dwlShowAllTags", checked) + } + } + + SettingsCard { + width: parent.width + iconName: "label" + title: I18n.tr("Named Workspace Icons") + visible: SettingsData.hasNamedWorkspaces() + + StyledText { + width: parent.width + text: I18n.tr("Configure icons for named workspaces. Icons take priority over numbers when both are enabled.") + font.pixelSize: Theme.fontSizeSmall + color: Theme.outline + wrapMode: Text.WordWrap + } + + Repeater { + model: SettingsData.getNamedWorkspaces() + + Rectangle { + width: parent.width + height: workspaceIconRow.implicitHeight + Theme.spacingM + radius: Theme.cornerRadius + color: Qt.rgba(Theme.surfaceContainer.r, Theme.surfaceContainer.g, Theme.surfaceContainer.b, 0.5) + border.width: 0 + + Row { + id: workspaceIconRow + + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: Theme.spacingM + anchors.rightMargin: Theme.spacingM + spacing: Theme.spacingM + + StyledText { + text: "\"" + modelData + "\"" + font.pixelSize: Theme.fontSizeMedium + font.weight: Font.Medium + color: Theme.surfaceText + anchors.verticalCenter: parent.verticalCenter + width: 150 + elide: Text.ElideRight + } + + DankIconPicker { + id: iconPicker + anchors.verticalCenter: parent.verticalCenter + + Component.onCompleted: { + var iconData = SettingsData.getWorkspaceNameIcon(modelData); + if (iconData) { + setIcon(iconData.value, iconData.type); + } + } + + onIconSelected: (iconName, iconType) => { + SettingsData.setWorkspaceNameIcon(modelData, { + "type": iconType, + "value": iconName + }); + setIcon(iconName, iconType); + } + + Connections { + target: SettingsData + function onWorkspaceIconsUpdated() { + var iconData = SettingsData.getWorkspaceNameIcon(modelData); + if (iconData) { + iconPicker.setIcon(iconData.value, iconData.type); + } else { + iconPicker.setIcon("", "icon"); + } + } + } + } + + Rectangle { + width: 28 + height: 28 + radius: Theme.cornerRadius + color: clearMouseArea.containsMouse ? Theme.errorHover : Theme.surfaceContainer + border.width: 0 + anchors.verticalCenter: parent.verticalCenter + + DankIcon { + name: "close" + size: 16 + color: clearMouseArea.containsMouse ? Theme.error : Theme.outline + anchors.centerIn: parent + } + + MouseArea { + id: clearMouseArea + + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + onClicked: SettingsData.removeWorkspaceNameIcon(modelData) + } + } + + Item { + width: parent.width - 150 - 240 - 28 - Theme.spacingM * 4 + height: 1 + } + } + } + } + } + } + } +} diff --git a/quickshell/Widgets/KeybindItem.qml b/quickshell/Widgets/KeybindItem.qml index 914fc2c4..df174b51 100644 --- a/quickshell/Widgets/KeybindItem.qml +++ b/quickshell/Widgets/KeybindItem.qml @@ -55,7 +55,6 @@ Item { signal saveBind(string originalKey, var newData) signal removeBind(string key) signal cancelEdit - signal restoreKeyConsumed implicitHeight: contentColumn.implicitHeight height: implicitHeight @@ -67,7 +66,6 @@ Item { return; if (restoreKey) { restoreToKey(restoreKey); - restoreKeyConsumed(); } else { resetEdits(); } @@ -77,7 +75,6 @@ Item { if (!isExpanded || !restoreKey) return; restoreToKey(restoreKey); - restoreKeyConsumed(); } function restoreToKey(keyToFind) { diff --git a/quickshell/translations/en.json b/quickshell/translations/en.json index 5724f46b..0c91f8de 100644 --- a/quickshell/translations/en.json +++ b/quickshell/translations/en.json @@ -1,4 +1,10 @@ [ + { + "term": "%1 DMS bind(s) may be overridden by config binds that come after the include.", + "context": "%1 DMS bind(s) may be overridden by config binds that come after the include.", + "reference": "Modules/Settings/KeybindsTab.qml:325", + "comment": "" + }, { "term": "%1 adapter(s), none connected", "context": "%1 adapter(s), none connected", @@ -54,15 +60,9 @@ "comment": "" }, { - "term": "- Stateless System Monitoring", - "context": "- Stateless System Monitoring", - "reference": "Modules/Settings/AboutTab.qml:612", - "comment": "" - }, - { - "term": "- Support Us With a Star ⭐", - "context": "- Support Us With a Star ⭐", - "reference": "Modules/Settings/AboutTab.qml:577", + "term": "0 = square corners", + "context": "0 = square corners", + "reference": "Modules/Settings/ThemeColorsTab.qml:665", "comment": "" }, { @@ -71,22 +71,88 @@ "reference": "Modules/DankDash/Overview/CalendarOverviewCard.qml:138", "comment": "" }, + { + "term": "1 minute", + "context": "1 minute", + "reference": "Modules/Settings/NotificationsTab.qml:43", + "comment": "" + }, + { + "term": "1 second", + "context": "1 second", + "reference": "Modules/Settings/NotificationsTab.qml:15", + "comment": "" + }, + { + "term": "10 minutes", + "context": "10 minutes", + "reference": "Modules/Settings/NotificationsTab.qml:55", + "comment": "" + }, + { + "term": "10 seconds", + "context": "10 seconds", + "reference": "Modules/Settings/NotificationsTab.qml:31", + "comment": "" + }, + { + "term": "15 seconds", + "context": "15 seconds", + "reference": "Modules/Settings/NotificationsTab.qml:35", + "comment": "" + }, + { + "term": "2 minutes", + "context": "2 minutes", + "reference": "Modules/Settings/NotificationsTab.qml:47", + "comment": "" + }, { "term": "24-Hour Format", "context": "24-Hour Format", - "reference": "Modules/Settings/TimeWeatherTab.qml:56", + "reference": "Modules/Settings/TimeWeatherTab.qml:35", "comment": "" }, { "term": "24-hour format", "context": "24-hour format", - "reference": "Modules/Settings/PersonalizationTab.qml:1353", + "reference": "Modules/Settings/WallpaperTab.qml:1107", + "comment": "" + }, + { + "term": "3 seconds", + "context": "3 seconds", + "reference": "Modules/Settings/NotificationsTab.qml:19", + "comment": "" + }, + { + "term": "30 seconds", + "context": "30 seconds", + "reference": "Modules/Settings/NotificationsTab.qml:39", "comment": "" }, { "term": "3rd party", "context": "3rd party", - "reference": "Modules/Settings/PluginBrowser.qml:396", + "reference": "Modules/Settings/PluginBrowser.qml:400", + "comment": "" + }, + { + "term": "5 minutes", + "context": "5 minutes", + "reference": "Modules/Settings/NotificationsTab.qml:51", + "comment": "" + }, + { + "term": "5 seconds", + "context": "5 seconds", + "reference": "Modules/Settings/NotificationsTab.qml:23, Modules/Settings/NotificationsTab.qml:62", + "comment": "" + }, + { + "term": "8 seconds", + "context": "8 seconds", + "reference": "Modules/Settings/NotificationsTab.qml:27", "comment": "" }, { @@ -98,7 +164,7 @@ { "term": "API", "context": "API", - "reference": "Modules/Settings/AboutTab.qml:688", + "reference": "Modules/Settings/AboutTab.qml:610", "comment": "" }, { @@ -110,7 +176,7 @@ { "term": "About", "context": "About", - "reference": "Modals/Settings/SettingsSidebar.qml:84, Modules/Settings/AboutTab.qml:432", + "reference": "Modals/Settings/SettingsSidebar.qml:171, Modules/Settings/AboutTab.qml:514", "comment": "" }, { @@ -146,7 +212,7 @@ { "term": "Action", "context": "Action", - "reference": "Widgets/KeybindItem.qml:662, Widgets/KeybindItem.qml:697", + "reference": "Widgets/KeybindItem.qml:794, Widgets/KeybindItem.qml:829", "comment": "" }, { @@ -167,6 +233,12 @@ "reference": "Modules/Settings/NetworkTab.qml:674", "comment": "" }, + { + "term": "Active Lock Screen Monitor", + "context": "Active Lock Screen Monitor", + "reference": "Modules/Settings/LockScreenTab.qml:89", + "comment": "" + }, { "term": "Active: ", "context": "Active: ", @@ -188,7 +260,7 @@ { "term": "Add", "context": "Add", - "reference": "Widgets/KeybindItem.qml:970, Modules/Plugins/ListSettingWithInput.qml:126", + "reference": "Widgets/KeybindItem.qml:1102, Modules/Plugins/ListSettingWithInput.qml:126", "comment": "" }, { @@ -206,25 +278,25 @@ { "term": "Add Widget", "context": "Add Widget", - "reference": "Modules/Settings/WidgetsTabSection.qml:741, Modules/Settings/WidgetSelectionPopup.qml:88, Modules/ControlCenter/Components/EditControls.qml:58, Modules/ControlCenter/Components/EditControls.qml:159", + "reference": "Modules/Settings/WidgetsTabSection.qml:741, Modules/Settings/WidgetSelectionPopup.qml:92, Modules/ControlCenter/Components/EditControls.qml:58, Modules/ControlCenter/Components/EditControls.qml:159", "comment": "" }, { "term": "Add Widget to %1 Section", "context": "Add Widget to %1 Section", - "reference": "Modules/Settings/WidgetSelectionPopup.qml:190", + "reference": "Modules/Settings/WidgetSelectionPopup.qml:198", "comment": "" }, { "term": "Add a border around the dock", "context": "Add a border around the dock", - "reference": "Modules/Settings/DockTab.qml:781", + "reference": "Modules/Settings/DockTab.qml:189", "comment": "" }, { "term": "Adjust the number of columns in grid view mode.", "context": "Adjust the number of columns in grid view mode.", - "reference": "Modules/Settings/LauncherTab.qml:565", + "reference": "Modules/Settings/LauncherTab.qml:315", "comment": "" }, { @@ -236,7 +308,13 @@ { "term": "All", "context": "All", - "reference": "Services/AppSearchService.qml:310, Services/AppSearchService.qml:326, Modals/Spotlight/SpotlightModal.qml:49, Modules/AppDrawer/CategorySelector.qml:11, Modules/AppDrawer/AppLauncher.qml:16, Modules/AppDrawer/AppLauncher.qml:27, Modules/AppDrawer/AppLauncher.qml:28, Modules/AppDrawer/AppLauncher.qml:45, Modules/AppDrawer/AppLauncher.qml:46, Modules/AppDrawer/AppLauncher.qml:80, Modules/AppDrawer/AppDrawerPopout.qml:34, Modules/Settings/KeybindsTab.qml:332", + "reference": "Services/AppSearchService.qml:310, Services/AppSearchService.qml:326, Modals/Spotlight/SpotlightModal.qml:65, Modules/AppDrawer/CategorySelector.qml:11, Modules/AppDrawer/AppLauncher.qml:16, Modules/AppDrawer/AppLauncher.qml:27, Modules/AppDrawer/AppLauncher.qml:28, Modules/AppDrawer/AppLauncher.qml:45, Modules/AppDrawer/AppLauncher.qml:46, Modules/AppDrawer/AppLauncher.qml:80, Modules/AppDrawer/AppDrawerPopout.qml:57, Modules/Settings/KeybindsTab.qml:397", + "comment": "" + }, + { + "term": "All Monitors", + "context": "All Monitors", + "reference": "Modules/Settings/LockScreenTab.qml:91, Modules/Settings/LockScreenTab.qml:101, Modules/Settings/LockScreenTab.qml:111, Modules/Settings/LockScreenTab.qml:115", "comment": "" }, { @@ -258,9 +336,9 @@ "comment": "" }, { - "term": "Always Show OSD Percentage", - "context": "Always Show OSD Percentage", - "reference": "Modules/Settings/WidgetTweaksTab.qml:674", + "term": "Always Show Percentage", + "context": "Always Show Percentage", + "reference": "Modules/Settings/OSDTab.qml:83", "comment": "" }, { @@ -272,13 +350,13 @@ { "term": "Always show a minimum of 3 workspaces, even if fewer are available", "context": "Always show a minimum of 3 workspaces, even if fewer are available", - "reference": "Modules/Settings/WidgetTweaksTab.qml:68", + "reference": "Modules/Settings/WorkspacesTab.qml:36", "comment": "" }, { "term": "Animation Speed", "context": "Animation Speed", - "reference": "Modules/Settings/PersonalizationTab.qml:1575", + "reference": "Modules/Settings/TypographyMotionTab.qml:208", "comment": "" }, { @@ -308,19 +386,19 @@ { "term": "Applications", "context": "Applications", - "reference": "Modules/AppDrawer/AppDrawerPopout.qml:178, Modules/Settings/ThemeColorsTab.qml:1201", + "reference": "Modules/AppDrawer/AppDrawerPopout.qml:242, Modules/Settings/ThemeColorsTab.qml:693", "comment": "" }, { "term": "Apply GTK Colors", "context": "Apply GTK Colors", - "reference": "Modules/Settings/ThemeColorsTab.qml:1371", + "reference": "Modules/Settings/ThemeColorsTab.qml:799", "comment": "" }, { "term": "Apply Qt Colors", "context": "Apply Qt Colors", - "reference": "Modules/Settings/ThemeColorsTab.qml:1407", + "reference": "Modules/Settings/ThemeColorsTab.qml:833", "comment": "" }, { @@ -332,13 +410,13 @@ { "term": "Apps Icon", "context": "Apps Icon", - "reference": "Modules/Settings/LauncherTab.qml:84", + "reference": "Modules/Settings/LauncherTab.qml:53", "comment": "" }, { "term": "Apps are ordered by usage frequency, then last used, then alphabetically.", "context": "Apps are ordered by usage frequency, then last used, then alphabetically.", - "reference": "Modules/Settings/LauncherTab.qml:799", + "reference": "Modules/Settings/LauncherTab.qml:378", "comment": "" }, { @@ -410,19 +488,19 @@ { "term": "Authorize", "context": "Authorize", - "reference": "Modals/BluetoothPairingModal.qml:314, Modals/BluetoothPairingModal.qml:317", + "reference": "Modals/BluetoothPairingModal.qml:320, Modals/BluetoothPairingModal.qml:323", "comment": "" }, { "term": "Authorize pairing with ", "context": "Authorize pairing with ", - "reference": "Modals/BluetoothPairingModal.qml:129", + "reference": "Modals/BluetoothPairingModal.qml:135", "comment": "" }, { "term": "Authorize service for ", "context": "Authorize service for ", - "reference": "Modals/BluetoothPairingModal.qml:136", + "reference": "Modals/BluetoothPairingModal.qml:142", "comment": "" }, { @@ -434,7 +512,7 @@ { "term": "Auto Location", "context": "Auto Location", - "reference": "Modules/Settings/TimeWeatherTab.qml:607", + "reference": "Modules/Settings/TimeWeatherTab.qml:373", "comment": "" }, { @@ -452,7 +530,7 @@ { "term": "Auto-hide Dock", "context": "Auto-hide Dock", - "reference": "Modules/Settings/DockTab.qml:189", + "reference": "Modules/Settings/DockTab.qml:78", "comment": "" }, { @@ -488,7 +566,7 @@ { "term": "Automatic Cycling", "context": "Automatic Cycling", - "reference": "Modules/Settings/PersonalizationTab.qml:1103", + "reference": "Modules/Settings/WallpaperTab.qml:880", "comment": "" }, { @@ -500,7 +578,7 @@ { "term": "Automatically cycle through wallpapers in the same folder", "context": "Automatically cycle through wallpapers in the same folder", - "reference": "Modules/Settings/PersonalizationTab.qml:1110", + "reference": "Modules/Settings/WallpaperTab.qml:881", "comment": "" }, { @@ -512,13 +590,7 @@ { "term": "Automatically determine your location using your IP address", "context": "Automatically determine your location using your IP address", - "reference": "Modules/Settings/TimeWeatherTab.qml:614", - "comment": "" - }, - { - "term": "Automatically extract colors from wallpaper", - "context": "Automatically extract colors from wallpaper", - "reference": "Modules/Settings/PersonalizationTab.qml:1779", + "reference": "Modules/Settings/TimeWeatherTab.qml:374", "comment": "" }, { @@ -530,13 +602,13 @@ { "term": "Automatically lock after", "context": "Automatically lock after", - "reference": "Modals/Settings/PowerSettings.qml:204", + "reference": "Modules/Settings/PowerSleepTab.qml:112", "comment": "" }, { "term": "Automatically lock the screen when the system prepares to suspend", "context": "Automatically lock the screen when the system prepares to suspend", - "reference": "Modals/Settings/PowerSettings.qml:89", + "reference": "Modules/Settings/LockScreenTab.qml:58", "comment": "" }, { @@ -584,7 +656,7 @@ { "term": "Backend", "context": "Backend", - "reference": "Modules/Settings/AboutTab.qml:650, Modules/Settings/NetworkTab.qml:116", + "reference": "Modules/Settings/AboutTab.qml:572, Modules/Settings/NetworkTab.qml:116", "comment": "" }, { @@ -617,22 +689,28 @@ "reference": "Modules/Settings/DankBarTab.qml:472", "comment": "" }, + { + "term": "Behavior", + "context": "Behavior", + "reference": "Modules/Settings/DockTab.qml:97", + "comment": "" + }, { "term": "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen", "context": "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen", - "reference": "Modals/Settings/PowerSettings.qml:76", + "reference": "Modules/Settings/LockScreenTab.qml:46", "comment": "" }, { "term": "Binds Include Missing", "context": "Binds Include Missing", - "reference": "Modules/Settings/KeybindsTab.qml:263", + "reference": "Modules/Settings/KeybindsTab.qml:307", "comment": "" }, { "term": "Binds include added", "context": "Binds include added", - "reference": "Services/KeybindsService.qml:153", + "reference": "Services/KeybindsService.qml:172", "comment": "" }, { @@ -650,37 +728,37 @@ { "term": "Blur on Overview", "context": "Blur on Overview", - "reference": "Modules/Settings/PersonalizationTab.qml:903", + "reference": "Modules/Settings/WallpaperTab.qml:755", "comment": "" }, { "term": "Blur wallpaper when niri overview is open", "context": "Blur wallpaper when niri overview is open", - "reference": "Modules/Settings/PersonalizationTab.qml:910", + "reference": "Modules/Settings/WallpaperTab.qml:756", "comment": "" }, { "term": "Border", "context": "Border", - "reference": "Modules/Settings/DockTab.qml:780, Modules/Settings/DankBarTab.qml:2369", + "reference": "Modules/Settings/DockTab.qml:185, Modules/Settings/DockTab.qml:188, Modules/Settings/DankBarTab.qml:2369", "comment": "" }, { "term": "Border Color", "context": "Border Color", - "reference": "Modules/Settings/DockTab.qml:810, Modules/Settings/DankBarTab.qml:2401", + "reference": "Modules/Settings/DockTab.qml:195, Modules/Settings/DankBarTab.qml:2401", "comment": "" }, { "term": "Border Opacity", "context": "Border Opacity", - "reference": "Modules/Settings/DockTab.qml:867, Modules/Settings/DockTab.qml:881, Modules/Settings/DankBarTab.qml:2463, Modules/Settings/DankBarTab.qml:2477", + "reference": "Modules/Settings/DockTab.qml:229, Modules/Settings/DankBarTab.qml:2463, Modules/Settings/DankBarTab.qml:2477", "comment": "" }, { "term": "Border Thickness", "context": "Border Thickness", - "reference": "Modules/Settings/DockTab.qml:931, Modules/Settings/DockTab.qml:945, Modules/Settings/DankBarTab.qml:2537, Modules/Settings/DankBarTab.qml:2551", + "reference": "Modules/Settings/DockTab.qml:240, Modules/Settings/DankBarTab.qml:2537, Modules/Settings/DankBarTab.qml:2551", "comment": "" }, { @@ -704,13 +782,7 @@ { "term": "Brightness", "context": "Brightness", - "reference": "Modules/Settings/WidgetsTabSection.qml:830, Modules/Settings/LauncherTab.qml:331", - "comment": "" - }, - { - "term": "Brightness OSD", - "context": "Brightness OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:822", + "reference": "Modules/Settings/WidgetsTabSection.qml:830, Modules/Settings/LauncherTab.qml:252, Modules/Settings/OSDTab.qml:111", "comment": "" }, { @@ -722,7 +794,7 @@ { "term": "Browse Plugins", "context": "Browse Plugins", - "reference": "Modules/Settings/PluginBrowser.qml:101, Modules/Settings/PluginBrowser.qml:170", + "reference": "Modules/Settings/PluginBrowser.qml:105, Modules/Settings/PluginBrowser.qml:174", "comment": "" }, { @@ -782,7 +854,7 @@ { "term": "Cancel", "context": "Cancel", - "reference": "Modals/BluetoothPairingModal.qml:266, Modals/PolkitAuthModal.qml:264, Modals/WifiPasswordModal.qml:605, Widgets/KeybindItem.qml:954, Modals/FileBrowser/FileBrowserOverwriteDialog.qml:83, Modules/Settings/PluginBrowser.qml:630", + "reference": "Modals/BluetoothPairingModal.qml:272, Modals/PolkitAuthModal.qml:264, Modals/WifiPasswordModal.qml:605, Widgets/KeybindItem.qml:1086, Modals/FileBrowser/FileBrowserOverwriteDialog.qml:83, Modules/Settings/PluginBrowser.qml:634", "comment": "" }, { @@ -794,7 +866,7 @@ { "term": "Capabilities", "context": "Capabilities", - "reference": "Modules/Settings/AboutTab.qml:743", + "reference": "Modules/Settings/AboutTab.qml:665", "comment": "" }, { @@ -804,15 +876,15 @@ "comment": "" }, { - "term": "Caps Lock Indicator", - "context": "Caps Lock Indicator", - "reference": "Modules/Settings/DankBarTab.qml:492", + "term": "Caps Lock", + "context": "Caps Lock", + "reference": "Modules/Settings/OSDTab.qml:132", "comment": "" }, { - "term": "Caps Lock OSD", - "context": "Caps Lock OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:852", + "term": "Caps Lock Indicator", + "context": "Caps Lock Indicator", + "reference": "Modules/Settings/DankBarTab.qml:492", "comment": "" }, { @@ -836,7 +908,7 @@ { "term": "Change bar appearance", "context": "Change bar appearance", - "reference": "Modules/Settings/ThemeColorsTab.qml:727", + "reference": "Modules/Settings/ThemeColorsTab.qml:601", "comment": "" }, { @@ -860,13 +932,13 @@ { "term": "Choose Color", "context": "Choose Color", - "reference": "Modals/DankColorPickerModal.qml:13", + "reference": "Modals/DankColorPickerModal.qml:19", "comment": "" }, { "term": "Choose Launcher Logo Color", "context": "Choose Launcher Logo Color", - "reference": "Modules/Settings/LauncherTab.qml:258", + "reference": "Modules/Settings/LauncherTab.qml:223", "comment": "" }, { @@ -878,19 +950,19 @@ { "term": "Choose the background color for widgets", "context": "Choose the background color for widgets", - "reference": "Modules/Settings/ThemeColorsTab.qml:785", + "reference": "Modules/Settings/ThemeColorsTab.qml:616", "comment": "" }, { "term": "Choose the border accent color", "context": "Choose the border accent color", - "reference": "Modules/Settings/DockTab.qml:817, Modules/Settings/DankBarTab.qml:2408", + "reference": "Modules/Settings/DockTab.qml:196, Modules/Settings/DankBarTab.qml:2408", "comment": "" }, { "term": "Choose the logo displayed on the launcher button in DankBar", "context": "Choose the logo displayed on the launcher button in DankBar", - "reference": "Modules/Settings/LauncherTab.qml:70", + "reference": "Modules/Settings/LauncherTab.qml:39", "comment": "" }, { @@ -902,13 +974,19 @@ { "term": "Choose where notification popups appear on screen", "context": "Choose where notification popups appear on screen", - "reference": "Modules/Settings/WidgetTweaksTab.qml:602", + "reference": "Modules/Settings/NotificationsTab.qml:95", "comment": "" }, { "term": "Choose where on-screen displays appear on screen", "context": "Choose where on-screen displays appear on screen", - "reference": "Modules/Settings/WidgetTweaksTab.qml:745", + "reference": "Modules/Settings/OSDTab.qml:28", + "comment": "" + }, + { + "term": "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.", + "context": "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.", + "reference": "Modules/Settings/LockScreenTab.qml:80", "comment": "" }, { @@ -926,7 +1004,7 @@ { "term": "Clear All", "context": "Clear All", - "reference": "Modals/Clipboard/ClipboardHistoryModal.qml:156, Modules/Settings/PrinterTab.qml:1034", + "reference": "Modals/Clipboard/ClipboardHistoryModal.qml:163, Modules/Settings/PrinterTab.qml:1034", "comment": "" }, { @@ -950,13 +1028,13 @@ { "term": "Click any shortcut to edit. Changes save to dms/binds.kdl", "context": "Click any shortcut to edit. Changes save to dms/binds.kdl", - "reference": "Modules/Settings/KeybindsTab.qml:188", + "reference": "Modules/Settings/KeybindsTab.qml:209", "comment": "" }, { "term": "Click to capture", "context": "Click to capture", - "reference": "Widgets/KeybindItem.qml:439", + "reference": "Widgets/KeybindItem.qml:571", "comment": "" }, { @@ -977,12 +1055,6 @@ "reference": "Modules/Settings/DankBarTab.qml:375", "comment": "" }, - { - "term": "Clock show seconds", - "context": "Clock show seconds", - "reference": "Modules/Settings/TimeWeatherTab.qml:123", - "comment": "" - }, { "term": "Close", "context": "Close", @@ -992,13 +1064,19 @@ { "term": "Close Overview on Launch", "context": "Close Overview on Launch", - "reference": "Modules/Settings/LauncherTab.qml:623", + "reference": "Modules/Settings/LauncherTab.qml:331", + "comment": "" + }, + { + "term": "Color Mode", + "context": "Color Mode", + "reference": "Modules/Settings/ThemeColorsTab.qml:573", "comment": "" }, { "term": "Color Override", "context": "Color Override", - "reference": "Modules/Settings/LauncherTab.qml:190", + "reference": "Modules/Settings/LauncherTab.qml:149", "comment": "" }, { @@ -1007,6 +1085,12 @@ "reference": "Modules/Settings/DankBarTab.qml:534", "comment": "" }, + { + "term": "Color displayed on monitors without the lock screen", + "context": "Color displayed on monitors without the lock screen", + "reference": "Modules/Settings/LockScreenTab.qml:146", + "comment": "" + }, { "term": "Color temperature for day time", "context": "Color temperature for day time", @@ -1028,43 +1112,7 @@ { "term": "Command", "context": "Command", - "reference": "Widgets/KeybindItem.qml:842", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard hibernate procedure", - "context": "Command or script to run instead of the standard hibernate procedure", - "reference": "Modals/Settings/PowerSettings.qml:773", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard lock procedure", - "context": "Command or script to run instead of the standard lock procedure", - "reference": "Modals/Settings/PowerSettings.qml:677", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard logout procedure", - "context": "Command or script to run instead of the standard logout procedure", - "reference": "Modals/Settings/PowerSettings.qml:709", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard power off procedure", - "context": "Command or script to run instead of the standard power off procedure", - "reference": "Modals/Settings/PowerSettings.qml:837", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard reboot procedure", - "context": "Command or script to run instead of the standard reboot procedure", - "reference": "Modals/Settings/PowerSettings.qml:805", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard suspend procedure", - "context": "Command or script to run instead of the standard suspend procedure", - "reference": "Modals/Settings/PowerSettings.qml:741", + "reference": "Widgets/KeybindItem.qml:974", "comment": "" }, { @@ -1088,7 +1136,13 @@ { "term": "Compositor", "context": "Compositor", - "reference": "Modules/Settings/LauncherTab.qml:94", + "reference": "Modules/Settings/LauncherTab.qml:63", + "comment": "" + }, + { + "term": "Config action: %1", + "context": "Config action: %1", + "reference": "Widgets/KeybindItem.qml:420", "comment": "" }, { @@ -1106,7 +1160,7 @@ { "term": "Configure icons for named workspaces. Icons take priority over numbers when both are enabled.", "context": "Configure icons for named workspaces. Icons take priority over numbers when both are enabled.", - "reference": "Modules/Settings/WidgetTweaksTab.qml:451", + "reference": "Modules/Settings/WorkspacesTab.qml:121", "comment": "" }, { @@ -1118,7 +1172,7 @@ { "term": "Confirm", "context": "Confirm", - "reference": "Modals/BluetoothPairingModal.qml:312", + "reference": "Modals/BluetoothPairingModal.qml:318", "comment": "" }, { @@ -1130,13 +1184,13 @@ { "term": "Confirm passkey for ", "context": "Confirm passkey for ", - "reference": "Modals/BluetoothPairingModal.qml:125", + "reference": "Modals/BluetoothPairingModal.qml:131", "comment": "" }, { "term": "Conflicts with: %1", "context": "Conflicts with: %1", - "reference": "Widgets/KeybindItem.qml:542", + "reference": "Widgets/KeybindItem.qml:674", "comment": "" }, { @@ -1160,7 +1214,7 @@ { "term": "Connected", "context": "Connected", - "reference": "Modules/Settings/AboutTab.qml:728, Modules/Settings/NetworkTab.qml:384, Modules/Settings/NetworkTab.qml:1091, Modules/Settings/NetworkTab.qml:1415, Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml:21", + "reference": "Modules/Settings/AboutTab.qml:650, Modules/Settings/NetworkTab.qml:384, Modules/Settings/NetworkTab.qml:1091, Modules/Settings/NetworkTab.qml:1415, Modules/ControlCenter/BuiltinPlugins/VpnWidget.qml:21", "comment": "" }, { @@ -1178,7 +1232,7 @@ { "term": "Contrast", "context": "Contrast", - "reference": "Modules/Settings/LauncherTab.qml:360", + "reference": "Modules/Settings/LauncherTab.qml:262", "comment": "" }, { @@ -1194,15 +1248,15 @@ "comment": "" }, { - "term": "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)", - "context": "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)", - "reference": "Modules/Settings/ThemeColorsTab.qml:845", + "term": "Controls opacity of all popouts, modals, and their content layers", + "context": "Controls opacity of all popouts, modals, and their content layers", + "reference": "Modules/Settings/ThemeColorsTab.qml:651", "comment": "" }, { "term": "Copied to clipboard", "context": "Copied to clipboard", - "reference": "Modals/Clipboard/ClipboardHistoryModal.qml:95", + "reference": "Modals/Clipboard/ClipboardHistoryModal.qml:101", "comment": "" }, { @@ -1224,9 +1278,9 @@ "comment": "" }, { - "term": "Corner Radius (0 = square corners)", - "context": "Corner Radius (0 = square corners)", - "reference": "Modules/Settings/ThemeColorsTab.qml:880", + "term": "Corner Radius", + "context": "Corner Radius", + "reference": "Modules/Settings/ThemeColorsTab.qml:664", "comment": "" }, { @@ -1262,7 +1316,7 @@ { "term": "Critical Priority", "context": "Critical Priority", - "reference": "Modules/Notifications/Center/NotificationSettings.qml:190", + "reference": "Modules/Settings/NotificationsTab.qml:192, Modules/Notifications/Center/NotificationSettings.qml:190", "comment": "" }, { @@ -1274,7 +1328,7 @@ { "term": "Current Weather", "context": "Current Weather", - "reference": "Modules/Settings/TimeWeatherTab.qml:828", + "reference": "Modules/Settings/TimeWeatherTab.qml:548", "comment": "" }, { @@ -1292,19 +1346,61 @@ { "term": "Custom", "context": "Custom", - "reference": "Widgets/KeybindItem.qml:779, Modules/Settings/LauncherTab.qml:96, Modules/Settings/LauncherTab.qml:203", + "reference": "Widgets/KeybindItem.qml:911, Modules/Settings/TypographyMotionTab.qml:222, Modules/Settings/LauncherTab.qml:65, Modules/Settings/LauncherTab.qml:162", + "comment": "" + }, + { + "term": "Custom Duration", + "context": "Custom Duration", + "reference": "Modules/Settings/TypographyMotionTab.qml:252", + "comment": "" + }, + { + "term": "Custom Hibernate Command", + "context": "Custom Hibernate Command", + "reference": "Modules/Settings/PowerSleepTab.qml:410", "comment": "" }, { "term": "Custom Location", "context": "Custom Location", - "reference": "Modules/Settings/TimeWeatherTab.qml:646", + "reference": "Modules/Settings/TimeWeatherTab.qml:402", + "comment": "" + }, + { + "term": "Custom Lock Command", + "context": "Custom Lock Command", + "reference": "Modules/Settings/PowerSleepTab.qml:395", + "comment": "" + }, + { + "term": "Custom Logout Command", + "context": "Custom Logout Command", + "reference": "Modules/Settings/PowerSleepTab.qml:400", "comment": "" }, { "term": "Custom Power Actions", "context": "Custom Power Actions", - "reference": "Modals/Settings/PowerSettings.qml:663", + "reference": "Modules/Settings/PowerSleepTab.qml:389", + "comment": "" + }, + { + "term": "Custom Power Off Command", + "context": "Custom Power Off Command", + "reference": "Modules/Settings/PowerSleepTab.qml:420", + "comment": "" + }, + { + "term": "Custom Reboot Command", + "context": "Custom Reboot Command", + "reference": "Modules/Settings/PowerSleepTab.qml:415", + "comment": "" + }, + { + "term": "Custom Suspend Command", + "context": "Custom Suspend Command", + "reference": "Modules/Settings/PowerSleepTab.qml:405", "comment": "" }, { @@ -1316,7 +1412,7 @@ { "term": "Custom: ", "context": "Custom: ", - "reference": "Modules/Settings/TimeWeatherTab.qml:224, Modules/Settings/TimeWeatherTab.qml:293", + "reference": "Modules/Settings/TimeWeatherTab.qml:103, Modules/Settings/TimeWeatherTab.qml:191", "comment": "" }, { @@ -1328,7 +1424,7 @@ { "term": "Customize which actions appear in the power menu", "context": "Customize which actions appear in the power menu", - "reference": "Modals/Settings/PowerSettings.qml:398", + "reference": "Modules/Settings/PowerSleepTab.qml:262", "comment": "" }, { @@ -1352,7 +1448,7 @@ { "term": "DMS shell actions (launcher, clipboard, etc.)", "context": "DMS shell actions (launcher, clipboard, etc.)", - "reference": "Widgets/KeybindItem.qml:575", + "reference": "Widgets/KeybindItem.qml:707", "comment": "" }, { @@ -1376,19 +1472,19 @@ { "term": "Daily at:", "context": "Daily at:", - "reference": "Modules/Settings/PersonalizationTab.qml:1278", + "reference": "Modules/Settings/WallpaperTab.qml:1034", "comment": "" }, { "term": "Dank", "context": "Dank", - "reference": "Modules/Settings/LauncherTab.qml:84", + "reference": "Modules/Settings/LauncherTab.qml:53", "comment": "" }, { "term": "Dank Bar", "context": "Dank Bar", - "reference": "Modals/Settings/SettingsSidebar.qml:32", + "reference": "Modals/Settings/SettingsSidebar.qml:53", "comment": "" }, { @@ -1403,22 +1499,28 @@ "reference": "Modals/Spotlight/FileSearchResults.qml:225", "comment": "" }, + { + "term": "DankShell & System Icons (requires restart)", + "context": "DankShell & System Icons (requires restart)", + "reference": "Modules/Settings/ThemeColorsTab.qml:755", + "comment": "" + }, { "term": "Dark Mode", "context": "Dark Mode", - "reference": "Modules/Settings/PersonalizationTab.qml:690, Modules/ControlCenter/Components/DragDropGrid.qml:601", + "reference": "Modules/Settings/WallpaperTab.qml:561, Modules/ControlCenter/Components/DragDropGrid.qml:601", "comment": "" }, { "term": "Darken Modal Background", "context": "Darken Modal Background", - "reference": "Modules/Settings/ThemeColorsTab.qml:920", + "reference": "Modules/Settings/ThemeColorsTab.qml:683", "comment": "" }, { "term": "Date Format", "context": "Date Format", - "reference": "Modules/Settings/TimeWeatherTab.qml:171", + "reference": "Modules/Settings/TimeWeatherTab.qml:55", "comment": "" }, { @@ -1454,13 +1556,13 @@ { "term": "Default", "context": "Default", - "reference": "Modules/Settings/LauncherTab.qml:203", + "reference": "Modules/Settings/LauncherTab.qml:162", "comment": "" }, { "term": "Default selected action", "context": "Default selected action", - "reference": "Modals/Settings/PowerSettings.qml:417", + "reference": "Modules/Settings/PowerSleepTab.qml:278", "comment": "" }, { @@ -1541,6 +1643,12 @@ "reference": "Modules/ControlCenter/Details/NetworkDetail.qml:760", "comment": "" }, + { + "term": "Disable Built-in Wallpapers", + "context": "wallpaper settings disable toggle", + "reference": "Modules/Settings/WallpaperTab.qml:1196", + "comment": "" + }, { "term": "Disabled", "context": "Disabled", @@ -1596,15 +1704,15 @@ "comment": "" }, { - "term": "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen", - "context": "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen", - "reference": "Modules/Settings/DockTab.qml:143", + "term": "Display a dock with pinned and running applications", + "context": "Display a dock with pinned and running applications", + "reference": "Modules/Settings/DockTab.qml:72", "comment": "" }, { "term": "Display all priorities over fullscreen apps", "context": "Display all priorities over fullscreen apps", - "reference": "Modules/Notifications/Center/NotificationSettings.qml:237", + "reference": "Modules/Settings/NotificationsTab.qml:137, Modules/Notifications/Center/NotificationSettings.qml:237", "comment": "" }, { @@ -1616,7 +1724,7 @@ { "term": "Display application icons in workspace indicators", "context": "Display application icons in workspace indicators", - "reference": "Modules/Settings/WidgetTweaksTab.qml:78", + "reference": "Modules/Settings/WorkspacesTab.qml:43", "comment": "" }, { @@ -1628,13 +1736,19 @@ { "term": "Display only workspaces that contain windows", "context": "Display only workspaces that contain windows", - "reference": "Modules/Settings/WidgetTweaksTab.qml:141", + "reference": "Modules/Settings/WorkspacesTab.qml:98", "comment": "" }, { "term": "Display power menu actions in a grid instead of a list", "context": "Display power menu actions in a grid instead of a list", - "reference": "Modals/Settings/PowerSettings.qml:408", + "reference": "Modules/Settings/PowerSleepTab.qml:271", + "comment": "" + }, + { + "term": "Display seconds in the clock", + "context": "Display seconds in the clock", + "reference": "Modules/Settings/TimeWeatherTab.qml:46", "comment": "" }, { @@ -1644,15 +1758,15 @@ "comment": "" }, { - "term": "Display volume and brightness percentage values by default in OSD popups", - "context": "Display volume and brightness percentage values by default in OSD popups", - "reference": "Modules/Settings/WidgetTweaksTab.qml:681", + "term": "Display volume and brightness percentage values in OSD popups", + "context": "Display volume and brightness percentage values in OSD popups", + "reference": "Modules/Settings/OSDTab.qml:84", "comment": "" }, { "term": "Displays", "context": "Displays", - "reference": "Modals/Settings/SettingsSidebar.qml:47", + "reference": "Modals/Settings/SettingsSidebar.qml:123", "comment": "" }, { @@ -1670,25 +1784,43 @@ { "term": "Do Not Disturb", "context": "Do Not Disturb", - "reference": "Modules/ControlCenter/Components/DragDropGrid.qml:603, Modules/Notifications/Center/NotificationHeader.qml:41, Modules/Notifications/Center/NotificationSettings.qml:131", + "reference": "Modules/Settings/NotificationsTab.qml:146, Modules/ControlCenter/Components/DragDropGrid.qml:603, Modules/Notifications/Center/NotificationHeader.qml:41, Modules/Notifications/Center/NotificationSettings.qml:131", "comment": "" }, { "term": "Dock", "context": "Dock", - "reference": "Modals/Settings/SettingsSidebar.qml:42", + "reference": "Modals/Settings/SettingsSidebar.qml:103", + "comment": "" + }, + { + "term": "Dock & Launcher", + "context": "Dock & Launcher", + "reference": "Modals/Settings/SettingsSidebar.qml:98", "comment": "" }, { "term": "Dock Position", "context": "Dock Position", - "reference": "Modules/Settings/DockTab.qml:53", + "reference": "Modules/Settings/DockTab.qml:25", "comment": "" }, { "term": "Dock Transparency", "context": "Dock Transparency", - "reference": "Modules/Settings/DockTab.qml:721", + "reference": "Modules/Settings/DockTab.qml:172", + "comment": "" + }, + { + "term": "Dock Visibility", + "context": "Dock Visibility", + "reference": "Modules/Settings/DockTab.qml:68", + "comment": "" + }, + { + "term": "Docs", + "context": "Docs", + "reference": "Modules/Settings/AboutTab.qml:212, Modules/Settings/AboutTab.qml:220", "comment": "" }, { @@ -1697,12 +1829,6 @@ "reference": "Modals/WifiPasswordModal.qml:490", "comment": "" }, - { - "term": "Donate on Ko-fi", - "context": "Donate on Ko-fi", - "reference": "Modules/Settings/AboutTab.qml:818", - "comment": "" - }, { "term": "Door Open", "context": "Door Open", @@ -1724,13 +1850,7 @@ { "term": "Duplicate Wallpaper with Blur", "context": "Duplicate Wallpaper with Blur", - "reference": "Modules/Settings/PersonalizationTab.qml:1462", - "comment": "" - }, - { - "term": "Duration", - "context": "Duration", - "reference": "Modules/Settings/PersonalizationTab.qml:1628", + "reference": "Modules/Settings/WallpaperTab.qml:1224", "comment": "" }, { @@ -1751,12 +1871,6 @@ "reference": "Services/WeatherService.qml:320", "comment": "" }, - { - "term": "Dynamic Theming", - "context": "Dynamic Theming", - "reference": "Modules/Settings/PersonalizationTab.qml:1772", - "comment": "" - }, { "term": "Edge Spacing (0 = edge-to-edge)", "context": "Edge Spacing (0 = edge-to-edge)", @@ -1787,6 +1901,12 @@ "reference": "Modules/Settings/DankBarTab.qml:1349", "comment": "" }, + { + "term": "Enable Do Not Disturb", + "context": "Enable Do Not Disturb", + "reference": "Modules/Settings/NotificationsTab.qml:149", + "comment": "" + }, { "term": "Enable GPU Temperature", "context": "Enable GPU Temperature", @@ -1796,19 +1916,19 @@ { "term": "Enable Overview Overlay", "context": "Enable Overview Overlay", - "reference": "Modules/Settings/LauncherTab.qml:686", + "reference": "Modules/Settings/LauncherTab.qml:338", "comment": "" }, { "term": "Enable System Sounds", "context": "Enable System Sounds", - "reference": "Modules/Settings/PersonalizationTab.qml:1928", + "reference": "Modules/Settings/SoundsTab.qml:34", "comment": "" }, { "term": "Enable Weather", "context": "Enable Weather", - "reference": "Modules/Settings/TimeWeatherTab.qml:476", + "reference": "Modules/Settings/TimeWeatherTab.qml:334", "comment": "" }, { @@ -1820,19 +1940,19 @@ { "term": "Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.", "context": "Enable compositor-targetable blur layer (namespace: dms:blurwallpaper). Requires manual niri configuration.", - "reference": "Modules/Settings/PersonalizationTab.qml:1469", + "reference": "Modules/Settings/WallpaperTab.qml:1225", "comment": "" }, { "term": "Enable fingerprint authentication", "context": "Enable fingerprint authentication", - "reference": "Modals/Settings/PowerSettings.qml:97", + "reference": "Modules/Settings/LockScreenTab.qml:65", "comment": "" }, { "term": "Enable loginctl lock integration", "context": "Enable loginctl lock integration", - "reference": "Modals/Settings/PowerSettings.qml:75", + "reference": "Modules/Settings/LockScreenTab.qml:45", "comment": "" }, { @@ -1850,19 +1970,19 @@ { "term": "Enter 6-digit passkey", "context": "Enter 6-digit passkey", - "reference": "Modals/BluetoothPairingModal.qml:205", + "reference": "Modals/BluetoothPairingModal.qml:211", "comment": "" }, { "term": "Enter PIN", "context": "Enter PIN", - "reference": "Modals/BluetoothPairingModal.qml:170", + "reference": "Modals/BluetoothPairingModal.qml:176", "comment": "" }, { "term": "Enter PIN for ", "context": "Enter PIN for ", - "reference": "Modals/BluetoothPairingModal.qml:131", + "reference": "Modals/BluetoothPairingModal.qml:137", "comment": "" }, { @@ -1880,13 +2000,13 @@ { "term": "Enter custom lock screen format (e.g., dddd, MMMM d)", "context": "Enter custom lock screen format (e.g., dddd, MMMM d)", - "reference": "Modules/Settings/TimeWeatherTab.qml:335", + "reference": "Modules/Settings/TimeWeatherTab.qml:219", "comment": "" }, { "term": "Enter custom top bar format (e.g., ddd MMM d)", "context": "Enter custom top bar format (e.g., ddd MMM d)", - "reference": "Modules/Settings/TimeWeatherTab.qml:322", + "reference": "Modules/Settings/TimeWeatherTab.qml:131", "comment": "" }, { @@ -1898,7 +2018,7 @@ { "term": "Enter passkey for ", "context": "Enter passkey for ", - "reference": "Modals/BluetoothPairingModal.qml:133", + "reference": "Modals/BluetoothPairingModal.qml:139", "comment": "" }, { @@ -1910,7 +2030,7 @@ { "term": "Enter this passkey on ", "context": "Enter this passkey on ", - "reference": "Modals/BluetoothPairingModal.qml:127", + "reference": "Modals/BluetoothPairingModal.qml:133", "comment": "" }, { @@ -1934,13 +2054,13 @@ { "term": "Exclusive Zone Offset", "context": "Exclusive Zone Offset", - "reference": "Modules/Settings/DockTab.qml:573, Modules/Settings/DockTab.qml:587, Modules/Settings/DankBarTab.qml:1989, Modules/Settings/DankBarTab.qml:2003", + "reference": "Modules/Settings/DockTab.qml:148, Modules/Settings/DankBarTab.qml:1989, Modules/Settings/DankBarTab.qml:2003", "comment": "" }, { - "term": "Execute templates from ~/.config/matugen/config.toml", - "context": "Execute templates from ~/.config/matugen/config.toml", - "reference": "Modules/Settings/PersonalizationTab.qml:1865", + "term": "External Wallpaper Management", + "context": "wallpaper settings external management", + "reference": "Modules/Settings/WallpaperTab.qml:1190", "comment": "" }, { @@ -1952,13 +2072,13 @@ { "term": "Fade grace period", "context": "Fade grace period", - "reference": "Modals/Settings/PowerSettings.qml:179", + "reference": "Modules/Settings/PowerSleepTab.qml:84", "comment": "" }, { "term": "Fade to lock screen", "context": "Fade to lock screen", - "reference": "Modals/Settings/PowerSettings.qml:166", + "reference": "Modules/Settings/PowerSleepTab.qml:73", "comment": "" }, { @@ -1970,7 +2090,7 @@ { "term": "Failed to add binds include", "context": "Failed to add binds include", - "reference": "Services/KeybindsService.qml:143", + "reference": "Services/KeybindsService.qml:162", "comment": "" }, { @@ -2108,7 +2228,7 @@ { "term": "Failed to remove keybind", "context": "Failed to remove keybind", - "reference": "Services/KeybindsService.qml:120", + "reference": "Services/KeybindsService.qml:139", "comment": "" }, { @@ -2132,7 +2252,7 @@ { "term": "Failed to save keybind", "context": "Failed to save keybind", - "reference": "Services/KeybindsService.qml:96", + "reference": "Services/KeybindsService.qml:115", "comment": "" }, { @@ -2186,7 +2306,7 @@ { "term": "Feels Like", "context": "Feels Like", - "reference": "Modules/Settings/TimeWeatherTab.qml:1082", + "reference": "Modules/Settings/TimeWeatherTab.qml:795", "comment": "" }, { @@ -2207,6 +2327,12 @@ "reference": "Modals/FileBrowser/FileInfo.qml:137", "comment": "" }, + { + "term": "Files", + "context": "Files", + "reference": "Modules/AppDrawer/AppDrawerPopout.qml:242", + "comment": "" + }, { "term": "Find in Text", "context": "Find in Text", @@ -2219,16 +2345,28 @@ "reference": "Modules/Notepad/NotepadTextEditor.qml:268", "comment": "" }, + { + "term": "Fine-tune animation timing in milliseconds", + "context": "Fine-tune animation timing in milliseconds", + "reference": "Modules/Settings/TypographyMotionTab.qml:253", + "comment": "" + }, + { + "term": "First Time Setup", + "context": "First Time Setup", + "reference": "Modules/Settings/KeybindsTab.qml:305", + "comment": "" + }, { "term": "Fix Now", "context": "Fix Now", - "reference": "Modules/Settings/KeybindsTab.qml:288", + "reference": "Modules/Settings/KeybindsTab.qml:352", "comment": "" }, { "term": "Fixing...", "context": "Fixing...", - "reference": "Modules/Settings/KeybindsTab.qml:288", + "reference": "Modules/Settings/KeybindsTab.qml:349", "comment": "" }, { @@ -2240,19 +2378,13 @@ { "term": "Font Family", "context": "Font Family", - "reference": "Modules/Notepad/NotepadSettings.qml:211, Modules/Settings/ThemeColorsTab.qml:983", + "reference": "Modules/Notepad/NotepadSettings.qml:211", "comment": "" }, { "term": "Font Scale", "context": "Font Scale", - "reference": "Modules/Settings/ThemeColorsTab.qml:1103", - "comment": "" - }, - { - "term": "Font Settings", - "context": "Font Settings", - "reference": "Modules/Settings/ThemeColorsTab.qml:974", + "reference": "Modules/Settings/TypographyMotionTab.qml:194", "comment": "" }, { @@ -2264,7 +2396,7 @@ { "term": "Font Weight", "context": "Font Weight", - "reference": "Modules/Settings/ThemeColorsTab.qml:1004", + "reference": "Modules/Settings/TypographyMotionTab.qml:125", "comment": "" }, { @@ -2276,7 +2408,7 @@ { "term": "Force terminal applications to always use dark color schemes", "context": "Force terminal applications to always use dark color schemes", - "reference": "Modules/Settings/ThemeColorsTab.qml:1222", + "reference": "Modules/Settings/ThemeColorsTab.qml:711", "comment": "" }, { @@ -2312,7 +2444,7 @@ { "term": "Format Legend", "context": "Format Legend", - "reference": "Modules/Settings/TimeWeatherTab.qml:359", + "reference": "Modules/Settings/TimeWeatherTab.qml:248", "comment": "" }, { @@ -2364,9 +2496,9 @@ "comment": "" }, { - "term": "Github:", - "context": "Github:", - "reference": "Modules/Settings/AboutTab.qml:550", + "term": "GitHub", + "context": "GitHub", + "reference": "Modules/Settings/AboutTab.qml:244", "comment": "" }, { @@ -2378,7 +2510,7 @@ { "term": "Good", "context": "Good", - "reference": "Modules/Settings/TimeWeatherTab.qml:1344", + "reference": "Modules/Settings/TimeWeatherTab.qml:1036", "comment": "" }, { @@ -2396,7 +2528,7 @@ { "term": "Gradually fade the screen before locking with a configurable grace period", "context": "Gradually fade the screen before locking with a configurable grace period", - "reference": "Modals/Settings/PowerSettings.qml:167", + "reference": "Modules/Settings/PowerSleepTab.qml:74", "comment": "" }, { @@ -2414,25 +2546,25 @@ { "term": "Grid Columns", "context": "Grid Columns", - "reference": "Modules/Settings/LauncherTab.qml:555", + "reference": "Modules/Settings/LauncherTab.qml:314", "comment": "" }, { "term": "Group by App", "context": "Group by App", - "reference": "Modules/Settings/DockTab.qml:309", + "reference": "Modules/Settings/DockTab.qml:100", "comment": "" }, { "term": "Group multiple windows of the same app together with a window count indicator", "context": "Group multiple windows of the same app together with a window count indicator", - "reference": "Modules/Settings/DockTab.qml:316", + "reference": "Modules/Settings/DockTab.qml:101", "comment": "" }, { "term": "HSV", "context": "HSV", - "reference": "Modals/DankColorPickerModal.qml:640", + "reference": "Modals/DankColorPickerModal.qml:646", "comment": "" }, { @@ -2450,13 +2582,13 @@ { "term": "Hex", "context": "Hex", - "reference": "Modals/DankColorPickerModal.qml:517", + "reference": "Modals/DankColorPickerModal.qml:523", "comment": "" }, { "term": "Hibernate", "context": "Hibernate", - "reference": "Modals/PowerMenuModal.qml:206, Modules/Lock/LockPowerMenu.qml:90", + "reference": "Modals/PowerMenuModal.qml:212, Modules/Lock/LockPowerMenu.qml:90", "comment": "" }, { @@ -2468,7 +2600,7 @@ { "term": "Hide the dock when not in use and reveal it when hovering near the dock area", "context": "Hide the dock when not in use and reveal it when hovering near the dock area", - "reference": "Modules/Settings/DockTab.qml:196", + "reference": "Modules/Settings/DockTab.qml:79", "comment": "" }, { @@ -2486,31 +2618,31 @@ { "term": "Hold Duration", "context": "Hold Duration", - "reference": "Modals/Settings/PowerSettings.qml:604", + "reference": "Modules/Settings/PowerSleepTab.qml:375", "comment": "" }, { "term": "Hold longer to confirm", "context": "Hold longer to confirm", - "reference": "Modals/PowerMenuModal.qml:787", + "reference": "Modals/PowerMenuModal.qml:793", "comment": "" }, { "term": "Hold to Confirm Power Actions", "context": "Hold to Confirm Power Actions", - "reference": "Modals/Settings/PowerSettings.qml:586", + "reference": "Modules/Settings/PowerSleepTab.qml:368", "comment": "" }, { "term": "Hold to confirm (%1s)", "context": "Hold to confirm (%1s)", - "reference": "Modals/PowerMenuModal.qml:789, Modals/PowerMenuModal.qml:790", + "reference": "Modals/PowerMenuModal.qml:795, Modals/PowerMenuModal.qml:796", "comment": "" }, { "term": "Hotkey overlay title (optional)", "context": "Hotkey overlay title (optional)", - "reference": "Widgets/KeybindItem.qml:913", + "reference": "Widgets/KeybindItem.qml:1045", "comment": "" }, { @@ -2525,22 +2657,28 @@ "reference": "Modules/DankDash/WeatherTab.qml:875", "comment": "" }, + { + "term": "How long to hold the button to confirm the action", + "context": "How long to hold the button to confirm the action", + "reference": "Modules/Settings/PowerSleepTab.qml:376", + "comment": "" + }, { "term": "How often to change wallpaper", "context": "How often to change wallpaper", - "reference": "Modules/Settings/PersonalizationTab.qml:1224", + "reference": "Modules/Settings/WallpaperTab.qml:983", "comment": "" }, { "term": "Humidity", "context": "Humidity", - "reference": "Modules/Settings/TimeWeatherTab.qml:1129, Modules/DankBar/Widgets/WeatherForecastCard.qml:60", + "reference": "Modules/Settings/TimeWeatherTab.qml:839, Modules/DankBar/Widgets/WeatherForecastCard.qml:60", "comment": "" }, { "term": "I Understand", "context": "I Understand", - "reference": "Modules/Settings/PluginBrowser.qml:636", + "reference": "Modules/Settings/PluginBrowser.qml:640", "comment": "" }, { @@ -2558,13 +2696,13 @@ { "term": "Icon Size", "context": "Icon Size", - "reference": "Modules/Settings/DockTab.qml:422", + "reference": "Modules/Settings/DockTab.qml:124", "comment": "" }, { "term": "Icon Theme", "context": "Icon Theme", - "reference": "Modules/Settings/ThemeColorsTab.qml:1292", + "reference": "Modules/Settings/ThemeColorsTab.qml:754", "comment": "" }, { @@ -2576,25 +2714,19 @@ { "term": "Idle Inhibitor", "context": "Idle Inhibitor", - "reference": "Modules/Settings/DankBarTab.qml:485", - "comment": "" - }, - { - "term": "Idle Inhibitor OSD", - "context": "Idle Inhibitor OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:832", + "reference": "Modules/Settings/DankBarTab.qml:485, Modules/Settings/OSDTab.qml:118", "comment": "" }, { "term": "Idle Settings", "context": "Idle Settings", - "reference": "Modals/Settings/PowerSettings.qml:132", + "reference": "Modules/Settings/PowerSleepTab.qml:33", "comment": "" }, { "term": "Idle monitoring not supported - requires newer Quickshell version", "context": "Idle monitoring not supported - requires newer Quickshell version", - "reference": "Modals/Settings/PowerSettings.qml:354", + "reference": "Modules/Settings/PowerSleepTab.qml:248", "comment": "" }, { @@ -2615,10 +2747,16 @@ "reference": "Widgets/VpnDetailContent.qml:22, Modules/Settings/NetworkTab.qml:28", "comment": "" }, + { + "term": "Inactive Monitor Color", + "context": "Inactive Monitor Color", + "reference": "Modules/Settings/LockScreenTab.qml:140, Modules/Settings/LockScreenTab.qml:171", + "comment": "" + }, { "term": "Include Transitions", "context": "Include Transitions", - "reference": "Modules/Settings/PersonalizationTab.qml:1390", + "reference": "Modules/Settings/WallpaperTab.qml:1148", "comment": "" }, { @@ -2630,7 +2768,7 @@ { "term": "Indicator Style", "context": "Indicator Style", - "reference": "Modules/Settings/DockTab.qml:369", + "reference": "Modules/Settings/DockTab.qml:107", "comment": "" }, { @@ -2648,7 +2786,7 @@ { "term": "Inhibit idle timeout when audio or video is playing", "context": "Inhibit idle timeout when audio or video is playing", - "reference": "Modals/Settings/PowerSettings.qml:158", + "reference": "Modules/Settings/PowerSleepTab.qml:66", "comment": "" }, { @@ -2660,7 +2798,7 @@ { "term": "Install plugins from the DMS plugin registry", "context": "Install plugins from the DMS plugin registry", - "reference": "Modules/Settings/PluginBrowser.qml:224", + "reference": "Modules/Settings/PluginBrowser.qml:228", "comment": "" }, { @@ -2684,13 +2822,13 @@ { "term": "Interval", "context": "Interval", - "reference": "Modules/Settings/PersonalizationTab.qml:1223", + "reference": "Modules/Settings/WallpaperTab.qml:982", "comment": "" }, { "term": "Invert on mode change", "context": "Invert on mode change", - "reference": "Modules/Settings/LauncherTab.qml:389", + "reference": "Modules/Settings/LauncherTab.qml:272", "comment": "" }, { @@ -2726,7 +2864,7 @@ { "term": "Key", "context": "Key", - "reference": "Widgets/KeybindItem.qml:398", + "reference": "Widgets/KeybindItem.qml:530", "comment": "" }, { @@ -2738,13 +2876,13 @@ { "term": "Keyboard Shortcuts", "context": "Keyboard Shortcuts", - "reference": "Modals/Settings/SettingsSidebar.qml:26, Modules/Settings/KeybindsTab.qml:181", + "reference": "Modals/Settings/SettingsSidebar.qml:116, Modules/Settings/KeybindsTab.qml:202", "comment": "" }, { "term": "Keys", "context": "Keys", - "reference": "Widgets/KeybindItem.qml:311", + "reference": "Widgets/KeybindItem.qml:443", "comment": "" }, { @@ -2753,70 +2891,76 @@ "reference": "Modules/ProcessList/ProcessContextMenu.qml:171", "comment": "" }, + { + "term": "Ko-fi", + "context": "Ko-fi", + "reference": "Modules/Settings/AboutTab.qml:260, Modules/Settings/AboutTab.qml:268", + "comment": "" + }, { "term": "Last launched %1", "context": "Last launched %1", - "reference": "Modules/Settings/LauncherTab.qml:885", + "reference": "Modules/Settings/LauncherTab.qml:471", "comment": "" }, { "term": "Last launched %1 day%2 ago", "context": "Last launched %1 day%2 ago", - "reference": "Modules/Settings/LauncherTab.qml:883", + "reference": "Modules/Settings/LauncherTab.qml:470", "comment": "" }, { "term": "Last launched %1 hour%2 ago", "context": "Last launched %1 hour%2 ago", - "reference": "Modules/Settings/LauncherTab.qml:880", + "reference": "Modules/Settings/LauncherTab.qml:468", "comment": "" }, { "term": "Last launched %1 minute%2 ago", "context": "Last launched %1 minute%2 ago", - "reference": "Modules/Settings/LauncherTab.qml:877", + "reference": "Modules/Settings/LauncherTab.qml:466", "comment": "" }, { "term": "Last launched just now", "context": "Last launched just now", - "reference": "Modules/Settings/LauncherTab.qml:874", + "reference": "Modules/Settings/LauncherTab.qml:464", "comment": "" }, { "term": "Latitude", "context": "Latitude", - "reference": "Modules/Settings/DisplaysTab.qml:486, Modules/Settings/TimeWeatherTab.qml:661", + "reference": "Modules/Settings/DisplaysTab.qml:486, Modules/Settings/TimeWeatherTab.qml:417", "comment": "" }, { "term": "Launch", "context": "Launch", - "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:51, Modules/AppDrawer/AppDrawerPopout.qml:747", + "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:51, Modules/AppDrawer/AppDrawerPopout.qml:838", "comment": "" }, { "term": "Launch Prefix", "context": "Launch Prefix", - "reference": "Modules/Settings/LauncherTab.qml:439", + "reference": "Modules/Settings/LauncherTab.qml:283", "comment": "" }, { "term": "Launch on dGPU", "context": "Launch on dGPU", - "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:62, Modules/AppDrawer/AppDrawerPopout.qml:807, Modules/Dock/DockContextMenu.qml:432", + "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:62, Modules/AppDrawer/AppDrawerPopout.qml:898, Modules/Dock/DockContextMenu.qml:432", "comment": "" }, { "term": "Launcher", "context": "Launcher", - "reference": "Modals/Settings/SettingsSidebar.qml:64", + "reference": "Modals/Settings/SettingsSidebar.qml:108", "comment": "" }, { "term": "Launcher Button Logo", "context": "Launcher Button Logo", - "reference": "Modules/Settings/LauncherTab.qml:60", + "reference": "Modules/Settings/LauncherTab.qml:35", "comment": "" }, { @@ -2840,7 +2984,7 @@ { "term": "Light Mode", "context": "Light Mode", - "reference": "Modules/Settings/PersonalizationTab.qml:501, Modules/Settings/PersonalizationTab.qml:1519", + "reference": "Modules/Settings/ThemeColorsTab.qml:580, Modules/Settings/WallpaperTab.qml:377", "comment": "" }, { @@ -2858,13 +3002,13 @@ { "term": "Loading keybinds...", "context": "Loading keybinds...", - "reference": "Modules/Settings/KeybindsTab.qml:496", + "reference": "Modules/Settings/KeybindsTab.qml:561", "comment": "" }, { "term": "Loading plugins...", "context": "Loading plugins...", - "reference": "Modules/Settings/PluginBrowser.qml:292", + "reference": "Modules/Settings/PluginBrowser.qml:296", "comment": "" }, { @@ -2888,37 +3032,49 @@ { "term": "Location Search", "context": "Location Search", - "reference": "Modules/Settings/TimeWeatherTab.qml:765", + "reference": "Modules/Settings/TimeWeatherTab.qml:517", "comment": "" }, { "term": "Lock", "context": "Lock", - "reference": "Modals/PowerMenuModal.qml:194", + "reference": "Modals/PowerMenuModal.qml:200", "comment": "" }, { "term": "Lock Screen", "context": "Lock Screen", - "reference": "Modals/Settings/PowerSettings.qml:48", + "reference": "Modals/Settings/SettingsSidebar.qml:148, Modules/Settings/LockScreenTab.qml:26", + "comment": "" + }, + { + "term": "Lock Screen Display", + "context": "Lock Screen Display", + "reference": "Modules/Settings/LockScreenTab.qml:76", "comment": "" }, { "term": "Lock Screen Format", "context": "Lock Screen Format", - "reference": "Modules/Settings/TimeWeatherTab.qml:250", + "reference": "Modules/Settings/TimeWeatherTab.qml:150", "comment": "" }, { "term": "Lock before suspend", "context": "Lock before suspend", - "reference": "Modals/Settings/PowerSettings.qml:88", + "reference": "Modules/Settings/LockScreenTab.qml:57", "comment": "" }, { "term": "Log Out", "context": "Log Out", - "reference": "Modals/PowerMenuModal.qml:182, Modules/Lock/LockPowerMenu.qml:84", + "reference": "Modals/PowerMenuModal.qml:188, Modules/Lock/LockPowerMenu.qml:84", + "comment": "" + }, + { + "term": "Long", + "context": "Long", + "reference": "Modules/Settings/TypographyMotionTab.qml:222", "comment": "" }, { @@ -2930,13 +3086,13 @@ { "term": "Longitude", "context": "Longitude", - "reference": "Modules/Settings/DisplaysTab.qml:509, Modules/Settings/TimeWeatherTab.qml:712", + "reference": "Modules/Settings/DisplaysTab.qml:509, Modules/Settings/TimeWeatherTab.qml:466", "comment": "" }, { "term": "Low Priority", "context": "Low Priority", - "reference": "Modules/Notifications/Center/NotificationSettings.qml:160", + "reference": "Modules/Settings/NotificationsTab.qml:162, Modules/Notifications/Center/NotificationSettings.qml:160", "comment": "" }, { @@ -2984,7 +3140,7 @@ { "term": "Margin", "context": "Margin", - "reference": "Modules/Settings/DockTab.qml:636, Modules/Settings/DockTab.qml:650", + "reference": "Modules/Settings/DockTab.qml:157", "comment": "" }, { @@ -3014,31 +3170,25 @@ { "term": "Material Colors", "context": "Material Colors", - "reference": "Modals/DankColorPickerModal.qml:370", + "reference": "Modals/DankColorPickerModal.qml:376", "comment": "" }, { "term": "Matugen Palette", "context": "Matugen Palette", - "reference": "Modules/Settings/ThemeColorsTab.qml:595, Modules/Settings/PersonalizationTab.qml:1804", - "comment": "" - }, - { - "term": "Matugen Settings", - "context": "Matugen Settings", - "reference": "Modules/Settings/PersonalizationTab.qml:1747", + "reference": "Modules/Settings/ThemeColorsTab.qml:495", "comment": "" }, { "term": "Matugen Target Monitor", "context": "Matugen Target Monitor", - "reference": "Modules/Settings/PersonalizationTab.qml:1033", + "reference": "Modules/Settings/WallpaperTab.qml:827", "comment": "" }, { "term": "Max apps to show", "context": "Max apps to show", - "reference": "Modules/Settings/WidgetTweaksTab.qml:99", + "reference": "Modules/Settings/WorkspacesTab.qml:62", "comment": "" }, { @@ -3077,10 +3227,16 @@ "reference": "Services/CupsService.qml:782", "comment": "" }, + { + "term": "Media Player", + "context": "Media Player", + "reference": "Modals/Settings/SettingsSidebar.qml:69", + "comment": "" + }, { "term": "Media Player Settings", "context": "Media Player Settings", - "reference": "Modules/Settings/WidgetTweaksTab.qml:189", + "reference": "Modules/Settings/MediaPlayerTab.qml:24", "comment": "" }, { @@ -3090,9 +3246,15 @@ "comment": "" }, { - "term": "Media Volume OSD", - "context": "Media Volume OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:812", + "term": "Media Volume", + "context": "Media Volume", + "reference": "Modules/Settings/OSDTab.qml:104", + "comment": "" + }, + { + "term": "Medium", + "context": "Medium", + "reference": "Modules/Settings/TypographyMotionTab.qml:222", "comment": "" }, { @@ -3120,9 +3282,9 @@ "comment": "" }, { - "term": "Microphone Mute OSD", - "context": "Microphone Mute OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:842", + "term": "Microphone Mute", + "context": "Microphone Mute", + "reference": "Modules/Settings/OSDTab.qml:125", "comment": "" }, { @@ -3152,7 +3314,7 @@ { "term": "Mode:", "context": "Mode:", - "reference": "Modules/Settings/PersonalizationTab.qml:1152", + "reference": "Modules/Settings/WallpaperTab.qml:913", "comment": "" }, { @@ -3167,16 +3329,10 @@ "reference": "Modules/Settings/PrinterTab.qml:823, Modules/Settings/DisplaysTab.qml:628", "comment": "" }, - { - "term": "Monitor Selection:", - "context": "Monitor Selection:", - "reference": "Modules/Settings/PersonalizationTab.qml:991", - "comment": "" - }, { "term": "Monitor whose wallpaper drives dynamic theming colors", "context": "Monitor whose wallpaper drives dynamic theming colors", - "reference": "Modules/Settings/PersonalizationTab.qml:1034", + "reference": "Modules/Settings/WallpaperTab.qml:828", "comment": "" }, { @@ -3188,7 +3344,7 @@ { "term": "Monospace Font", "context": "Monospace Font", - "reference": "Modules/Settings/ThemeColorsTab.qml:1070", + "reference": "Modules/Settings/TypographyMotionTab.qml:99", "comment": "" }, { @@ -3230,7 +3386,7 @@ { "term": "Named Workspace Icons", "context": "Named Workspace Icons", - "reference": "Modules/Settings/WidgetTweaksTab.qml:441", + "reference": "Modules/Settings/WorkspacesTab.qml:116", "comment": "" }, { @@ -3242,7 +3398,7 @@ { "term": "Network", "context": "Network", - "reference": "Services/CupsService.qml:131, Modals/Settings/SettingsSidebar.qml:52, Modules/ProcessList/PerformanceTab.qml:342, Modules/Settings/WidgetsTabSection.qml:800", + "reference": "Services/CupsService.qml:131, Modals/Settings/SettingsSidebar.qml:129, Modules/ProcessList/PerformanceTab.qml:342, Modules/Settings/WidgetsTabSection.qml:800", "comment": "" }, { @@ -3281,6 +3437,12 @@ "reference": "Modules/Settings/DankBarTab.qml:514", "comment": "" }, + { + "term": "Never", + "context": "Never", + "reference": "Modules/Settings/NotificationsTab.qml:11, Modules/Settings/NotificationsTab.qml:68", + "comment": "" + }, { "term": "New", "context": "New", @@ -3290,25 +3452,25 @@ { "term": "New Key", "context": "New Key", - "reference": "Widgets/KeybindItem.qml:398", + "reference": "Widgets/KeybindItem.qml:530", "comment": "" }, { "term": "New Keybind", "context": "New Keybind", - "reference": "Modules/Settings/KeybindsTab.qml:410", + "reference": "Modules/Settings/KeybindsTab.qml:475", "comment": "" }, { "term": "New Notification", "context": "New Notification", - "reference": "Modules/Settings/PersonalizationTab.qml:2042", + "reference": "Modules/Settings/SoundsTab.qml:96", "comment": "" }, { "term": "New York, NY", "context": "New York, NY", - "reference": "Modules/Settings/TimeWeatherTab.qml:775", + "reference": "Modules/Settings/TimeWeatherTab.qml:527", "comment": "" }, { @@ -3329,10 +3491,16 @@ "reference": "Modules/Settings/DisplaysTab.qml:202", "comment": "" }, + { + "term": "Niri Integration", + "context": "Niri Integration", + "reference": "Modules/Settings/LauncherTab.qml:327", + "comment": "" + }, { "term": "Niri compositor actions (focus, move, etc.)", "context": "Niri compositor actions (focus, move, etc.)", - "reference": "Widgets/KeybindItem.qml:576", + "reference": "Widgets/KeybindItem.qml:708", "comment": "" }, { @@ -3374,13 +3542,13 @@ { "term": "No Weather Data Available", "context": "No Weather Data Available", - "reference": "Modules/DankDash/WeatherTab.qml:71, Modules/Settings/TimeWeatherTab.qml:849", + "reference": "Modules/DankDash/WeatherTab.qml:71, Modules/Settings/TimeWeatherTab.qml:565", "comment": "" }, { "term": "No action", "context": "No action", - "reference": "Widgets/KeybindItem.qml:211", + "reference": "Widgets/KeybindItem.qml:283", "comment": "" }, { @@ -3392,13 +3560,13 @@ { "term": "No changes", "context": "No changes", - "reference": "Widgets/KeybindItem.qml:947", + "reference": "Widgets/KeybindItem.qml:1079", "comment": "" }, { "term": "No clipboard entries found", "context": "No clipboard entries found", - "reference": "Modals/Clipboard/ClipboardContent.qml:115", + "reference": "Modals/Clipboard/ClipboardContent.qml:119", "comment": "" }, { @@ -3428,7 +3596,7 @@ { "term": "No keybinds found", "context": "No keybinds found", - "reference": "Modules/Settings/KeybindsTab.qml:504", + "reference": "Modules/Settings/KeybindsTab.qml:569", "comment": "" }, { @@ -3440,7 +3608,7 @@ { "term": "No plugins found", "context": "No plugins found", - "reference": "Modules/Settings/PluginBrowser.qml:520", + "reference": "Modules/Settings/PluginBrowser.qml:524", "comment": "" }, { @@ -3470,13 +3638,19 @@ { "term": "None", "context": "None", - "reference": "Services/CupsService.qml:766", + "reference": "Services/CupsService.qml:766, Modules/Settings/TypographyMotionTab.qml:222", + "comment": "" + }, + { + "term": "Normal Font", + "context": "Normal Font", + "reference": "Modules/Settings/TypographyMotionTab.qml:80", "comment": "" }, { "term": "Normal Priority", "context": "Normal Priority", - "reference": "Modules/Notifications/Center/NotificationSettings.qml:175", + "reference": "Modules/Settings/NotificationsTab.qml:177, Modules/Notifications/Center/NotificationSettings.qml:175", "comment": "" }, { @@ -3488,7 +3662,7 @@ { "term": "Notepad", "context": "Notepad", - "reference": "DMSShell.qml:547, Modules/Settings/DankBarTab.qml:527", + "reference": "DMSShell.qml:545, Modules/Settings/DankBarTab.qml:527", "comment": "" }, { @@ -3518,13 +3692,13 @@ { "term": "Notification Overlay", "context": "Notification Overlay", - "reference": "Modules/Notifications/Center/NotificationSettings.qml:231", + "reference": "Modules/Settings/NotificationsTab.qml:136, Modules/Notifications/Center/NotificationSettings.qml:231", "comment": "" }, { "term": "Notification Popups", "context": "Notification Popups", - "reference": "Modules/Settings/DisplaysTab.qml:34, Modules/Settings/WidgetTweaksTab.qml:585", + "reference": "Modules/Settings/DisplaysTab.qml:34, Modules/Settings/NotificationsTab.qml:91", "comment": "" }, { @@ -3536,7 +3710,7 @@ { "term": "Notification Timeouts", "context": "Notification Timeouts", - "reference": "Modules/Notifications/Center/NotificationSettings.qml:153", + "reference": "Modules/Settings/NotificationsTab.qml:159, Modules/Notifications/Center/NotificationSettings.qml:153", "comment": "" }, { @@ -3548,7 +3722,7 @@ { "term": "Notifications", "context": "Notifications", - "reference": "Modules/Notifications/Center/NotificationHeader.qml:25", + "reference": "Modals/Settings/SettingsSidebar.qml:74, Modules/Notifications/Center/NotificationHeader.qml:25", "comment": "" }, { @@ -3560,13 +3734,13 @@ { "term": "OS Logo", "context": "OS Logo", - "reference": "Modules/Settings/LauncherTab.qml:84", + "reference": "Modules/Settings/LauncherTab.qml:53", "comment": "" }, { "term": "OSD Position", "context": "OSD Position", - "reference": "Modules/Settings/WidgetTweaksTab.qml:744", + "reference": "Modules/Settings/OSDTab.qml:27", "comment": "" }, { @@ -3590,7 +3764,7 @@ { "term": "On-screen Displays", "context": "On-screen Displays", - "reference": "Modules/Settings/WidgetTweaksTab.qml:728", + "reference": "Modals/Settings/SettingsSidebar.qml:79, Modules/Settings/OSDTab.qml:24", "comment": "" }, { @@ -3602,13 +3776,13 @@ { "term": "Only visible if hibernate is supported by your system", "context": "Only visible if hibernate is supported by your system", - "reference": "Modals/Settings/PowerSettings.qml:533", + "reference": "Modules/Settings/PowerSleepTab.qml:337", "comment": "" }, { "term": "Opacity", "context": "Opacity", - "reference": "Modals/DankColorPickerModal.qml:472", + "reference": "Modals/DankColorPickerModal.qml:478", "comment": "" }, { @@ -3632,7 +3806,7 @@ { "term": "Open with...", "context": "Open with...", - "reference": "DMSShell.qml:442, Modals/BrowserPickerModal.qml:11", + "reference": "DMSShell.qml:440, Modals/BrowserPickerModal.qml:11", "comment": "" }, { @@ -3689,16 +3863,22 @@ "reference": "Services/CupsService.qml:790", "comment": "" }, + { + "term": "Overridden by config", + "context": "Overridden by config", + "reference": "Widgets/KeybindItem.qml:324", + "comment": "" + }, { "term": "Override", "context": "Override", - "reference": "Widgets/KeybindItem.qml:238", + "reference": "Widgets/KeybindItem.qml:310", "comment": "" }, { "term": "Overrides", "context": "Overrides", - "reference": "Modules/Settings/KeybindsTab.qml:70", + "reference": "Modules/Settings/KeybindsTab.qml:73", "comment": "" }, { @@ -3728,31 +3908,31 @@ { "term": "Padding", "context": "Padding", - "reference": "Modules/Settings/DockTab.qml:510, Modules/Settings/DockTab.qml:524", + "reference": "Modules/Settings/DockTab.qml:139", "comment": "" }, { "term": "Pair", "context": "Pair", - "reference": "Modals/BluetoothPairingModal.qml:318", + "reference": "Modals/BluetoothPairingModal.qml:324", "comment": "" }, { "term": "Pair Bluetooth Device", "context": "Pair Bluetooth Device", - "reference": "Modals/BluetoothPairingModal.qml:115", + "reference": "Modals/BluetoothPairingModal.qml:121", "comment": "" }, { "term": "Pairing failed", "context": "Pairing failed", - "reference": "Modals/BluetoothPairingModal.qml:394, Modules/ControlCenter/Details/BluetoothDetail.qml:47", + "reference": "Modals/BluetoothPairingModal.qml:400, Modules/ControlCenter/Details/BluetoothDetail.qml:47", "comment": "" }, { "term": "Passkey:", "context": "Passkey:", - "reference": "Modals/BluetoothPairingModal.qml:229", + "reference": "Modals/BluetoothPairingModal.qml:235", "comment": "" }, { @@ -3782,19 +3962,19 @@ { "term": "Per-Mode Wallpapers", "context": "Per-Mode Wallpapers", - "reference": "Modules/Settings/PersonalizationTab.qml:461", + "reference": "Modules/Settings/WallpaperTab.qml:355", "comment": "" }, { "term": "Per-Monitor Wallpapers", "context": "Per-Monitor Wallpapers", - "reference": "Modules/Settings/PersonalizationTab.qml:959", + "reference": "Modules/Settings/WallpaperTab.qml:774", "comment": "" }, { "term": "Per-Monitor Workspaces", "context": "Per-Monitor Workspaces", - "reference": "Modules/Settings/WidgetTweaksTab.qml:130", + "reference": "Modules/Settings/WorkspacesTab.qml:90", "comment": "" }, { @@ -3812,13 +3992,13 @@ { "term": "Personalization", "context": "Personalization", - "reference": "Modals/Settings/SettingsSidebar.qml:16", + "reference": "Modals/Settings/SettingsSidebar.qml:20", "comment": "" }, { "term": "Pin to Dock", "context": "Pin to Dock", - "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:26, Modules/AppDrawer/AppDrawerPopout.qml:610, Modules/Dock/DockContextMenu.qml:379", + "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:26, Modules/AppDrawer/AppDrawerPopout.qml:701, Modules/Dock/DockContextMenu.qml:379", "comment": "" }, { @@ -3836,25 +4016,25 @@ { "term": "Play sound when new notification arrives", "context": "Play sound when new notification arrives", - "reference": "Modules/Settings/PersonalizationTab.qml:2048", + "reference": "Modules/Settings/SoundsTab.qml:97", "comment": "" }, { "term": "Play sound when power cable is connected", "context": "Play sound when power cable is connected", - "reference": "Modules/Settings/PersonalizationTab.qml:2117", + "reference": "Modules/Settings/SoundsTab.qml:118", "comment": "" }, { "term": "Play sound when volume is adjusted", "context": "Play sound when volume is adjusted", - "reference": "Modules/Settings/PersonalizationTab.qml:2082", + "reference": "Modules/Settings/SoundsTab.qml:107", "comment": "" }, { "term": "Play sounds for system events", "context": "Play sounds for system events", - "reference": "Modules/Settings/PersonalizationTab.qml:1935", + "reference": "Modules/Settings/SoundsTab.qml:35", "comment": "" }, { @@ -3866,7 +4046,7 @@ { "term": "Plugged In", "context": "Plugged In", - "reference": "Modules/Settings/PersonalizationTab.qml:2111", + "reference": "Modules/Settings/SoundsTab.qml:117", "comment": "" }, { @@ -3890,31 +4070,25 @@ { "term": "Plugins", "context": "Plugins", - "reference": "Modals/Settings/SettingsSidebar.qml:79", - "comment": "" - }, - { - "term": "Plugins:", - "context": "Plugins:", - "reference": "Modules/Settings/AboutTab.qml:527", + "reference": "Modals/Settings/SettingsSidebar.qml:161, Modules/Settings/AboutTab.qml:228, Modules/Settings/AboutTab.qml:236", "comment": "" }, { "term": "Popup Position", "context": "Popup Position", - "reference": "Modules/Settings/WidgetTweaksTab.qml:601", + "reference": "Modules/Settings/NotificationsTab.qml:94", "comment": "" }, { "term": "Popup Transparency", "context": "Popup Transparency", - "reference": "Modules/Settings/ThemeColorsTab.qml:838", + "reference": "Modules/Settings/ThemeColorsTab.qml:650", "comment": "" }, { "term": "Position", "context": "Position", - "reference": "Modules/Settings/DankBarTab.qml:1548", + "reference": "Modules/Settings/DockTab.qml:28, Modules/Settings/DankBarTab.qml:1548", "comment": "" }, { @@ -3923,28 +4097,40 @@ "reference": "Modals/DisplayConfirmationModal.qml:130", "comment": "" }, + { + "term": "Possible Override Conflicts", + "context": "Possible Override Conflicts", + "reference": "Modules/Settings/KeybindsTab.qml:309", + "comment": "" + }, { "term": "Power & Security", "context": "Power & Security", - "reference": "Modals/Settings/SettingsSidebar.qml:74", + "reference": "Modals/Settings/SettingsSidebar.qml:143", + "comment": "" + }, + { + "term": "Power & Sleep", + "context": "Power & Sleep", + "reference": "Modals/Settings/SettingsSidebar.qml:153", "comment": "" }, { "term": "Power Action Confirmation", "context": "Power Action Confirmation", - "reference": "Modals/Settings/PowerSettings.qml:576", + "reference": "Modules/Settings/PowerSleepTab.qml:365", "comment": "" }, { "term": "Power Menu Customization", "context": "Power Menu Customization", - "reference": "Modals/Settings/PowerSettings.qml:389", + "reference": "Modules/Settings/PowerSleepTab.qml:259", "comment": "" }, { "term": "Power Off", "context": "Power Off", - "reference": "Modals/PowerMenuModal.qml:188, Modules/Lock/LockPowerMenu.qml:86", + "reference": "Modals/PowerMenuModal.qml:194, Modules/Lock/LockPowerMenu.qml:86", "comment": "" }, { @@ -3953,6 +4139,12 @@ "reference": "Modules/Lock/LockPowerMenu.qml:331", "comment": "" }, + { + "term": "Power Profile", + "context": "Power Profile", + "reference": "Modules/Settings/OSDTab.qml:139", + "comment": "" + }, { "term": "Power Profile Degradation", "context": "Power Profile Degradation", @@ -3960,9 +4152,9 @@ "comment": "" }, { - "term": "Power Profile OSD", - "context": "Power Profile OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:862", + "term": "Power source", + "context": "Power source", + "reference": "Modules/Settings/PowerSleepTab.qml:40", "comment": "" }, { @@ -3980,19 +4172,19 @@ { "term": "Press key...", "context": "Press key...", - "reference": "Widgets/KeybindItem.qml:439", + "reference": "Widgets/KeybindItem.qml:571", "comment": "" }, { "term": "Pressure", "context": "Pressure", - "reference": "Modules/Settings/TimeWeatherTab.qml:1234, Modules/DankBar/Widgets/WeatherForecastCard.qml:70", + "reference": "Modules/Settings/TimeWeatherTab.qml:936, Modules/DankBar/Widgets/WeatherForecastCard.qml:70", "comment": "" }, { "term": "Prevent idle for media", "context": "Prevent idle for media", - "reference": "Modals/Settings/PowerSettings.qml:157", + "reference": "Modules/Settings/PowerSleepTab.qml:65", "comment": "" }, { @@ -4004,7 +4196,7 @@ { "term": "Primary", "context": "Primary", - "reference": "Modules/Settings/LauncherTab.qml:203, Modules/Settings/NetworkTab.qml:173", + "reference": "Modules/Settings/LauncherTab.qml:162, Modules/Settings/NetworkTab.qml:173", "comment": "" }, { @@ -4046,7 +4238,7 @@ { "term": "Printers", "context": "Printers", - "reference": "Modals/Settings/SettingsSidebar.qml:58, Modules/Settings/PrinterTab.qml:153, Modules/Settings/PrinterTab.qml:539, Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml:17", + "reference": "Modals/Settings/SettingsSidebar.qml:136, Modules/Settings/PrinterTab.qml:153, Modules/Settings/PrinterTab.qml:539, Modules/ControlCenter/BuiltinPlugins/CupsWidget.qml:17", "comment": "" }, { @@ -4124,13 +4316,13 @@ { "term": "RGB", "context": "RGB", - "reference": "Modals/DankColorPickerModal.qml:576", + "reference": "Modals/DankColorPickerModal.qml:582", "comment": "" }, { "term": "Rain Chance", "context": "Rain Chance", - "reference": "Modules/Settings/TimeWeatherTab.qml:1290", + "reference": "Modules/Settings/TimeWeatherTab.qml:986", "comment": "" }, { @@ -4148,19 +4340,19 @@ { "term": "Reboot", "context": "Reboot", - "reference": "Modals/PowerMenuModal.qml:176, Modules/Lock/LockPowerMenu.qml:82", + "reference": "Modals/PowerMenuModal.qml:182, Modules/Lock/LockPowerMenu.qml:82", "comment": "" }, { "term": "Recent Colors", "context": "Recent Colors", - "reference": "Modals/DankColorPickerModal.qml:420", + "reference": "Modals/DankColorPickerModal.qml:426", "comment": "" }, { "term": "Recently Used Apps", "context": "Recently Used Apps", - "reference": "Modules/Settings/LauncherTab.qml:771", + "reference": "Modules/Settings/LauncherTab.qml:348", "comment": "" }, { @@ -4208,7 +4400,7 @@ { "term": "Require holding button/key to confirm power off, restart, suspend, hibernate and logout", "context": "Require holding button/key to confirm power off, restart, suspend, hibernate and logout", - "reference": "Modals/Settings/PowerSettings.qml:587", + "reference": "Modules/Settings/PowerSleepTab.qml:369", "comment": "" }, { @@ -4223,22 +4415,16 @@ "reference": "Modules/Settings/DankBarTab.qml:3166, Modules/ControlCenter/Components/EditControls.qml:227", "comment": "" }, - { - "term": "Resources", - "context": "Resources", - "reference": "Modules/Settings/AboutTab.qml:489", - "comment": "" - }, { "term": "Restart DMS", "context": "Restart DMS", - "reference": "Modals/PowerMenuModal.qml:212", + "reference": "Modals/PowerMenuModal.qml:218", "comment": "" }, { "term": "Restart the DankMaterialShell", "context": "Restart the DankMaterialShell", - "reference": "Modals/Settings/PowerSettings.qml:517", + "reference": "Modules/Settings/PowerSleepTab.qml:332", "comment": "" }, { @@ -4283,46 +4469,40 @@ "reference": "Modules/DankBar/Popouts/DWLLayoutPopout.qml:307", "comment": "" }, - { - "term": "Run User Templates", - "context": "Run User Templates", - "reference": "Modules/Settings/PersonalizationTab.qml:1858", - "comment": "" - }, { "term": "Run a program (e.g., firefox, kitty)", "context": "Run a program (e.g., firefox, kitty)", - "reference": "Widgets/KeybindItem.qml:577", + "reference": "Widgets/KeybindItem.qml:709", "comment": "" }, { "term": "Run a shell command (e.g., notify-send)", "context": "Run a shell command (e.g., notify-send)", - "reference": "Widgets/KeybindItem.qml:578", + "reference": "Widgets/KeybindItem.qml:710", "comment": "" }, { "term": "Running Apps", "context": "Running Apps", - "reference": "Modules/Settings/DankBarTab.qml:368", + "reference": "Modals/Settings/SettingsSidebar.qml:84, Modules/Settings/DankBarTab.qml:368", "comment": "" }, { "term": "Running Apps Only In Current Workspace", "context": "Running Apps Only In Current Workspace", - "reference": "Modules/Settings/WidgetTweaksTab.qml:403", + "reference": "Modules/Settings/RunningAppsTab.qml:27", "comment": "" }, { "term": "Running Apps Settings", "context": "Running Apps Settings", - "reference": "Modules/Settings/WidgetTweaksTab.qml:393", + "reference": "Modules/Settings/RunningAppsTab.qml:24", "comment": "" }, { "term": "Save", "context": "Save", - "reference": "Modals/DankColorPickerModal.qml:704, Widgets/KeybindItem.qml:970, Modals/FileBrowser/FileBrowserSaveRow.qml:55, Modules/Notepad/NotepadTextEditor.qml:511, Modules/Notepad/Notepad.qml:461", + "reference": "Modals/DankColorPickerModal.qml:710, Widgets/KeybindItem.qml:1102, Modals/FileBrowser/FileBrowserSaveRow.qml:55, Modules/Notepad/NotepadTextEditor.qml:511, Modules/Notepad/Notepad.qml:461", "comment": "" }, { @@ -4356,9 +4536,9 @@ "comment": "" }, { - "term": "Scale all font sizes", - "context": "Scale all font sizes", - "reference": "Modules/Settings/ThemeColorsTab.qml:1110", + "term": "Scale all font sizes throughout the shell", + "context": "Scale all font sizes throughout the shell", + "reference": "Modules/Settings/TypographyMotionTab.qml:195", "comment": "" }, { @@ -4388,7 +4568,7 @@ { "term": "Scroll song title", "context": "Scroll song title", - "reference": "Modules/Settings/WidgetTweaksTab.qml:208", + "reference": "Modules/Settings/MediaPlayerTab.qml:34", "comment": "" }, { @@ -4400,13 +4580,13 @@ { "term": "Search file contents", "context": "Search file contents", - "reference": "Modals/Spotlight/SpotlightContent.qml:465", + "reference": "Modals/Spotlight/SpotlightContent.qml:448", "comment": "" }, { "term": "Search filenames", "context": "Search filenames", - "reference": "Modals/Spotlight/SpotlightContent.qml:423", + "reference": "Modals/Spotlight/SpotlightContent.qml:406", "comment": "" }, { @@ -4418,19 +4598,19 @@ { "term": "Search keybinds...", "context": "Search keybinds...", - "reference": "Modules/Settings/KeybindsTab.qml:205", + "reference": "Modules/Settings/KeybindsTab.qml:226", "comment": "" }, { "term": "Search plugins...", "context": "Search plugins...", - "reference": "Modules/Settings/PluginBrowser.qml:248", + "reference": "Modules/Settings/PluginBrowser.qml:252", "comment": "" }, { "term": "Search widgets...", "context": "Search widgets...", - "reference": "Modules/Settings/WidgetSelectionPopup.qml:243", + "reference": "Modules/Settings/WidgetSelectionPopup.qml:251", "comment": "" }, { @@ -4466,13 +4646,13 @@ { "term": "Select Custom Theme", "context": "custom theme file browser title", - "reference": "Modules/Settings/ThemeColorsTab.qml:1449", + "reference": "Modules/Settings/ThemeColorsTab.qml:874", "comment": "" }, { "term": "Select Launcher Logo", "context": "Select Launcher Logo", - "reference": "Modules/Settings/LauncherTab.qml:12", + "reference": "Modules/Settings/LauncherTab.qml:13", "comment": "" }, { @@ -4484,7 +4664,7 @@ { "term": "Select Wallpaper", "context": "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title", - "reference": "Modals/Settings/SettingsModal.qml:103, Modules/Settings/PersonalizationTab.qml:2144, Modules/Settings/PersonalizationTab.qml:2163, Modules/Settings/PersonalizationTab.qml:2180", + "reference": "Modals/Settings/SettingsModal.qml:103, Modules/Settings/WallpaperTab.qml:1236, Modules/Settings/WallpaperTab.qml:1254, Modules/Settings/WallpaperTab.qml:1270", "comment": "" }, { @@ -4496,25 +4676,19 @@ { "term": "Select a color from the palette or use custom sliders", "context": "Select a color from the palette or use custom sliders", - "reference": "Modals/DankColorPickerModal.qml:177", - "comment": "" - }, - { - "term": "Select a preset or drag the slider to customize", - "context": "Select a preset or drag the slider to customize", - "reference": "Modules/Settings/PersonalizationTab.qml:1709", + "reference": "Modals/DankColorPickerModal.qml:183", "comment": "" }, { "term": "Select a widget to add. You can add multiple instances of the same widget if needed.", "context": "Select a widget to add. You can add multiple instances of the same widget if needed.", - "reference": "Modules/Settings/WidgetSelectionPopup.qml:221", + "reference": "Modules/Settings/WidgetSelectionPopup.qml:229", "comment": "" }, { "term": "Select an image file...", "context": "Select an image file...", - "reference": "Modules/Settings/LauncherTab.qml:155", + "reference": "Modules/Settings/LauncherTab.qml:122", "comment": "" }, { @@ -4530,51 +4704,51 @@ "comment": "" }, { - "term": "Select font weight", - "context": "Select font weight", - "reference": "Modules/Settings/ThemeColorsTab.qml:1005", + "term": "Select font weight for UI text", + "context": "Select font weight for UI text", + "reference": "Modules/Settings/TypographyMotionTab.qml:126", "comment": "" }, { "term": "Select monitor to configure wallpaper", "context": "Select monitor to configure wallpaper", - "reference": "Modules/Settings/PersonalizationTab.qml:1001", + "reference": "Modules/Settings/WallpaperTab.qml:793", "comment": "" }, { "term": "Select monospace font for process list and technical displays", "context": "Select monospace font for process list and technical displays", - "reference": "Modules/Settings/ThemeColorsTab.qml:1071", - "comment": "" - }, - { - "term": "Select system font family", - "context": "Select system font family", - "reference": "Modules/Settings/ThemeColorsTab.qml:984", + "reference": "Modules/Settings/TypographyMotionTab.qml:100", "comment": "" }, { "term": "Select system sound theme", "context": "Select system sound theme", - "reference": "Modules/Settings/PersonalizationTab.qml:2006", + "reference": "Modules/Settings/SoundsTab.qml:70", + "comment": "" + }, + { + "term": "Select the font family for UI text", + "context": "Select the font family for UI text", + "reference": "Modules/Settings/TypographyMotionTab.qml:81", "comment": "" }, { "term": "Select the palette algorithm used for wallpaper-based colors", "context": "Select the palette algorithm used for wallpaper-based colors", - "reference": "Modules/Settings/ThemeColorsTab.qml:596, Modules/Settings/PersonalizationTab.qml:1805", + "reference": "Modules/Settings/ThemeColorsTab.qml:496", "comment": "" }, { "term": "Select which transitions to include in randomization", "context": "Select which transitions to include in randomization", - "reference": "Modules/Settings/PersonalizationTab.qml:1397", + "reference": "Modules/Settings/WallpaperTab.qml:1155", "comment": "" }, { "term": "Select...", "context": "Select...", - "reference": "Widgets/KeybindItem.qml:672, Widgets/KeybindItem.qml:726", + "reference": "Widgets/KeybindItem.qml:804, Widgets/KeybindItem.qml:858", "comment": "" }, { @@ -4598,31 +4772,37 @@ { "term": "Set different wallpapers for each connected monitor", "context": "Set different wallpapers for each connected monitor", - "reference": "Modules/Settings/PersonalizationTab.qml:966", + "reference": "Modules/Settings/WallpaperTab.qml:775", "comment": "" }, { "term": "Set different wallpapers for light and dark mode", "context": "Set different wallpapers for light and dark mode", - "reference": "Modules/Settings/PersonalizationTab.qml:468", + "reference": "Modules/Settings/WallpaperTab.qml:356", "comment": "" }, { "term": "Set key and action to save", "context": "Set key and action to save", - "reference": "Widgets/KeybindItem.qml:947", + "reference": "Widgets/KeybindItem.qml:1079", "comment": "" }, { "term": "Settings", "context": "settings window title", - "reference": "Services/AppSearchService.qml:269, Services/PopoutService.qml:226, Modals/Settings/SettingsModal.qml:41, Modals/Settings/SettingsModal.qml:193, Modules/DankDash/DankDashPopout.qml:290", + "reference": "Services/AppSearchService.qml:269, Services/PopoutService.qml:226, Modals/Settings/SettingsModal.qml:41, Modals/Settings/SettingsModal.qml:182, Modules/DankDash/DankDashPopout.qml:290", + "comment": "" + }, + { + "term": "Setup", + "context": "Setup", + "reference": "Modules/Settings/KeybindsTab.qml:351", "comment": "" }, { "term": "Shell", "context": "Shell", - "reference": "Widgets/KeybindItem.qml:874", + "reference": "Widgets/KeybindItem.qml:1006", "comment": "" }, { @@ -4631,28 +4811,34 @@ "reference": "Modals/Clipboard/ClipboardKeyboardHints.qml:9", "comment": "" }, + { + "term": "Short", + "context": "Short", + "reference": "Modules/Settings/TypographyMotionTab.qml:222", + "comment": "" + }, { "term": "Shortcuts", "context": "Shortcuts", - "reference": "Modules/Settings/KeybindsTab.qml:466, Modules/Settings/KeybindsTab.qml:466", + "reference": "Modules/Settings/KeybindsTab.qml:531, Modules/Settings/KeybindsTab.qml:531", "comment": "" }, { "term": "Show All Tags", "context": "Show All Tags", - "reference": "Modules/Settings/WidgetTweaksTab.qml:151", + "reference": "Modules/Settings/WorkspacesTab.qml:105", "comment": "" }, { "term": "Show Dock", "context": "Show Dock", - "reference": "Modules/Settings/DockTab.qml:136", + "reference": "Modules/Settings/DockTab.qml:71", "comment": "" }, { "term": "Show Hibernate", "context": "Show Hibernate", - "reference": "Modals/Settings/PowerSettings.qml:532", + "reference": "Modules/Settings/PowerSleepTab.qml:336", "comment": "" }, { @@ -4664,67 +4850,73 @@ { "term": "Show Lock", "context": "Show Lock", - "reference": "Modals/Settings/PowerSettings.qml:486", + "reference": "Modules/Settings/PowerSleepTab.qml:323", "comment": "" }, { "term": "Show Log Out", "context": "Show Log Out", - "reference": "Modals/Settings/PowerSettings.qml:456", + "reference": "Modules/Settings/PowerSleepTab.qml:315", "comment": "" }, { "term": "Show Occupied Workspaces Only", "context": "Show Occupied Workspaces Only", - "reference": "Modules/Settings/WidgetTweaksTab.qml:140", + "reference": "Modules/Settings/WorkspacesTab.qml:97", "comment": "" }, { "term": "Show Power Actions", "context": "Show Power Actions", - "reference": "Modals/Settings/PowerSettings.qml:58", + "reference": "Modules/Settings/LockScreenTab.qml:29", "comment": "" }, { "term": "Show Power Off", "context": "Show Power Off", - "reference": "Modals/Settings/PowerSettings.qml:471", + "reference": "Modules/Settings/PowerSleepTab.qml:319", "comment": "" }, { "term": "Show Reboot", "context": "Show Reboot", - "reference": "Modals/Settings/PowerSettings.qml:441", + "reference": "Modules/Settings/PowerSleepTab.qml:311", "comment": "" }, { "term": "Show Restart DMS", "context": "Show Restart DMS", - "reference": "Modals/Settings/PowerSettings.qml:516", + "reference": "Modules/Settings/PowerSleepTab.qml:331", + "comment": "" + }, + { + "term": "Show Seconds", + "context": "Show Seconds", + "reference": "Modules/Settings/TimeWeatherTab.qml:45", "comment": "" }, { "term": "Show Suspend", "context": "Show Suspend", - "reference": "Modals/Settings/PowerSettings.qml:501", + "reference": "Modules/Settings/PowerSleepTab.qml:327", "comment": "" }, { "term": "Show Workspace Apps", "context": "Show Workspace Apps", - "reference": "Modules/Settings/WidgetTweaksTab.qml:77", + "reference": "Modules/Settings/WorkspacesTab.qml:42", "comment": "" }, { "term": "Show all 9 tags instead of only occupied tags (DWL only)", "context": "Show all 9 tags instead of only occupied tags (DWL only)", - "reference": "Modules/Settings/WidgetTweaksTab.qml:152", + "reference": "Modules/Settings/WorkspacesTab.qml:106", "comment": "" }, { "term": "Show darkened overlay behind modal dialogs", "context": "Show darkened overlay behind modal dialogs", - "reference": "Modules/Settings/ThemeColorsTab.qml:927", + "reference": "Modules/Settings/ThemeColorsTab.qml:684", "comment": "" }, { @@ -4736,7 +4928,7 @@ { "term": "Show on Overview", "context": "Show on Overview", - "reference": "Modules/Settings/DockTab.qml:248, Modules/Settings/DankBarTab.qml:1840", + "reference": "Modules/Settings/DockTab.qml:86, Modules/Settings/DankBarTab.qml:1840", "comment": "" }, { @@ -4754,55 +4946,55 @@ { "term": "Show on-screen display when brightness changes", "context": "Show on-screen display when brightness changes", - "reference": "Modules/Settings/WidgetTweaksTab.qml:823", + "reference": "Modules/Settings/OSDTab.qml:112", "comment": "" }, { "term": "Show on-screen display when caps lock state changes", "context": "Show on-screen display when caps lock state changes", - "reference": "Modules/Settings/WidgetTweaksTab.qml:853", + "reference": "Modules/Settings/OSDTab.qml:133", "comment": "" }, { "term": "Show on-screen display when idle inhibitor state changes", "context": "Show on-screen display when idle inhibitor state changes", - "reference": "Modules/Settings/WidgetTweaksTab.qml:833", + "reference": "Modules/Settings/OSDTab.qml:119", "comment": "" }, { "term": "Show on-screen display when media player volume changes", "context": "Show on-screen display when media player volume changes", - "reference": "Modules/Settings/WidgetTweaksTab.qml:813", + "reference": "Modules/Settings/OSDTab.qml:105", "comment": "" }, { "term": "Show on-screen display when microphone is muted/unmuted", "context": "Show on-screen display when microphone is muted/unmuted", - "reference": "Modules/Settings/WidgetTweaksTab.qml:843", + "reference": "Modules/Settings/OSDTab.qml:126", "comment": "" }, { "term": "Show on-screen display when power profile changes", "context": "Show on-screen display when power profile changes", - "reference": "Modules/Settings/WidgetTweaksTab.qml:863", + "reference": "Modules/Settings/OSDTab.qml:140", "comment": "" }, { "term": "Show on-screen display when volume changes", "context": "Show on-screen display when volume changes", - "reference": "Modules/Settings/WidgetTweaksTab.qml:803", + "reference": "Modules/Settings/OSDTab.qml:98", "comment": "" }, { "term": "Show only apps running in current workspace", "context": "Show only apps running in current workspace", - "reference": "Modules/Settings/WidgetTweaksTab.qml:404", + "reference": "Modules/Settings/RunningAppsTab.qml:28", "comment": "" }, { "term": "Show only workspaces belonging to each specific monitor.", "context": "Show only workspaces belonging to each specific monitor.", - "reference": "Modules/Settings/WidgetTweaksTab.qml:131", + "reference": "Modules/Settings/WorkspacesTab.qml:91", "comment": "" }, { @@ -4814,25 +5006,19 @@ { "term": "Show power, restart, and logout buttons on the lock screen", "context": "Show power, restart, and logout buttons on the lock screen", - "reference": "Modals/Settings/PowerSettings.qml:59", - "comment": "" - }, - { - "term": "Show seconds", - "context": "Show seconds", - "reference": "Modules/Settings/TimeWeatherTab.qml:116", + "reference": "Modules/Settings/LockScreenTab.qml:30", "comment": "" }, { "term": "Show weather information in top bar and control center", "context": "Show weather information in top bar and control center", - "reference": "Modules/Settings/TimeWeatherTab.qml:483", + "reference": "Modules/Settings/TimeWeatherTab.qml:335", "comment": "" }, { "term": "Show workspace index numbers in the top bar workspace switcher", "context": "Show workspace index numbers in the top bar workspace switcher", - "reference": "Modules/Settings/WidgetTweaksTab.qml:59", + "reference": "Modules/Settings/WorkspacesTab.qml:29", "comment": "" }, { @@ -4886,19 +5072,37 @@ { "term": "Size Offset", "context": "Size Offset", - "reference": "Modules/Settings/LauncherTab.qml:280", + "reference": "Modules/Settings/LauncherTab.qml:235", + "comment": "" + }, + { + "term": "Sizing", + "context": "Sizing", + "reference": "Modules/Settings/DockTab.qml:121", "comment": "" }, { "term": "Sort Alphabetically", "context": "Sort Alphabetically", - "reference": "Modules/Settings/LauncherTab.qml:493", + "reference": "Modules/Settings/LauncherTab.qml:307", + "comment": "" + }, + { + "term": "Sorting & Layout", + "context": "Sorting & Layout", + "reference": "Modules/Settings/LauncherTab.qml:304", "comment": "" }, { "term": "Sound Theme", "context": "Sound Theme", - "reference": "Modules/Settings/PersonalizationTab.qml:2005", + "reference": "Modules/Settings/SoundsTab.qml:69", + "comment": "" + }, + { + "term": "Sounds", + "context": "Sounds", + "reference": "Modals/Settings/SettingsSidebar.qml:44", "comment": "" }, { @@ -4910,7 +5114,7 @@ { "term": "Spacing", "context": "Spacing", - "reference": "Modules/Settings/DockTab.qml:493, Modules/Settings/DankBarTab.qml:1898", + "reference": "Modules/Settings/DockTab.qml:136, Modules/Settings/DankBarTab.qml:1898", "comment": "" }, { @@ -4952,7 +5156,7 @@ { "term": "Status", "context": "Status", - "reference": "Widgets/DankIconPicker.qml:49, Modules/Settings/AboutTab.qml:711, Modules/Settings/PrinterTab.qml:129, Modules/Settings/NetworkTab.qml:128", + "reference": "Widgets/DankIconPicker.qml:49, Modules/Settings/AboutTab.qml:633, Modules/Settings/PrinterTab.qml:129, Modules/Settings/NetworkTab.qml:128", "comment": "" }, { @@ -4992,33 +5196,33 @@ "comment": "" }, { - "term": "Support Development", - "context": "Support Development", - "reference": "Modules/Settings/AboutTab.qml:803", + "term": "Suppress notification popups while enabled", + "context": "Suppress notification popups while enabled", + "reference": "Modules/Settings/NotificationsTab.qml:150", "comment": "" }, { "term": "Surface", "context": "Surface", - "reference": "Modules/Settings/LauncherTab.qml:203", + "reference": "Modules/Settings/LauncherTab.qml:162", "comment": "" }, { "term": "Suspend", "context": "Suspend", - "reference": "Modals/PowerMenuModal.qml:200, Modules/Lock/LockPowerMenu.qml:88", + "reference": "Modals/PowerMenuModal.qml:206, Modules/Lock/LockPowerMenu.qml:88", "comment": "" }, { "term": "Suspend behavior", "context": "Suspend behavior", - "reference": "Modals/Settings/PowerSettings.qml:315", + "reference": "Modules/Settings/PowerSleepTab.qml:209", "comment": "" }, { "term": "Suspend system after", "context": "Suspend system after", - "reference": "Modals/Settings/PowerSettings.qml:278", + "reference": "Modules/Settings/PowerSleepTab.qml:174", "comment": "" }, { @@ -5036,13 +5240,13 @@ { "term": "Sync Mode with Portal", "context": "Sync Mode with Portal", - "reference": "Modules/Settings/ThemeColorsTab.qml:1211", + "reference": "Modules/Settings/ThemeColorsTab.qml:700", "comment": "" }, { "term": "Sync dark mode with settings portals for system-wide theme hints", "context": "Sync dark mode with settings portals for system-wide theme hints", - "reference": "Modules/Settings/ThemeColorsTab.qml:1212", + "reference": "Modules/Settings/ThemeColorsTab.qml:701", "comment": "" }, { @@ -5054,7 +5258,7 @@ { "term": "System App Theming", "context": "System App Theming", - "reference": "Modules/Settings/ThemeColorsTab.qml:1339", + "reference": "Modules/Settings/ThemeColorsTab.qml:773", "comment": "" }, { @@ -5070,9 +5274,9 @@ "comment": "" }, { - "term": "System Monitoring:", - "context": "System Monitoring:", - "reference": "Modules/Settings/AboutTab.qml:585", + "term": "System Sounds", + "context": "System Sounds", + "reference": "Modules/Settings/SoundsTab.qml:26", "comment": "" }, { @@ -5090,7 +5294,7 @@ { "term": "System Updater", "context": "System Updater", - "reference": "Modules/Settings/WidgetTweaksTab.qml:245", + "reference": "Modals/Settings/SettingsSidebar.qml:90, Modules/Settings/SystemUpdaterTab.qml:24", "comment": "" }, { @@ -5105,6 +5309,12 @@ "reference": "Modules/Settings/DankBarTab.qml:444", "comment": "" }, + { + "term": "System sounds are not available. Install canberra-gtk-play for sound support.", + "context": "System sounds are not available. Install canberra-gtk-play for sound support.", + "reference": "Modules/Settings/SoundsTab.qml:147", + "comment": "" + }, { "term": "System toast notifications", "context": "System toast notifications", @@ -5120,7 +5330,7 @@ { "term": "System update custom command", "context": "System update custom command", - "reference": "Modules/Settings/WidgetTweaksTab.qml:281", + "reference": "Modules/Settings/SystemUpdaterTab.qml:53", "comment": "" }, { @@ -5132,13 +5342,13 @@ { "term": "Terminal custom additional parameters", "context": "Terminal custom additional parameters", - "reference": "Modules/Settings/WidgetTweaksTab.qml:328", + "reference": "Modules/Settings/SystemUpdaterTab.qml:98", "comment": "" }, { "term": "Terminals - Always use Dark Theme", "context": "Terminals - Always use Dark Theme", - "reference": "Modules/Settings/ThemeColorsTab.qml:1221", + "reference": "Modules/Settings/ThemeColorsTab.qml:710", "comment": "" }, { @@ -5168,7 +5378,7 @@ { "term": "The below settings will modify your GTK and Qt settings. If you wish to preserve your current configurations, please back them up (qt5ct.conf|qt6ct.conf and ~/.config/gtk-3.0|gtk-4.0).", "context": "The below settings will modify your GTK and Qt settings. If you wish to preserve your current configurations, please back them up (qt5ct.conf|qt6ct.conf and ~/.config/gtk-3.0|gtk-4.0).", - "reference": "Modules/Settings/ThemeColorsTab.qml:1254", + "reference": "Modules/Settings/ThemeColorsTab.qml:738", "comment": "" }, { @@ -5180,25 +5390,31 @@ { "term": "Theme & Colors", "context": "Theme & Colors", - "reference": "Modals/Settings/SettingsSidebar.qml:69", + "reference": "Modals/Settings/SettingsSidebar.qml:29", "comment": "" }, { "term": "Theme Color", "context": "Theme Color", - "reference": "Modules/Settings/ThemeColorsTab.qml:100", + "reference": "Modules/Settings/ThemeColorsTab.qml:40", "comment": "" }, { "term": "Third-Party Plugin Warning", "context": "Third-Party Plugin Warning", - "reference": "Modules/Settings/PluginBrowser.qml:533, Modules/Settings/PluginBrowser.qml:567", + "reference": "Modules/Settings/PluginBrowser.qml:537, Modules/Settings/PluginBrowser.qml:571", "comment": "" }, { "term": "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.", "context": "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.", - "reference": "Modules/Settings/PluginBrowser.qml:591", + "reference": "Modules/Settings/PluginBrowser.qml:595", + "comment": "" + }, + { + "term": "This bind is overridden by config.kdl", + "context": "This bind is overridden by config.kdl", + "reference": "Widgets/KeybindItem.qml:411", "comment": "" }, { @@ -5222,7 +5438,13 @@ { "term": "Time & Weather", "context": "Time & Weather", - "reference": "Modals/Settings/SettingsSidebar.qml:21", + "reference": "Modals/Settings/SettingsSidebar.qml:39", + "comment": "" + }, + { + "term": "Time Format", + "context": "Time Format", + "reference": "Modules/Settings/TimeWeatherTab.qml:28", "comment": "" }, { @@ -5231,10 +5453,28 @@ "reference": "Services/CupsService.qml:799", "comment": "" }, + { + "term": "Timeout for critical priority notifications", + "context": "Timeout for critical priority notifications", + "reference": "Modules/Settings/NotificationsTab.qml:193", + "comment": "" + }, + { + "term": "Timeout for low priority notifications", + "context": "Timeout for low priority notifications", + "reference": "Modules/Settings/NotificationsTab.qml:163", + "comment": "" + }, + { + "term": "Timeout for normal priority notifications", + "context": "Timeout for normal priority notifications", + "reference": "Modules/Settings/NotificationsTab.qml:178", + "comment": "" + }, { "term": "Title", "context": "Title", - "reference": "Widgets/KeybindItem.qml:902", + "reference": "Widgets/KeybindItem.qml:1034", "comment": "" }, { @@ -5249,6 +5489,12 @@ "reference": "Services/DMSService.qml:302", "comment": "" }, + { + "term": "To use this DMS bind, remove or change the keybind in your config.kdl", + "context": "To use this DMS bind, remove or change the keybind in your config.kdl", + "reference": "Widgets/KeybindItem.qml:428", + "comment": "" + }, { "term": "Toast Messages", "context": "Toast Messages", @@ -5306,7 +5552,7 @@ { "term": "Top Bar Format", "context": "Top Bar Format", - "reference": "Modules/Settings/TimeWeatherTab.qml:181", + "reference": "Modules/Settings/TimeWeatherTab.qml:62", "comment": "" }, { @@ -5324,19 +5570,37 @@ { "term": "Transition Effect", "context": "Transition Effect", - "reference": "Modules/Settings/PersonalizationTab.qml:1370", + "reference": "Modules/Settings/WallpaperTab.qml:1126", + "comment": "" + }, + { + "term": "Transparency", + "context": "Transparency", + "reference": "Modules/Settings/DockTab.qml:169", "comment": "" }, { "term": "Turn off monitors after", "context": "Turn off monitors after", - "reference": "Modals/Settings/PowerSettings.qml:241", + "reference": "Modules/Settings/PowerSleepTab.qml:143", "comment": "" }, { "term": "Type", "context": "Type", - "reference": "Widgets/KeybindItem.qml:555", + "reference": "Widgets/KeybindItem.qml:687", + "comment": "" + }, + { + "term": "Typography", + "context": "Typography", + "reference": "Modules/Settings/TypographyMotionTab.qml:73", + "comment": "" + }, + { + "term": "Typography & Motion", + "context": "Typography & Motion", + "reference": "Modals/Settings/SettingsSidebar.qml:34", "comment": "" }, { @@ -5360,7 +5624,7 @@ { "term": "Unpin from Dock", "context": "Unpin from Dock", - "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:26, Modules/AppDrawer/AppDrawerPopout.qml:610, Modules/Dock/DockContextMenu.qml:379", + "reference": "Modals/Spotlight/SpotlightContextMenuContent.qml:26, Modules/AppDrawer/AppDrawerPopout.qml:701, Modules/Dock/DockContextMenu.qml:379", "comment": "" }, { @@ -5372,7 +5636,7 @@ { "term": "Unsaved changes", "context": "Unsaved changes", - "reference": "Widgets/KeybindItem.qml:947, Modules/Notepad/NotepadTextEditor.qml:588", + "reference": "Widgets/KeybindItem.qml:1079, Modules/Notepad/NotepadTextEditor.qml:588", "comment": "" }, { @@ -5402,19 +5666,19 @@ { "term": "Use 24-hour time format instead of 12-hour AM/PM", "context": "Use 24-hour time format instead of 12-hour AM/PM", - "reference": "Modules/Settings/TimeWeatherTab.qml:63", + "reference": "Modules/Settings/TimeWeatherTab.qml:36", "comment": "" }, { "term": "Use Custom Command", "context": "Use Custom Command", - "reference": "Modules/Settings/WidgetTweaksTab.qml:255", + "reference": "Modules/Settings/SystemUpdaterTab.qml:27", "comment": "" }, { "term": "Use Grid Layout", "context": "Use Grid Layout", - "reference": "Modals/Settings/PowerSettings.qml:407", + "reference": "Modules/Settings/PowerSleepTab.qml:270", "comment": "" }, { @@ -5426,13 +5690,13 @@ { "term": "Use Imperial Units", "context": "Use Imperial Units", - "reference": "Modules/Settings/TimeWeatherTab.qml:538", + "reference": "Modules/Settings/TimeWeatherTab.qml:356", "comment": "" }, { "term": "Use Imperial units (°F, mph, inHg) instead of Metric (°C, km/h, hPa)", "context": "Use Imperial units (°F, mph, inHg) instead of Metric (°C, km/h, hPa)", - "reference": "Modules/Settings/TimeWeatherTab.qml:545", + "reference": "Modules/Settings/TimeWeatherTab.qml:357", "comment": "" }, { @@ -5444,37 +5708,43 @@ { "term": "Use System Theme", "context": "Use System Theme", - "reference": "Modules/Settings/PersonalizationTab.qml:1977", + "reference": "Modules/Settings/SoundsTab.qml:57", + "comment": "" + }, + { + "term": "Use an external wallpaper manager like swww, hyprpaper, or swaybg.", + "context": "wallpaper settings disable description", + "reference": "Modules/Settings/WallpaperTab.qml:1197", "comment": "" }, { "term": "Use animated wave progress bars for media playback", "context": "Use animated wave progress bars for media playback", - "reference": "Modules/Settings/WidgetTweaksTab.qml:200", + "reference": "Modules/Settings/MediaPlayerTab.qml:28", "comment": "" }, { "term": "Use custom command for update your system", "context": "Use custom command for update your system", - "reference": "Modules/Settings/WidgetTweaksTab.qml:256", + "reference": "Modules/Settings/SystemUpdaterTab.qml:28", "comment": "" }, { "term": "Use fingerprint reader for lock screen authentication (requires enrolled fingerprints)", "context": "Use fingerprint reader for lock screen authentication (requires enrolled fingerprints)", - "reference": "Modals/Settings/PowerSettings.qml:98", + "reference": "Modules/Settings/LockScreenTab.qml:66", "comment": "" }, { "term": "Use light theme instead of dark theme", "context": "Use light theme instead of dark theme", - "reference": "Modules/Settings/PersonalizationTab.qml:1526", + "reference": "Modules/Settings/ThemeColorsTab.qml:581", "comment": "" }, { "term": "Use sound theme from system settings", "context": "Use sound theme from system settings", - "reference": "Modules/Settings/PersonalizationTab.qml:1983", + "reference": "Modules/Settings/SoundsTab.qml:58", "comment": "" }, { @@ -5558,7 +5828,7 @@ { "term": "Version", "context": "Version", - "reference": "Modules/Settings/AboutTab.qml:665", + "reference": "Modules/Settings/AboutTab.qml:587", "comment": "" }, { @@ -5594,7 +5864,7 @@ { "term": "Visibility", "context": "Visibility", - "reference": "Modules/Settings/TimeWeatherTab.qml:1337, Modules/DankBar/Widgets/WeatherForecastCard.qml:80", + "reference": "Modules/Settings/TimeWeatherTab.qml:1030, Modules/DankBar/Widgets/WeatherForecastCard.qml:80", "comment": "" }, { @@ -5606,19 +5876,19 @@ { "term": "Visual effect used when wallpaper changes", "context": "Visual effect used when wallpaper changes", - "reference": "Modules/Settings/PersonalizationTab.qml:1371", + "reference": "Modules/Settings/WallpaperTab.qml:1127", + "comment": "" + }, + { + "term": "Volume", + "context": "Volume", + "reference": "Modules/Settings/OSDTab.qml:97", "comment": "" }, { "term": "Volume Changed", "context": "Volume Changed", - "reference": "Modules/Settings/PersonalizationTab.qml:2076", - "comment": "" - }, - { - "term": "Volume OSD", - "context": "Volume OSD", - "reference": "Modules/Settings/WidgetTweaksTab.qml:802", + "reference": "Modules/Settings/SoundsTab.qml:106", "comment": "" }, { @@ -5636,13 +5906,13 @@ { "term": "Wallpaper", "context": "Wallpaper", - "reference": "Modules/Settings/DisplaysTab.qml:40, Modules/Settings/PersonalizationTab.qml:103", + "reference": "Modals/Settings/SettingsSidebar.qml:24, Modules/Settings/WallpaperTab.qml:39, Modules/Settings/DisplaysTab.qml:40", "comment": "" }, { "term": "Wallpaper Monitor", "context": "Wallpaper Monitor", - "reference": "Modules/Settings/PersonalizationTab.qml:1000", + "reference": "Modules/Settings/WallpaperTab.qml:792", "comment": "" }, { @@ -5660,13 +5930,13 @@ { "term": "Wave Progress Bars", "context": "Wave Progress Bars", - "reference": "Modules/Settings/WidgetTweaksTab.qml:199", + "reference": "Modules/Settings/MediaPlayerTab.qml:27", "comment": "" }, { "term": "Weather", "context": "Weather", - "reference": "Modules/DankDash/DankDashPopout.qml:284", + "reference": "Modules/DankDash/DankDashPopout.qml:284, Modules/Settings/TimeWeatherTab.qml:327", "comment": "" }, { @@ -5675,22 +5945,16 @@ "reference": "Modules/Settings/DankBarTab.qml:382", "comment": "" }, - { - "term": "Website:", - "context": "Website:", - "reference": "Modules/Settings/AboutTab.qml:504", - "comment": "" - }, { "term": "When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.", "context": "When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.", - "reference": "Modules/Settings/LauncherTab.qml:520", + "reference": "Modules/Settings/LauncherTab.qml:308", "comment": "" }, { "term": "When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.", "context": "When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.", - "reference": "Modules/Settings/LauncherTab.qml:713", + "reference": "Modules/Settings/LauncherTab.qml:339", "comment": "" }, { @@ -5732,7 +5996,7 @@ { "term": "Widget Background Color", "context": "Widget Background Color", - "reference": "Modules/Settings/ThemeColorsTab.qml:778", + "reference": "Modules/Settings/ThemeColorsTab.qml:615", "comment": "" }, { @@ -5750,13 +6014,13 @@ { "term": "Widget Style", "context": "Widget Style", - "reference": "Modules/Settings/ThemeColorsTab.qml:718", + "reference": "Modules/Settings/ThemeColorsTab.qml:600", "comment": "" }, { "term": "Widget Styling", "context": "Widget Styling", - "reference": "Modules/Settings/ThemeColorsTab.qml:699", + "reference": "Modules/Settings/ThemeColorsTab.qml:593", "comment": "" }, { @@ -5765,16 +6029,10 @@ "reference": "Modules/Settings/DankBarTab.qml:2935, Modules/Settings/DankBarTab.qml:2949", "comment": "" }, - { - "term": "Widgets", - "context": "Widgets", - "reference": "Modals/Settings/SettingsSidebar.qml:37", - "comment": "" - }, { "term": "Wind", "context": "Wind", - "reference": "Modules/Settings/TimeWeatherTab.qml:1176", + "reference": "Modules/Settings/TimeWeatherTab.qml:883", "comment": "" }, { @@ -5792,19 +6050,19 @@ { "term": "Workspace Index Numbers", "context": "Workspace Index Numbers", - "reference": "Modules/Settings/WidgetTweaksTab.qml:58", + "reference": "Modules/Settings/WorkspacesTab.qml:28", "comment": "" }, { "term": "Workspace Padding", "context": "Workspace Padding", - "reference": "Modules/Settings/WidgetTweaksTab.qml:67", + "reference": "Modules/Settings/WorkspacesTab.qml:35", "comment": "" }, { "term": "Workspace Settings", "context": "Workspace Settings", - "reference": "Modules/Settings/WidgetTweaksTab.qml:48", + "reference": "Modules/Settings/WorkspacesTab.qml:25", "comment": "" }, { @@ -5813,6 +6071,18 @@ "reference": "Modules/Settings/DankBarTab.qml:354", "comment": "" }, + { + "term": "Workspaces", + "context": "Workspaces", + "reference": "Modals/Settings/SettingsSidebar.qml:64", + "comment": "" + }, + { + "term": "Workspaces & Widgets", + "context": "Workspaces & Widgets", + "reference": "Modals/Settings/SettingsSidebar.qml:59", + "comment": "" + }, { "term": "Yes", "context": "Yes", @@ -5844,27 +6114,33 @@ "comment": "" }, { - "term": "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.", - "context": "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.", - "reference": "Modules/Settings/KeybindsTab.qml:270", + "term": "apps", + "context": "apps", + "reference": "Modules/AppDrawer/AppDrawerPopout.qml:257", + "comment": "" + }, + { + "term": "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.", + "context": "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.", + "reference": "Modules/Settings/KeybindsTab.qml:322", "comment": "" }, { "term": "dms/binds.kdl is now included in config.kdl", "context": "dms/binds.kdl is now included in config.kdl", - "reference": "Services/KeybindsService.qml:153", + "reference": "Services/KeybindsService.qml:172", "comment": "" }, { "term": "e.g., firefox, kitty --title foo", "context": "e.g., firefox, kitty --title foo", - "reference": "Widgets/KeybindItem.qml:853", + "reference": "Widgets/KeybindItem.qml:985", "comment": "" }, { "term": "e.g., focus-workspace 3, resize-column -10", "context": "e.g., focus-workspace 3, resize-column -10", - "reference": "Widgets/KeybindItem.qml:790", + "reference": "Widgets/KeybindItem.qml:922", "comment": "" }, { @@ -5874,21 +6150,33 @@ "comment": "" }, { - "term": "loginctl not available - lock integration requires DMS socket connection", - "context": "loginctl not available - lock integration requires DMS socket connection", - "reference": "Modals/Settings/PowerSettings.qml:65", + "term": "files", + "context": "files", + "reference": "Modules/AppDrawer/AppDrawerPopout.qml:255", "comment": "" }, { - "term": "matugen not detected - dynamic theming unavailable", - "context": "matugen not detected - dynamic theming unavailable", - "reference": "Modules/Settings/PersonalizationTab.qml:1885", + "term": "loginctl not available - lock integration requires DMS socket connection", + "context": "loginctl not available - lock integration requires DMS socket connection", + "reference": "Modules/Settings/LockScreenTab.qml:36", + "comment": "" + }, + { + "term": "minutes", + "context": "minutes", + "reference": "Modules/Settings/NotificationsTab.qml:73", "comment": "" }, { "term": "official", "context": "official", - "reference": "Modules/Settings/PluginBrowser.qml:376", + "reference": "Modules/Settings/PluginBrowser.qml:380", + "comment": "" + }, + { + "term": "seconds", + "context": "seconds", + "reference": "Modules/Settings/NotificationsTab.qml:72", "comment": "" }, { @@ -5900,79 +6188,79 @@ { "term": "• Install only from trusted sources", "context": "• Install only from trusted sources", - "reference": "Modules/Settings/PluginBrowser.qml:614", + "reference": "Modules/Settings/PluginBrowser.qml:618", "comment": "" }, { "term": "• M - Month (1-12)", "context": "• M - Month (1-12)", - "reference": "Modules/Settings/TimeWeatherTab.qml:398", + "reference": "Modules/Settings/TimeWeatherTab.qml:283", "comment": "" }, { "term": "• MM - Month (01-12)", "context": "• MM - Month (01-12)", - "reference": "Modules/Settings/TimeWeatherTab.qml:409", + "reference": "Modules/Settings/TimeWeatherTab.qml:294", "comment": "" }, { "term": "• MMM - Month (Jan)", "context": "• MMM - Month (Jan)", - "reference": "Modules/Settings/TimeWeatherTab.qml:415", + "reference": "Modules/Settings/TimeWeatherTab.qml:299", "comment": "" }, { "term": "• MMMM - Month (January)", "context": "• MMMM - Month (January)", - "reference": "Modules/Settings/TimeWeatherTab.qml:421", + "reference": "Modules/Settings/TimeWeatherTab.qml:304", "comment": "" }, { "term": "• Plugins may contain bugs or security issues", "context": "• Plugins may contain bugs or security issues", - "reference": "Modules/Settings/PluginBrowser.qml:602", + "reference": "Modules/Settings/PluginBrowser.qml:606", "comment": "" }, { "term": "• Review code before installation when possible", "context": "• Review code before installation when possible", - "reference": "Modules/Settings/PluginBrowser.qml:608", + "reference": "Modules/Settings/PluginBrowser.qml:612", "comment": "" }, { "term": "• d - Day (1-31)", "context": "• d - Day (1-31)", - "reference": "Modules/Settings/TimeWeatherTab.qml:374", + "reference": "Modules/Settings/TimeWeatherTab.qml:263", "comment": "" }, { "term": "• dd - Day (01-31)", "context": "• dd - Day (01-31)", - "reference": "Modules/Settings/TimeWeatherTab.qml:380", + "reference": "Modules/Settings/TimeWeatherTab.qml:268", "comment": "" }, { "term": "• ddd - Day name (Mon)", "context": "• ddd - Day name (Mon)", - "reference": "Modules/Settings/TimeWeatherTab.qml:386", + "reference": "Modules/Settings/TimeWeatherTab.qml:273", "comment": "" }, { "term": "• dddd - Day name (Monday)", "context": "• dddd - Day name (Monday)", - "reference": "Modules/Settings/TimeWeatherTab.qml:392", + "reference": "Modules/Settings/TimeWeatherTab.qml:278", "comment": "" }, { "term": "• yy - Year (24)", "context": "• yy - Year (24)", - "reference": "Modules/Settings/TimeWeatherTab.qml:427", + "reference": "Modules/Settings/TimeWeatherTab.qml:309", "comment": "" }, { "term": "• yyyy - Year (2024)", "context": "• yyyy - Year (2024)", - "reference": "Modules/Settings/TimeWeatherTab.qml:433", + "reference": "Modules/Settings/TimeWeatherTab.qml:314", "comment": "" } ] \ No newline at end of file diff --git a/quickshell/translations/poexports/es.json b/quickshell/translations/poexports/es.json index d9b607b9..aac604a5 100644 --- a/quickshell/translations/poexports/es.json +++ b/quickshell/translations/poexports/es.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "%1 adaptador(es), ninguno conectado" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- Apóyanos con una estrella" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1 evento" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "Formato de 24 horas" }, "24-hour format": { "24-hour format": "Formato de 24 horas" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "De terceros" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "Clima de la semana" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "Un archivo con este nombre ya existe. ¿Quieres reemplazarlo?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "Activo" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "Activo:" }, @@ -128,6 +170,9 @@ "All": { "All": "Todo" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "Todo el día" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "Siempre mostrar el porcentaje en el OSD" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "Iconos fijos" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "Nivel de batería y gestión de energía" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "Conectar pantalla de bloqueo a las señales dbus de loginctl. Deshabilitar si se usa una pantalla de bloqueo externa" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "Capacidad" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "Indicador de Bloq Mayús" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "Elije dónde aparecen los indicadores en pantalla" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "Cifrado" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "Cerrar vista general al iniciar" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "Sobrescribir color" }, "Color Picker": { "Color Picker": "Selector de color" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "Temperatura de color para el día" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "Compositor" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "Configuración activada" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "Controlar la reproducción en curso" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "Controla la opacidad de todas las ventanas, modales y sus capas de contenido (DankDash, Ajustes, Cajón de aplicaciones, Centro de control, etc.)" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "Copiar Nombre del Proceso" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "Redondeo de esquinas (0 = esquinas cuadradas)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "Personal" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "Ubicación personalizada" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "Acciones de energía personalizadas" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "Transparencia personalizada" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch no disponible" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "Modo oscuro" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "Formato de nombre" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "Mostrar un panel con aplicaciones fijadas y activas que puede colocarse en el borde superior, inferior, izquierdo o derecho de la pantalla" }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "Mostrar acciones en una cuadrícula en vez de una lista" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "Ajustes de pantalla para " }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "Mostrar porcentaje de volumen y brillo en los avisos OSD" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "Pantallas" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "Dock" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "Posición del dock" }, "Dock Transparency": { "Dock Transparency": "Transparencia del dock" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "Dominio (opcional)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "Habilitar barra" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "Habilitar temperatura GPU" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "Información del archivo" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "Encontrar texto" }, "Find in note...": { "Find in note...": "Encontrar en notas..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "Control de gamma no disponible. Requiere DMS API v6+." }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "GitHub:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "Con qué frecuencia cambiar el fondo de pantalla" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "Importar VPN" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "Incluir transiciones" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "Matar el proceso" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "Usado hace %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "Pantalla de bloqueo" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "Formato en la pantalla de bloqueo" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "Cerrar sesión" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "Texto largo" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "Medio necesario" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "Ajustes del reproductor" }, "Media Players (": { "Media Players (": "Reproductores (" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "Volumen multimedia OSD" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "Memoria" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "Micrófono" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "Silencio del micrófono OSD" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "Mostrar velocidad de descarga y subida de la red" }, + "Never": { + "Never": "" + }, "New": { "New": "Nuevo" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "Temperatura nocturna" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "Ninguna" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "Prioridad normal" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "Bandeja de salida no encontrada" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "Posición: " }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "Energía y seguridad" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "Confirmación de acción" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "Opciones de Energía" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "Perfil de Energía Degradada" }, "Power Profile OSD": { "Power Profile OSD": "Perfil de energía OSD" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "Escalar todos los tamaños de fuente" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "Escanear" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "Seleccionar el grosor de la fuente" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "Seleccionar monitor para configurar el fondo de pantalla" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "Seleccionar tema de sonidos del sistema" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "Selecciona el algoritmo de colores del fondo de pantalla" }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "Ajustes" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: Borrar todo • Esc: Cerrar " }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "Mostrar Reiniciar DMS" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "Mostrar Suspender" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "Tamaño relativo" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "Ordenar alfabéticamente" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "Tema de sonidos" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "Espaciador" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "Apoyar desarrollo" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "Superficie" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "Monitoreo del sistema:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "Bandeja del sistema" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "Iconos del área de notificaciones del sistema" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "Notificaciones emergentes del sistema" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "Los complementos de terceros son creados por la comunidad y no cuentan con soporte oficial de DankMaterialShell.\\n\\nEstos complementos pueden representar riesgos de seguridad y privacidad - instálalos bajo tu propia responsabilidad." }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Este widget evita que la GPU entre en estados de apagado y puede afectar significativamente la batería en portátiles. No se recomienda usarlo en portátiles con gráficos híbridos." }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "Tiempo y clima" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "Tiempo agotado" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "Para actualizar, ejecute el siguiente comando:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "Mensajes emergentes" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "Efecto de transición" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "Apagar monitores después de" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "No disponible" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "Efecto visual usado al cambiar el fondo de pantalla" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "Cambio de volumen" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "Espacios de trabajo" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "Si" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "Tienes cambios sin guardar. ¿Guardar antes de abrir otro archivo?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "Elegir tema personalizado" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "Seleccionar fondo de pantalla" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "eventos" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl no disponible - integración requiere conexión al socket DMS" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "Matugen no detectado - tematización dinámica no disponible" }, + "minutes": { + "minutes": "" + }, "official": { "official": "oficial" }, "profile image file browser title": { "Select Profile Image": "Elegir foto de perfil" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "Ajustes" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "Elegir carpeta de fondos de pantalla" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• Instalar solo desde fuentes confiables" }, diff --git a/quickshell/translations/poexports/it.json b/quickshell/translations/poexports/it.json index a9fe26a3..650c547a 100644 --- a/quickshell/translations/poexports/it.json +++ b/quickshell/translations/poexports/it.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- Supportaci Con Una Stella ⭐" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1 evento" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "Formato 24-Ore" }, "24-hour format": { "24-hour format": "formato 24-ore" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "terze parti" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "Previsioni 7-giorni" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "Un file con questo nome esiste già. Vuoi sovrascriverlo?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "" }, @@ -128,6 +170,9 @@ "All": { "All": "Tutto" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "Tutto il giorno" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "Visualizza sempre percentuale OSD" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "Icone sempre attive" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "Livello batteria e gestione energetica" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "Collega il blocca schermo ai segnali dbus da loginctl.\nDisabilità se stai usando un blocca schermo esterno" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "Capacità" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "Indicatore Maiuscolo" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "Scegli dove i messaggi appaiono sullo schermo" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "Chiudi Overview all'Avvio" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "Sostituzione Colore" }, "Color Picker": { "Color Picker": "Prelievo Colore" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "Temperatura colore per il giorno" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "Compositor\n" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "Configurazione attivata" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "Controllo media attualmente in riproduzione " }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "Controlla l'opacità di tutti i popup, delle finestre modali e dei relativi livelli di contenuto (Dank Dash, Impostazioni, App Drawer, Centro di controllo, ecc.)" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "Copia Nome Processo" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "Raggio Angoli (0 = angoli squadrati)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "Personalizzato" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "Posizione Personalizzata" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "Azione Alimentazione Personalizzate" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "Trasparenza personalizzata" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch non disponibile" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "Modalità Scura" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "Formato del nome visualizzato" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "Visualizza una dock con applicazioni pinnate ed in esecuzione che possono essere posizionate nell'angolo superiore, inferiore, sinistro o destro dello schermo" }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "Visualizza le azioni di alimentazioni in griglia invece di una lista" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "Impostazioni display per " }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "Mostra di default la percentuale volume e luminosità nei popups OSD" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "Displays" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "Dock" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "Posizione Dock" }, "Dock Transparency": { "Dock Transparency": "Trasparenza Dock" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "Dominio (opzionale)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "Abilita Barra" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "Abilita Temperatura GPU" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "Informazioni File" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "Trova nel Testo" }, "Find in note...": { "Find in note...": "Trova in note..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "Gamma control non disponibile. Richiede API DMS v6+." }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "Github:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "Quanto spesso cambiare lo sfondo" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "Includi Transizioni" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "Chiusura Processo" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "Ultimo avviato %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "Blocca Schermo" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "Formato Blocca Schermo" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "Log Out" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "Testo Lungo" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "Media Richiesti" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "Impostazioni Media Player" }, "Media Players (": { "Media Players (": "Media Players (" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "OSD Volume Media" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "Memoria" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "Microfono" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "OSD Microfono Muto" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "Mostra velocità di download e upload della rete" }, + "Never": { + "Never": "" + }, "New": { "New": "Nuovo" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "Temperatura Notte" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "Nulla" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "Priorità Normale" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "Vassoio Uscita Mancante" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "Posizione" }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "Alimentazione & Sicurezza" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "Conferma Azioni Alimentazione" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "Opzioni Alimentazione" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "Degradamento profilo energetico" }, "Power Profile OSD": { "Power Profile OSD": "OSD Profilo Alimentazione" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "Scala tutte le dimensioni dei font" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "Scansiona" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "Seleziona peso font" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "Selezionare il monitor per configurare lo sconto" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "Seleziona tema suoni di sistema" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "Seleziona l'algoritmo tavolozza usato per i colori basati sullo sfondo" }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "Impostazioni" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: Elimina tutto • Esc: Chiude" }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "Mostra Riavvia DMS" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "Mostra Sospendi" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "Dimensione Offset" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "Ordina Alfabeticamente" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "Tema Suoni" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "Spaziatore" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "Supporta Sviluppo" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "Superficie" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "Monitoraggio Sistema:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "Vassoio Sistema" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "Icone area notifiche di sistema" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "Notiche toast di sistema" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "I plugin di terze parti sono creati dalla community e non sono ufficialmente supportati da DankMaterialShell.\\n\\nQuesti plugin possono comportare rischi per la sicurezza e la privacy - installare a proprio rischio." }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Questo widget impedisce gli stati di spegnimento della GPU, che possono influire in modo significativo sulla durata della batteria sui laptop. Non è consigliabile utilizzare questo su laptop con grafica ibrida." }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "Orario & Meteo" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "Scaduto" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "Per aggiornare, esegui il seguente comando:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "Messaggi Toast" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "Effetto Transizione" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "Spegni monitors dopo" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "Effetto visivo usato quando cambia lo sfondo" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "Volume Cambiato" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "Switcher Workspace" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "Ci sono modifiche non salvate. Salvare prima di aprire un file?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "Seleziona Tema Personalizzato" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "Seleziona Sfondo" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "eventi" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl non disponibile - integrazione blocco richiede connessione socket DMS" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "matugen non rilevato - tema dinamico non disponibile" }, + "minutes": { + "minutes": "" + }, "official": { "official": "ufficiale" }, "profile image file browser title": { "Select Profile Image": "Seleziona Immagine Profilo" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "Impostazioni" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "Seleziona Cartella Sfondo" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• Installa solo da sorgenti fidate" }, diff --git a/quickshell/translations/poexports/ja.json b/quickshell/translations/poexports/ja.json index 1437d8c6..f91ce0f1 100644 --- a/quickshell/translations/poexports/ja.json +++ b/quickshell/translations/poexports/ja.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- 星を付けて応援してください⭐" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1件のイベント" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "24時間形式" }, "24-hour format": { "24-hour format": "24時間形式" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "サードパーティ" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "7日間予報" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "この名前のファイルは既に存在します。上書きしてもよろしいですか?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "" }, @@ -128,6 +170,9 @@ "All": { "All": "全て" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "毎日" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "常に OSD パーセンテージを表示" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "常時表示アイコン" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "バッテリーレベルおよび電源管理" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "ロック画面をloginctlからのdbus信号にバインド。外部ロック画面を使用している場合は無効に" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "容量" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "Caps Lock インジケーター" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "OSDの表示する場所を選んでください" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "起動中のときに概要を閉じる" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "色のオーバーライド" }, "Color Picker": { "Color Picker": "カラーピッカー" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "昼間の色温度" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "コンポジター" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "設定が適用されました" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "現在再生中のメディアを制御" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "すべてのポップアウト、モーダル、およびそれらのコンテンツレイヤー(DankDash、設定、アプリドロワー、コントロールセンターなど)の不透明度を制御" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "プロセス名をコピー" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "コーナー半径(0 = 角丸なし)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "カスタム" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "カスタムロケーション" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "カスタム電源アクション" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "カスタム透明度" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearchが利用できません" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "ダークモード" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "名称形式を表示" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "画面の上、下、左、右の端に配置できる、ピン留めされた実行中のアプリケーションを含むドックを表示します" }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "電源メニューのアクションをリストではなくグリッドに表示" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "以下の設定を表示 " }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "OSDポップアップに音量と輝度のパーセンテージ値をデフォルトで表示" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "表示" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "ドック" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "ドック位置" }, "Dock Transparency": { "Dock Transparency": "ドックの透明度" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "ドメイン (オプション)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "バーを起用" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "GPU温度を有効にする" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "ファイル情報" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "テキスト内検索" }, "Find in note...": { "Find in note...": "メモで検索..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "ガンマ制御は使用できません。DMS API v6+ が必要です。" }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "GitHub:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "壁紙を切り替える間隔" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "トランジションを含める" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "プロセスを強制終了" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "最終起動日 %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "ロック画面" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "ロック画面のフォーマット" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "ログアウト" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "長文" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "メディアが必要" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "メディアプレーヤーの設定" }, "Media Players (": { "Media Players (": "メディアプレーヤー(" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "メディア音量OSD" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "メモリ" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "マイク" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "マイクミュートOSD" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "ネットワークのダウンロードおよびアップロード速度を表示" }, + "Never": { + "Never": "" + }, "New": { "New": "新しい" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "夜間の温度" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "ない" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "通常の優先度" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "アウトプットトレイが見つかりませんでした" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "位置: " }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "電源とセキュリティ" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "電源アクションの確認" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "電源オプション" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "電源プロファイルの劣化" }, "Power Profile OSD": { "Power Profile OSD": "電源プロファイルOSD" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "すべてのフォントサイズを拡大縮小" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "スキャン" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "フォントの太さを選ぶ" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "壁紙を設定するモニターを選ぶ" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "システムサウンドテーマを選ぶ" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "壁紙ベースの色で、使用するパレットアルゴリズムを選ぶ" }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "設定" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: すべてクリア • Esc: 閉じる" }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "DMS再起動を表示" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "一時停止を表示" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "サイズオフセット" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "アルファベット順に並べ替える" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "サウンドテーマ" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "間隔" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "開発をサポート" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "表面" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "システム監視:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "システムトレイ" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "システム通知エリアアイコン" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "システムトースト通知" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "サードパーティプラグインはコミュニティによって作成されており、DankMaterialShellによる公式サポートはありません。\\n\\nこれらのプラグインはセキュリティやプライバシーのリスクをもたらす可能性があります - 自己責任でインストールしてください。" }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "このウィジェットはGPUの省電力状態を防ぎ、ノートパソコンのバッテリー寿命に大きな影響を与える可能性があります。ハイブリッドグラフィックス搭載のノートパソコンでの使用は推奨されません。" }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "時間および天気" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "タイムアウト" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "更新するには以下のコマンドを実行してください:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "トーストメッセージ" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "トランジション効果" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "後にモニターの電源を切る" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "壁紙が変更される時に使用されるビジュアルエフェクト" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "音量変更" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "ワークスペーススイッチャー" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "保存されていない変更があります。ファイルを開く前に保存しますか?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "カスタムテーマを選んでください" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "壁紙を選んでください" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "イベント" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctlが利用できません- ロック統合のためにDMS socketの接続が必要です。" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "matugen が検出されません - ダイナミックテーマ設定は利用できません" }, + "minutes": { + "minutes": "" + }, "official": { "official": "公式" }, "profile image file browser title": { "Select Profile Image": "プロファイル画像を選んでください" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "設定" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "壁紙のディレクトリを選んでください" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• 信頼できるソースからのみインストールする" }, diff --git a/quickshell/translations/poexports/pl.json b/quickshell/translations/poexports/pl.json index becffdd3..7d2396f9 100644 --- a/quickshell/translations/poexports/pl.json +++ b/quickshell/translations/poexports/pl.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "%1 adapter(y), brak połączenia" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- Wesprzyj nas gwiazdką ⭐" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1 wydarzenie" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "Format 24-godzinny" }, "24-hour format": { "24-hour format": "format 24-godzinny" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "strona trzecia" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "Prognoza 7-dniowa" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "Plik o takiej nazwie już istnieje. Czy chcesz go nadpisać?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "Aktywny" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "Aktywny: " }, @@ -128,6 +170,9 @@ "All": { "All": "Wszystkie" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "Cały dzień" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "Zawsze pokazuj procent w OSD" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "Ikony zawsze włączone" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "Poziom baterii i zarządzanie zasilaniem" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "Powiąż ekran blokady z sygnałami dbus z loginctl. Wyłącz, jeśli używasz zewnętrznego ekranu blokady" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "Pojemność" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "Wskaźnik caps locka" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "Wybierz miejsce wyświetlania informacji na ekranie" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "Szyfr" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "Zamknij podgląd przy uruchomieniu" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "Nadpisanie koloru" }, "Color Picker": { "Color Picker": "Próbnik kolorów" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "Temperatura barwowa w ciągu dnia" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "Kompozytor" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "Konfiguracja aktywowana" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "Steruj aktualnie odtwarzanymi multimediami" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "Kontroluje przezroczystość wszystkich wyskakujących okienek, okien modalnych i ich warstw zawartości (DankDash, Ustawienia, Szuflada aplikacji, Centrum sterowania itp.)" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "Kopiuj nazwę procesu" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "Promień narożnika (0 = kwadratowe narożniki)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "Niestandardowy" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "Niestandardowa lokalizacja" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "Niestandardowe akcje zasilania" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "Niestandardowa przezroczystość" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch niedostępny" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "Tryb ciemny" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "Format nazwy wyświetlanej" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "Wyświetla dok z przypiętymi i uruchomionymi aplikacjami, który można umieścić na górze, na dole, po lewej lub po prawej stronie ekranu." }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "Wyświetl elementy menu zasilania w siatce zamiast listy" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "Ustawienia wyświetlania dla " }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "Domyślnie wyświetlaj wartości procentowe głośności i jasności w wyskakujących okienkach OSD" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "Ekrany" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "Dok" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "Pozycja Doka" }, "Dock Transparency": { "Dock Transparency": "Przezroczystość Doka" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "Domena (opcjonalnie)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "Włącz pasek" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "Pokaż temperaturę GPU" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "Informacje" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "Znajdź w tekście" }, "Find in note...": { "Find in note...": "Znajdź w notatce..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "Kontrola gamma niedostępna. Wymaga DMS API w wersji 6+." }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "Github:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "Jak często zmieniać tapetę" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "Importuj VPN" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "Uwzględnij przejścia" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "Zabij proces" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "Ostatnio uruchomiony %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "Ekran blokady" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "Format ekranu blokady" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "Wyloguj" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "Długi tekst" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "Wymagany nośnik" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "Ustawienia odtwarzacza multimediów" }, "Media Players (": { "Media Players (": "Odtwarzacze multimediów (" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "OSD głośności multimediów" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "Pamięć" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "Mikrofon" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "OSD Wyciszenia Mikrofonu" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "Wyświetlanie prędkości pobierania i wysyłania sieci" }, + "Never": { + "Never": "" + }, "New": { "New": "Nowy" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "Temperatura w nocy" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "Brak" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "Normalny priorytet" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "Brak tacy wyjściowej" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "Stanowisko: " }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "Zasilanie i bezpieczeństwo" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "Potwierdzenie działania zasilania" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "Opcje zasilania" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "Pogorszenie profilu zasilania" }, "Power Profile OSD": { "Power Profile OSD": "OSD Profilu Zasilania" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "Skaluj wszystkie rozmiary czcionek" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "Skanuj" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "Wybierz grubość czcionki" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "Wybierz monitor, aby skonfigurować tapetę" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "Wybierz motyw dźwiękowy systemu" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "Wybierz algorytm palety używany dla kolorów tapet." }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "Ustawienia" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: Wyczyść wszystko • Esc: Zamknij" }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "Pokaż ponowne uruchomienie DMS" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "Pokaż zawieszenie" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "Przesunięcie rozmiaru" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "Sortuj alfabetycznie" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "Motyw dźwiękowy" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "Odstęp" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "Wspieraj rozwój" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "Powierzchnia" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "Monitorowanie systemu:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "Zasobnik systemowy" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "Ikony obszaru powiadomień systemowych" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "Powiadomienia o toastach systemowych" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "Wtyczki firm trzecich są tworzone przez społeczność i nie są oficjalnie wspierane przez DankMaterialShell.\\n\\nTe wtyczki mogą stanowić zagrożenie dla bezpieczeństwa i prywatności - instaluj na własne ryzyko." }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Ten widżet zapobiega wyłączaniu zasilania GPU, co może znacznie wpłynąć na żywotność baterii w laptopach. Nie zaleca się używania go na laptopach z hybrydową grafiką." }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "Czas i pogoda" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "Przekroczono limit czasu" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "Aby dokonać aktualizacji, uruchom następujące polecenie:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "Wiadomości toastowe" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "Efekt przejścia" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "Wyłącz monitory po" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "Niedostępny" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "Efekt wizualny używany przy zmianie tapety" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "Zmieniony wolumen" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "Przełącznik obszarów roboczych" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "Tak" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "Masz niezapisane zmiany. Zapisać przed otwarciem pliku?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "Wybierz niestandardowy motyw" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "Wybierz tapetę" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "wydarzenia" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl niedostępny - integracja blokady wymaga połączenia z gniazdem DMS" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "nie wykryto matugen - dynamiczne motywy niedostępne" }, + "minutes": { + "minutes": "" + }, "official": { "official": "oficjalny" }, "profile image file browser title": { "Select Profile Image": "Wybierz obraz profilowy" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "Ustawienia" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "Wybierz katalog z tapetami" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• Instaluj tylko z zaufanych źródeł" }, diff --git a/quickshell/translations/poexports/pt.json b/quickshell/translations/poexports/pt.json index 162de2c1..d8a31833 100644 --- a/quickshell/translations/poexports/pt.json +++ b/quickshell/translations/poexports/pt.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- Apoie-nos com uma Estrela ⭐" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1 evento" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "Formato de 24 Horas" }, "24-hour format": { "24-hour format": "formato de 24 horas" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "Terceiros" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "Previsão do Tempo de 7 Dias" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "Um arquivo com esse nome já existe. Você quer sobrescrevê-lo?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "" }, @@ -128,6 +170,9 @@ "All": { "All": "Todos" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "O dia todo" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "Sempre mostrar porcetagem no OSD" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "Nível de bateria e manejamento de energia" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "Vincular o bloqueio de tela aos sinais do DBus do loginctl. Desative se estiver usando um bloqueio de tela externo" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "Capacidade" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "Sobrescrever Cor" }, "Color Picker": { "Color Picker": "Seletor de Cores" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "Temperatura de cor durante o dia" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "Compositor" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "Configuração ativada" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "Controlar mídia que está sendo reproduzida" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "Copiar Nome do Processo" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "Ângulo da quina (0 = quina quadrilátera)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "Customizado" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "Customizar Localização" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "Ações de Energia Customizadas" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "Transparência Customizada" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch não disponível" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "Exibir um dock com aplicativos que estão sendo utilizados, e que pode ser posicionada no superior, inferior, esquerda ou direita dos cantos da tela" }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "" }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "Mostrar porcentagem de volume e brilho por padrão nos pop ups de OSD" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "Telas" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "Dock" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "Posição da Dock" }, "Dock Transparency": { "Dock Transparency": "Transparência da Dock" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "Domínio (opcional)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "Habilitar Temperatura da GPU" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "Informação do Arquivo" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "Procurar no Texto" }, "Find in note...": { "Find in note...": "Procurar na nota..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "Controle de gama não disponível. Necessário DMS API v6+." }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "Github:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "Tempo entre papéis de parede" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "Incluir Transições" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "Matar Processo" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "Lançado pela última vez em %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "Tela de Bloqueio" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "Formato da Tela de Bloqueio" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "Sair" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "Longo Texto" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "Configurações do Reprodutor de Mídia" }, "Media Players (": { "Media Players (": "Reprodutores de Mídia(" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "Memória" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "Monitor de velocidades de download e upload da rede" }, + "Never": { + "Never": "" + }, "New": { "New": "Novo" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "Temperatura Noturna" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "Prioridade Normal" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "" }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "Energia & Segurança" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "Confirmação de Ação de Energia" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "Opções de Energia" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "Degradação do Perfil de Energia" }, "Power Profile OSD": { "Power Profile OSD": "" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "Ajustar todos os tamanhos de fonte" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "Escanear" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "Selecionar espessura da fonte" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "Selecionar monitor para configurar papel de parede" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "Selecionar tema do som do sistema" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "Selecione o algoritmo usado para cores baseadas no papel de parede" }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "Configurações" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: Apagar tudo • Esc: Fechar" }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "Ajuste de Tamanho" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "Ordenar Alfabeticamente" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "Tema do Som" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "Espaçador" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "Apoie o Desenvolvimento" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "Superfície" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "Monitoramento do Sistema:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "Bandeja do Sistema" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "Área de ícones de notificações do sistema" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "Notificações toast do sistema" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "Plugins de terceiros são criados pela comunidade e não têm suporte oficial do DankMaterialShell.\\n\\nEsses plugins podem representar riscos à segurança e à privacidade - instale por sua conta e risco." }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Este widget mantém a GPU ativa, podendo reduzir a duração da bateria. Não recomendado em laptops com gráficos híbridos." }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "Hora & Clima" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "Para atualizar, execute o seguinte comando:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "Mensagens Toast" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "Efeito de Transição" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "Desligar monitores depois de" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "Efeito visual usado na mudança do papel de parede" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "Volume Alterado" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "Seletor de Áreas de Trabalho" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "Você tem mudanças não salvas. Deseja salvar antes de abrir um arquivo?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "eventos" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl não disponível - integração com bloqueio requer conexão de socket DMS" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "matugen não detectado - tematização dinâmica não disponível" }, + "minutes": { + "minutes": "" + }, "official": { "official": "oficial" }, "profile image file browser title": { "Select Profile Image": "" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "Instale apenas de fontes confiáveis" }, diff --git a/quickshell/translations/poexports/tr.json b/quickshell/translations/poexports/tr.json index b6ceb780..b4de41a2 100644 --- a/quickshell/translations/poexports/tr.json +++ b/quickshell/translations/poexports/tr.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "%1 bağdaştırıcı, hiçbiri bağlı değil" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- Bir yıldızla bize destek olun ⭐" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1 etkinlik" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "24-Saat Biçimi" }, "24-hour format": { "24-hour format": "24-saat biçimi" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "Üçüncü taraf" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "7 Günlük Tahmin" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "Bu isimde bir dosya zaten var. Üzerine yazmak istiyor musunuz?" }, @@ -75,7 +114,7 @@ "Access to system controls and settings": "Sistem kontrolleri ve ayarlara eriş" }, "Action": { - "Action": "" + "Action": "Eylem" }, "Actions": { "Actions": "Eylemler" @@ -86,6 +125,9 @@ "Active": { "Active": "Etkin" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "Etkin: " }, @@ -117,17 +159,20 @@ "Add a VPN in NetworkManager": "NetworkManager'da VPN ekle" }, "Add a border around the dock": { - "Add a border around the dock": "" + "Add a border around the dock": "Dock etrafına kenarlık ekle" }, "Adjust the number of columns in grid view mode.": { "Adjust the number of columns in grid view mode.": "Izgara görünümü modunda sütun sayısını ayarla" }, "Afternoon": { - "Afternoon": "" + "Afternoon": "Öğleden Sonra" }, "All": { "All": "Tümü" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "Tüm gün" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "OSD Yüzdesini Her Zaman Göster" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "Her zaman açık simgeler" }, @@ -335,14 +383,17 @@ "Battery level and power management": { "Battery level and power management": "Batarya seviyesi ve güç yönetimi" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "Kilit ekranını loginctl'den gelen dbus sinyallerine bağlayın. Harici bir kilit ekranı kullanıyorsanız devre dışı bırakın" }, "Binds Include Missing": { - "Binds Include Missing": "" + "Binds Include Missing": "Bağlantı dahili yok" }, "Binds include added": { - "Binds include added": "" + "Binds include added": "Bağlantı dahili eklendi" }, "Bluetooth": { "Bluetooth": "Bluetooth" @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "Kapasite" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "Caps Lock Göstergesi" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "Ekran gösterimlerinin ekranda nerede gösterileceğini seç" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "Şifre" }, @@ -507,10 +564,10 @@ "Click Import to add a .ovpn or .conf": ".ovpn veya .conf dosyası eklemek için İçe Aktar'ı tıklayın." }, "Click any shortcut to edit. Changes save to dms/binds.kdl": { - "Click any shortcut to edit. Changes save to dms/binds.kdl": "" + "Click any shortcut to edit. Changes save to dms/binds.kdl": "Düzenlemek için herhangi bir kısayola tıklayın. Değişiklikler dms/binds.kdl dosyasına kaydedilir." }, "Click to capture": { - "Click to capture": "" + "Click to capture": "Yakalamak için tıkla" }, "Clipboard History": { "Clipboard History": "Pano Geçmişi" @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "Başlatmada Genel Görünümü Kapat" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "Renk Değiştirme" }, "Color Picker": { "Color Picker": "Renk Seçici" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "Gündüz için renk sıcaklığı" }, @@ -546,7 +609,7 @@ "Colorful mix of bright contrasting accents.": "Parlak kontrastlı vurguların renkli karışımı." }, "Command": { - "Command": "" + "Command": "Komut" }, "Command or script to run instead of the standard hibernate procedure": { "Command or script to run instead of the standard hibernate procedure": "Standart hazırda bekleme prosedürü yerine çalıştırılacak komut veya komut dosyası" @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "Kompozitör" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "Yapılandırma aktifleştirildi" }, @@ -600,7 +666,7 @@ "Confirm passkey for ": "Şunun için şifreyi onayla: " }, "Conflicts with: %1": { - "Conflicts with: %1": "" + "Conflicts with: %1": "Şununla çakışıyor: %1" }, "Connect": { "Connect": "Bağlan" @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "Şu anda oynatılan medyayı kontrol et" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "Tüm açılır pencerelerin, modal pencerelerin ve bunların içerik katmanlarının (DankDash, Ayarlar, Uygulama Çekmecesi, Kontrol Merkezi vb.) opaklığını kontrol eder" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "Süreç Adını Kopyala" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "Köşe Yarıçapı (0 = kare köşeler)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "Özel" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "Özel Konum" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "Özel Güç Eylemleri" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "Özel Şeffaflık" }, @@ -714,7 +807,7 @@ "DMS out of date": "DMS güncel değil" }, "DMS shell actions (launcher, clipboard, etc.)": { - "DMS shell actions (launcher, clipboard, etc.)": "" + "DMS shell actions (launcher, clipboard, etc.)": "DMS kabuk eylemleri (başlatıcı, pano, vb.)" }, "DMS_SOCKET not available": { "DMS_SOCKET not available": "DMS_SOCKET kullanılamıyor" @@ -723,7 +816,7 @@ "DWL service not available": "DWL hizmeti kullanılamıyor" }, "Daily Forecast": { - "Daily Forecast": "" + "Daily Forecast": "Günlük Hava Tahmini" }, "Daily at:": { "Daily at:": "Her gün saat:" @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch kullanılamıyor" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "Karanlık Mod" }, @@ -756,13 +852,13 @@ "Date Format": "Tarih Biçimi" }, "Dawn (Astronomical Twilight)": { - "Dawn (Astronomical Twilight)": "" + "Dawn (Astronomical Twilight)": "Şafak (Astronomik Alacakaranlık)" }, "Dawn (Civil Twilight)": { - "Dawn (Civil Twilight)": "" + "Dawn (Civil Twilight)": "Şafak (Sivil Alacakaranlık)" }, "Dawn (Nautical Twilight)": { - "Dawn (Nautical Twilight)": "" + "Dawn (Nautical Twilight)": "Şafak (Denizci Şafağı)" }, "Day Temperature": { "Day Temperature": "Gündüz Sıcaklığı" @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "Ekran İsim Formatı" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "Ekranın üst, alt, sol veya sağ kenarına yerleştirilebilen, sabitlenmiş ve çalışan uygulamaları içeren bir dock görüntüleyin." }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "Güç menüsü eylemlerini liste yerine ızgara şeklinde göster" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "Ekran ayarları: " }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "OSD açılır pencerelerinde varsayılan olarak ses seviyesi ve parlaklık yüzdelik değerlerini göster" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "Ekranlar" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "Dock" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "Dock Konumu" }, "Dock Transparency": { "Dock Transparency": "Dock Şeffaflığı" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "Etki alanı (isteğe bağlı)" }, @@ -912,13 +1026,13 @@ "Duration": "Süre" }, "Dusk (Astronomical Twilight)": { - "Dusk (Astronomical Twilight)": "" + "Dusk (Astronomical Twilight)": "Alacakaranlık (Astronomik Alacakaranlık)" }, "Dusk (Civil Twighlight)": { - "Dusk (Civil Twighlight)": "" + "Dusk (Civil Twighlight)": "Alacakaranlık (Sivil Alacakaranlık)" }, "Dusk (Nautical Twilight)": { - "Dusk (Nautical Twilight)": "" + "Dusk (Nautical Twilight)": "Alacakaranlık (Denizci Alacakaranlığı)" }, "Dynamic Theming": { "Dynamic Theming": "Dinamik Tema" @@ -938,11 +1052,14 @@ "Enable Bar": { "Enable Bar": "Barı Etkinleştir" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "GPU Sıcaklığını Etkinleştir" }, "Enable Overview Overlay": { - "Enable Overview Overlay": "" + "Enable Overview Overlay": "Genel Görünüm Katmanını Etkinleştir" }, "Enable System Sounds": { "Enable System Sounds": "Sistem Seslerini Etkinleştir" @@ -1029,7 +1146,7 @@ "Failed to activate configuration": "Yapılandırma etkinleştirilemedi" }, "Failed to add binds include": { - "Failed to add binds include": "" + "Failed to add binds include": "Bağlantı dahili eklenemedi" }, "Failed to add printer to class": { "Failed to add printer to class": "Yazıcı sınıfa eklenemedi" @@ -1098,7 +1215,7 @@ "Failed to remove device": "Cihaz kaldırılamadı" }, "Failed to remove keybind": { - "Failed to remove keybind": "" + "Failed to remove keybind": "Tuş kombinasyonu kaldırılamadı" }, "Failed to remove printer from class": { "Failed to remove printer from class": "Yazıcı sınıftan kaldırılamadı" @@ -1110,7 +1227,7 @@ "Failed to resume printer": "Yazıcıyı devam ettirme başarısız" }, "Failed to save keybind": { - "Failed to save keybind": "" + "Failed to save keybind": "Tuş kombinasyonu kaydedilemedi" }, "Failed to set profile image": { "Failed to set profile image": "Profil resmi ayarlanamadı" @@ -1148,17 +1265,26 @@ "File Information": { "File Information": "Dosya Bilgisi" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "Metinde Bul" }, "Find in note...": { "Find in note...": "Notta bul..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { - "Fix Now": "" + "Fix Now": "Şimdi Düzelt" }, "Fixing...": { - "Fixing...": "" + "Fixing...": "Düzeltiliyor..." }, "Focused Window": { "Focused Window": "Odaklanılmış Pencere" @@ -1185,7 +1311,7 @@ "Force terminal applications to always use dark color schemes": "Terminal uygulamalarının her zaman koyu renk şemalarını kullanmasını zorla" }, "Forecast Not Available": { - "Forecast Not Available": "" + "Forecast Not Available": "Hava Tahmini Mevcut Değil" }, "Forget": { "Forget": "Unut" @@ -1226,11 +1352,14 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "Gama kontrolü mevcut değil. DMS API V6+ gerekir." }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "Github:" }, "Golden Hour": { - "Golden Hour": "" + "Golden Hour": "Altın Saat" }, "Good": { "Good": "İyi" @@ -1302,13 +1431,16 @@ "Hold to confirm (%1s)": "Onaylamak için basılı tutun (%1s)" }, "Hotkey overlay title (optional)": { - "Hotkey overlay title (optional)": "" + "Hotkey overlay title (optional)": "Kısayol katmanı başlığı (opsiyonel)" }, "Hour": { "Hour": "Saat" }, "Hourly Forecast": { - "Hourly Forecast": "" + "Hourly Forecast": "Saatlik Hava Tahmini" + }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" }, "How often to change wallpaper": { "How often to change wallpaper": "Duvar kağıdı değiştirme sıklığı" @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "VPN'i İçe Aktar" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "Geçişleri Dahil Et" }, @@ -1410,20 +1545,23 @@ "Keeping Awake": "Uyanık Tutuluyor" }, "Key": { - "Key": "" + "Key": "Tuş" }, "Keyboard Layout Name": { "Keyboard Layout Name": "Klavye Düzeni Adı" }, "Keyboard Shortcuts": { - "Keyboard Shortcuts": "" + "Keyboard Shortcuts": "Klavye Kısayolları" }, "Keys": { - "Keys": "" + "Keys": "Tuşlar" }, "Kill Process": { "Kill Process": "Süreci Öldür" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "Son başlatma %1" }, @@ -1476,7 +1614,7 @@ "Lively palette with saturated accents.": "Doygun vurgularla canlı renk paleti." }, "Loading keybinds...": { - "Loading keybinds...": "" + "Loading keybinds...": "Tuş kombinasyonları yükleniyor..." }, "Loading plugins...": { "Loading plugins...": "Eklentiler yükleniyor..." @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "Kilit Ekranı" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "Kilit Ekranı Biçimi" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "Çıkış" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "Uzun Metin" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "Kağıt Gerekli" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "Medya Oynatıcı Ayarları" }, "Media Players (": { "Media Players (": "Medya Oynatıcıları (" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "Medya Ses OSD" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "Bellek" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "Mikrofon" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "Mikrofon Sessiz OSD" }, @@ -1644,7 +1800,7 @@ "Monospace Font": "Sabit Aralıklı Yazı Tipi" }, "Morning": { - "Morning": "" + "Morning": "Sabah" }, "Mount": { "Mount": "Bağlı" @@ -1691,14 +1847,17 @@ "Network download and upload speed display": { "Network download and upload speed display": "Ağ indirme ve yükleme hız gösterimi" }, + "Never": { + "Never": "" + }, "New": { "New": "Yeni" }, "New Key": { - "New Key": "" + "New Key": "Yeni Tuş" }, "New Keybind": { - "New Keybind": "" + "New Keybind": "Yeni Tuş Kombinasyonu" }, "New Notification": { "New Notification": "Yeni Bildirim" @@ -1707,7 +1866,7 @@ "New York, NY": "New York, NY" }, "Night": { - "Night": "" + "Night": "Gece" }, "Night Mode": { "Night Mode": "Gece Modu" @@ -1715,8 +1874,11 @@ "Night Temperature": { "Night Temperature": "Gece Sıcaklığı" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { - "Niri compositor actions (focus, move, etc.)": "" + "Niri compositor actions (focus, move, etc.)": "Niri kompozitör (focus, move, vb.)" }, "No": { "No": "Hayır" @@ -1743,13 +1905,13 @@ "No Weather Data Available": "Hava Durumu Verileri Mevcut Değil" }, "No action": { - "No action": "" + "No action": "Eylem yok" }, "No adapters": { "No adapters": "Bağdaştırıcı yok" }, "No changes": { - "No changes": "" + "No changes": "Değişiklik yok" }, "No clipboard entries found": { "No clipboard entries found": "Pano girişleri bulunamadı" @@ -1767,7 +1929,7 @@ "No items added yet": "Henüz eklenen öğe yok" }, "No keybinds found": { - "No keybinds found": "" + "No keybinds found": "Tuş kombinasyonu bulunamadı" }, "No matches": { "No matches": "Eşleşme yok" @@ -1790,6 +1952,9 @@ "None": { "None": "Hiçbiri" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "Normal Öncelik" }, @@ -1869,7 +2034,7 @@ "Open search bar to find text": "Metin bulmak için arama çubuğunu aç" }, "Open with...": { - "Open with...": "" + "Open with...": "... ile aç" }, "Optional description": { "Optional description": "Opsiyonel tanım" @@ -1898,11 +2063,14 @@ "Output Tray Missing": { "Output Tray Missing": "Çıktı Tepsisi Yok" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { - "Override": "" + "Override": "Geçersiz Kıl" }, "Overrides": { - "Overrides": "" + "Overrides": "Geçersiz Kılınanlar" }, "Overview": { "Overview": "Genel Görünüm" @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "Pozisyon: " }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "Güç & Güvenlik" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "Güç Eylemi Onayı" }, @@ -2030,20 +2204,26 @@ "Power Options": { "Power Options": "Güç Ayarları" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "Güç Profili Dejenerasyonu" }, "Power Profile OSD": { "Power Profile OSD": "Güç Profili OSD" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { - "Precipitation Chance": "" + "Precipitation Chance": "Yağış Olasılığı" }, "Preference": { "Preference": "Tercih" }, "Press key...": { - "Press key...": "" + "Press key...": "Tuşa bas..." }, "Pressure": { "Pressure": "Basınç" @@ -2142,7 +2322,7 @@ "Refresh": "Yenile" }, "Refresh Weather": { - "Refresh Weather": "" + "Refresh Weather": "Hava Durumunu Yenile" }, "Reject Jobs": { "Reject Jobs": "İşleri Reddet" @@ -2205,10 +2385,10 @@ "Run User Templates": "Kullanıcı Şablonlarını Çalıştır" }, "Run a program (e.g., firefox, kitty)": { - "Run a program (e.g., firefox, kitty)": "" + "Run a program (e.g., firefox, kitty)": "Program çalıştır (örn. firefox, kitty)" }, "Run a shell command (e.g., notify-send)": { - "Run a shell command (e.g., notify-send)": "" + "Run a shell command (e.g., notify-send)": "Shell komutu çalıştır (örn. notify-send)" }, "Running Apps": { "Running Apps": "Çalışan Uygulamalar" @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "Tüm yazı tipi boyutlarını ölçeklendir" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "Tara" }, @@ -2253,7 +2436,7 @@ "Screen sharing": "Ekran paylaşımı" }, "Scroll song title": { - "Scroll song title": "" + "Scroll song title": "Şarkı başlığını kaydır" }, "Scrolling": { "Scrolling": "Kaydırma" @@ -2268,7 +2451,7 @@ "Search for a location...": "Bir konum ara..." }, "Search keybinds...": { - "Search keybinds...": "" + "Search keybinds...": "Tuş kombinasyonları ara..." }, "Search plugins...": { "Search plugins...": "Eklentileri ara..." @@ -2289,7 +2472,7 @@ "Security": "Güvenlik" }, "Select Application": { - "Select Application": "" + "Select Application": "Uygulama Seç" }, "Select Launcher Logo": { "Select Launcher Logo": "Başlatıcı Logosu Seç" @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "Yazı tipi ağırlığını seçin" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "Duvar kağıdını ayarlamak için monitör seçin" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "Sistem ses temasını seç" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "Duvar kağıdı tabanlı renkler için kullanılan palet algoritmasını seçin" }, @@ -2337,7 +2526,7 @@ "Select which transitions to include in randomization": "Rastgele seçime dahil edilecek geçişleri seçin" }, "Select...": { - "Select...": "" + "Select...": "Seç..." }, "Selected image file not found.": { "Selected image file not found.": "Seçilen resim dosyası bulunamadı." @@ -2355,19 +2544,25 @@ "Set different wallpapers for light and dark mode": "Karanlık ve aydınlık mod için farklı duvar kağıtları ayarlayın" }, "Set key and action to save": { - "Set key and action to save": "" + "Set key and action to save": "Kaydetmek için tuş ve eylem ayarlayın" }, "Settings": { "Settings": "Ayarlar" }, + "Setup": { + "Setup": "" + }, "Shell": { - "Shell": "" + "Shell": "Shell" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: Tümünü Temizle • Esc: Kapat" }, + "Short": { + "Short": "" + }, "Shortcuts": { - "Shortcuts": "" + "Shortcuts": "Kısayollar" }, "Show All Tags": { "Show All Tags": "Tüm Etiketleri Göster" @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "DMS'yi Yeniden Başlatı Göster" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "Askıya Alı Göster" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "Boyut Ofseti" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "Alfabetik Olarak Sırala" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "Ses Teması" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "Boşluklandırıcı" }, @@ -2544,14 +2751,17 @@ "Storage & Disks": "Depolama & Diskler" }, "Sunrise": { - "Sunrise": "" + "Sunrise": "Gündoğumu" }, "Sunset": { - "Sunset": "" + "Sunset": "Günbatımı" }, "Support Development": { "Support Development": "Gelişimi Destekle" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "Yüzey" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "Sistem İzleme:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "Sistem Tepsisi" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "Sistem bildirim alanı simgeleri" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "Sistem anlık bildirimleri" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "Üçüncü taraf eklentiler topluluk tarafından oluşturulmuştur ve DankMaterialShell tarafından resmi olarak desteklenmemektedir.\\n\\nBu eklentiler güvenlik ve gizlilik riskleri oluşturabilir - kendi sorumluluğunuzda yükleyin." }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "Bu widget, dizüstü bilgisayarlarda pil ömrünü önemli ölçüde etkileyebilen GPU güç kapatma durumlarını önler. Hibrit grafik kartına sahip dizüstü bilgisayarlarda kullanılması önerilmez." }, @@ -2669,11 +2888,23 @@ "Time & Weather": { "Time & Weather": "Zaman & Hava Durumu" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "Zaman Aşımı" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { - "Title": "" + "Title": "Başlık" }, "To Full": { "To Full": "Dolmasına" @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "Güncellemek için aşağıdaki komutu çalıştırın:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "Anlık Bildirimler" }, @@ -2720,11 +2954,20 @@ "Transition Effect": { "Transition Effect": "Geçiş Efekti" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "Şu zaman sonra monitörleri kapat" }, "Type": { - "Type": "" + "Type": "Tip" + }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" }, "Unavailable": { "Unavailable": "Mevcut Değil" @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "Duvar kağıdı değiştiğinde kullanılan görsel efekt" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "Ses Seviyesi Değişti" }, @@ -2907,7 +3153,7 @@ "When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.": "Etkinleştirildiğinde, uygulamalar alfabetik olarak sıralanır. Devre dışı bırakıldığında, uygulamalar kullanım sıklığına göre sıralanır." }, "When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.": { - "When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.": "" + "When enabled, shows the launcher overlay when typing in Niri overview mode. Disable this if you prefer to not have the launcher when typing on Niri overview or want to use other launcher in the overview.": "Etkinleştirildiğinde, Niri genel görünümünde yazarken başlatıcı katmanını gösterir. Niri genel görünümünde yazarken başlatıcının olmasını tercih etmiyorsanız veya genel görünümde başka bir başlatıcı kullanmak istiyorsanız bunu devre dışı bırakın." }, "Wi-Fi Password": { "Wi-Fi Password": "Wi-Fi Parolası" @@ -2952,7 +3198,7 @@ "Wind": "Rüzgar" }, "Wind Speed": { - "Wind Speed": "" + "Wind Speed": "Rüzgar hızı" }, "Workspace": { "Workspace": "Çalışma Alanı" @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "Çalışma Alanı Değiştirici" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "Evet" }, @@ -2984,39 +3236,54 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "Kaydedilmemiş değişiklikleriniz var. Yeni dosya açmadan önce kaydedelim mi?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "Özel Tema Seç" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "Duvar Kağıdı Seç" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { - "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "dms/binds.kdl, config.kdl dosyasına dahil değildir. Bu sorun giderilene kadar özel tuş atamaları çalışmayacaktır." }, "dms/binds.kdl is now included in config.kdl": { - "dms/binds.kdl is now included in config.kdl": "" + "dms/binds.kdl is now included in config.kdl": "dms/binds.kdl artık config.kdl dosyasına dahil edilmiştir." }, "e.g., firefox, kitty --title foo": { - "e.g., firefox, kitty --title foo": "" + "e.g., firefox, kitty --title foo": "örn. firefox, kitty --title foo" }, "e.g., focus-workspace 3, resize-column -10": { - "e.g., focus-workspace 3, resize-column -10": "" + "e.g., focus-workspace 3, resize-column -10": "örn. focus-workspace 3, resize-column -10" }, "events": { "events": "etkinlikler" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl kullanılabilir değil - kilit entegrasyonu DMS soket bağlantısı gerektirir" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "matugen tespit edilemedi - dinamik tema kullanılamıyor" }, + "minutes": { + "minutes": "" + }, "official": { "official": "resmi" }, "profile image file browser title": { "Select Profile Image": "Profil Resmi Seç" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "Ayarlar" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "Duvar Kağıdı Dizinini Seç" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• Yalnızca güvenilir kaynaklardan yükle" }, diff --git a/quickshell/translations/poexports/zh_CN.json b/quickshell/translations/poexports/zh_CN.json index c3b8578e..9cad99b7 100644 --- a/quickshell/translations/poexports/zh_CN.json +++ b/quickshell/translations/poexports/zh_CN.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- 给个 Star ⭐来表示支持吧" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1个事件" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "24小时制" }, "24-hour format": { "24-hour format": "24小时制" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "第三方" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "七日天气预报" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "已存在同名文件,是否覆盖?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "" }, @@ -128,6 +170,9 @@ "All": { "All": "全部" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "每天" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "始终显示 OSD 百分比" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "总显示的图标" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "电池电量与电源管理" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "将锁屏绑定到来自 loginctl 的 dbus 信号。如使用外部锁屏程序,请禁用此项" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "电池容量" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "大小写指示灯" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "选择OSD在屏幕上出现的位置" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "在启动时关闭概览" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "覆盖颜色" }, "Color Picker": { "Color Picker": "取色器" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "白天模式色温" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "合成器" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "已应用配置" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "控制当前播放的媒体" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "控制所有弹出窗口、模态及其内容层(DankDash、设置、应用抽屉、控制中心等)的不透明度" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "复制进程名" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "圆角半径(0 = 直角)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "自定义" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "自定义位置" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "自定义电源操作" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "自定义透明度" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch 不可用" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "暗色模式" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "显示名称格式" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "显示一个包含固定和运行中应用的程序坞,可放置在屏幕四边任意位置" }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "通过网格而非列表显示电源菜单" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "显示设置 " }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "在OSD弹窗中默认显示音量与亮度数值" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "显示" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "程序坞" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "程序坞位置" }, "Dock Transparency": { "Dock Transparency": "程序坞透明度" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "域(可选)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "启用状态栏" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "显示 GPU 温度" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "文件信息" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "查找文本" }, "Find in note...": { "Find in note...": "在便签中查找..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "伽玛控制不可用,需要 DMS API v6+。" }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "Github:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "壁纸轮换频率" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "包含过渡效果" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "结束进程" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "上次启动于 %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "锁屏" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "锁屏格式" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "注销" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "长文本" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "需要纸张" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "媒体播放器设置" }, "Media Players (": { "Media Players (": "媒体播放器 (" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "媒体音量OSD" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "内存" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "麦克风" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "OSD麦克风静音" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "显示网络下载与上传速度" }, + "Never": { + "Never": "" + }, "New": { "New": "新建" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "夜间色温" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "无" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "标准通知" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "未检测到出纸盒" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "位置: " }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "电源与安全" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "电源操作确认" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "电源菜单" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "电源配置性能下降" }, "Power Profile OSD": { "Power Profile OSD": "OSD电源配置" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "缩放所有字体大小" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "扫描" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "选择字体粗细" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "选择要设置壁纸的屏幕" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "选择系统声音主题" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "选择从壁纸取色的配色方案" }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "设置" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: 清空 • Esc: 关闭" }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "显示重启 DMS" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "显示挂起" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "尺寸偏移" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "按字母顺序排序" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "声音主题" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "空白占位" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "支持开发" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "表面色" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "系统监测:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "系统托盘" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "系统通知区域图标" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "系统弹出式通知" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "第三方插件由社区开发,DankMaterialShell 不提供官方支持。\\n\\n这些插件可能存在隐私和安全隐患,请自行承担风险。" }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "此组件会阻止 GPU 进入省电状态,可能会显著影响笔记本的电池续航。不建议在配备混合显卡的笔记本上使用。" }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "时间与天气" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "超时" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "请运行以下命令以更新:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "弹出式信息" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "过渡效果" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "在此时间后关闭显示器" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "壁纸切换时的动画效果" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "音量变化" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "工作区切换器" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "检测到未保存的更改,是否在打开文件前保存?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "选择自定义主题" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "选择壁纸" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "事件" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl 不可用 - 启用锁定集成需连接 DMS socket" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "未检测到 Matugen,动态主题不可用" }, + "minutes": { + "minutes": "" + }, "official": { "official": "官方" }, "profile image file browser title": { "Select Profile Image": "选择个人信息图像" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "设置" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "选择壁纸位置" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• 仅从可信来源安装" }, diff --git a/quickshell/translations/poexports/zh_TW.json b/quickshell/translations/poexports/zh_TW.json index 21039d59..6e6404c2 100644 --- a/quickshell/translations/poexports/zh_TW.json +++ b/quickshell/translations/poexports/zh_TW.json @@ -1,4 +1,7 @@ { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": { + "%1 DMS bind(s) may be overridden by config binds that come after the include.": "" + }, "%1 adapter(s), none connected": { "%1 adapter(s), none connected": "%1 個轉接器,未連接" }, @@ -32,21 +35,57 @@ "- Support Us With a Star ⭐": { "- Support Us With a Star ⭐": "- 給我們點個 Star ⭐ 來支持我們" }, + "0 = square corners": { + "0 = square corners": "" + }, "1 event": { "1 event": "1 個活動" }, + "1 minute": { + "1 minute": "" + }, + "1 second": { + "1 second": "" + }, + "10 minutes": { + "10 minutes": "" + }, + "10 seconds": { + "10 seconds": "" + }, + "15 seconds": { + "15 seconds": "" + }, + "2 minutes": { + "2 minutes": "" + }, "24-Hour Format": { "24-Hour Format": "24 小時制" }, "24-hour format": { "24-hour format": "24 小時制" }, + "3 seconds": { + "3 seconds": "" + }, + "30 seconds": { + "30 seconds": "" + }, "3rd party": { "3rd party": "第三方" }, + "5 minutes": { + "5 minutes": "" + }, + "5 seconds": { + "5 seconds": "" + }, "7-Day Forecast": { "7-Day Forecast": "七天氣象預報" }, + "8 seconds": { + "8 seconds": "" + }, "A file with this name already exists. Do you want to overwrite it?": { "A file with this name already exists. Do you want to overwrite it?": "檔案名稱已存在。是否要覆蓋它?" }, @@ -86,6 +125,9 @@ "Active": { "Active": "啟用" }, + "Active Lock Screen Monitor": { + "Active Lock Screen Monitor": "" + }, "Active: ": { "Active: ": "啟用:" }, @@ -128,6 +170,9 @@ "All": { "All": "所有" }, + "All Monitors": { + "All Monitors": "" + }, "All day": { "All day": "全天" }, @@ -140,6 +185,9 @@ "Always Show OSD Percentage": { "Always Show OSD Percentage": "OSD 始終顯示百分比" }, + "Always Show Percentage": { + "Always Show Percentage": "" + }, "Always on icons": { "Always on icons": "始終顯示圖示" }, @@ -335,6 +383,9 @@ "Battery level and power management": { "Battery level and power management": "電量與電源管理" }, + "Behavior": { + "Behavior": "" + }, "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": { "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen": "將鎖定畫面綁定到 loginctl 的 dbus 訊號。如果使用外部鎖屏,請停用" }, @@ -434,6 +485,9 @@ "Capacity": { "Capacity": "容量" }, + "Caps Lock": { + "Caps Lock": "" + }, "Caps Lock Indicator": { "Caps Lock Indicator": "大小寫鎖定指示器" }, @@ -488,6 +542,9 @@ "Choose where on-screen displays appear on screen": { "Choose where on-screen displays appear on screen": "選擇螢幕顯示出現在螢幕上的位置" }, + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": { + "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.": "" + }, "Cipher": { "Cipher": "密碼" }, @@ -530,12 +587,18 @@ "Close Overview on Launch": { "Close Overview on Launch": "啟動時關閉概覽" }, + "Color Mode": { + "Color Mode": "" + }, "Color Override": { "Color Override": "顏色覆蓋" }, "Color Picker": { "Color Picker": "顏色選擇器" }, + "Color displayed on monitors without the lock screen": { + "Color displayed on monitors without the lock screen": "" + }, "Color temperature for day time": { "Color temperature for day time": "白天螢幕的顏色溫度" }, @@ -578,6 +641,9 @@ "Compositor": { "Compositor": "合成器" }, + "Config action: %1": { + "Config action: %1": "" + }, "Configuration activated": { "Configuration activated": "配置已啟動" }, @@ -629,6 +695,9 @@ "Control currently playing media": { "Control currently playing media": "控制目前播放器" }, + "Controls opacity of all popouts, modals, and their content layers": { + "Controls opacity of all popouts, modals, and their content layers": "" + }, "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": { "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)": "控制所有彈出式介面、模態對話框及其內容層級的不透明度 (適用於 DankDash、設定、應用程式抽屜、控制中心等)" }, @@ -650,6 +719,9 @@ "Copy Process Name": { "Copy Process Name": "複製程序名" }, + "Corner Radius": { + "Corner Radius": "" + }, "Corner Radius (0 = square corners)": { "Corner Radius (0 = square corners)": "圓角半徑 (0 = 方角)" }, @@ -686,12 +758,33 @@ "Custom": { "Custom": "自訂" }, + "Custom Duration": { + "Custom Duration": "" + }, + "Custom Hibernate Command": { + "Custom Hibernate Command": "" + }, "Custom Location": { "Custom Location": "自訂位置" }, + "Custom Lock Command": { + "Custom Lock Command": "" + }, + "Custom Logout Command": { + "Custom Logout Command": "" + }, "Custom Power Actions": { "Custom Power Actions": "自訂電源選項" }, + "Custom Power Off Command": { + "Custom Power Off Command": "" + }, + "Custom Reboot Command": { + "Custom Reboot Command": "" + }, + "Custom Suspend Command": { + "Custom Suspend Command": "" + }, "Custom Transparency": { "Custom Transparency": "自訂透明度" }, @@ -746,6 +839,9 @@ "DankSearch not available": { "DankSearch not available": "DankSearch 不可用" }, + "DankShell & System Icons (requires restart)": { + "DankShell & System Icons (requires restart)": "" + }, "Dark Mode": { "Dark Mode": "深色主題" }, @@ -842,6 +938,9 @@ "Display Name Format": { "Display Name Format": "顯示名稱格式" }, + "Display a dock with pinned and running applications": { + "Display a dock with pinned and running applications": "" + }, "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": { "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen": "顯示一個帶有固定和正在運行的應用程式的 Dock,這些應用程式可以放置在螢幕的頂部、底部、左側或右側邊緣" }, @@ -863,12 +962,18 @@ "Display power menu actions in a grid instead of a list": { "Display power menu actions in a grid instead of a list": "以網格而非列表顯示電源選單操作" }, + "Display seconds in the clock": { + "Display seconds in the clock": "" + }, "Display settings for ": { "Display settings for ": "顯示設定適用於" }, "Display volume and brightness percentage values by default in OSD popups": { "Display volume and brightness percentage values by default in OSD popups": "在 OSD 彈出視窗中預設顯示音量和亮度百分比值" }, + "Display volume and brightness percentage values in OSD popups": { + "Display volume and brightness percentage values in OSD popups": "" + }, "Displays": { "Displays": "螢幕" }, @@ -884,12 +989,21 @@ "Dock": { "Dock": "Dock" }, + "Dock & Launcher": { + "Dock & Launcher": "" + }, "Dock Position": { "Dock Position": "Dock 位置" }, "Dock Transparency": { "Dock Transparency": "Dock 透明度" }, + "Dock Visibility": { + "Dock Visibility": "" + }, + "Docs": { + "Docs": "" + }, "Domain (optional)": { "Domain (optional)": "網域 (可選)" }, @@ -938,6 +1052,9 @@ "Enable Bar": { "Enable Bar": "啟用欄" }, + "Enable Do Not Disturb": { + "Enable Do Not Disturb": "" + }, "Enable GPU Temperature": { "Enable GPU Temperature": "啟用 GPU 溫度" }, @@ -1148,12 +1265,21 @@ "File Information": { "File Information": "檔案資訊" }, + "Files": { + "Files": "" + }, "Find in Text": { "Find in Text": "尋找文字" }, "Find in note...": { "Find in note...": "尋找筆記..." }, + "Fine-tune animation timing in milliseconds": { + "Fine-tune animation timing in milliseconds": "" + }, + "First Time Setup": { + "First Time Setup": "" + }, "Fix Now": { "Fix Now": "" }, @@ -1226,6 +1352,9 @@ "Gamma control not available. Requires DMS API v6+.": { "Gamma control not available. Requires DMS API v6+.": "Gamma 控制不可用。需要 DMS API v6+。" }, + "GitHub": { + "GitHub": "" + }, "Github:": { "Github:": "Github:" }, @@ -1310,6 +1439,9 @@ "Hourly Forecast": { "Hourly Forecast": "" }, + "How long to hold the button to confirm the action": { + "How long to hold the button to confirm the action": "" + }, "How often to change wallpaper": { "How often to change wallpaper": "多久更換一次桌布" }, @@ -1355,6 +1487,9 @@ "Import VPN": { "Import VPN": "匯入 VPN" }, + "Inactive Monitor Color": { + "Inactive Monitor Color": "" + }, "Include Transitions": { "Include Transitions": "包括過渡" }, @@ -1424,6 +1559,9 @@ "Kill Process": { "Kill Process": "結束程序" }, + "Ko-fi": { + "Ko-fi": "" + }, "Last launched %1": { "Last launched %1": "上次啟動於 %1" }, @@ -1499,6 +1637,9 @@ "Lock Screen": { "Lock Screen": "鎖定螢幕" }, + "Lock Screen Display": { + "Lock Screen Display": "" + }, "Lock Screen Format": { "Lock Screen Format": "鎖定螢幕格式" }, @@ -1508,6 +1649,9 @@ "Log Out": { "Log Out": "登出" }, + "Long": { + "Long": "" + }, "Long Text": { "Long Text": "長文字" }, @@ -1586,15 +1730,24 @@ "Media Needed": { "Media Needed": "需要媒體" }, + "Media Player": { + "Media Player": "" + }, "Media Player Settings": { "Media Player Settings": "媒體播放設定" }, "Media Players (": { "Media Players (": "媒體播放 (" }, + "Media Volume": { + "Media Volume": "" + }, "Media Volume OSD": { "Media Volume OSD": "媒體音量 OSD" }, + "Medium": { + "Medium": "" + }, "Memory": { "Memory": "記憶體" }, @@ -1607,6 +1760,9 @@ "Microphone": { "Microphone": "麥克風" }, + "Microphone Mute": { + "Microphone Mute": "" + }, "Microphone Mute OSD": { "Microphone Mute OSD": "麥克風靜音 OSD" }, @@ -1691,6 +1847,9 @@ "Network download and upload speed display": { "Network download and upload speed display": "顯示網路下載跟上傳速度" }, + "Never": { + "Never": "" + }, "New": { "New": "新" }, @@ -1715,6 +1874,9 @@ "Night Temperature": { "Night Temperature": "夜間色溫" }, + "Niri Integration": { + "Niri Integration": "" + }, "Niri compositor actions (focus, move, etc.)": { "Niri compositor actions (focus, move, etc.)": "" }, @@ -1790,6 +1952,9 @@ "None": { "None": "無" }, + "Normal Font": { + "Normal Font": "" + }, "Normal Priority": { "Normal Priority": "普通優先級" }, @@ -1898,6 +2063,9 @@ "Output Tray Missing": { "Output Tray Missing": "輸出托盤遺失" }, + "Overridden by config": { + "Overridden by config": "" + }, "Override": { "Override": "" }, @@ -2015,9 +2183,15 @@ "Position: ": { "Position: ": "位置:" }, + "Possible Override Conflicts": { + "Possible Override Conflicts": "" + }, "Power & Security": { "Power & Security": "電源與安全" }, + "Power & Sleep": { + "Power & Sleep": "" + }, "Power Action Confirmation": { "Power Action Confirmation": "電源操作確認" }, @@ -2030,12 +2204,18 @@ "Power Options": { "Power Options": "電源選項" }, + "Power Profile": { + "Power Profile": "" + }, "Power Profile Degradation": { "Power Profile Degradation": "電源配置降級" }, "Power Profile OSD": { "Power Profile OSD": "電源設定檔 OSD" }, + "Power source": { + "Power source": "" + }, "Precipitation Chance": { "Precipitation Chance": "" }, @@ -2240,6 +2420,9 @@ "Scale all font sizes": { "Scale all font sizes": "縮放所有字體大小" }, + "Scale all font sizes throughout the shell": { + "Scale all font sizes throughout the shell": "" + }, "Scan": { "Scan": "掃描" }, @@ -2318,6 +2501,9 @@ "Select font weight": { "Select font weight": "選擇字體粗細" }, + "Select font weight for UI text": { + "Select font weight for UI text": "" + }, "Select monitor to configure wallpaper": { "Select monitor to configure wallpaper": "選擇指定螢幕桌布" }, @@ -2330,6 +2516,9 @@ "Select system sound theme": { "Select system sound theme": "選擇系統音效主題" }, + "Select the font family for UI text": { + "Select the font family for UI text": "" + }, "Select the palette algorithm used for wallpaper-based colors": { "Select the palette algorithm used for wallpaper-based colors": "請選擇調色板演算法,以桌布的顏色為基底。" }, @@ -2360,12 +2549,18 @@ "Settings": { "Settings": "設定" }, + "Setup": { + "Setup": "" + }, "Shell": { "Shell": "" }, "Shift+Del: Clear All • Esc: Close": { "Shift+Del: Clear All • Esc: Close": "Shift+Del: 清除所有 • Esc: 關閉" }, + "Short": { + "Short": "" + }, "Shortcuts": { "Shortcuts": "" }, @@ -2405,6 +2600,9 @@ "Show Restart DMS": { "Show Restart DMS": "顯示重新啟動 DMS" }, + "Show Seconds": { + "Show Seconds": "" + }, "Show Suspend": { "Show Suspend": "顯示暫停" }, @@ -2498,12 +2696,21 @@ "Size Offset": { "Size Offset": "大小偏移" }, + "Sizing": { + "Sizing": "" + }, "Sort Alphabetically": { "Sort Alphabetically": "按字母順序排序" }, + "Sorting & Layout": { + "Sorting & Layout": "" + }, "Sound Theme": { "Sound Theme": "音效主題" }, + "Sounds": { + "Sounds": "" + }, "Spacer": { "Spacer": "空白間隔" }, @@ -2552,6 +2759,9 @@ "Support Development": { "Support Development": "支援開發" }, + "Suppress notification popups while enabled": { + "Suppress notification popups while enabled": "" + }, "Surface": { "Surface": "表面" }, @@ -2591,6 +2801,9 @@ "System Monitoring:": { "System Monitoring:": "系統監視器:" }, + "System Sounds": { + "System Sounds": "" + }, "System Tray": { "System Tray": "系統匣" }, @@ -2609,6 +2822,9 @@ "System notification area icons": { "System notification area icons": "顯示常駐程式狀態圖示和系統通知" }, + "System sounds are not available. Install canberra-gtk-play for sound support.": { + "System sounds are not available. Install canberra-gtk-play for sound support.": "" + }, "System toast notifications": { "System toast notifications": "系統快顯通知" }, @@ -2657,6 +2873,9 @@ "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": { "Third-party plugins are created by the community and are not officially supported by DankMaterialShell.\\n\\nThese plugins may pose security and privacy risks - install at your own risk.": "第三方插件由社群創建,不受 DankMaterialShell 官方支援。\\n\\n這些插件可能會帶來安全性和隱私風險 - 安裝後風險自負。" }, + "This bind is overridden by config.kdl": { + "This bind is overridden by config.kdl": "" + }, "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": { "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.": "此部件可防止 GPU 電源關閉,這會嚴重影響筆記型電腦的電池續航時間。不建議在配備混合顯示卡的筆記型電腦上使用此功能。" }, @@ -2669,9 +2888,21 @@ "Time & Weather": { "Time & Weather": "時間與天氣" }, + "Time Format": { + "Time Format": "" + }, "Timed Out": { "Timed Out": "逾時" }, + "Timeout for critical priority notifications": { + "Timeout for critical priority notifications": "" + }, + "Timeout for low priority notifications": { + "Timeout for low priority notifications": "" + }, + "Timeout for normal priority notifications": { + "Timeout for normal priority notifications": "" + }, "Title": { "Title": "" }, @@ -2681,6 +2912,9 @@ "To update, run the following command:": { "To update, run the following command:": "若要更新,請執行以下命令:" }, + "To use this DMS bind, remove or change the keybind in your config.kdl": { + "To use this DMS bind, remove or change the keybind in your config.kdl": "" + }, "Toast Messages": { "Toast Messages": "快顯通知" }, @@ -2720,12 +2954,21 @@ "Transition Effect": { "Transition Effect": "切換動畫效果" }, + "Transparency": { + "Transparency": "" + }, "Turn off monitors after": { "Turn off monitors after": "關閉螢幕之後" }, "Type": { "Type": "" }, + "Typography": { + "Typography": "" + }, + "Typography & Motion": { + "Typography & Motion": "" + }, "Unavailable": { "Unavailable": "不可用" }, @@ -2867,6 +3110,9 @@ "Visual effect used when wallpaper changes": { "Visual effect used when wallpaper changes": "桌布變更時所使用的視覺效果" }, + "Volume": { + "Volume": "" + }, "Volume Changed": { "Volume Changed": "音量改變" }, @@ -2969,6 +3215,12 @@ "Workspace Switcher": { "Workspace Switcher": "工作區切換器" }, + "Workspaces": { + "Workspaces": "" + }, + "Workspaces & Widgets": { + "Workspaces & Widgets": "" + }, "Yes": { "Yes": "是" }, @@ -2984,12 +3236,18 @@ "You have unsaved changes. Save before opening a file?": { "You have unsaved changes. Save before opening a file?": "您有未儲存的變更。是否先保存再開檔案?" }, + "apps": { + "apps": "" + }, "custom theme file browser title": { "Select Custom Theme": "選擇自訂主題" }, "dark mode wallpaper file browser title | light mode wallpaper file browser title | wallpaper file browser title": { "Select Wallpaper": "選擇桌布" }, + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": { + "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" + }, "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": { "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.": "" }, @@ -3005,18 +3263,27 @@ "events": { "events": "活動" }, + "files": { + "files": "" + }, "loginctl not available - lock integration requires DMS socket connection": { "loginctl not available - lock integration requires DMS socket connection": "loginctl 不可用 - 鎖定整合需要 DMS 套接字連接" }, "matugen not detected - dynamic theming unavailable": { "matugen not detected - dynamic theming unavailable": "未偵測到 matugen - 動態主題不可用" }, + "minutes": { + "minutes": "" + }, "official": { "official": "官方" }, "profile image file browser title": { "Select Profile Image": "選擇個人資料圖片" }, + "seconds": { + "seconds": "" + }, "settings window title": { "Settings": "設定" }, @@ -3029,6 +3296,15 @@ "wallpaper directory file browser title": { "Select Wallpaper Directory": "選擇桌布目錄" }, + "wallpaper settings disable description": { + "Use an external wallpaper manager like swww, hyprpaper, or swaybg.": "" + }, + "wallpaper settings disable toggle": { + "Disable Built-in Wallpapers": "" + }, + "wallpaper settings external management": { + "External Wallpaper Management": "" + }, "• Install only from trusted sources": { "• Install only from trusted sources": "• 僅從受信任的來源安裝" }, diff --git a/quickshell/translations/template.json b/quickshell/translations/template.json index 6d91bca6..8c414fb8 100644 --- a/quickshell/translations/template.json +++ b/quickshell/translations/template.json @@ -1,4 +1,11 @@ [ + { + "term": "%1 DMS bind(s) may be overridden by config binds that come after the include.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "%1 adapter(s), none connected", "translation": "", @@ -63,14 +70,7 @@ "comment": "" }, { - "term": "- Stateless System Monitoring", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, - { - "term": "- Support Us With a Star ⭐", + "term": "0 = square corners", "translation": "", "context": "", "reference": "", @@ -83,6 +83,48 @@ "reference": "", "comment": "" }, + { + "term": "1 minute", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "1 second", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "10 minutes", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "10 seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "15 seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "2 minutes", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "24-Hour Format", "translation": "", @@ -97,6 +139,20 @@ "reference": "", "comment": "" }, + { + "term": "3 seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "30 seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "3rd party", "translation": "", @@ -104,6 +160,27 @@ "reference": "", "comment": "" }, + { + "term": "5 minutes", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "5 seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "8 seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "A file with this name already exists. Do you want to overwrite it?", "translation": "", @@ -195,6 +272,13 @@ "reference": "", "comment": "" }, + { + "term": "Active Lock Screen Monitor", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Active: ", "translation": "", @@ -279,6 +363,13 @@ "reference": "", "comment": "" }, + { + "term": "All Monitors", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "All day", "translation": "", @@ -301,7 +392,7 @@ "comment": "" }, { - "term": "Always Show OSD Percentage", + "term": "Always Show Percentage", "translation": "", "context": "", "reference": "", @@ -601,13 +692,6 @@ "reference": "", "comment": "" }, - { - "term": "Automatically extract colors from wallpaper", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Automatically hide the top bar to expand screen real estate", "translation": "", @@ -720,6 +804,13 @@ "reference": "", "comment": "" }, + { + "term": "Behavior", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen", "translation": "", @@ -825,13 +916,6 @@ "reference": "", "comment": "" }, - { - "term": "Brightness OSD", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Browse", "translation": "", @@ -938,14 +1022,14 @@ "comment": "" }, { - "term": "Caps Lock Indicator", + "term": "Caps Lock", "translation": "", "context": "", "reference": "", "comment": "" }, { - "term": "Caps Lock OSD", + "term": "Caps Lock Indicator", "translation": "", "context": "", "reference": "", @@ -1063,6 +1147,13 @@ "reference": "", "comment": "" }, + { + "term": "Choose which monitor shows the lock screen interface. Other monitors will display a solid color for OLED burn-in protection.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Cipher", "translation": "", @@ -1140,13 +1231,6 @@ "reference": "", "comment": "" }, - { - "term": "Clock show seconds", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Close", "translation": "", @@ -1161,6 +1245,13 @@ "reference": "", "comment": "" }, + { + "term": "Color Mode", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Color Override", "translation": "", @@ -1175,6 +1266,13 @@ "reference": "", "comment": "" }, + { + "term": "Color displayed on monitors without the lock screen", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Color temperature for day time", "translation": "", @@ -1203,48 +1301,6 @@ "reference": "", "comment": "" }, - { - "term": "Command or script to run instead of the standard hibernate procedure", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard lock procedure", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard logout procedure", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard power off procedure", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard reboot procedure", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, - { - "term": "Command or script to run instead of the standard suspend procedure", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Communication", "translation": "", @@ -1273,6 +1329,13 @@ "reference": "", "comment": "" }, + { + "term": "Config action: %1", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Configuration activated", "translation": "", @@ -1393,7 +1456,7 @@ "comment": "" }, { - "term": "Controls opacity of all popouts, modals, and their content layers (DankDash, Settings, App Drawer, Control Center, etc.)", + "term": "Controls opacity of all popouts, modals, and their content layers", "translation": "", "context": "", "reference": "", @@ -1428,7 +1491,7 @@ "comment": "" }, { - "term": "Corner Radius (0 = square corners)", + "term": "Corner Radius", "translation": "", "context": "", "reference": "", @@ -1511,6 +1574,20 @@ "reference": "", "comment": "" }, + { + "term": "Custom Duration", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Custom Hibernate Command", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Custom Location", "translation": "", @@ -1518,6 +1595,20 @@ "reference": "", "comment": "" }, + { + "term": "Custom Lock Command", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Custom Logout Command", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Custom Power Actions", "translation": "", @@ -1525,6 +1616,27 @@ "reference": "", "comment": "" }, + { + "term": "Custom Power Off Command", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Custom Reboot Command", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Custom Suspend Command", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Custom Transparency", "translation": "", @@ -1637,6 +1749,13 @@ "reference": "", "comment": "" }, + { + "term": "DankShell & System Icons (requires restart)", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Dark Mode", "translation": "", @@ -1798,6 +1917,13 @@ "reference": "", "comment": "" }, + { + "term": "Disable Built-in Wallpapers", + "translation": "", + "context": "wallpaper settings disable toggle", + "reference": "", + "comment": "" + }, { "term": "Disabled", "translation": "", @@ -1862,7 +1988,7 @@ "comment": "" }, { - "term": "Display a dock with pinned and running applications that can be positioned at the top, bottom, left, or right edge of the screen", + "term": "Display a dock with pinned and running applications", "translation": "", "context": "", "reference": "", @@ -1910,6 +2036,13 @@ "reference": "", "comment": "" }, + { + "term": "Display seconds in the clock", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Display settings for ", "translation": "", @@ -1918,7 +2051,7 @@ "comment": "" }, { - "term": "Display volume and brightness percentage values by default in OSD popups", + "term": "Display volume and brightness percentage values in OSD popups", "translation": "", "context": "", "reference": "", @@ -1959,6 +2092,13 @@ "reference": "", "comment": "" }, + { + "term": "Dock & Launcher", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Dock Position", "translation": "", @@ -1974,14 +2114,21 @@ "comment": "" }, { - "term": "Domain (optional)", + "term": "Dock Visibility", "translation": "", "context": "", "reference": "", "comment": "" }, { - "term": "Donate on Ko-fi", + "term": "Docs", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Domain (optional)", "translation": "", "context": "", "reference": "", @@ -2015,13 +2162,6 @@ "reference": "", "comment": "" }, - { - "term": "Duration", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Dusk (Astronomical Twilight)", "translation": "", @@ -2043,13 +2183,6 @@ "reference": "", "comment": "" }, - { - "term": "Dynamic Theming", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Edge Spacing (0 = edge-to-edge)", "translation": "", @@ -2085,6 +2218,13 @@ "reference": "", "comment": "" }, + { + "term": "Enable Do Not Disturb", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Enable GPU Temperature", "translation": "", @@ -2261,9 +2401,9 @@ "comment": "" }, { - "term": "Execute templates from ~/.config/matugen/config.toml", + "term": "External Wallpaper Management", "translation": "", - "context": "", + "context": "wallpaper settings external management", "reference": "", "comment": "" }, @@ -2575,6 +2715,13 @@ "reference": "", "comment": "" }, + { + "term": "Files", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Find in Text", "translation": "", @@ -2589,6 +2736,20 @@ "reference": "", "comment": "" }, + { + "term": "Fine-tune animation timing in milliseconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "First Time Setup", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Fix Now", "translation": "", @@ -2624,13 +2785,6 @@ "reference": "", "comment": "" }, - { - "term": "Font Settings", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Font Size", "translation": "", @@ -2758,7 +2912,7 @@ "comment": "" }, { - "term": "Github:", + "term": "GitHub", "translation": "", "context": "", "reference": "", @@ -2946,6 +3100,13 @@ "reference": "", "comment": "" }, + { + "term": "How long to hold the button to confirm the action", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "How often to change wallpaper", "translation": "", @@ -3009,13 +3170,6 @@ "reference": "", "comment": "" }, - { - "term": "Idle Inhibitor OSD", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Idle Settings", "translation": "", @@ -3051,6 +3205,13 @@ "reference": "", "comment": "" }, + { + "term": "Inactive Monitor Color", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Include Transitions", "translation": "", @@ -3212,6 +3373,13 @@ "reference": "", "comment": "" }, + { + "term": "Ko-fi", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Last launched %1", "translation": "", @@ -3387,6 +3555,13 @@ "reference": "", "comment": "" }, + { + "term": "Lock Screen Display", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Lock Screen Format", "translation": "", @@ -3408,6 +3583,13 @@ "reference": "", "comment": "" }, + { + "term": "Long", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Long Text", "translation": "", @@ -3527,13 +3709,6 @@ "reference": "", "comment": "" }, - { - "term": "Matugen Settings", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Matugen Target Monitor", "translation": "", @@ -3590,6 +3765,13 @@ "reference": "", "comment": "" }, + { + "term": "Media Player", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Media Player Settings", "translation": "", @@ -3605,7 +3787,14 @@ "comment": "" }, { - "term": "Media Volume OSD", + "term": "Media Volume", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Medium", "translation": "", "context": "", "reference": "", @@ -3640,7 +3829,7 @@ "comment": "" }, { - "term": "Microphone Mute OSD", + "term": "Microphone Mute", "translation": "", "context": "", "reference": "", @@ -3695,13 +3884,6 @@ "reference": "", "comment": "" }, - { - "term": "Monitor Selection:", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Monitor whose wallpaper drives dynamic theming colors", "translation": "", @@ -3828,6 +4010,13 @@ "reference": "", "comment": "" }, + { + "term": "Never", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "New", "translation": "", @@ -3884,6 +4073,13 @@ "reference": "", "comment": "" }, + { + "term": "Niri Integration", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Niri compositor actions (focus, move, etc.)", "translation": "", @@ -4052,6 +4248,13 @@ "reference": "", "comment": "" }, + { + "term": "Normal Font", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Normal Priority", "translation": "", @@ -4304,6 +4507,13 @@ "reference": "", "comment": "" }, + { + "term": "Overridden by config", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Override", "translation": "", @@ -4542,13 +4752,6 @@ "reference": "", "comment": "" }, - { - "term": "Plugins:", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Popup Position", "translation": "", @@ -4577,6 +4780,13 @@ "reference": "", "comment": "" }, + { + "term": "Possible Override Conflicts", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Power & Security", "translation": "", @@ -4584,6 +4794,13 @@ "reference": "", "comment": "" }, + { + "term": "Power & Sleep", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Power Action Confirmation", "translation": "", @@ -4612,6 +4829,13 @@ "reference": "", "comment": "" }, + { + "term": "Power Profile", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Power Profile Degradation", "translation": "", @@ -4620,7 +4844,7 @@ "comment": "" }, { - "term": "Power Profile OSD", + "term": "Power source", "translation": "", "context": "", "reference": "", @@ -4927,13 +5151,6 @@ "reference": "", "comment": "" }, - { - "term": "Resources", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Restart DMS", "translation": "", @@ -4997,13 +5214,6 @@ "reference": "", "comment": "" }, - { - "term": "Run User Templates", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Run a program (e.g., firefox, kitty)", "translation": "", @@ -5082,7 +5292,7 @@ "comment": "" }, { - "term": "Scale all font sizes", + "term": "Scale all font sizes throughout the shell", "translation": "", "context": "", "reference": "", @@ -5249,13 +5459,6 @@ "reference": "", "comment": "" }, - { - "term": "Select a preset or drag the slider to customize", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Select a widget to add. You can add multiple instances of the same widget if needed.", "translation": "", @@ -5285,7 +5488,7 @@ "comment": "" }, { - "term": "Select font weight", + "term": "Select font weight for UI text", "translation": "", "context": "", "reference": "", @@ -5306,14 +5509,14 @@ "comment": "" }, { - "term": "Select system font family", + "term": "Select system sound theme", "translation": "", "context": "", "reference": "", "comment": "" }, { - "term": "Select system sound theme", + "term": "Select the font family for UI text", "translation": "", "context": "", "reference": "", @@ -5389,6 +5592,13 @@ "reference": "", "comment": "" }, + { + "term": "Setup", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Shell", "translation": "", @@ -5403,6 +5613,13 @@ "reference": "", "comment": "" }, + { + "term": "Short", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Shortcuts", "translation": "", @@ -5487,6 +5704,13 @@ "reference": "", "comment": "" }, + { + "term": "Show Seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Show Suspend", "translation": "", @@ -5620,13 +5844,6 @@ "reference": "", "comment": "" }, - { - "term": "Show seconds", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Show weather information in top bar and control center", "translation": "", @@ -5704,6 +5921,13 @@ "reference": "", "comment": "" }, + { + "term": "Sizing", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Sort Alphabetically", "translation": "", @@ -5711,6 +5935,13 @@ "reference": "", "comment": "" }, + { + "term": "Sorting & Layout", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Sound Theme", "translation": "", @@ -5718,6 +5949,13 @@ "reference": "", "comment": "" }, + { + "term": "Sounds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Spacer", "translation": "", @@ -5824,7 +6062,7 @@ "comment": "" }, { - "term": "Support Development", + "term": "Suppress notification popups while enabled", "translation": "", "context": "", "reference": "", @@ -5915,7 +6153,7 @@ "comment": "" }, { - "term": "System Monitoring:", + "term": "System Sounds", "translation": "", "context": "", "reference": "", @@ -5956,6 +6194,13 @@ "reference": "", "comment": "" }, + { + "term": "System sounds are not available. Install canberra-gtk-play for sound support.", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "System toast notifications", "translation": "", @@ -6068,6 +6313,13 @@ "reference": "", "comment": "" }, + { + "term": "This bind is overridden by config.kdl", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "This widget prevents GPU power off states, which can significantly impact battery life on laptops. It is not recommended to use this on laptops with hybrid graphics.", "translation": "", @@ -6096,6 +6348,13 @@ "reference": "", "comment": "" }, + { + "term": "Time Format", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Timed Out", "translation": "", @@ -6103,6 +6362,27 @@ "reference": "", "comment": "" }, + { + "term": "Timeout for critical priority notifications", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Timeout for low priority notifications", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Timeout for normal priority notifications", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Title", "translation": "", @@ -6124,6 +6404,13 @@ "reference": "", "comment": "" }, + { + "term": "To use this DMS bind, remove or change the keybind in your config.kdl", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Toast Messages", "translation": "", @@ -6215,6 +6502,13 @@ "reference": "", "comment": "" }, + { + "term": "Transparency", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Turn off monitors after", "translation": "", @@ -6229,6 +6523,20 @@ "reference": "", "comment": "" }, + { + "term": "Typography", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Typography & Motion", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Unavailable", "translation": "", @@ -6355,6 +6663,13 @@ "reference": "", "comment": "" }, + { + "term": "Use an external wallpaper manager like swww, hyprpaper, or swaybg.", + "translation": "", + "context": "wallpaper settings disable description", + "reference": "", + "comment": "" + }, { "term": "Use animated wave progress bars for media playback", "translation": "", @@ -6545,14 +6860,14 @@ "comment": "" }, { - "term": "Volume Changed", + "term": "Volume", "translation": "", "context": "", "reference": "", "comment": "" }, { - "term": "Volume OSD", + "term": "Volume Changed", "translation": "", "context": "", "reference": "", @@ -6621,13 +6936,6 @@ "reference": "", "comment": "" }, - { - "term": "Website:", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "When enabled, apps are sorted alphabetically. When disabled, apps are sorted by usage frequency.", "translation": "", @@ -6726,13 +7034,6 @@ "reference": "", "comment": "" }, - { - "term": "Widgets", - "translation": "", - "context": "", - "reference": "", - "comment": "" - }, { "term": "Wind", "translation": "", @@ -6782,6 +7083,20 @@ "reference": "", "comment": "" }, + { + "term": "Workspaces", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "Workspaces & Widgets", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "Yes", "translation": "", @@ -6818,7 +7133,14 @@ "comment": "" }, { - "term": "dms/binds.kdl is not included in config.kdl. Custom keybinds will not work until this is fixed.", + "term": "apps", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, + { + "term": "dms/binds.kdl exists but is not included in config.kdl. Custom keybinds will not work until this is fixed.", "translation": "", "context": "", "reference": "", @@ -6852,6 +7174,13 @@ "reference": "", "comment": "" }, + { + "term": "files", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "loginctl not available - lock integration requires DMS socket connection", "translation": "", @@ -6860,7 +7189,7 @@ "comment": "" }, { - "term": "matugen not detected - dynamic theming unavailable", + "term": "minutes", "translation": "", "context": "", "reference": "", @@ -6873,6 +7202,13 @@ "reference": "", "comment": "" }, + { + "term": "seconds", + "translation": "", + "context": "", + "reference": "", + "comment": "" + }, { "term": "update dms for NM integration.", "translation": "",