124 lines
4.5 KiB
QML
124 lines
4.5 KiB
QML
// Named themes are the first layer of Appearance: shipped profiles stay
|
|
// immutable, while saved profiles can be selected or removed in place.
|
|
|
|
import QtQuick
|
|
import qs.config
|
|
import qs.services
|
|
|
|
Column {
|
|
id: root
|
|
|
|
width: parent ? parent.width : 620
|
|
spacing: 0
|
|
|
|
Repeater {
|
|
model: ThemeProfiles.profiles
|
|
|
|
SettingRow {
|
|
id: profileRow
|
|
|
|
required property var modelData
|
|
|
|
label: profileRow.modelData.name
|
|
detail: (profileRow.modelData.scheme === "light" ? "Light" : "Dark")
|
|
+ " · " + profileRow.modelData.accent + " → " + profileRow.modelData.secondary
|
|
controlWidth: profileRow.modelData.shipped ? 88 : 170
|
|
|
|
Row {
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: 6
|
|
|
|
SettingsButton {
|
|
id: useButton
|
|
text: profileRow.modelData.id === ThemeProfiles.activeProfile.id ? "Selected" : "Use"
|
|
enabled: profileRow.modelData.id !== ThemeProfiles.activeProfile.id
|
|
activeFocusOnTab: enabled
|
|
border.width: activeFocus ? 2 : (tone === "accent" ? 0 : 1)
|
|
border.color: activeFocus ? Theme.accent : Theme.alpha(Theme.fg, 0.08)
|
|
onClicked: ThemeProfiles.selectProfile(profileRow.modelData.id)
|
|
Keys.onReturnPressed: if (enabled) ThemeProfiles.selectProfile(profileRow.modelData.id)
|
|
Keys.onSpacePressed: if (enabled) ThemeProfiles.selectProfile(profileRow.modelData.id)
|
|
}
|
|
|
|
SettingsButton {
|
|
id: deleteButton
|
|
visible: !profileRow.modelData.shipped
|
|
text: "Delete"
|
|
activeFocusOnTab: visible
|
|
border.width: activeFocus ? 2 : 1
|
|
border.color: activeFocus ? Theme.danger : Theme.alpha(Theme.fg, 0.08)
|
|
onClicked: ThemeProfiles.deleteProfile(profileRow.modelData.id)
|
|
Keys.onReturnPressed: ThemeProfiles.deleteProfile(profileRow.modelData.id)
|
|
Keys.onSpacePressed: ThemeProfiles.deleteProfile(profileRow.modelData.id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SettingRow {
|
|
label: "Save current theme"
|
|
detail: "Stores this scheme and accent pair under a unique name"
|
|
divider: false
|
|
controlWidth: 292
|
|
|
|
Row {
|
|
anchors.right: parent.right
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
spacing: 7
|
|
|
|
Rectangle {
|
|
width: 196
|
|
height: 31
|
|
radius: 8
|
|
color: Theme.alpha(Theme.fg, 0.05)
|
|
border.width: nameInput.activeFocus ? 2 : 1
|
|
border.color: nameInput.activeFocus ? Theme.accent : Theme.alpha(Theme.fg, 0.12)
|
|
|
|
TextInput {
|
|
id: nameInput
|
|
anchors.fill: parent
|
|
anchors.leftMargin: 10
|
|
anchors.rightMargin: 10
|
|
activeFocusOnTab: true
|
|
verticalAlignment: TextInput.AlignVCenter
|
|
maximumLength: 40
|
|
color: Theme.fg
|
|
selectionColor: Theme.alpha(Theme.accent, 0.35)
|
|
font.family: Theme.fontFamily
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
Accessible.name: "Theme profile name"
|
|
|
|
Text {
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
visible: nameInput.text === "" && !nameInput.activeFocus
|
|
text: "Theme name"
|
|
color: Theme.fgMuted
|
|
font: nameInput.font
|
|
}
|
|
|
|
onAccepted: saveButton.save()
|
|
}
|
|
}
|
|
|
|
SettingsButton {
|
|
id: saveButton
|
|
text: "Save"
|
|
tone: "accent"
|
|
activeFocusOnTab: true
|
|
border.width: activeFocus ? 2 : 0
|
|
border.color: activeFocus ? Theme.fg : "transparent"
|
|
|
|
function save(): void {
|
|
if (ThemeProfiles.saveProfile(nameInput.text))
|
|
nameInput.text = "";
|
|
}
|
|
|
|
onClicked: save()
|
|
Keys.onReturnPressed: save()
|
|
Keys.onSpacePressed: save()
|
|
}
|
|
}
|
|
}
|
|
}
|