Settings window: added separators and renamed Recording to Screen Recorder

This commit is contained in:
quadbyte 2025-08-06 19:10:32 -04:00
parent 6ef29ae745
commit 7c2d2b4d66
7 changed files with 1042 additions and 851 deletions

View file

@ -57,7 +57,7 @@ PanelWithOverlay {
"General", "General",
"Bar", "Bar",
"Time & Weather", "Time & Weather",
"Recording", "Screen Recorder",
"Network", "Network",
"Display", "Display",
"Wallpaper", "Wallpaper",
@ -202,7 +202,7 @@ PanelWithOverlay {
text: wallpaperSelector.visible ? "Select Wallpaper" : (activeTabIndex === 0 ? "General" : text: wallpaperSelector.visible ? "Select Wallpaper" : (activeTabIndex === 0 ? "General" :
activeTabIndex === 1 ? "Bar" : activeTabIndex === 1 ? "Bar" :
activeTabIndex === 2 ? "Time & Weather" : activeTabIndex === 2 ? "Time & Weather" :
activeTabIndex === 3 ? "Recording" : activeTabIndex === 3 ? "Screen Recorder" :
activeTabIndex === 4 ? "Network" : activeTabIndex === 4 ? "Network" :
activeTabIndex === 5 ? "Display" : activeTabIndex === 5 ? "Display" :
activeTabIndex === 6 ? "Wallpaper" : activeTabIndex === 6 ? "Wallpaper" :
@ -303,7 +303,7 @@ PanelWithOverlay {
left: parent.left left: parent.left
right: parent.right right: parent.right
bottom: parent.bottom bottom: parent.bottom
margins: 24 margins: 16
topMargin: 32 topMargin: 32
} }
@ -344,7 +344,7 @@ PanelWithOverlay {
{ icon: "tune", text: "General" }, { icon: "tune", text: "General" },
{ icon: "space_dashboard", text: "Bar" }, { icon: "space_dashboard", text: "Bar" },
{ icon: "schedule", text: "Time & Weather" }, { icon: "schedule", text: "Time & Weather" },
{ icon: "photo_camera", text: "Recording" }, { icon: "photo_camera", text: "Screen Recorder" },
{ icon: "wifi", text: "Network" }, { icon: "wifi", text: "Network" },
{ icon: "monitor", text: "Display" }, { icon: "monitor", text: "Display" },
{ icon: "wallpaper", text: "Wallpaper" }, { icon: "wallpaper", text: "Wallpaper" },

View file

@ -21,7 +21,7 @@ ColumnLayout {
Layout.fillWidth: true Layout.fillWidth: true
Text { Text {
text: "Bar Elements" text: "Elements"
font.pixelSize: 18 font.pixelSize: 18
font.bold: true font.bold: true
color: Theme.textPrimary color: Theme.textPrimary

View file

@ -107,11 +107,23 @@ ColumnLayout {
} }
} }
Rectangle {
Layout.topMargin: 26
Layout.bottomMargin: 18
anchors {
top: headerArea.bottom
left: parent.left
right: parent.right
}
height: 1
color: Theme.outline
opacity: 0.3
}
ColumnLayout { ColumnLayout {
spacing: 4 spacing: 4
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 58
Text { Text {
text: "User Interface" text: "User Interface"

View file

@ -97,11 +97,23 @@ ColumnLayout {
} }
} }
Rectangle {
Layout.topMargin: 26
Layout.bottomMargin: 18
anchors {
top: headerArea.bottom
left: parent.left
right: parent.right
}
height: 1
color: Theme.outline
opacity: 0.3
}
ColumnLayout { ColumnLayout {
spacing: 16 spacing: 16
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 58
Text { Text {
text: "Bluetooth" text: "Bluetooth"

View file

@ -1,17 +1,19 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import qs.Settings
import qs.Components import qs.Components
import qs.Settings
ColumnLayout { ColumnLayout {
id: root id: root
spacing: 0 spacing: 0
anchors.fill: parent anchors.fill: parent
anchors.margins: 0 anchors.margins: 0
ScrollView { ScrollView {
id: scrollView id: scrollView
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
padding: 0 padding: 0
@ -29,20 +31,18 @@ ColumnLayout {
Layout.preferredHeight: 0 Layout.preferredHeight: 0
} }
ColumnLayout { ColumnLayout {
// Text {
// text: "Screen Recording"
// font.pixelSize: 18
// font.bold: true
// color: Theme.textPrimary
// Layout.bottomMargin: 8
// }
spacing: 4 spacing: 4
Layout.fillWidth: true Layout.fillWidth: true
Text {
text: "Screen Recording"
font.pixelSize: 18
font.bold: true
color: Theme.textPrimary
Layout.bottomMargin: 8
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
Layout.fillWidth: true Layout.fillWidth: true
@ -71,6 +71,7 @@ ColumnLayout {
TextInput { TextInput {
id: videoPathInput id: videoPathInput
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: 12 anchors.leftMargin: 12
anchors.rightMargin: 12 anchors.rightMargin: 12
@ -87,15 +88,18 @@ ColumnLayout {
onTextChanged: { onTextChanged: {
Settings.settings.videoPath = text; Settings.settings.videoPath = text;
} }
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.IBeamCursor cursorShape: Qt.IBeamCursor
onClicked: videoPathInput.forceActiveFocus() onClicked: videoPathInput.forceActiveFocus()
} }
}
}
} }
}
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -118,13 +122,13 @@ ColumnLayout {
SpinBox { SpinBox {
id: frameRateSpinBox id: frameRateSpinBox
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 40 Layout.preferredHeight: 40
from: 24 from: 24
to: 144 to: 144
value: Settings.settings.recordingFrameRate || 60 value: Settings.settings.recordingFrameRate || 60
stepSize: 1 stepSize: 1
onValueChanged: { onValueChanged: {
Settings.settings.recordingFrameRate = value; Settings.settings.recordingFrameRate = value;
} }
@ -148,25 +152,25 @@ ColumnLayout {
verticalAlignment: Qt.AlignVCenter verticalAlignment: Qt.AlignVCenter
readOnly: false readOnly: false
selectByMouse: true selectByMouse: true
inputMethodHints: Qt.ImhDigitsOnly
onTextChanged: {
var newValue = parseInt(text);
if (!isNaN(newValue) && newValue >= frameRateSpinBox.from && newValue <= frameRateSpinBox.to)
frameRateSpinBox.value = newValue;
}
onEditingFinished: {
var newValue = parseInt(text);
if (isNaN(newValue) || newValue < frameRateSpinBox.from || newValue > frameRateSpinBox.to)
text = frameRateSpinBox.textFromValue(frameRateSpinBox.value, frameRateSpinBox.locale);
}
validator: IntValidator { validator: IntValidator {
bottom: frameRateSpinBox.from bottom: frameRateSpinBox.from
top: frameRateSpinBox.to top: frameRateSpinBox.to
} }
inputMethodHints: Qt.ImhDigitsOnly
onTextChanged: {
var newValue = parseInt(text);
if (!isNaN(newValue) && newValue >= frameRateSpinBox.from && newValue <= frameRateSpinBox.to) {
frameRateSpinBox.value = newValue;
}
}
onEditingFinished: {
var newValue = parseInt(text);
if (isNaN(newValue) || newValue < frameRateSpinBox.from || newValue > frameRateSpinBox.to) {
text = frameRateSpinBox.textFromValue(frameRateSpinBox.value, frameRateSpinBox.locale);
}
}
} }
up.indicator: Rectangle { up.indicator: Rectangle {
@ -183,6 +187,7 @@ ColumnLayout {
color: Theme.textPrimary color: Theme.textPrimary
anchors.centerIn: parent anchors.centerIn: parent
} }
} }
down.indicator: Rectangle { down.indicator: Rectangle {
@ -199,10 +204,12 @@ ColumnLayout {
color: Theme.textPrimary color: Theme.textPrimary
anchors.centerIn: parent anchors.centerIn: parent
} }
}
}
} }
}
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -225,10 +232,14 @@ ColumnLayout {
ComboBox { ComboBox {
id: audioSourceComboBox id: audioSourceComboBox
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 40 Layout.preferredHeight: 40
model: ["default_output", "default_input", "both"] model: ["default_output", "default_input", "both"]
currentIndex: model.indexOf(Settings.settings.recordingAudioSource || "default_output") currentIndex: model.indexOf(Settings.settings.recordingAudioSource || "default_output")
onActivated: {
Settings.settings.recordingAudioSource = model[index];
}
background: Rectangle { background: Rectangle {
implicitWidth: 120 implicitWidth: 120
@ -244,10 +255,14 @@ ColumnLayout {
rightPadding: audioSourceComboBox.indicator.width + audioSourceComboBox.spacing rightPadding: audioSourceComboBox.indicator.width + audioSourceComboBox.spacing
text: { text: {
switch (audioSourceComboBox.currentText) { switch (audioSourceComboBox.currentText) {
case "default_output": return "System Audio"; case "default_output":
case "default_input": return "Microphone"; return "System Audio";
case "both": return "System Audio + Microphone"; case "default_input":
default: return audioSourceComboBox.currentText; return "Microphone";
case "both":
return "System Audio + Microphone";
default:
return audioSourceComboBox.currentText;
} }
} }
font.pixelSize: 13 font.pixelSize: 13
@ -277,7 +292,9 @@ ColumnLayout {
model: audioSourceComboBox.popup.visible ? audioSourceComboBox.delegateModel : null model: audioSourceComboBox.popup.visible ? audioSourceComboBox.delegateModel : null
currentIndex: audioSourceComboBox.highlightedIndex currentIndex: audioSourceComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator {} ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -286,17 +303,24 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 16 radius: 16
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: audioSourceComboBox.width width: audioSourceComboBox.width
highlighted: audioSourceComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: { text: {
switch (modelData) { switch (modelData) {
case "default_output": return "System Audio"; case "default_output":
case "default_input": return "Microphone"; return "System Audio";
case "both": return "System Audio + Microphone"; case "default_input":
default: return modelData; return "Microphone";
case "both":
return "System Audio + Microphone";
default:
return modelData;
} }
} }
font.pixelSize: 13 font.pixelSize: 13
@ -304,19 +328,16 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight elide: Text.ElideRight
} }
highlighted: audioSourceComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent"
} }
} }
onActivated: {
Settings.settings.recordingAudioSource = model[index];
}
}
} }
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -339,10 +360,14 @@ ColumnLayout {
ComboBox { ComboBox {
id: qualityComboBox id: qualityComboBox
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 40 Layout.preferredHeight: 40
model: ["medium", "high", "very_high", "ultra"] model: ["medium", "high", "very_high", "ultra"]
currentIndex: model.indexOf(Settings.settings.recordingQuality || "very_high") currentIndex: model.indexOf(Settings.settings.recordingQuality || "very_high")
onActivated: {
Settings.settings.recordingQuality = model[index];
}
background: Rectangle { background: Rectangle {
implicitWidth: 120 implicitWidth: 120
@ -358,11 +383,16 @@ ColumnLayout {
rightPadding: qualityComboBox.indicator.width + qualityComboBox.spacing rightPadding: qualityComboBox.indicator.width + qualityComboBox.spacing
text: { text: {
switch (qualityComboBox.currentText) { switch (qualityComboBox.currentText) {
case "medium": return "Medium"; case "medium":
case "high": return "High"; return "Medium";
case "very_high": return "Very High"; case "high":
case "ultra": return "Ultra"; return "High";
default: return qualityComboBox.currentText; case "very_high":
return "Very High";
case "ultra":
return "Ultra";
default:
return qualityComboBox.currentText;
} }
} }
font.pixelSize: 13 font.pixelSize: 13
@ -392,7 +422,9 @@ ColumnLayout {
model: qualityComboBox.popup.visible ? qualityComboBox.delegateModel : null model: qualityComboBox.popup.visible ? qualityComboBox.delegateModel : null
currentIndex: qualityComboBox.highlightedIndex currentIndex: qualityComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator {} ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -401,18 +433,26 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 16 radius: 16
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: qualityComboBox.width width: qualityComboBox.width
highlighted: qualityComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: { text: {
switch (modelData) { switch (modelData) {
case "medium": return "Medium"; case "medium":
case "high": return "High"; return "Medium";
case "very_high": return "Very High"; case "high":
case "ultra": return "Ultra"; return "High";
default: return modelData; case "very_high":
return "Very High";
case "ultra":
return "Ultra";
default:
return modelData;
} }
} }
font.pixelSize: 13 font.pixelSize: 13
@ -420,19 +460,16 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight elide: Text.ElideRight
} }
highlighted: qualityComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent"
} }
} }
onActivated: {
Settings.settings.recordingQuality = model[index];
}
}
} }
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -455,10 +492,14 @@ ColumnLayout {
ComboBox { ComboBox {
id: codecComboBox id: codecComboBox
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 40 Layout.preferredHeight: 40
model: ["h264", "hevc", "av1", "vp8", "vp9"] model: ["h264", "hevc", "av1", "vp8", "vp9"]
currentIndex: model.indexOf(Settings.settings.recordingCodec || "h264") currentIndex: model.indexOf(Settings.settings.recordingCodec || "h264")
onActivated: {
Settings.settings.recordingCodec = model[index];
}
background: Rectangle { background: Rectangle {
implicitWidth: 120 implicitWidth: 120
@ -500,7 +541,9 @@ ColumnLayout {
model: codecComboBox.popup.visible ? codecComboBox.delegateModel : null model: codecComboBox.popup.visible ? codecComboBox.delegateModel : null
currentIndex: codecComboBox.highlightedIndex currentIndex: codecComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator {} ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -509,10 +552,13 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 16 radius: 16
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: codecComboBox.width width: codecComboBox.width
highlighted: codecComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: modelData.toUpperCase() text: modelData.toUpperCase()
font.pixelSize: 13 font.pixelSize: 13
@ -520,19 +566,16 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight elide: Text.ElideRight
} }
highlighted: codecComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent"
} }
} }
onActivated: {
Settings.settings.recordingCodec = model[index];
}
}
} }
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -555,10 +598,14 @@ ColumnLayout {
ComboBox { ComboBox {
id: audioCodecComboBox id: audioCodecComboBox
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 40 Layout.preferredHeight: 40
model: ["opus", "aac"] model: ["opus", "aac"]
currentIndex: model.indexOf(Settings.settings.audioCodec || "opus") currentIndex: model.indexOf(Settings.settings.audioCodec || "opus")
onActivated: {
Settings.settings.audioCodec = model[index];
}
background: Rectangle { background: Rectangle {
implicitWidth: 120 implicitWidth: 120
@ -600,7 +647,9 @@ ColumnLayout {
model: audioCodecComboBox.popup.visible ? audioCodecComboBox.delegateModel : null model: audioCodecComboBox.popup.visible ? audioCodecComboBox.delegateModel : null
currentIndex: audioCodecComboBox.highlightedIndex currentIndex: audioCodecComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator {} ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -609,10 +658,13 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 16 radius: 16
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: audioCodecComboBox.width width: audioCodecComboBox.width
highlighted: audioCodecComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: modelData.toUpperCase() text: modelData.toUpperCase()
font.pixelSize: 13 font.pixelSize: 13
@ -620,19 +672,16 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight elide: Text.ElideRight
} }
highlighted: audioCodecComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent"
} }
} }
onActivated: {
Settings.settings.audioCodec = model[index];
}
}
} }
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -655,10 +704,14 @@ ColumnLayout {
ComboBox { ComboBox {
id: colorRangeComboBox id: colorRangeComboBox
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 40 Layout.preferredHeight: 40
model: ["limited", "full"] model: ["limited", "full"]
currentIndex: model.indexOf(Settings.settings.colorRange || "limited") currentIndex: model.indexOf(Settings.settings.colorRange || "limited")
onActivated: {
Settings.settings.colorRange = model[index];
}
background: Rectangle { background: Rectangle {
implicitWidth: 120 implicitWidth: 120
@ -700,7 +753,9 @@ ColumnLayout {
model: colorRangeComboBox.popup.visible ? colorRangeComboBox.delegateModel : null model: colorRangeComboBox.popup.visible ? colorRangeComboBox.delegateModel : null
currentIndex: colorRangeComboBox.highlightedIndex currentIndex: colorRangeComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator {} ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -709,10 +764,13 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 16 radius: 16
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: colorRangeComboBox.width width: colorRangeComboBox.width
highlighted: colorRangeComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: modelData.charAt(0).toUpperCase() + modelData.slice(1) text: modelData.charAt(0).toUpperCase() + modelData.slice(1)
font.pixelSize: 13 font.pixelSize: 13
@ -720,19 +778,16 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight elide: Text.ElideRight
} }
highlighted: colorRangeComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent"
} }
} }
onActivated: {
Settings.settings.colorRange = model[index];
}
}
} }
}
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -761,10 +816,12 @@ ColumnLayout {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Rectangle { Rectangle {
id: cursorSwitch id: cursorSwitch
width: 52 width: 52
height: 32 height: 32
radius: 16 radius: 16
@ -774,6 +831,7 @@ ColumnLayout {
Rectangle { Rectangle {
id: cursorThumb id: cursorThumb
width: 28 width: 28
height: 28 height: 28
radius: 14 radius: 14
@ -788,7 +846,9 @@ ColumnLayout {
duration: 200 duration: 200
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }
} }
} }
MouseArea { MouseArea {
@ -798,15 +858,22 @@ ColumnLayout {
Settings.settings.showCursor = !Settings.settings.showCursor; Settings.settings.showCursor = !Settings.settings.showCursor;
} }
} }
} }
} }
} }
} }
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 24 Layout.preferredHeight: 24
} }
} }
} }
} }

View file

@ -168,11 +168,23 @@ ColumnLayout {
} }
} }
Rectangle {
Layout.topMargin: 26
Layout.bottomMargin: 18
anchors {
top: headerArea.bottom
left: parent.left
right: parent.right
}
height: 1
color: Theme.outline
opacity: 0.3
}
ColumnLayout { ColumnLayout {
spacing: 4 spacing: 4
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 58
Text { Text {
text: "Weather" text: "Weather"

View file

@ -1,20 +1,20 @@
import QtQuick import QtQuick
import QtQuick.Controls import QtQuick.Controls
import QtQuick.Layouts import QtQuick.Layouts
import qs.Settings
import qs.Components import qs.Components
import qs.Services import qs.Services
import qs.Settings
ColumnLayout { ColumnLayout {
id: root id: root
spacing: 0 spacing: 0
anchors.fill: parent anchors.fill: parent
anchors.margins: 0 anchors.margins: 0
ScrollView { ScrollView {
id: scrollView id: scrollView
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
padding: 0 padding: 0
@ -44,8 +44,6 @@ ColumnLayout {
Layout.bottomMargin: 8 Layout.bottomMargin: 8
} }
// Wallpaper Settings Category // Wallpaper Settings Category
ColumnLayout { ColumnLayout {
spacing: 8 spacing: 8
@ -93,6 +91,7 @@ ColumnLayout {
TextInput { TextInput {
id: folderInput id: folderInput
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: 12 anchors.leftMargin: 12
anchors.rightMargin: 12 anchors.rightMargin: 12
@ -117,17 +116,30 @@ ColumnLayout {
cursorShape: Qt.IBeamCursor cursorShape: Qt.IBeamCursor
onClicked: folderInput.forceActiveFocus() onClicked: folderInput.forceActiveFocus()
} }
}
}
} }
} }
}
}
Rectangle {
Layout.topMargin: 26
Layout.bottomMargin: 18
anchors {
top: headerArea.bottom
left: parent.left
right: parent.right
}
height: 1
color: Theme.outline
opacity: 0.3
}
ColumnLayout { ColumnLayout {
spacing: 4 spacing: 4
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 58
Text { Text {
text: "Automation" text: "Automation"
@ -165,10 +177,12 @@ ColumnLayout {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Rectangle { Rectangle {
id: randomWallpaperSwitch id: randomWallpaperSwitch
width: 52 width: 52
height: 32 height: 32
radius: 16 radius: 16
@ -178,6 +192,7 @@ ColumnLayout {
Rectangle { Rectangle {
id: randomWallpaperThumb id: randomWallpaperThumb
width: 28 width: 28
height: 28 height: 28
radius: 14 radius: 14
@ -192,7 +207,9 @@ ColumnLayout {
duration: 200 duration: 200
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }
} }
} }
MouseArea { MouseArea {
@ -202,8 +219,11 @@ ColumnLayout {
Settings.settings.randomWallpaper = !Settings.settings.randomWallpaper; Settings.settings.randomWallpaper = !Settings.settings.randomWallpaper;
} }
} }
} }
} }
} }
// Use Wallpaper Theme // Use Wallpaper Theme
@ -234,10 +254,12 @@ ColumnLayout {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Rectangle { Rectangle {
id: wallpaperThemeSwitch id: wallpaperThemeSwitch
width: 52 width: 52
height: 32 height: 32
radius: 16 radius: 16
@ -247,6 +269,7 @@ ColumnLayout {
Rectangle { Rectangle {
id: wallpaperThemeThumb id: wallpaperThemeThumb
width: 28 width: 28
height: 28 height: 28
radius: 14 radius: 14
@ -261,7 +284,9 @@ ColumnLayout {
duration: 200 duration: 200
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }
} }
} }
MouseArea { MouseArea {
@ -271,8 +296,11 @@ ColumnLayout {
Settings.settings.useWallpaperTheme = !Settings.settings.useWallpaperTheme; Settings.settings.useWallpaperTheme = !Settings.settings.useWallpaperTheme;
} }
} }
} }
} }
} }
// Wallpaper Interval // Wallpaper Interval
@ -308,10 +336,12 @@ ColumnLayout {
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Slider { Slider {
id: intervalSlider id: intervalSlider
Layout.fillWidth: true Layout.fillWidth: true
from: 10 from: 10
to: 900 to: 900
@ -338,6 +368,7 @@ ColumnLayout {
color: Theme.accentPrimary color: Theme.accentPrimary
radius: 2 radius: 2
} }
} }
handle: Rectangle { handle: Rectangle {
@ -350,17 +381,31 @@ ColumnLayout {
border.color: Theme.accentPrimary border.color: Theme.accentPrimary
border.width: 2 border.width: 2
} }
} }
}
} }
} }
}
Rectangle {
Layout.topMargin: 26
Layout.bottomMargin: 18
anchors {
top: headerArea.bottom
left: parent.left
right: parent.right
}
height: 1
color: Theme.outline
opacity: 0.3
}
ColumnLayout { ColumnLayout {
spacing: 4 spacing: 4
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 58
Text { Text {
text: "SWWW" text: "SWWW"
@ -398,10 +443,12 @@ ColumnLayout {
wrapMode: Text.WordWrap wrapMode: Text.WordWrap
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Rectangle { Rectangle {
id: swwwSwitch id: swwwSwitch
width: 52 width: 52
height: 32 height: 32
radius: 16 radius: 16
@ -411,6 +458,7 @@ ColumnLayout {
Rectangle { Rectangle {
id: swwwThumb id: swwwThumb
width: 28 width: 28
height: 28 height: 28
radius: 14 radius: 14
@ -425,7 +473,9 @@ ColumnLayout {
duration: 200 duration: 200
easing.type: Easing.OutCubic easing.type: Easing.OutCubic
} }
} }
} }
MouseArea { MouseArea {
@ -435,8 +485,11 @@ ColumnLayout {
Settings.settings.useSWWW = !Settings.settings.useSWWW; Settings.settings.useSWWW = !Settings.settings.useSWWW;
} }
} }
} }
} }
} }
// SWWW Settings (only visible when useSWWW is enabled) // SWWW Settings (only visible when useSWWW is enabled)
@ -476,6 +529,7 @@ ColumnLayout {
ComboBox { ComboBox {
id: resizeComboBox id: resizeComboBox
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: 12 anchors.leftMargin: 12
anchors.rightMargin: 12 anchors.rightMargin: 12
@ -511,7 +565,9 @@ ColumnLayout {
model: resizeComboBox.popup.visible ? resizeComboBox.delegateModel : null model: resizeComboBox.popup.visible ? resizeComboBox.delegateModel : null
currentIndex: resizeComboBox.highlightedIndex currentIndex: resizeComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -520,10 +576,13 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 8 radius: 8
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: resizeComboBox.width width: resizeComboBox.width
highlighted: resizeComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: modelData text: modelData
color: Theme.textPrimary color: Theme.textPrimary
@ -531,13 +590,17 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
} }
highlighted: resizeComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: parent.highlighted ? Theme.accentPrimary : "transparent" color: parent.highlighted ? Theme.accentPrimary : "transparent"
} }
} }
} }
} }
} }
// Transition Type // Transition Type
@ -571,6 +634,7 @@ ColumnLayout {
ComboBox { ComboBox {
id: transitionTypeComboBox id: transitionTypeComboBox
anchors.fill: parent anchors.fill: parent
anchors.leftMargin: 12 anchors.leftMargin: 12
anchors.rightMargin: 12 anchors.rightMargin: 12
@ -606,7 +670,9 @@ ColumnLayout {
model: transitionTypeComboBox.popup.visible ? transitionTypeComboBox.delegateModel : null model: transitionTypeComboBox.popup.visible ? transitionTypeComboBox.delegateModel : null
currentIndex: transitionTypeComboBox.highlightedIndex currentIndex: transitionTypeComboBox.highlightedIndex
ScrollIndicator.vertical: ScrollIndicator { } ScrollIndicator.vertical: ScrollIndicator {
}
} }
background: Rectangle { background: Rectangle {
@ -615,10 +681,13 @@ ColumnLayout {
border.width: 1 border.width: 1
radius: 8 radius: 8
} }
} }
delegate: ItemDelegate { delegate: ItemDelegate {
width: transitionTypeComboBox.width width: transitionTypeComboBox.width
highlighted: transitionTypeComboBox.highlightedIndex === index
contentItem: Text { contentItem: Text {
text: modelData text: modelData
color: Theme.textPrimary color: Theme.textPrimary
@ -626,13 +695,17 @@ ColumnLayout {
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignLeft horizontalAlignment: Text.AlignLeft
} }
highlighted: transitionTypeComboBox.highlightedIndex === index
background: Rectangle { background: Rectangle {
color: parent.highlighted ? Theme.accentPrimary : "transparent" color: parent.highlighted ? Theme.accentPrimary : "transparent"
} }
} }
} }
} }
} }
// Transition FPS // Transition FPS
@ -668,10 +741,12 @@ ColumnLayout {
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Slider { Slider {
id: fpsSlider id: fpsSlider
Layout.fillWidth: true Layout.fillWidth: true
from: 30 from: 30
to: 500 to: 500
@ -698,6 +773,7 @@ ColumnLayout {
color: Theme.accentPrimary color: Theme.accentPrimary
radius: 2 radius: 2
} }
} }
handle: Rectangle { handle: Rectangle {
@ -710,7 +786,9 @@ ColumnLayout {
border.color: Theme.accentPrimary border.color: Theme.accentPrimary
border.width: 2 border.width: 2
} }
} }
} }
// Transition Duration // Transition Duration
@ -746,10 +824,12 @@ ColumnLayout {
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
Slider { Slider {
id: durationSlider id: durationSlider
Layout.fillWidth: true Layout.fillWidth: true
from: 0.25 from: 0.25
to: 10 to: 10
@ -776,6 +856,7 @@ ColumnLayout {
color: Theme.accentPrimary color: Theme.accentPrimary
radius: 2 radius: 2
} }
} }
handle: Rectangle { handle: Rectangle {
@ -788,15 +869,22 @@ ColumnLayout {
border.color: Theme.accentPrimary border.color: Theme.accentPrimary
border.width: 2 border.width: 2
} }
} }
} }
} }
} }
} }
} }
Item { Item {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
} }
} }