mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-30 23:17:51 -04:00
* fix(settings): show what frame mode controls With frame mode on, many settings did nothing or were hidden while still applying, and nothing said so. The frame takes its color and opacity from the first non-island bar, but that bar's Surface card is hidden while the frame styles it, so neither had a visible control. Add Background and Override/Opacity rows to the Appearance Frame card, bound to the same frame bar the renderer reads. Settings the frame provides in connected mode get a "Managed by Frame in Connected Mode" note (Interface style border, corner style, background blur and dock opacity, shadow targets, launcher border); settings with no effect get "Disabled by Frame Mode" (maximize detection, bar shadow, the bar's overlay layer in separate mode). Bar size, the bar's overlay layer in connected mode, dock Over fullscreen and the controls of overlay-layer docks and launchers are shown again, since they still apply. Notification Over fullscreen shows as forced on when the frame covers every display, and launcher rows the Spotlight style ignores are disabled. Also relabel the frame Width row as Thickness, raise the inset padding maximum to its automatic range, and drop a FrameWindow handler for the removed frameOpacity signal. No new strings. * settings: show what frame mode controls, fix review findings --------- Co-authored-by: purian23 <[email protected]>
804 lines
36 KiB
QML
804 lines
36 KiB
QML
import QtQuick
|
|
import qs.Common
|
|
import qs.Services
|
|
import qs.DCommon.Widgets
|
|
import qs.Modules.Settings.Widgets
|
|
|
|
Item {
|
|
id: root
|
|
|
|
LayoutMirroring.enabled: I18n.isRtl
|
|
LayoutMirroring.childrenInherit: true
|
|
|
|
Component.onCompleted: BlurService.probe()
|
|
|
|
property var parentModal: null
|
|
readonly property bool widgetBackgroundEnabled: !(bar.selectedBarConfig?.noBackground ?? false)
|
|
readonly property var outlineColors: ["surfaceText", "secondary", "primary"]
|
|
readonly property var outlineColorLabels: [I18n.tr("Surface"), I18n.tr("Secondary"), I18n.tr("Primary")]
|
|
readonly property var paletteValues: ["default", "bright", "dim"]
|
|
readonly property var satellitePositionValues: ["island", "edges"]
|
|
readonly property bool selectedIslandEnabled: bar.selectedBarIsIsland && (bar.selectedBarConfig?.enabled ?? false)
|
|
readonly property bool selectedIslandFree: bar.selectedBarIsIsland && SettingsData.islandFreePlacement(bar.selectedBarConfig)
|
|
readonly property bool selectedIslandNotch: bar.selectedBarIsIsland && !root.selectedIslandFree && bar.islandSetting("islandNotch")
|
|
readonly property int frameInsetPaddingDisplay: Math.round(SettingsData.frameBarContentGap)
|
|
readonly property var frameBar: SettingsData.frameBarConfig
|
|
readonly property bool frameBarOverridden: frameBar?.followInterfaceStyle === false
|
|
|
|
function updateFrameBar(updates) {
|
|
if (!frameBar)
|
|
return;
|
|
SettingsData.updateBarConfig(frameBar.id, updates);
|
|
}
|
|
|
|
BarSelectionState {
|
|
id: bar
|
|
}
|
|
|
|
SettingsPage {
|
|
id: mainColumn
|
|
|
|
SettingsCard {
|
|
iconName: "border_outer"
|
|
title: I18n.tr("Frame")
|
|
settingKey: "frameBorder"
|
|
collapsible: true
|
|
visible: SettingsData.frameEnabled
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "frameRounding"
|
|
tags: ["frame", "border", "rounding", "radius", "corner"]
|
|
text: I18n.tr("Radius", "corner radius slider label")
|
|
unit: "px"
|
|
minimum: 0
|
|
maximum: 100
|
|
step: 1
|
|
value: SettingsData.frameRounding
|
|
onSliderDragFinished: v => SettingsData.set("frameRounding", v)
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "frameThickness"
|
|
tags: ["frame", "border", "thickness", "size", "width"]
|
|
text: I18n.tr("Thickness")
|
|
unit: "px"
|
|
minimum: 2
|
|
maximum: 100
|
|
step: 1
|
|
value: SettingsData.frameThickness
|
|
onSliderDragFinished: v => SettingsData.set("frameThickness", v)
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "frameBarSize"
|
|
tags: ["frame", "bar", "thickness", "size", "height", "width"]
|
|
text: I18n.tr("Bar size")
|
|
unit: "px"
|
|
minimum: 24
|
|
maximum: 100
|
|
step: 1
|
|
value: SettingsData.frameBarSize
|
|
onSliderDragFinished: v => SettingsData.set("frameBarSize", v)
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "frameBarInsetPadding"
|
|
tags: ["frame", "bar", "edge", "inset", "padding", "corner", "end"]
|
|
text: I18n.tr("Bar inset padding")
|
|
description: I18n.tr("Gap between the bar ends and the outermost widgets", "bar inset padding slider description")
|
|
minimumLabel: I18n.tr("Edge to edge", "slider minimum label, bar touches the screen edges")
|
|
unit: "px"
|
|
minimum: 0
|
|
maximum: 100
|
|
step: 1
|
|
value: root.frameInsetPaddingDisplay
|
|
onSliderDragFinished: v => SettingsData.set("frameBarInsetPadding", v)
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
id: frameBlurToggle
|
|
settingKey: "frameBlurEnabled"
|
|
tags: ["frame", "blur", "background", "glass", "transparency", "frosted"]
|
|
text: I18n.tr("Blur")
|
|
checked: SettingsData.frameBlurEnabled
|
|
onToggled: checked => SettingsData.set("frameBlurEnabled", checked)
|
|
enabled: BlurService.available && SettingsData.blurEnabled
|
|
visible: BlurService.available
|
|
}
|
|
|
|
SettingsControlledBy {
|
|
visible: BlurService.available && !SettingsData.blurEnabled
|
|
target: "surfaces"
|
|
parentModal: root.parentModal
|
|
section: "blurEnabled"
|
|
settingLabel: I18n.tr("Background blur")
|
|
}
|
|
|
|
SurfaceColorRow {
|
|
settingKey: "frameSurfaceColor"
|
|
tags: ["frame", "background", "color", "surface"]
|
|
visible: !!root.frameBar
|
|
text: I18n.tr("Background")
|
|
defaultColor: Theme.hostSurface
|
|
currentMode: root.frameBar?.surfaceColor ?? "default"
|
|
customColor: root.frameBar?.surfaceCustomColor ?? SettingsData.barConfigDefault("surfaceCustomColor")
|
|
pickerTitle: I18n.tr("Background")
|
|
modified: (root.frameBar?.surfaceColor ?? "default") !== "default"
|
|
resetByKeys: false
|
|
onResetRequested: root.updateFrameBar({
|
|
surfaceColor: "default",
|
|
surfaceCustomColor: SettingsData.barConfigDefault("surfaceCustomColor")
|
|
})
|
|
onModeSelected: mode => root.updateFrameBar({
|
|
surfaceColor: mode
|
|
})
|
|
onCustomColorSelected: selectedColor => root.updateFrameBar({
|
|
surfaceCustomColor: selectedColor.toString()
|
|
})
|
|
}
|
|
|
|
SettingsToggleSliderRow {
|
|
settingKey: "frameSurfaceOpacity"
|
|
tags: ["frame", "opacity", "transparency", "override", "interface", "style"]
|
|
visible: !!root.frameBar
|
|
text: I18n.tr("Opacity")
|
|
description: I18n.tr("Override")
|
|
checked: root.frameBarOverridden
|
|
value: Math.round((root.frameBar?.transparency ?? 1) * 100)
|
|
minimum: 0
|
|
maximum: 100
|
|
modified: root.frameBarOverridden
|
|
valueModified: (root.frameBar?.transparency ?? 1) !== 1
|
|
onResetRequested: root.updateFrameBar({
|
|
followInterfaceStyle: true,
|
|
transparency: 1
|
|
})
|
|
onValueResetRequested: root.updateFrameBar({
|
|
transparency: 1
|
|
})
|
|
onToggled: checked => root.updateFrameBar({
|
|
followInterfaceStyle: !checked
|
|
})
|
|
onSliderDragFinished: finalValue => root.updateFrameBar({
|
|
transparency: finalValue / 100
|
|
})
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
iconName: "rounded_corner"
|
|
title: I18n.tr("Surface")
|
|
settingKey: "barCorners"
|
|
tags: ["background", "opacity", "corners", "rounded", "goth", "shadow", "palette", "contrast"]
|
|
visible: (bar.selectedBarConfig?.enabled ?? false) && !bar.selectedBarFrameStyled
|
|
|
|
SettingsButtonGroupRow {
|
|
settingKey: "islandPalette"
|
|
tags: ["island", "appearance", "palette", "surface", "bright", "dim"]
|
|
visible: bar.selectedBarIsIsland
|
|
resetStore: bar
|
|
resetKeys: ["islandPalette"]
|
|
text: I18n.tr("Palette", "island settings: surface tone choice")
|
|
model: [I18n.tr("Default", "island settings: default surface tone"), I18n.tr("Bright", "island settings: bright surface tone"), I18n.tr("Dim", "island settings: dim surface tone")]
|
|
values: root.paletteValues
|
|
value: bar.islandSetting("islandPalette")
|
|
fallbackValue: "default"
|
|
onValueSelected: value => bar.apply("islandPalette", value)
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "islandHighContrast"
|
|
tags: ["island", "appearance", "contrast", "accessibility", "outline"]
|
|
visible: bar.selectedBarIsIsland
|
|
text: I18n.tr("High contrast", "island settings: high contrast toggle")
|
|
checked: bar.islandSetting("islandHighContrast")
|
|
onToggled: checked => bar.apply("islandHighContrast", checked)
|
|
}
|
|
|
|
SurfaceColorRow {
|
|
settingKey: "barSurfaceColor"
|
|
tags: ["background", "color", "surface", "bar", "material"]
|
|
resetStore: bar
|
|
resetKeys: ["surfaceColor", "surfaceCustomColor"]
|
|
text: I18n.tr("Background")
|
|
defaultColor: Theme.hostSurface
|
|
currentMode: bar.selectedBarConfig?.surfaceColor ?? "default"
|
|
customColor: bar.selectedBarConfig?.surfaceCustomColor ?? SettingsData.barConfigDefault("surfaceCustomColor")
|
|
pickerTitle: I18n.tr("Background")
|
|
onModeSelected: mode => bar.apply("surfaceColor", mode)
|
|
onCustomColorSelected: selectedColor => bar.apply("surfaceCustomColor", selectedColor.toString())
|
|
}
|
|
|
|
SettingsControlledBy {
|
|
visible: !bar.islandOwnsSelectedBarTop
|
|
target: "surfaces"
|
|
parentModal: root.parentModal
|
|
section: "surfaceOpacity_bar_" + bar.selectedBarId
|
|
settingLabel: I18n.tr("Opacity")
|
|
}
|
|
|
|
SettingsButtonGroupRow {
|
|
settingKey: "barCornerStyle"
|
|
tags: ["rounded", "attached", "square", "corners", "edge", "screen", "flush"]
|
|
text: I18n.tr("Corner style")
|
|
visible: !bar.selectedBarFrameSanitized && !bar.islandOwnsSelectedBarTop
|
|
resetStore: bar
|
|
resetKeys: ["squareCorners", "attachToScreenEdge"]
|
|
model: [I18n.tr("Rounded", "bar corner style option"), I18n.tr("Flush", "bar corner style option"), I18n.tr("Square", "bar corner style option")]
|
|
currentIndex: {
|
|
if (bar.selectedBarConfig?.squareCorners ?? false)
|
|
return 2;
|
|
if (bar.selectedBarConfig?.attachToScreenEdge ?? false)
|
|
return 1;
|
|
return 0;
|
|
}
|
|
onSelectionChanged: (index, selected) => {
|
|
if (!selected)
|
|
return;
|
|
SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
squareCorners: index === 2,
|
|
attachToScreenEdge: index === 1
|
|
});
|
|
}
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "barGothCorners"
|
|
tags: ["goth", "corners", "concave", "cutout"]
|
|
text: I18n.tr("Goth corners")
|
|
description: I18n.tr("Adds concave curves where the bar meets the screen edge", "bar goth corners toggle description")
|
|
visible: !bar.selectedBarFrameSanitized && !bar.islandOwnsSelectedBarTop
|
|
checked: bar.selectedBarConfig?.gothCornersEnabled ?? false
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
gothCornersEnabled: checked
|
|
})
|
|
}
|
|
|
|
SettingsToggleSliderRow {
|
|
resetStore: bar
|
|
text: I18n.tr("Custom radius")
|
|
tags: ["goth", "corners", "radius"]
|
|
visible: (bar.selectedBarConfig?.gothCornersEnabled ?? false) && !bar.selectedBarFrameSanitized && !bar.islandOwnsSelectedBarTop
|
|
valueKeys: ["gothCornerRadiusValue"]
|
|
checked: bar.selectedBarConfig?.gothCornerRadiusOverride ?? false
|
|
unit: "px"
|
|
value: bar.selectedBarConfig?.gothCornerRadiusValue ?? 12
|
|
minimum: 0
|
|
maximum: 64
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
gothCornerRadiusOverride: checked
|
|
})
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
gothCornerRadiusValue: finalValue
|
|
})
|
|
}
|
|
|
|
SettingsControlledBy {
|
|
visible: !bar.selectedBarFrameSanitized && !bar.islandOwnsSelectedBarTop
|
|
target: "shadows"
|
|
parentModal: root.parentModal
|
|
section: "barShadow"
|
|
settingLabel: I18n.tr("Shadow", "bar shadow settings card")
|
|
}
|
|
|
|
SettingsControlledBy {
|
|
visible: bar.selectedBarFrameSanitized && !bar.selectedBarFrameStyled && !bar.islandOwnsSelectedBarTop
|
|
parentModal: root.parentModal
|
|
section: "frameBorder"
|
|
settingLabel: [I18n.tr("Corner style"), I18n.tr("Border", "noun, settings toggle card title for an outline around a surface"), I18n.tr("Shadow", "bar shadow settings card")].join(" · ")
|
|
reason: I18n.tr("Disabled by Frame Mode")
|
|
}
|
|
}
|
|
|
|
SettingsToggleCard {
|
|
settingKey: "barBorder"
|
|
iconName: "border_style"
|
|
title: I18n.tr("Border", "noun, settings toggle card title for an outline around a surface")
|
|
visible: (bar.selectedBarConfig?.enabled ?? false) && !bar.selectedBarFrameSanitized && !bar.islandOwnsSelectedBarTop
|
|
checked: bar.selectedBarConfig?.borderEnabled ?? false
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
borderEnabled: checked
|
|
})
|
|
|
|
SettingsButtonGroupRow {
|
|
text: I18n.tr("Color")
|
|
resetStore: bar
|
|
resetKeys: ["borderColor"]
|
|
model: root.outlineColorLabels
|
|
currentIndex: Math.max(0, root.outlineColors.indexOf(bar.selectedBarConfig?.borderColor || "surfaceText"))
|
|
onSelectionChanged: (index, selected) => {
|
|
if (!selected)
|
|
return;
|
|
SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
borderColor: root.outlineColors[index]
|
|
});
|
|
}
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
text: I18n.tr("Opacity")
|
|
resetStore: bar
|
|
resetKeys: ["borderOpacity"]
|
|
value: (bar.selectedBarConfig?.borderOpacity ?? 1.0) * 100
|
|
minimum: 0
|
|
maximum: 100
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
borderOpacity: finalValue / 100
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
text: I18n.tr("Thickness")
|
|
resetStore: bar
|
|
resetKeys: ["borderThickness"]
|
|
value: bar.selectedBarConfig?.borderThickness ?? 1
|
|
minimum: 1
|
|
maximum: 10
|
|
unit: "px"
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
borderThickness: finalValue
|
|
})
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
iconName: "space_bar"
|
|
title: I18n.tr("Size & spacing")
|
|
settingKey: "barSpacing"
|
|
tags: ["size", "scale", "font", "icon", "spacing", "padding", "inset", "length"]
|
|
visible: bar.selectedBarConfig?.enabled ?? false
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "islandCompactThickness"
|
|
tags: ["island", "placement", "compact", "height", "width", "thickness", "size", "satellite"]
|
|
visible: bar.selectedBarIsIsland && !root.selectedIslandFree
|
|
resetStore: bar
|
|
resetKeys: ["islandCompactThickness"]
|
|
text: bar.selectedBarIsVertical ? I18n.tr("Compact width", "island settings: compact pill width slider") : I18n.tr("Compact height", "island settings: compact pill height slider")
|
|
unit: "px"
|
|
minimum: 24
|
|
maximum: 72
|
|
step: 1
|
|
value: bar.islandSetting("islandCompactThickness")
|
|
onSliderValueChanged: value => bar.apply("islandCompactThickness", value)
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "barSize"
|
|
tags: ["size", "thickness", "height", "inner"]
|
|
text: I18n.tr("Size")
|
|
resetStore: bar
|
|
resetKeys: ["innerPadding"]
|
|
value: bar.selectedBarConfig?.innerPadding ?? 4
|
|
minimum: -8
|
|
maximum: 24
|
|
unit: "px"
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
innerPadding: finalValue
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "barFontScale"
|
|
tags: ["font", "text", "scale", "size"]
|
|
text: I18n.tr("Font scale")
|
|
resetStore: bar
|
|
resetKeys: ["fontScale"]
|
|
value: Math.round((bar.selectedBarConfig?.fontScale ?? 1.0) * 100)
|
|
minimum: 50
|
|
maximum: 200
|
|
onSliderValueChanged: newValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
fontScale: newValue / 100
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "barIconScale"
|
|
tags: ["icon", "scale", "size"]
|
|
text: I18n.tr("Icon scale")
|
|
resetStore: bar
|
|
resetKeys: ["iconScale"]
|
|
value: Math.round((bar.selectedBarConfig?.iconScale ?? 1.0) * 100)
|
|
minimum: 50
|
|
maximum: 200
|
|
onSliderValueChanged: newValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
iconScale: newValue / 100
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
visible: !bar.selectedBarFrameStyled && !bar.islandOwnsSelectedBarTop
|
|
text: I18n.tr("Edge spacing")
|
|
tags: ["edge", "spacing", "gap", "margin"]
|
|
resetStore: bar
|
|
resetKeys: ["spacing"]
|
|
value: bar.selectedBarConfig?.spacing ?? 4
|
|
minimum: 0
|
|
maximum: 32
|
|
unit: "px"
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
spacing: finalValue
|
|
})
|
|
}
|
|
|
|
SettingsRow {
|
|
settingKey: "barLengthMode"
|
|
tags: ["bar", "width", "height", "length", "fit", "full", "custom", "percent", "compact", "widgets", "hug", "shrink"]
|
|
title: bar.selectedBarIsVertical ? I18n.tr("Height") : I18n.tr("Width")
|
|
visible: !bar.selectedBarFrameStyled && !bar.islandOwnsSelectedBarTop
|
|
resetStore: bar
|
|
resetKeys: ["barLengthMode", "barLengthPercent"]
|
|
|
|
body: SettingsLayoutPicker {
|
|
barLength: true
|
|
vertical: bar.selectedBarIsVertical
|
|
choices: [
|
|
{
|
|
key: "full",
|
|
label: I18n.tr("Full", "bar length option, the bar spans the whole edge")
|
|
},
|
|
{
|
|
key: "percent",
|
|
label: I18n.tr("Custom", "bar length option, the bar spans a percentage of the edge")
|
|
},
|
|
{
|
|
key: "fit",
|
|
label: I18n.tr("Fit", "bar length option, the bar spans only its widgets")
|
|
}
|
|
]
|
|
selectedKey: bar.selectedBarConfig?.barLengthMode ?? "full"
|
|
onSelected: key => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
barLengthMode: key
|
|
})
|
|
}
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "barLengthPercent"
|
|
tags: ["bar", "width", "height", "length", "percent", "custom"]
|
|
visible: !bar.selectedBarFrameStyled && !bar.islandOwnsSelectedBarTop && (bar.selectedBarConfig?.barLengthMode ?? "full") === "percent"
|
|
text: I18n.tr("Percentage")
|
|
resetStore: bar
|
|
resetKeys: ["barLengthPercent"]
|
|
unit: "%"
|
|
minimum: 10
|
|
maximum: 100
|
|
value: bar.selectedBarConfig?.barLengthPercent ?? 80
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
barLengthPercent: finalValue
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "barLengthPadding"
|
|
visible: !bar.selectedBarFrameStyled && !bar.islandOwnsSelectedBarTop && (bar.selectedBarConfig?.barLengthMode ?? "full") === "full"
|
|
text: I18n.tr("Length padding")
|
|
description: I18n.tr("Shortens the bar at both ends", "bar length padding slider description")
|
|
tags: ["bar", "length", "padding", "size", "shorter", "ends"]
|
|
resetStore: bar
|
|
resetKeys: ["barLengthPadding"]
|
|
unit: "px"
|
|
minimum: 0
|
|
maximum: 512
|
|
value: bar.selectedBarConfig?.barLengthPadding ?? 0
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
barLengthPadding: finalValue
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
visible: !bar.selectedBarFrameStyled
|
|
text: I18n.tr("Inset padding")
|
|
description: I18n.tr("Gap between the bar ends and the outermost widgets", "bar inset padding slider description")
|
|
tags: ["bar", "padding", "inset", "edge", "corner", "end", "gap"]
|
|
minimumLabel: I18n.tr("Edge to edge", "slider minimum label, bar touches the screen edges")
|
|
resetStore: SettingsData.barInsetPaddingSyncAll ? SettingsData : bar
|
|
resetKeys: SettingsData.barInsetPaddingSyncAll ? ["barInsetPaddingShared"] : ["barInsetPadding"]
|
|
unit: "px"
|
|
minimum: 0
|
|
maximum: 48
|
|
value: bar.insetPadDisplayValue
|
|
onSliderDragFinished: finalValue => {
|
|
if (SettingsData.barInsetPaddingSyncAll) {
|
|
SettingsData.set("barInsetPaddingShared", finalValue);
|
|
return;
|
|
}
|
|
SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
barInsetPadding: finalValue
|
|
});
|
|
}
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
visible: !bar.selectedBarFrameStyled && SettingsData.barConfigs.length > 1
|
|
text: I18n.tr("Sync inset padding")
|
|
tags: ["bar", "padding", "inset", "edge", "sync", "all", "global"]
|
|
checked: SettingsData.barInsetPaddingSyncAll
|
|
onToggled: checked => SettingsData.set("barInsetPaddingSyncAll", checked)
|
|
}
|
|
}
|
|
|
|
IslandHomeCard {
|
|
store: bar.islandStore
|
|
parentModal: root.parentModal
|
|
visible: root.selectedIslandEnabled
|
|
}
|
|
|
|
SettingsCard {
|
|
iconName: "widgets"
|
|
title: I18n.tr("Satellites", "island settings: satellite widgets card title")
|
|
settingKey: "islandSatellites"
|
|
collapsible: true
|
|
expanded: true
|
|
visible: root.selectedIslandEnabled
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "islandSatellitesEnabled"
|
|
tags: ["island", "satellite", "widgets", "left", "right"]
|
|
text: I18n.tr("Show", "island settings: satellite widgets toggle")
|
|
checked: bar.islandSetting("islandSatellitesEnabled")
|
|
onToggled: checked => bar.apply("islandSatellitesEnabled", checked)
|
|
}
|
|
|
|
SettingsButtonGroupRow {
|
|
settingKey: "islandSatellitePosition"
|
|
tags: ["island", "satellite", "widgets", "position", "edges", "center"]
|
|
resetStore: bar
|
|
resetKeys: ["islandSatellitePosition"]
|
|
text: I18n.tr("Position", "island settings: position card title")
|
|
model: [I18n.tr("Near island", "island settings: satellites hug the island"), I18n.tr("Display edges", "island settings: satellites sit at screen edges")]
|
|
values: root.satellitePositionValues
|
|
value: bar.islandSetting("islandSatellitePosition")
|
|
fallbackValue: "island"
|
|
enabled: bar.islandSetting("islandSatellitesEnabled")
|
|
onValueSelected: value => bar.apply("islandSatellitePosition", value)
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "islandSatelliteBackground"
|
|
tags: ["island", "satellite", "widgets", "background", "chrome"]
|
|
text: I18n.tr("Background", "island settings: satellite background toggle")
|
|
checked: bar.islandSetting("islandSatelliteBackground")
|
|
visible: bar.islandSetting("islandSatellitesEnabled")
|
|
onToggled: checked => bar.apply("islandSatelliteBackground", checked)
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "islandSatelliteGothCorners"
|
|
tags: ["island", "satellite", "goth", "corners", "wing", "sweep"]
|
|
text: I18n.tr("Goth corners", "island settings: satellite goth corners toggle")
|
|
checked: bar.islandSetting("islandSatelliteGothCorners")
|
|
visible: bar.islandSetting("islandSatellitesEnabled")
|
|
enabled: bar.islandSetting("islandSatelliteBackground")
|
|
onToggled: checked => bar.apply("islandSatelliteGothCorners", checked)
|
|
}
|
|
|
|
SettingsToggleSliderRow {
|
|
resetStore: bar
|
|
settingKey: "islandGothCornerRadius"
|
|
tags: ["island", "satellite", "notch", "goth", "corners", "radius", "sweep", "size"]
|
|
valueKeys: ["gothCornerRadiusValue"]
|
|
text: I18n.tr("Custom radius")
|
|
checked: bar.selectedBarConfig?.gothCornerRadiusOverride ?? false
|
|
unit: "px"
|
|
minimum: 0
|
|
maximum: 64
|
|
step: 1
|
|
value: bar.selectedBarConfig?.gothCornerRadiusValue ?? SettingsData.barConfigDefault("gothCornerRadiusValue")
|
|
visible: bar.islandSetting("islandSatellitesEnabled") || root.selectedIslandNotch
|
|
enabled: (bar.islandSetting("islandSatelliteBackground") && bar.islandSetting("islandSatelliteGothCorners")) || root.selectedIslandNotch
|
|
onToggled: checked => bar.apply("gothCornerRadiusOverride", checked)
|
|
onSliderDragFinished: finalValue => bar.apply("gothCornerRadiusValue", finalValue)
|
|
}
|
|
|
|
SettingsToggleSliderRow {
|
|
resetStore: bar
|
|
settingKey: "islandSatelliteTransparency"
|
|
tags: ["island", "satellite", "background", "opacity", "transparency", "blur", "override", "interface", "style"]
|
|
valueKeys: ["islandSatelliteTransparency"]
|
|
text: I18n.tr("Override", "verb, toggle to override the global setting for this item")
|
|
description: I18n.tr("Opacity", "island settings: satellite background opacity slider")
|
|
checked: !bar.islandSetting("islandSatelliteFollowInterfaceStyle")
|
|
minimum: 0
|
|
maximum: 100
|
|
step: 1
|
|
value: Math.round(SettingsData.islandSatelliteTransparency(bar.selectedBarConfig) * 100)
|
|
visible: bar.islandSetting("islandSatellitesEnabled")
|
|
enabled: bar.islandSetting("islandSatelliteBackground")
|
|
onToggled: checked => bar.apply("islandSatelliteFollowInterfaceStyle", !checked)
|
|
onSliderValueChanged: value => bar.apply("islandSatelliteTransparency", value / 100)
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
settingKey: "islandSatelliteGap"
|
|
tags: ["island", "satellite", "widgets", "gap", "spacing"]
|
|
resetStore: bar
|
|
resetKeys: ["islandSatelliteGap"]
|
|
text: I18n.tr("Gap", "island settings: satellite to island gap slider")
|
|
unit: "px"
|
|
minimum: 0
|
|
maximum: 48
|
|
step: 1
|
|
value: bar.islandSetting("islandSatelliteGap")
|
|
visible: bar.islandSetting("islandSatellitesEnabled")
|
|
enabled: bar.islandSetting("islandSatellitePosition") !== "edges" || bar.islandSetting("islandSatelliteBackground")
|
|
onSliderValueChanged: value => bar.apply("islandSatelliteGap", value)
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
iconName: "widgets"
|
|
title: I18n.tr("Widgets")
|
|
settingKey: "barWidgets"
|
|
tags: ["widget", "style", "pills", "segments", "opacity", "padding", "maximize"]
|
|
visible: bar.selectedBarConfig?.enabled ?? false
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "barNoBackground"
|
|
tags: ["transparent", "background", "invisible"]
|
|
text: I18n.tr("Background")
|
|
checked: !(bar.selectedBarConfig?.noBackground ?? false)
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
noBackground: !checked
|
|
})
|
|
}
|
|
|
|
SettingsRow {
|
|
settingKey: "barWidgetStyle"
|
|
tags: ["widget", "style", "segments", "pills", "flat", "connected", "group"]
|
|
title: I18n.tr("Widget style")
|
|
enabled: root.widgetBackgroundEnabled
|
|
resetStore: bar
|
|
resetKeys: ["widgetStyle"]
|
|
|
|
body: SettingsLayoutPicker {
|
|
widgetStyle: true
|
|
choices: [
|
|
{
|
|
key: "pills",
|
|
label: I18n.tr("Pills", "bar widget style option")
|
|
},
|
|
{
|
|
key: "segments",
|
|
label: I18n.tr("Segments", "bar widget style option")
|
|
},
|
|
{
|
|
key: "flat",
|
|
label: I18n.tr("Flat", "adjective, bar widget style option")
|
|
}
|
|
]
|
|
selectedKey: bar.selectedBarConfig?.widgetStyle ?? "pills"
|
|
onSelected: key => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetStyle: key
|
|
})
|
|
}
|
|
}
|
|
|
|
SettingsToggleSliderRow {
|
|
resetStore: bar
|
|
text: I18n.tr("Override", "verb, toggle to override the global setting for this item")
|
|
description: I18n.tr("Opacity")
|
|
tags: ["widget", "opacity", "transparency", "override", "foreground", "interface", "style"]
|
|
enabled: root.widgetBackgroundEnabled
|
|
valueKeys: ["widgetTransparency"]
|
|
checked: bar.selectedBarConfig?.widgetFollowInterfaceStyle === false
|
|
value: Math.round(SettingsData.barWidgetTransparency(bar.selectedBarConfig) * 100)
|
|
minimum: 0
|
|
maximum: 100
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetFollowInterfaceStyle: !checked
|
|
})
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetTransparency: finalValue / 100
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
text: I18n.tr("Padding")
|
|
tags: ["widget", "padding", "spacing", "compact", "remove"]
|
|
resetStore: bar
|
|
resetKeys: ["widgetPadding"]
|
|
value: bar.selectedBarConfig?.widgetPadding ?? 8
|
|
minimum: 0
|
|
maximum: 32
|
|
unit: "px"
|
|
onSliderValueChanged: newValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetPadding: newValue
|
|
})
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "barMaximizeWidgetIcons"
|
|
tags: ["maximize", "icons", "stretch"]
|
|
text: I18n.tr("Maximize widget icons")
|
|
checked: bar.selectedBarConfig?.maximizeWidgetIcons ?? false
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
maximizeWidgetIcons: checked
|
|
})
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "barMaximizeWidgetText"
|
|
tags: ["maximize", "text", "stretch"]
|
|
text: I18n.tr("Maximize widget text")
|
|
checked: bar.selectedBarConfig?.maximizeWidgetText ?? false
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
maximizeWidgetText: checked
|
|
})
|
|
}
|
|
}
|
|
|
|
SettingsToggleCard {
|
|
settingKey: "barWidgetOutline"
|
|
iconName: "highlight"
|
|
title: I18n.tr("Widget outline")
|
|
visible: bar.selectedBarConfig?.enabled ?? false
|
|
enabled: root.widgetBackgroundEnabled
|
|
checked: bar.selectedBarConfig?.widgetOutlineEnabled ?? false
|
|
onToggled: checked => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetOutlineEnabled: checked
|
|
})
|
|
|
|
SettingsButtonGroupRow {
|
|
text: I18n.tr("Color")
|
|
resetStore: bar
|
|
resetKeys: ["widgetOutlineColor"]
|
|
model: root.outlineColorLabels
|
|
currentIndex: {
|
|
const index = root.outlineColors.indexOf(bar.selectedBarConfig?.widgetOutlineColor || "primary");
|
|
return index >= 0 ? index : 2;
|
|
}
|
|
onSelectionChanged: (index, selected) => {
|
|
if (!selected)
|
|
return;
|
|
SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetOutlineColor: root.outlineColors[index]
|
|
});
|
|
}
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
text: I18n.tr("Opacity")
|
|
resetStore: bar
|
|
resetKeys: ["widgetOutlineOpacity"]
|
|
value: (bar.selectedBarConfig?.widgetOutlineOpacity ?? 1.0) * 100
|
|
minimum: 0
|
|
maximum: 100
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetOutlineOpacity: finalValue / 100
|
|
})
|
|
}
|
|
|
|
SettingsSliderRow {
|
|
text: I18n.tr("Thickness")
|
|
resetStore: bar
|
|
resetKeys: ["widgetOutlineThickness"]
|
|
value: bar.selectedBarConfig?.widgetOutlineThickness ?? 1
|
|
minimum: 1
|
|
maximum: 10
|
|
unit: "px"
|
|
onSliderDragFinished: finalValue => SettingsData.updateBarConfig(bar.selectedBarId, {
|
|
widgetOutlineThickness: finalValue
|
|
})
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
iconName: "format_color_fill"
|
|
title: I18n.tr("Widget colors")
|
|
settingKey: "widgetStyling"
|
|
tags: ["widget", "background", "color", "colorful", "text", "all", "bars"]
|
|
|
|
WidgetTextStyleRow {}
|
|
|
|
WidgetBackgroundRow {
|
|
enabled: root.widgetBackgroundEnabled
|
|
}
|
|
|
|
WidgetBackgroundStrengthRow {
|
|
enabled: root.widgetBackgroundEnabled
|
|
}
|
|
}
|
|
}
|
|
}
|