mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-01-30 00:12:50 -05:00
Re-organize settings
This commit is contained in:
@@ -25,6 +25,67 @@ Item {
|
|||||||
visible: !BatteryService.batteryAvailable
|
visible: !BatteryService.batteryAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StyledRect {
|
||||||
|
width: parent.width
|
||||||
|
height: lockScreenSection.implicitHeight + Theme.spacingL * 2
|
||||||
|
radius: Theme.cornerRadius
|
||||||
|
color: Qt.rgba(Theme.surfaceVariant.r, Theme.surfaceVariant.g, Theme.surfaceVariant.b, 0.3)
|
||||||
|
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: "Show power, restart, and logout buttons on the lock screen"
|
||||||
|
checked: SettingsData.lockScreenShowPowerActions
|
||||||
|
onToggled: checked => SettingsData.setLockScreenShowPowerActions(checked)
|
||||||
|
}
|
||||||
|
|
||||||
|
DankToggle {
|
||||||
|
width: parent.width
|
||||||
|
text: I18n.tr("Enable loginctl lock integration")
|
||||||
|
description: "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen."
|
||||||
|
checked: SessionData.loginctlLockIntegration
|
||||||
|
onToggled: checked => SessionData.setLoginctlLockIntegration(checked)
|
||||||
|
}
|
||||||
|
|
||||||
|
DankToggle {
|
||||||
|
width: parent.width
|
||||||
|
text: I18n.tr("Lock before suspend")
|
||||||
|
description: "Automatically lock the screen when the system prepares to suspend"
|
||||||
|
checked: SessionData.lockBeforeSuspend
|
||||||
|
visible: SessionData.loginctlLockIntegration
|
||||||
|
onToggled: checked => SessionData.setLockBeforeSuspend(checked)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StyledRect {
|
StyledRect {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: timeoutSection.implicitHeight + Theme.spacingL * 2
|
height: timeoutSection.implicitHeight + Theme.spacingL * 2
|
||||||
@@ -219,23 +280,6 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Enable loginctl lock integration")
|
|
||||||
description: "Bind lock screen to dbus signals from loginctl. Disable if using an external lock screen."
|
|
||||||
checked: SessionData.loginctlLockIntegration
|
|
||||||
onToggled: checked => SessionData.setLoginctlLockIntegration(checked)
|
|
||||||
}
|
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Lock before suspend")
|
|
||||||
description: "Automatically lock the screen when the system prepares to suspend"
|
|
||||||
checked: SessionData.lockBeforeSuspend
|
|
||||||
visible: SessionData.loginctlLockIntegration
|
|
||||||
onToggled: checked => SessionData.setLockBeforeSuspend(checked)
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
StyledText {
|
||||||
text: I18n.tr("Idle monitoring not supported - requires newer Quickshell version")
|
text: I18n.tr("Idle monitoring not supported - requires newer Quickshell version")
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
|||||||
@@ -35,27 +35,14 @@ FocusScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: timeLoader
|
id: timeWeatherLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 1
|
active: root.currentIndex === 1
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
sourceComponent: TimeTab {
|
sourceComponent: TimeWeatherTab {
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
|
||||||
id: weatherLoader
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
active: root.currentIndex === 2
|
|
||||||
visible: active
|
|
||||||
asynchronous: true
|
|
||||||
|
|
||||||
sourceComponent: WeatherTab {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -64,7 +51,7 @@ FocusScope {
|
|||||||
id: topBarLoader
|
id: topBarLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 3
|
active: root.currentIndex === 2
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -78,7 +65,7 @@ FocusScope {
|
|||||||
id: widgetsLoader
|
id: widgetsLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 4
|
active: root.currentIndex === 3
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -91,7 +78,7 @@ FocusScope {
|
|||||||
id: dockLoader
|
id: dockLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 5
|
active: root.currentIndex === 4
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -107,7 +94,7 @@ FocusScope {
|
|||||||
id: displaysLoader
|
id: displaysLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 6
|
active: root.currentIndex === 5
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -120,7 +107,7 @@ FocusScope {
|
|||||||
id: launcherLoader
|
id: launcherLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 7
|
active: root.currentIndex === 6
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -133,7 +120,7 @@ FocusScope {
|
|||||||
id: themeColorsLoader
|
id: themeColorsLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 8
|
active: root.currentIndex === 7
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -146,7 +133,7 @@ FocusScope {
|
|||||||
id: powerLoader
|
id: powerLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 9
|
active: root.currentIndex === 8
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -159,7 +146,7 @@ FocusScope {
|
|||||||
id: pluginsLoader
|
id: pluginsLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 10
|
active: root.currentIndex === 9
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
@@ -173,7 +160,7 @@ FocusScope {
|
|||||||
id: aboutLoader
|
id: aboutLoader
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
active: root.currentIndex === 11
|
active: root.currentIndex === 10
|
||||||
visible: active
|
visible: active
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,8 @@ Rectangle {
|
|||||||
"text": I18n.tr("Personalization"),
|
"text": I18n.tr("Personalization"),
|
||||||
"icon": "person"
|
"icon": "person"
|
||||||
}, {
|
}, {
|
||||||
"text": I18n.tr("Time & Date"),
|
"text": I18n.tr("Time & Weather"),
|
||||||
"icon": "schedule"
|
"icon": "schedule"
|
||||||
}, {
|
|
||||||
"text": I18n.tr("Weather"),
|
|
||||||
"icon": "cloud"
|
|
||||||
}, {
|
}, {
|
||||||
"text": I18n.tr("Dank Bar"),
|
"text": I18n.tr("Dank Bar"),
|
||||||
"icon": "toolbar"
|
"icon": "toolbar"
|
||||||
@@ -36,8 +33,8 @@ Rectangle {
|
|||||||
"text": I18n.tr("Theme & Colors"),
|
"text": I18n.tr("Theme & Colors"),
|
||||||
"icon": "palette"
|
"icon": "palette"
|
||||||
}, {
|
}, {
|
||||||
"text": I18n.tr("Power"),
|
"text": I18n.tr("Idle & Lock Screen"),
|
||||||
"icon": "power_settings_new"
|
"icon": "lock"
|
||||||
}, {
|
}, {
|
||||||
"text": I18n.tr("Plugins"),
|
"text": I18n.tr("Plugins"),
|
||||||
"icon": "extension"
|
"icon": "extension"
|
||||||
|
|||||||
@@ -76,6 +76,378 @@ Item {
|
|||||||
width: parent.width
|
width: parent.width
|
||||||
spacing: Theme.spacingXL
|
spacing: Theme.spacingXL
|
||||||
|
|
||||||
|
StyledRect {
|
||||||
|
width: parent.width
|
||||||
|
height: gammaSection.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: gammaSection
|
||||||
|
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.margins: Theme.spacingL
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
|
||||||
|
Row {
|
||||||
|
width: parent.width
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
|
||||||
|
DankIcon {
|
||||||
|
name: "brightness_6"
|
||||||
|
size: Theme.iconSize
|
||||||
|
color: Theme.primary
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Gamma Control")
|
||||||
|
font.pixelSize: Theme.fontSizeLarge
|
||||||
|
font.weight: Font.Medium
|
||||||
|
color: Theme.surfaceText
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankToggle {
|
||||||
|
id: nightModeToggle
|
||||||
|
|
||||||
|
width: parent.width
|
||||||
|
text: I18n.tr("Night Mode")
|
||||||
|
description: "Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates."
|
||||||
|
checked: DisplayService.nightModeEnabled
|
||||||
|
onToggled: checked => {
|
||||||
|
DisplayService.toggleNightMode()
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
function onNightModeEnabledChanged() {
|
||||||
|
nightModeToggle.checked = DisplayService.nightModeEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
target: DisplayService
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
width: parent.width
|
||||||
|
spacing: 0
|
||||||
|
leftPadding: Theme.spacingM
|
||||||
|
rightPadding: Theme.spacingM
|
||||||
|
|
||||||
|
DankDropdown {
|
||||||
|
width: parent.width - parent.leftPadding - parent.rightPadding
|
||||||
|
text: I18n.tr("Temperature")
|
||||||
|
description: I18n.tr("Color temperature for night mode")
|
||||||
|
currentValue: SessionData.nightModeTemperature + "K"
|
||||||
|
options: {
|
||||||
|
var temps = []
|
||||||
|
for (var i = 2500; i <= 6000; i += 500) {
|
||||||
|
temps.push(i + "K")
|
||||||
|
}
|
||||||
|
return temps
|
||||||
|
}
|
||||||
|
onValueChanged: value => {
|
||||||
|
var temp = parseInt(value.replace("K", ""))
|
||||||
|
SessionData.setNightModeTemperature(temp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankToggle {
|
||||||
|
id: automaticToggle
|
||||||
|
width: parent.width
|
||||||
|
text: I18n.tr("Automatic Control")
|
||||||
|
description: "Only adjust gamma based on time or location rules."
|
||||||
|
checked: SessionData.nightModeAutoEnabled
|
||||||
|
onToggled: checked => {
|
||||||
|
if (checked && !DisplayService.nightModeEnabled) {
|
||||||
|
DisplayService.toggleNightMode()
|
||||||
|
} else if (!checked && DisplayService.nightModeEnabled) {
|
||||||
|
DisplayService.toggleNightMode()
|
||||||
|
}
|
||||||
|
SessionData.setNightModeAutoEnabled(checked)
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: SessionData
|
||||||
|
function onNightModeAutoEnabledChanged() {
|
||||||
|
automaticToggle.checked = SessionData.nightModeAutoEnabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
id: automaticSettings
|
||||||
|
width: parent.width
|
||||||
|
spacing: Theme.spacingS
|
||||||
|
visible: SessionData.nightModeAutoEnabled
|
||||||
|
leftPadding: Theme.spacingM
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: SessionData
|
||||||
|
function onNightModeAutoEnabledChanged() {
|
||||||
|
automaticSettings.visible = SessionData.nightModeAutoEnabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
width: 200
|
||||||
|
height: 45 + Theme.spacingM
|
||||||
|
|
||||||
|
DankTabBar {
|
||||||
|
id: modeTabBarNight
|
||||||
|
width: 200
|
||||||
|
height: 45
|
||||||
|
model: [{
|
||||||
|
"text": "Time",
|
||||||
|
"icon": "access_time"
|
||||||
|
}, {
|
||||||
|
"text": "Location",
|
||||||
|
"icon": "place"
|
||||||
|
}]
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
currentIndex = SessionData.nightModeAutoMode === "location" ? 1 : 0
|
||||||
|
Qt.callLater(updateIndicator)
|
||||||
|
}
|
||||||
|
|
||||||
|
onTabClicked: index => {
|
||||||
|
console.log("Tab clicked:", index, "Setting mode to:", index === 1 ? "location" : "time")
|
||||||
|
DisplayService.setNightModeAutomationMode(index === 1 ? "location" : "time")
|
||||||
|
currentIndex = index
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: SessionData
|
||||||
|
function onNightModeAutoModeChanged() {
|
||||||
|
modeTabBarNight.currentIndex = SessionData.nightModeAutoMode === "location" ? 1 : 0
|
||||||
|
Qt.callLater(modeTabBarNight.updateIndicator)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
property bool isTimeMode: SessionData.nightModeAutoMode === "time"
|
||||||
|
visible: isTimeMode
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
height: 20
|
||||||
|
leftPadding: 45
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Hour")
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.surfaceVariantText
|
||||||
|
width: 50
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Minute")
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.surfaceVariantText
|
||||||
|
width: 50
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
height: 32
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: startLabel
|
||||||
|
text: I18n.tr("Start")
|
||||||
|
font.pixelSize: Theme.fontSizeMedium
|
||||||
|
color: Theme.surfaceText
|
||||||
|
width: 50
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
DankDropdown {
|
||||||
|
width: 60
|
||||||
|
height: 32
|
||||||
|
text: ""
|
||||||
|
currentValue: SessionData.nightModeStartHour.toString()
|
||||||
|
options: {
|
||||||
|
var hours = []
|
||||||
|
for (var i = 0; i < 24; i++) {
|
||||||
|
hours.push(i.toString())
|
||||||
|
}
|
||||||
|
return hours
|
||||||
|
}
|
||||||
|
onValueChanged: value => {
|
||||||
|
SessionData.setNightModeStartHour(parseInt(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankDropdown {
|
||||||
|
width: 60
|
||||||
|
height: 32
|
||||||
|
text: ""
|
||||||
|
currentValue: SessionData.nightModeStartMinute.toString().padStart(2, '0')
|
||||||
|
options: {
|
||||||
|
var minutes = []
|
||||||
|
for (var i = 0; i < 60; i += 5) {
|
||||||
|
minutes.push(i.toString().padStart(2, '0'))
|
||||||
|
}
|
||||||
|
return minutes
|
||||||
|
}
|
||||||
|
onValueChanged: value => {
|
||||||
|
SessionData.setNightModeStartMinute(parseInt(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
height: 32
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("End")
|
||||||
|
font.pixelSize: Theme.fontSizeMedium
|
||||||
|
color: Theme.surfaceText
|
||||||
|
width: startLabel.width
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
DankDropdown {
|
||||||
|
width: 60
|
||||||
|
height: 32
|
||||||
|
text: ""
|
||||||
|
currentValue: SessionData.nightModeEndHour.toString()
|
||||||
|
options: {
|
||||||
|
var hours = []
|
||||||
|
for (var i = 0; i < 24; i++) {
|
||||||
|
hours.push(i.toString())
|
||||||
|
}
|
||||||
|
return hours
|
||||||
|
}
|
||||||
|
onValueChanged: value => {
|
||||||
|
SessionData.setNightModeEndHour(parseInt(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankDropdown {
|
||||||
|
width: 60
|
||||||
|
height: 32
|
||||||
|
text: ""
|
||||||
|
currentValue: SessionData.nightModeEndMinute.toString().padStart(2, '0')
|
||||||
|
options: {
|
||||||
|
var minutes = []
|
||||||
|
for (var i = 0; i < 60; i += 5) {
|
||||||
|
minutes.push(i.toString().padStart(2, '0'))
|
||||||
|
}
|
||||||
|
return minutes
|
||||||
|
}
|
||||||
|
onValueChanged: value => {
|
||||||
|
SessionData.setNightModeEndMinute(parseInt(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
property bool isLocationMode: SessionData.nightModeAutoMode === "location"
|
||||||
|
visible: isLocationMode
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
width: parent.width
|
||||||
|
|
||||||
|
DankToggle {
|
||||||
|
width: parent.width
|
||||||
|
text: I18n.tr("Auto-location")
|
||||||
|
description: DisplayService.geoclueAvailable ? "Use automatic location detection (geoclue2)" : "Geoclue service not running - cannot auto-detect location"
|
||||||
|
checked: SessionData.nightModeLocationProvider === "geoclue2"
|
||||||
|
enabled: DisplayService.geoclueAvailable
|
||||||
|
onToggled: checked => {
|
||||||
|
if (checked && DisplayService.geoclueAvailable) {
|
||||||
|
SessionData.setNightModeLocationProvider("geoclue2")
|
||||||
|
SessionData.setLatitude(0.0)
|
||||||
|
SessionData.setLongitude(0.0)
|
||||||
|
} else {
|
||||||
|
SessionData.setNightModeLocationProvider("")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Manual Coordinates")
|
||||||
|
font.pixelSize: Theme.fontSizeMedium
|
||||||
|
color: Theme.surfaceText
|
||||||
|
visible: SessionData.nightModeLocationProvider !== "geoclue2"
|
||||||
|
}
|
||||||
|
|
||||||
|
Row {
|
||||||
|
spacing: Theme.spacingM
|
||||||
|
visible: SessionData.nightModeLocationProvider !== "geoclue2"
|
||||||
|
|
||||||
|
Column {
|
||||||
|
spacing: Theme.spacingXS
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Latitude")
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.surfaceVariantText
|
||||||
|
}
|
||||||
|
|
||||||
|
DankTextField {
|
||||||
|
width: 120
|
||||||
|
height: 40
|
||||||
|
text: SessionData.latitude.toString()
|
||||||
|
placeholderText: "0.0"
|
||||||
|
onTextChanged: {
|
||||||
|
const lat = parseFloat(text) || 0.0
|
||||||
|
if (lat >= -90 && lat <= 90) {
|
||||||
|
SessionData.setLatitude(lat)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Column {
|
||||||
|
spacing: Theme.spacingXS
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Longitude")
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.surfaceVariantText
|
||||||
|
}
|
||||||
|
|
||||||
|
DankTextField {
|
||||||
|
width: 120
|
||||||
|
height: 40
|
||||||
|
text: SessionData.longitude.toString()
|
||||||
|
placeholderText: "0.0"
|
||||||
|
onTextChanged: {
|
||||||
|
const lon = parseFloat(text) || 0.0
|
||||||
|
if (lon >= -180 && lon <= 180) {
|
||||||
|
SessionData.setLongitude(lon)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
text: I18n.tr("Uses sunrise/sunset times to automatically adjust night mode based on your location.")
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
color: Theme.surfaceVariantText
|
||||||
|
width: parent.width
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StyledRect {
|
StyledRect {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: screensInfoSection.implicitHeight + Theme.spacingL * 2
|
height: screensInfoSection.implicitHeight + Theme.spacingL * 2
|
||||||
|
|||||||
@@ -905,7 +905,63 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dynamic Theme Section
|
StyledRect {
|
||||||
|
width: parent.width
|
||||||
|
height: lightModeRow.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
|
||||||
|
|
||||||
|
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
|
||||||
|
onToggleCompleted: checked => {
|
||||||
|
Theme.screenTransition()
|
||||||
|
Theme.setLightMode(checked)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StyledRect {
|
StyledRect {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
height: dynamicThemeSection.implicitHeight + Theme.spacingL * 2
|
height: dynamicThemeSection.implicitHeight + Theme.spacingL * 2
|
||||||
@@ -932,6 +988,26 @@ Item {
|
|||||||
anchors.verticalCenter: parent.verticalCenter
|
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 {
|
Column {
|
||||||
width: parent.width - Theme.iconSize - Theme.spacingM - toggle.width - Theme.spacingM
|
width: parent.width - Theme.iconSize - Theme.spacingM - toggle.width - Theme.spacingM
|
||||||
spacing: Theme.spacingXS
|
spacing: Theme.spacingXS
|
||||||
@@ -1059,722 +1135,6 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display Settings
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: displaySection.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: displaySection
|
|
||||||
|
|
||||||
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("Display Settings")
|
|
||||||
font.pixelSize: Theme.fontSizeLarge
|
|
||||||
font.weight: Font.Medium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Light Mode")
|
|
||||||
description: I18n.tr("Use light theme instead of dark theme")
|
|
||||||
checked: SessionData.isLightMode
|
|
||||||
onToggleCompleted: checked => {
|
|
||||||
Theme.screenTransition()
|
|
||||||
Theme.setLightMode(checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: 1
|
|
||||||
color: Theme.outline
|
|
||||||
opacity: 0.2
|
|
||||||
}
|
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
id: nightModeToggle
|
|
||||||
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Night Mode")
|
|
||||||
description: "Apply warm color temperature to reduce eye strain. Use automation settings below to control when it activates."
|
|
||||||
checked: DisplayService.nightModeEnabled
|
|
||||||
onToggled: checked => {
|
|
||||||
DisplayService.toggleNightMode()
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
function onNightModeEnabledChanged() {
|
|
||||||
nightModeToggle.checked = DisplayService.nightModeEnabled
|
|
||||||
}
|
|
||||||
|
|
||||||
target: DisplayService
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankDropdown {
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Temperature")
|
|
||||||
description: I18n.tr("Color temperature for night mode")
|
|
||||||
currentValue: SessionData.nightModeTemperature + "K"
|
|
||||||
options: {
|
|
||||||
var temps = []
|
|
||||||
for (var i = 2500; i <= 6000; i += 500) {
|
|
||||||
temps.push(i + "K")
|
|
||||||
}
|
|
||||||
return temps
|
|
||||||
}
|
|
||||||
onValueChanged: value => {
|
|
||||||
var temp = parseInt(value.replace("K", ""))
|
|
||||||
SessionData.setNightModeTemperature(temp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
id: automaticToggle
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Automatic Control")
|
|
||||||
description: "Only adjust gamma based on time or location rules."
|
|
||||||
checked: SessionData.nightModeAutoEnabled
|
|
||||||
onToggled: checked => {
|
|
||||||
if (checked && !DisplayService.nightModeEnabled) {
|
|
||||||
DisplayService.toggleNightMode()
|
|
||||||
} else if (!checked && DisplayService.nightModeEnabled) {
|
|
||||||
DisplayService.toggleNightMode()
|
|
||||||
}
|
|
||||||
SessionData.setNightModeAutoEnabled(checked)
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: SessionData
|
|
||||||
function onNightModeAutoEnabledChanged() {
|
|
||||||
automaticToggle.checked = SessionData.nightModeAutoEnabled
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: automaticSettings
|
|
||||||
width: parent.width
|
|
||||||
spacing: Theme.spacingS
|
|
||||||
visible: SessionData.nightModeAutoEnabled
|
|
||||||
leftPadding: Theme.spacingM
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: SessionData
|
|
||||||
function onNightModeAutoEnabledChanged() {
|
|
||||||
automaticSettings.visible = SessionData.nightModeAutoEnabled
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
|
||||||
width: 200
|
|
||||||
height: 45 + Theme.spacingM
|
|
||||||
|
|
||||||
DankTabBar {
|
|
||||||
id: modeTabBarNight
|
|
||||||
width: 200
|
|
||||||
height: 45
|
|
||||||
model: [{
|
|
||||||
"text": "Time",
|
|
||||||
"icon": "access_time"
|
|
||||||
}, {
|
|
||||||
"text": "Location",
|
|
||||||
"icon": "place"
|
|
||||||
}]
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
currentIndex = SessionData.nightModeAutoMode === "location" ? 1 : 0
|
|
||||||
Qt.callLater(updateIndicator)
|
|
||||||
}
|
|
||||||
|
|
||||||
onTabClicked: index => {
|
|
||||||
console.log("Tab clicked:", index, "Setting mode to:", index === 1 ? "location" : "time")
|
|
||||||
DisplayService.setNightModeAutomationMode(index === 1 ? "location" : "time")
|
|
||||||
currentIndex = index
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
|
||||||
target: SessionData
|
|
||||||
function onNightModeAutoModeChanged() {
|
|
||||||
modeTabBarNight.currentIndex = SessionData.nightModeAutoMode === "location" ? 1 : 0
|
|
||||||
Qt.callLater(modeTabBarNight.updateIndicator)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
property bool isTimeMode: SessionData.nightModeAutoMode === "time"
|
|
||||||
visible: isTimeMode
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
|
|
||||||
// Header row
|
|
||||||
Row {
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
height: 20
|
|
||||||
leftPadding: 45
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Hour")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
width: 50
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Minute")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
width: 50
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start time row
|
|
||||||
Row {
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
height: 32
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
id: startLabel
|
|
||||||
text: I18n.tr("Start")
|
|
||||||
font.pixelSize: Theme.fontSizeMedium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
width: 50
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
DankDropdown {
|
|
||||||
width: 60
|
|
||||||
height: 32
|
|
||||||
text: ""
|
|
||||||
currentValue: SessionData.nightModeStartHour.toString()
|
|
||||||
options: {
|
|
||||||
var hours = []
|
|
||||||
for (var i = 0; i < 24; i++) {
|
|
||||||
hours.push(i.toString())
|
|
||||||
}
|
|
||||||
return hours
|
|
||||||
}
|
|
||||||
onValueChanged: value => {
|
|
||||||
SessionData.setNightModeStartHour(parseInt(value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankDropdown {
|
|
||||||
width: 60
|
|
||||||
height: 32
|
|
||||||
text: ""
|
|
||||||
currentValue: SessionData.nightModeStartMinute.toString().padStart(2, '0')
|
|
||||||
options: {
|
|
||||||
var minutes = []
|
|
||||||
for (var i = 0; i < 60; i += 5) {
|
|
||||||
minutes.push(i.toString().padStart(2, '0'))
|
|
||||||
}
|
|
||||||
return minutes
|
|
||||||
}
|
|
||||||
onValueChanged: value => {
|
|
||||||
SessionData.setNightModeStartMinute(parseInt(value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// End time row
|
|
||||||
Row {
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
height: 32
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("End")
|
|
||||||
font.pixelSize: Theme.fontSizeMedium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
width: startLabel.width
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
DankDropdown {
|
|
||||||
width: 60
|
|
||||||
height: 32
|
|
||||||
text: ""
|
|
||||||
currentValue: SessionData.nightModeEndHour.toString()
|
|
||||||
options: {
|
|
||||||
var hours = []
|
|
||||||
for (var i = 0; i < 24; i++) {
|
|
||||||
hours.push(i.toString())
|
|
||||||
}
|
|
||||||
return hours
|
|
||||||
}
|
|
||||||
onValueChanged: value => {
|
|
||||||
SessionData.setNightModeEndHour(parseInt(value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankDropdown {
|
|
||||||
width: 60
|
|
||||||
height: 32
|
|
||||||
text: ""
|
|
||||||
currentValue: SessionData.nightModeEndMinute.toString().padStart(2, '0')
|
|
||||||
options: {
|
|
||||||
var minutes = []
|
|
||||||
for (var i = 0; i < 60; i += 5) {
|
|
||||||
minutes.push(i.toString().padStart(2, '0'))
|
|
||||||
}
|
|
||||||
return minutes
|
|
||||||
}
|
|
||||||
onValueChanged: value => {
|
|
||||||
SessionData.setNightModeEndMinute(parseInt(value))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
property bool isLocationMode: SessionData.nightModeAutoMode === "location"
|
|
||||||
visible: isLocationMode
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
width: parent.width
|
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Auto-location")
|
|
||||||
description: DisplayService.geoclueAvailable ? "Use automatic location detection (geoclue2)" : "Geoclue service not running - cannot auto-detect location"
|
|
||||||
checked: SessionData.nightModeLocationProvider === "geoclue2"
|
|
||||||
enabled: DisplayService.geoclueAvailable
|
|
||||||
onToggled: checked => {
|
|
||||||
if (checked && DisplayService.geoclueAvailable) {
|
|
||||||
SessionData.setNightModeLocationProvider("geoclue2")
|
|
||||||
SessionData.setLatitude(0.0)
|
|
||||||
SessionData.setLongitude(0.0)
|
|
||||||
} else {
|
|
||||||
SessionData.setNightModeLocationProvider("")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Manual Coordinates")
|
|
||||||
font.pixelSize: Theme.fontSizeMedium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
visible: SessionData.nightModeLocationProvider !== "geoclue2"
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
visible: SessionData.nightModeLocationProvider !== "geoclue2"
|
|
||||||
|
|
||||||
Column {
|
|
||||||
spacing: Theme.spacingXS
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Latitude")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
}
|
|
||||||
|
|
||||||
DankTextField {
|
|
||||||
width: 120
|
|
||||||
height: 40
|
|
||||||
text: SessionData.latitude.toString()
|
|
||||||
placeholderText: "0.0"
|
|
||||||
onTextChanged: {
|
|
||||||
const lat = parseFloat(text) || 0.0
|
|
||||||
if (lat >= -90 && lat <= 90) {
|
|
||||||
SessionData.setLatitude(lat)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
spacing: Theme.spacingXS
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Longitude")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
}
|
|
||||||
|
|
||||||
DankTextField {
|
|
||||||
width: 120
|
|
||||||
height: 40
|
|
||||||
text: SessionData.longitude.toString()
|
|
||||||
placeholderText: "0.0"
|
|
||||||
onTextChanged: {
|
|
||||||
const lon = parseFloat(text) || 0.0
|
|
||||||
if (lon >= -180 && lon <= 180) {
|
|
||||||
SessionData.setLongitude(lon)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Uses sunrise/sunset times to automatically adjust night mode based on your location.")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
width: parent.width
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notification Popup Settings
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: notificationPopupSection.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: notificationPopupSection
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankDropdown {
|
|
||||||
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.setNotificationPopupPosition(SettingsData.Position.Top)
|
|
||||||
break
|
|
||||||
case "Top Left":
|
|
||||||
SettingsData.setNotificationPopupPosition(SettingsData.Position.Left)
|
|
||||||
break
|
|
||||||
case "Top Center":
|
|
||||||
SettingsData.setNotificationPopupPosition(-1)
|
|
||||||
break
|
|
||||||
case "Bottom Right":
|
|
||||||
SettingsData.setNotificationPopupPosition(SettingsData.Position.Right)
|
|
||||||
break
|
|
||||||
case "Bottom Left":
|
|
||||||
SettingsData.setNotificationPopupPosition(SettingsData.Position.Bottom)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
SettingsData.sendTestNotifications()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: 1
|
|
||||||
color: Theme.outline
|
|
||||||
opacity: 0.2
|
|
||||||
}
|
|
||||||
|
|
||||||
DankToggle {
|
|
||||||
width: parent.width
|
|
||||||
text: I18n.tr("Always Show OSD Percentage")
|
|
||||||
description: I18n.tr("Display volume and brightness percentage values by default in OSD popups")
|
|
||||||
checked: SettingsData.osdAlwaysShowValue
|
|
||||||
onToggled: checked => {
|
|
||||||
SettingsData.setOsdAlwaysShowValue(checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Font Settings
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: fontSection.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: 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 === SettingsData.defaultFontFamily)
|
|
||||||
return "Default"
|
|
||||||
else
|
|
||||||
return SettingsData.fontFamily || "Default"
|
|
||||||
}
|
|
||||||
enableFuzzySearch: true
|
|
||||||
popupWidthOffset: 100
|
|
||||||
maxPopupHeight: 400
|
|
||||||
options: cachedFontFamilies
|
|
||||||
onValueChanged: value => {
|
|
||||||
if (value.startsWith("Default"))
|
|
||||||
SettingsData.setFontFamily(SettingsData.defaultFontFamily)
|
|
||||||
else
|
|
||||||
SettingsData.setFontFamily(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.setFontWeight(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: cachedFontFamilies
|
|
||||||
onValueChanged: value => {
|
|
||||||
if (value === "Default")
|
|
||||||
SettingsData.setMonoFontFamily(SettingsData.defaultMonoFontFamily)
|
|
||||||
else
|
|
||||||
SettingsData.setMonoFontFamily(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
|
|
||||||
anchors.leftMargin: Theme.spacingM
|
|
||||||
anchors.rightMargin: Theme.spacingM
|
|
||||||
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
|
|
||||||
|
|
||||||
width: 180
|
|
||||||
height: 36
|
|
||||||
anchors.right: parent.right
|
|
||||||
anchors.rightMargin: 0
|
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
|
||||||
spacing: Theme.spacingS
|
|
||||||
|
|
||||||
DankActionButton {
|
|
||||||
buttonSize: 32
|
|
||||||
iconName: "remove"
|
|
||||||
iconSize: Theme.iconSizeSmall
|
|
||||||
enabled: SettingsData.fontScale > 1.0
|
|
||||||
backgroundColor: Theme.surfaceContainerHigh
|
|
||||||
iconColor: Theme.surfaceText
|
|
||||||
onClicked: {
|
|
||||||
var newScale = Math.max(1.0, SettingsData.fontScale - 0.05)
|
|
||||||
SettingsData.setFontScale(newScale)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledRect {
|
|
||||||
width: 60
|
|
||||||
height: 32
|
|
||||||
radius: Theme.cornerRadius
|
|
||||||
color: Theme.surfaceContainerHigh
|
|
||||||
border.color: Qt.rgba(Theme.outline.r, Theme.outline.g, Theme.outline.b, 0.2)
|
|
||||||
border.width: 0
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
anchors.centerIn: parent
|
|
||||||
text: (SettingsData.fontScale * 100).toFixed(0) + "%"
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
font.weight: Font.Medium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankActionButton {
|
|
||||||
buttonSize: 32
|
|
||||||
iconName: "add"
|
|
||||||
iconSize: Theme.iconSizeSmall
|
|
||||||
enabled: SettingsData.fontScale < 2.0
|
|
||||||
backgroundColor: Theme.surfaceContainerHigh
|
|
||||||
iconColor: Theme.surfaceText
|
|
||||||
onClicked: {
|
|
||||||
var newScale = Math.min(2.0, SettingsData.fontScale + 0.05)
|
|
||||||
SettingsData.setFontScale(newScale)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Animation Settings
|
// Animation Settings
|
||||||
StyledRect {
|
StyledRect {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
@@ -1803,7 +1163,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
StyledText {
|
StyledText {
|
||||||
text: I18n.tr("Animations")
|
text: I18n.tr("Animation Speed")
|
||||||
font.pixelSize: Theme.fontSizeLarge
|
font.pixelSize: Theme.fontSizeLarge
|
||||||
font.weight: Font.Medium
|
font.weight: Font.Medium
|
||||||
color: Theme.surfaceText
|
color: Theme.surfaceText
|
||||||
@@ -1811,28 +1171,13 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Column {
|
Item {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
spacing: Theme.spacingS
|
height: childrenRect.height
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Animation Speed")
|
|
||||||
font.pixelSize: Theme.fontSizeMedium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
font.weight: Font.Medium
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Control the speed of animations throughout the interface")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
wrapMode: Text.WordWrap
|
|
||||||
width: parent.width
|
|
||||||
}
|
|
||||||
|
|
||||||
DankButtonGroup {
|
DankButtonGroup {
|
||||||
id: animationSpeedGroup
|
id: animationSpeedGroup
|
||||||
width: parent.width
|
x: (parent.width - width) / 2
|
||||||
model: ["None", "Shortest", "Short", "Medium", "Long"]
|
model: ["None", "Shortest", "Short", "Medium", "Long"]
|
||||||
selectionMode: "single"
|
selectionMode: "single"
|
||||||
currentIndex: SettingsData.animationSpeed
|
currentIndex: SettingsData.animationSpeed
|
||||||
@@ -1845,54 +1190,6 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lock Screen Settings
|
|
||||||
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: "Show power, restart, and logout buttons on the lock screen"
|
|
||||||
checked: SettingsData.lockScreenShowPowerActions
|
|
||||||
onToggled: checked => {
|
|
||||||
SettingsData.setLockScreenShowPowerActions(checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -929,6 +929,238 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StyledRect {
|
||||||
|
width: parent.width
|
||||||
|
height: fontSection.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: 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 === SettingsData.defaultFontFamily)
|
||||||
|
return "Default"
|
||||||
|
else
|
||||||
|
return SettingsData.fontFamily || "Default"
|
||||||
|
}
|
||||||
|
enableFuzzySearch: true
|
||||||
|
popupWidthOffset: 100
|
||||||
|
maxPopupHeight: 400
|
||||||
|
options: cachedFontFamilies
|
||||||
|
onValueChanged: value => {
|
||||||
|
if (value.startsWith("Default"))
|
||||||
|
SettingsData.setFontFamily(SettingsData.defaultFontFamily)
|
||||||
|
else
|
||||||
|
SettingsData.setFontFamily(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.setFontWeight(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: cachedFontFamilies
|
||||||
|
onValueChanged: value => {
|
||||||
|
if (value === "Default")
|
||||||
|
SettingsData.setMonoFontFamily(SettingsData.defaultMonoFontFamily)
|
||||||
|
else
|
||||||
|
SettingsData.setMonoFontFamily(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
|
||||||
|
|
||||||
|
width: 180
|
||||||
|
height: 36
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.rightMargin: 0
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
spacing: Theme.spacingS
|
||||||
|
|
||||||
|
DankActionButton {
|
||||||
|
buttonSize: 32
|
||||||
|
iconName: "remove"
|
||||||
|
iconSize: Theme.iconSizeSmall
|
||||||
|
enabled: SettingsData.fontScale > 1.0
|
||||||
|
backgroundColor: Theme.surfaceContainerHigh
|
||||||
|
iconColor: Theme.surfaceText
|
||||||
|
onClicked: {
|
||||||
|
var newScale = Math.max(1.0, SettingsData.fontScale - 0.05)
|
||||||
|
SettingsData.setFontScale(newScale)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledRect {
|
||||||
|
width: 60
|
||||||
|
height: 32
|
||||||
|
radius: Theme.cornerRadius
|
||||||
|
color: Theme.surfaceContainerHigh
|
||||||
|
border.color: Qt.rgba(Theme.outline.r,
|
||||||
|
Theme.outline.g,
|
||||||
|
Theme.outline.b, 0.2)
|
||||||
|
border.width: 0
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
text: (SettingsData.fontScale * 100).toFixed(
|
||||||
|
0) + "%"
|
||||||
|
font.pixelSize: Theme.fontSizeSmall
|
||||||
|
font.weight: Font.Medium
|
||||||
|
color: Theme.surfaceText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DankActionButton {
|
||||||
|
buttonSize: 32
|
||||||
|
iconName: "add"
|
||||||
|
iconSize: Theme.iconSizeSmall
|
||||||
|
enabled: SettingsData.fontScale < 2.0
|
||||||
|
backgroundColor: Theme.surfaceContainerHigh
|
||||||
|
iconColor: Theme.surfaceText
|
||||||
|
onClicked: {
|
||||||
|
var newScale = Math.min(2.0,
|
||||||
|
SettingsData.fontScale + 0.05)
|
||||||
|
SettingsData.setFontScale(newScale)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// System Configuration Warning
|
// System Configuration Warning
|
||||||
Rectangle {
|
Rectangle {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
|
|||||||
@@ -1,378 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
import qs.Common
|
|
||||||
import qs.Widgets
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: timeTab
|
|
||||||
|
|
||||||
DankFlickable {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: Theme.spacingL
|
|
||||||
clip: true
|
|
||||||
contentHeight: mainColumn.height
|
|
||||||
contentWidth: width
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: mainColumn
|
|
||||||
|
|
||||||
width: parent.width
|
|
||||||
spacing: Theme.spacingXL
|
|
||||||
|
|
||||||
// Time Format
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: timeSection.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: timeSection
|
|
||||||
|
|
||||||
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.setClockFormat(
|
|
||||||
checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Date Format Section
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: dateSection.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: dateSection
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Date Format")
|
|
||||||
font.pixelSize: Theme.fontSizeLarge
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
// Find matching preset or show "Custom"
|
|
||||||
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 => {
|
|
||||||
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.setClockDateFormat(
|
|
||||||
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"
|
|
||||||
}
|
|
||||||
// Find matching preset or show "Custom"
|
|
||||||
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 => {
|
|
||||||
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.setLockDateFormat(
|
|
||||||
formatMap[value])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DankTextField {
|
|
||||||
id: customFormatInput
|
|
||||||
|
|
||||||
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.setClockDateFormat(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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.setLockDateFormat(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: formatHelp.implicitHeight + Theme.spacingM * 2
|
|
||||||
radius: Theme.cornerRadius
|
|
||||||
color: Theme.surfaceContainerHigh
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1288
Modules/Settings/TimeWeatherTab.qml
Normal file
1288
Modules/Settings/TimeWeatherTab.qml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,390 +0,0 @@
|
|||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
import qs.Common
|
|
||||||
import qs.Widgets
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: weatherTab
|
|
||||||
|
|
||||||
DankFlickable {
|
|
||||||
anchors.fill: parent
|
|
||||||
anchors.topMargin: Theme.spacingL
|
|
||||||
clip: true
|
|
||||||
contentHeight: mainColumn.height
|
|
||||||
contentWidth: width
|
|
||||||
|
|
||||||
Column {
|
|
||||||
id: mainColumn
|
|
||||||
|
|
||||||
width: parent.width
|
|
||||||
spacing: Theme.spacingXL
|
|
||||||
|
|
||||||
// Enable Weather
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: enableWeatherSection.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: 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.setWeatherEnabled(
|
|
||||||
checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Temperature Unit
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: temperatureSection.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: 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 Fahrenheit")
|
|
||||||
font.pixelSize: Theme.fontSizeLarge
|
|
||||||
font.weight: Font.Medium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Use Fahrenheit instead of Celsius for temperature")
|
|
||||||
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.setTemperatureUnit(
|
|
||||||
checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Behavior on opacity {
|
|
||||||
NumberAnimation {
|
|
||||||
duration: Theme.mediumDuration
|
|
||||||
easing.type: Theme.emphasizedEasing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Location Settings
|
|
||||||
StyledRect {
|
|
||||||
width: parent.width
|
|
||||||
height: locationSection.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: 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.setAutoLocation(
|
|
||||||
checked)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
width: parent.width
|
|
||||||
spacing: Theme.spacingXS
|
|
||||||
visible: !SettingsData.useAutoLocation
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
width: parent.width
|
|
||||||
height: 1
|
|
||||||
color: Theme.outline
|
|
||||||
opacity: 0.2
|
|
||||||
}
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Custom Location")
|
|
||||||
font.pixelSize: Theme.fontSizeMedium
|
|
||||||
color: Theme.surfaceText
|
|
||||||
font.weight: Font.Medium
|
|
||||||
}
|
|
||||||
|
|
||||||
Row {
|
|
||||||
width: parent.width
|
|
||||||
spacing: Theme.spacingM
|
|
||||||
|
|
||||||
Column {
|
|
||||||
width: (parent.width - Theme.spacingM) / 2
|
|
||||||
spacing: Theme.spacingXS
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
text: I18n.tr("Latitude")
|
|
||||||
font.pixelSize: Theme.fontSizeSmall
|
|
||||||
color: Theme.surfaceVariantText
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Column {
|
|
||||||
width: (parent.width - Theme.spacingM) / 2
|
|
||||||
spacing: Theme.spacingXS
|
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -396,6 +396,151 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
StyledRect {
|
||||||
|
width: parent.width
|
||||||
|
height: notificationSection.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: 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.setNotificationPopupPosition(SettingsData.Position.Top)
|
||||||
|
break
|
||||||
|
case "Top Left":
|
||||||
|
SettingsData.setNotificationPopupPosition(SettingsData.Position.Left)
|
||||||
|
break
|
||||||
|
case "Top Center":
|
||||||
|
SettingsData.setNotificationPopupPosition(-1)
|
||||||
|
break
|
||||||
|
case "Bottom Right":
|
||||||
|
SettingsData.setNotificationPopupPosition(SettingsData.Position.Right)
|
||||||
|
break
|
||||||
|
case "Bottom Left":
|
||||||
|
SettingsData.setNotificationPopupPosition(SettingsData.Position.Bottom)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
SettingsData.sendTestNotifications()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledRect {
|
||||||
|
width: parent.width
|
||||||
|
height: osdRow.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
|
||||||
|
|
||||||
|
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
|
||||||
|
onToggleCompleted: checked => {
|
||||||
|
SettingsData.setOsdAlwaysShowValue(checked)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user