mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-16 00:04:01 -04:00
207 lines
7.7 KiB
QML
207 lines
7.7 KiB
QML
pragma ComponentBehavior: Bound
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import qs.Common
|
|
import qs.Services
|
|
import qs.DCommon.Widgets
|
|
import qs.Modules.Settings.Widgets
|
|
import qs.Modules.DDash
|
|
import qs.Modules.DDash.Overview
|
|
|
|
FocusScope {
|
|
id: root
|
|
|
|
property var parentModal: null
|
|
|
|
focus: true
|
|
|
|
readonly property var tabs: DashRegistry.tabEntries
|
|
readonly property var optionEntryIds: DashRegistry.entries.filter(e => (e.options?.length ?? 0) > 0).map(e => e.id)
|
|
SettingsPage {
|
|
SettingsCard {
|
|
title: I18n.tr("Weather")
|
|
|
|
SettingsNavRow {
|
|
tab: "dank_dash"
|
|
settingKey: "dashWeatherSettings"
|
|
title: I18n.tr("Weather")
|
|
iconName: "partly_cloudy_day"
|
|
onClicked: keyboard => root.parentModal?.navigateTo("weather", keyboard)
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: I18n.tr("Media player")
|
|
|
|
SettingsNavRow {
|
|
tab: "dank_dash"
|
|
settingKey: "dashMediaSettings"
|
|
title: I18n.tr("Media player")
|
|
hint: I18n.tr("Lyrics providers", "Lyrics source priority settings")
|
|
iconName: "music_note"
|
|
onClicked: keyboard => root.parentModal?.navigateTo("media_player", keyboard)
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: I18n.tr("Digital wellbeing", "settings page and dashboard tab title, screen time tracking")
|
|
|
|
SettingsNavRow {
|
|
tab: "dank_dash"
|
|
settingKey: "dashWellbeingSettings"
|
|
title: I18n.tr("Digital wellbeing", "settings page and dashboard tab title, screen time tracking")
|
|
hint: I18n.tr("Screen time and app limits", "settings sidebar hint and dashboard tab description for digital wellbeing")
|
|
iconName: "digital_wellbeing"
|
|
onClicked: root.parentModal?.navigateTo("wellbeing")
|
|
}
|
|
}
|
|
|
|
SettingsCard {
|
|
title: I18n.tr("Tabs", "noun, card title for dashboard tabs")
|
|
settingKey: "dashTabs"
|
|
tab: "dank_dash"
|
|
|
|
headerActions: DActionButton {
|
|
iconName: "refresh"
|
|
iconSize: Theme.iconSizeSmall
|
|
tooltipText: I18n.tr("Reset to default")
|
|
onClicked: {
|
|
SettingsData.resetDashTabs();
|
|
SettingsData.resetToDefault(["dashTabPosition", "dashTabsEvenlySpaced"]);
|
|
}
|
|
}
|
|
|
|
SettingsDropdownRow {
|
|
text: I18n.tr("Position")
|
|
readonly property var positions: [
|
|
{
|
|
value: "auto",
|
|
text: I18n.tr("Auto")
|
|
},
|
|
{
|
|
value: "left",
|
|
text: I18n.tr("Left")
|
|
},
|
|
{
|
|
value: "right",
|
|
text: I18n.tr("Right")
|
|
},
|
|
{
|
|
value: "bottom",
|
|
text: I18n.tr("Bottom")
|
|
},
|
|
{
|
|
value: "center",
|
|
text: I18n.tr("Center")
|
|
}
|
|
]
|
|
settingKey: "dashTabPosition"
|
|
tab: "dank_dash"
|
|
tags: ["dashboard", "tabs", "position", "navigation"]
|
|
currentValue: (positions.find(option => option.value === SettingsData.dashTabPosition) ?? positions[0]).text
|
|
options: positions.map(option => option.text)
|
|
onValueChanged: value => {
|
|
const option = positions.find(option => option.text === value);
|
|
if (option)
|
|
SettingsData.set("dashTabPosition", option.value);
|
|
}
|
|
}
|
|
|
|
SettingsToggleRow {
|
|
settingKey: "dashTabsEvenlySpaced"
|
|
tab: "dank_dash"
|
|
tags: ["dashboard", "tabs", "spacing", "navigation"]
|
|
text: I18n.tr("Evenly space tabs", "dashboard tab bar toggle")
|
|
checked: SettingsData.dashTabsEvenlySpaced
|
|
onToggled: checked => SettingsData.set("dashTabsEvenlySpaced", checked)
|
|
}
|
|
|
|
SettingsReorderList {
|
|
id: tabList
|
|
|
|
model: ScriptModel {
|
|
values: root.tabs
|
|
objectProp: "id"
|
|
}
|
|
onReordered: indices => SettingsData.setDashTabOrder(indices.map(i => root.tabs[i].id))
|
|
|
|
delegate: SettingsReorderRow {
|
|
id: tabRow
|
|
|
|
required property var modelData
|
|
|
|
reorderList: tabList
|
|
|
|
readonly property bool available: modelData.available !== false
|
|
|
|
iconName: modelData.icon
|
|
iconColor: available && modelData.enabled ? Theme.primary : Theme.onSurface_38
|
|
titleColor: available ? Theme.surfaceText : Theme.onSurface_38
|
|
title: modelData.text
|
|
subtitle: available ? modelData.description ?? "" : I18n.tr("Disabled")
|
|
clickable: available
|
|
onClicked: SettingsData.setDashTabEnabled(modelData.id, !modelData.enabled)
|
|
|
|
Row {
|
|
spacing: Theme.spacingXS
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
DActionButton {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
objectName: "editDashTab"
|
|
iconName: "edit"
|
|
tooltipText: I18n.tr("Edit")
|
|
Accessible.description: tabRow.modelData.text
|
|
enabled: tabRow.available
|
|
onClicked: PopoutService.openDankDashEditor(tabRow.modelData.id, root.Window.window?.screen)
|
|
}
|
|
|
|
DToggle {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
hideText: true
|
|
checked: tabRow.modelData.enabled
|
|
enabled: tabRow.available
|
|
onToggled: checked => SettingsData.setDashTabEnabled(tabRow.modelData.id, checked)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Repeater {
|
|
// value-diffed ids keep a card alive across option changes, a rebuilt card collapses
|
|
model: ScriptModel {
|
|
values: root.optionEntryIds
|
|
}
|
|
|
|
SettingsCard {
|
|
id: optionCard
|
|
|
|
required property string modelData
|
|
readonly property var entry: DashRegistry.entries.find(e => e.id === modelData) ?? null
|
|
readonly property var options: entry?.options ?? []
|
|
|
|
title: entry?.text ?? ""
|
|
settingKey: "dashOptions:" + modelData
|
|
tab: "dank_dash"
|
|
collapsible: true
|
|
expanded: false
|
|
|
|
Repeater {
|
|
model: optionCard.options.length
|
|
|
|
DashOptionRow {
|
|
required property int index
|
|
|
|
spec: optionCard.options[index] ?? ({})
|
|
value: DashRegistry.option(optionCard.modelData, spec.key)
|
|
settingKey: "dashOptions:" + optionCard.modelData + ":" + spec.key
|
|
onCommitted: next => DashRegistry.setOption(optionCard.modelData, spec.key, next)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|