diff --git a/Bar/Modules/SettingsButton.qml b/Bar/Modules/SettingsButton.qml new file mode 100644 index 0000000..28aafab --- /dev/null +++ b/Bar/Modules/SettingsButton.qml @@ -0,0 +1,71 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import Quickshell +import qs.Settings +import qs.Components +import qs.Widgets.SettingsWindow + +Item { + id: root + width: 22 + height: 22 + + Rectangle { + id: button + anchors.fill: parent + color: "transparent" + radius: width / 2 + + Text { + anchors.centerIn: parent + text: "settings" + font.family: "Material Symbols Outlined" + font.pixelSize: 16 + color: mouseArea.containsMouse ? Theme.accentPrimary : Theme.textPrimary + } + + MouseArea { + id: mouseArea + anchors.fill: parent + hoverEnabled: true + cursorShape: Qt.PointingHandCursor + + onClicked: { + if (!settingsWindowLoader.active) { + // Start loading the settings window + settingsWindowLoader.loading = true; + } + + if (settingsWindowLoader.item) { + // Toggle visibility + if (settingsWindowLoader.item.visible) { + settingsWindowLoader.item.visible = false; + } else { + settingsWindowLoader.item.visible = true; + } + } + } + } + + StyledTooltip { + text: "Settings" + targetItem: mouseArea + tooltipVisible: mouseArea.containsMouse + } + } + + // LazyLoader for SettingsWindow + LazyLoader { + id: settingsWindowLoader + loading: false + component: SettingsWindow { + // Handle window closure - just hide it, don't destroy + onVisibleChanged: { + if (!visible) { + // Window is hidden, but keep it loaded for reuse + } + } + } + } +} \ No newline at end of file diff --git a/Programs/zigbrightness b/Programs/zigbrightness new file mode 100755 index 0000000..941653a Binary files /dev/null and b/Programs/zigbrightness differ diff --git a/Programs/zigstat b/Programs/zigstat new file mode 100755 index 0000000..397a01e Binary files /dev/null and b/Programs/zigstat differ diff --git a/Templates/templates/kitty.conf b/Templates/templates/kitty.conf new file mode 100644 index 0000000..040feda --- /dev/null +++ b/Templates/templates/kitty.conf @@ -0,0 +1,29 @@ +# The kitty terminal template for wallust +# Add to wallust config: kitty = { src='kitty.conf', dst='~/.config/kitty/colors.conf'} +# And add to kitty config: include colors.conf + +cursor {{ cursor }} + +background {{ background }} +foreground {{ foreground }} + +color0 {{ color0 }} +color1 {{ color1 }} +color2 {{ color2 }} +color3 {{ color3 }} +color4 {{ color4 }} +color5 {{ color5 }} +color6 {{ color6 }} +color7 {{ color7 }} +color8 {{ color8 }} +color9 {{ color9 }} +color10 {{ color10 }} +color11 {{ color11 }} +color12 {{ color12 }} +color13 {{ color13 }} +color14 {{ color14 }} +color15 {{ color15 }} + +mark1_foreground {{ color6 | saturate(0.2) }} +mark2_foreground {{ color7 | saturate(0.2) }} +mark3_foreground {{ color6 | saturate(0.2) }} diff --git a/Templates/templates/niri.kdl b/Templates/templates/niri.kdl new file mode 100644 index 0000000..cd99b52 --- /dev/null +++ b/Templates/templates/niri.kdl @@ -0,0 +1,292 @@ +// Niri configuration for CachyOS +// For documentation and full reference, see: https://github.com/YaLTeR/niri/wiki + +// ────────────── Input Configuration ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Input + +input { + keyboard { + xkb { + layout "de" // Use the German keyboard layout + } + numlock // Enable numlock on startup + } + + touchpad { + tap // Enable tap-to-click + natural-scroll // Enable natural (macOS-style) scrolling + } + + focus-follows-mouse // Automatically focus windows under the mouse pointer + workspace-auto-back-and-forth // Enable workspace back & forth switching +} + +// ────────────── Output Configuration ────────────── +// You can run `niri msg outputs` to get the correct name for your displays. +// You will have to remove "/-" and edit it before it takes effect. +// https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs + + output "DP-1" { + mode "2560x1440@359.979" // Set resolution and refresh rate + scale 1 // No scaling (use 2 for HiDPI) +} + +// ────────────── Keybindings ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Key-Bindings + +binds { + MOD+SHIFT+ESCAPE { show-hotkey-overlay; } + + // ─── Applications ─── + MOD+RETURN hotkey-overlay-title="Open Terminal: Kitty" { spawn "kitty"; } + MOD+CTRL+RETURN hotkey-overlay-title="Open App Launcher: QS" { spawn "qs" "ipc" "call" "globalIPC" "toggleLauncher"; } + MOD+B hotkey-overlay-title="Open Browser: firefox" { spawn "firefox"; } + MOD+ALT+L hotkey-overlay-title="Lock Screen: swaylock" { spawn "swaylock"; } + + // Please choose your own file manager + MOD+E hotkey-overlay-title="File Manager: Nautilus" { spawn "nautilus"; } + + // ─── Audio Controls ─── + XF86AUDIORAISEVOLUME allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; } + XF86AUDIOLOWERVOLUME allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; } + XF86AUDIOMUTE allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } + XF86AUDIOMICMUTE allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } + + // ─── Window Movement and Focus ─── + MOD+Q { close-window; } + + MOD+LEFT { focus-column-left; } + MOD+H { focus-column-left; } + MOD+RIGHT { focus-column-right; } + MOD+L { focus-column-right; } + MOD+UP { focus-window-up; } + MOD+K { focus-window-up; } + MOD+DOWN { focus-window-down; } + MOD+J { focus-window-down; } + + MOD+CTRL+LEFT { move-column-left; } + MOD+CTRL+H { move-column-left; } + MOD+CTRL+RIGHT { move-column-right; } + MOD+CTRL+L { move-column-right; } + MOD+CTRL+UP { move-window-up; } + MOD+CTRL+K { move-window-up; } + MOD+CTRL+DOWN { move-window-down; } + MOD+CTRL+J { move-window-down; } + + MOD+HOME { focus-column-first; } + MOD+END { focus-column-last; } + MOD+CTRL+HOME { move-column-to-first; } + MOD+CTRL+END { move-column-to-last; } + + MOD+SHIFT+LEFT { focus-monitor-left; } + MOD+SHIFT+RIGHT { focus-monitor-right; } + MOD+SHIFT+UP { focus-monitor-up; } + MOD+SHIFT+DOWN { focus-monitor-down; } + + MOD+SHIFT+CTRL+LEFT { move-column-to-monitor-left; } + MOD+SHIFT+CTRL+RIGHT { move-column-to-monitor-right; } + MOD+SHIFT+CTRL+UP { move-column-to-monitor-up; } + MOD+SHIFT+CTRL+DOWN { move-column-to-monitor-down; } + + // ─── Workspace Switching ─── + MOD+WHEELSCROLLDOWN cooldown-ms=150 { focus-workspace-down; } + MOD+WHEELSCROLLUP cooldown-ms=150 { focus-workspace-up; } + MOD+CTRL+WHEELSCROLLDOWN cooldown-ms=150 { move-column-to-workspace-down; } + MOD+CTRL+WHEELSCROLLUP cooldown-ms=150 { move-column-to-workspace-up; } + + MOD+WHEELSCROLLRIGHT { focus-column-right; } + MOD+WHEELSCROLLLEFT { focus-column-left; } + MOD+CTRL+WHEELSCROLLRIGHT { move-column-right; } + MOD+CTRL+WHEELSCROLLLEFT { move-column-left; } + + MOD+SHIFT+WHEELSCROLLDOWN { focus-column-right; } + MOD+SHIFT+WHEELSCROLLUP { focus-column-left; } + MOD+CTRL+SHIFT+WHEELSCROLLDOWN { move-column-right; } + MOD+CTRL+SHIFT+WHEELSCROLLUP { move-column-left; } + + MOD+1 { focus-workspace 1; } + MOD+2 { focus-workspace 2; } + MOD+3 { focus-workspace 3; } + MOD+4 { focus-workspace 4; } + MOD+5 { focus-workspace 5; } + MOD+6 { focus-workspace 6; } + MOD+7 { focus-workspace 7; } + MOD+8 { focus-workspace 8; } + MOD+9 { focus-workspace 9; } + + MOD+CTRL+1 { move-column-to-workspace 1; } + MOD+CTRL+2 { move-column-to-workspace 2; } + MOD+CTRL+3 { move-column-to-workspace 3; } + MOD+CTRL+4 { move-column-to-workspace 4; } + MOD+CTRL+5 { move-column-to-workspace 5; } + MOD+CTRL+6 { move-column-to-workspace 6; } + MOD+CTRL+7 { move-column-to-workspace 7; } + MOD+CTRL+8 { move-column-to-workspace 8; } + MOD+CTRL+9 { move-column-to-workspace 9; } + + MOD+TAB { focus-workspace-previous; } + + // ─── Layout Controls ─── + MOD+CTRL+F { expand-column-to-available-width; } + MOD+C { center-column; } + MOD+CTRL+C { center-visible-columns; } + MOD+MINUS { set-column-width "-10%"; } + MOD+EQUAL { set-column-width "+10%"; } + MOD+SHIFT+MINUS { set-window-height "-10%"; } + MOD+SHIFT+EQUAL { set-window-height "+10%"; } + + // ─── Modes ─── + MOD+T { toggle-window-floating; } + MOD+F { fullscreen-window; } + MOD+W { toggle-column-tabbed-display; } + + // ─── Screenshots ─── + CTRL+SHIFT+1 { screenshot; } + CTRL+SHIFT+2 { screenshot-screen; } + CTRL+SHIFT+3 { screenshot-window; } + + // ─── Emergency Escape Key ─── + // Use this when a fullscreen app blocks your keybinds. + // It disables any active keyboard shortcut inhibitor, restoring control. + MOD+ESCAPE allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + // ─── Exit / Power ─── + CTRL+ALT+DELETE { quit; } // Also quits Niri + MOD+SHIFT+P { power-off-monitors; } // Turn off screens (useful for OLED or privacy) + MOD+O repeat=false { toggle-overview; } +} + +// ────────────── Startup Applications ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#spawn-at-startup + + spawn-at-startup "/usr/lib/polkit-kde-authentication-agent-1" "&" // Polkit + spawn-at-startup "xwayland-satellite" // XWayland support + spawn-at-startup "swww-daemon" // Wallpaper daemon + spawn-at-startup "swww img" "/usr/share/wallpapers/cachyos-wallpapers/Skyscraper.png" // Set wallpaper + spawn-at-startup "qs" // Launch Quickshell + spawn-at-startup "vesktop" // Launch Vesktop + + prefer-no-csd // Disable program decorations + screenshot-path null // Disable screenshot saving + +// ────────────── Layout Settings ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout + + layout { + gaps 16 // Gap between windows + center-focused-column "never" // Don’t auto-center focused column + + preset-column-widths { + proportion 0.33333 + proportion 0.5 + proportion 0.66667 + } + + focus-ring { + width 3 + active-color "{{ color4 }}" + inactive-color "{{ color0 }}" + } + + shadow { + softness 30 + spread 5 + offset x=0 y=5 + color "#0007" + } + + background-color "transparent" + + struts {} + } + +// ────────────── Animation Settings ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations + animations { + workspace-switch { + spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001 + } + window-open { + duration-ms 200 + curve "ease-out-quad" + } + window-close { + duration-ms 200 + curve "ease-out-cubic" + } + horizontal-view-movement { + spring damping-ratio=1.0 stiffness=900 epsilon=0.0001 + } + window-movement { + spring damping-ratio=1.0 stiffness=800 epsilon=0.0001 + } + window-resize { + spring damping-ratio=1.0 stiffness=1000 epsilon=0.0001 + } + config-notification-open-close { + spring damping-ratio=0.6 stiffness=1200 epsilon=0.001 + } + screenshot-ui-open { + duration-ms 300 + curve "ease-out-quad" + } + overview-open-close { + spring damping-ratio=1.0 stiffness=900 epsilon=0.0001 + } + } + +// ────────────── Named Workspaces ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules + + workspace "browser" + workspace "chat" + +// ────────────── Window Rules ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules + + window-rule { + match at-startup=true app-id="vesktop" + open-on-workspace "chat" + open-maximized true + } + + window-rule { + match app-id="firefox" + open-on-workspace "browser" + open-maximized true + } + + window-rule { + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + open-floating true // Always float Firefox PiP windows + } + + window-rule { + geometry-corner-radius 20 // Set every window radius to 20 + clip-to-geometry true + } + +// ────────────── Layer Rules ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules + + layer-rule { + match namespace="^swww-daemon$" + place-within-backdrop true + } + +// ────────────── Environment Variables ────────────── +// https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#environment + + environment { + DISPLAY ":1" + ELECTRON_OZONE_PLATFORM_HINT "auto" + QT_QPA_PLATFORM "wayland" + QT_WAYLAND_DISABLE_WINDOWDECORATION "1" + XDG_SESSION_TYPE "wayland" + XDG_CURRENT_DESKTOP "niri" + } + +// ────────────── Misc ────────────── +hotkey-overlay { + skip-at-startup +} \ No newline at end of file diff --git a/Widgets/Sidebar/Config/CollapsibleCategory.qml b/Widgets/Sidebar/Config/CollapsibleCategory.qml new file mode 100644 index 0000000..d0c2eb7 --- /dev/null +++ b/Widgets/Sidebar/Config/CollapsibleCategory.qml @@ -0,0 +1,56 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import qs.Settings + +ColumnLayout { + property alias title: headerText.text + property bool expanded: false // Hidden by default + default property alias content: contentItem.children + + Rectangle { + Layout.fillWidth: true + height: 44 + radius: 12 + color: Theme.surface + border.color: Theme.accentPrimary + border.width: 2 + RowLayout { + anchors.fill: parent + anchors.margins: 8 + spacing: 8 + Item { width: 2 } + Text { + id: headerText + font.family: Theme.fontFamily + font.pixelSize: Theme.fontSizeBody + font.bold: true + color: Theme.textPrimary + } + Item { Layout.fillWidth: true } + Rectangle { + width: 32; height: 32 + color: "transparent" + Text { + anchors.centerIn: parent + text: expanded ? "expand_less" : "expand_more" + font.family: "Material Symbols Outlined" + font.pixelSize: Theme.fontSizeBody + color: Theme.accentPrimary + } + } + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: expanded = !expanded + } + } + Item { height: 8 } + ColumnLayout { + id: contentItem + Layout.fillWidth: true + visible: expanded + spacing: 0 + } +} \ No newline at end of file diff --git a/Widgets/Sidebar/Config/ProfileSettings.qml b/Widgets/Sidebar/Config/ProfileSettings.qml new file mode 100644 index 0000000..3451e25 --- /dev/null +++ b/Widgets/Sidebar/Config/ProfileSettings.qml @@ -0,0 +1,643 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Effects +import QtQuick.Controls +import Quickshell.Widgets +import qs.Components +import qs.Settings + +Rectangle { + id: profileSettingsCard + Layout.fillWidth: true + Layout.preferredHeight: 690 + color: Theme.surface + radius: 18 + + ColumnLayout { + anchors.fill: parent + anchors.margins: 18 + spacing: 12 + + // Header + RowLayout { + Layout.fillWidth: true + spacing: 12 + Text { + text: "settings" + font.family: "Material Symbols Outlined" + font.pixelSize: 20 + color: Theme.accentPrimary + } + Text { + text: "Profile Settings" + font.family: Theme.fontFamily + font.pixelSize: 16 + font.bold: true + color: Theme.textPrimary + Layout.fillWidth: true + } + } + + // Profile Image Input Section + ColumnLayout { + spacing: 8 + Layout.fillWidth: true + + Text { + text: "Profile Image" + font.family: Theme.fontFamily + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + RowLayout { + spacing: 8 + Layout.fillWidth: true + + // Profile image + Rectangle { + width: 48 + height: 48 + radius: 24 + + // Border + Rectangle { + anchors.fill: parent + color: "transparent" + radius: 24 + border.color: profileImageInput.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 2 + z: 2 + } + + Avatar {} + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 40 + radius: 16 + color: Theme.surfaceVariant + border.color: profileImageInput.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + + TextInput { + id: profileImageInput + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + anchors.topMargin: 6 + anchors.bottomMargin: 6 + text: Settings.settings.profileImage + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: TextInput.AlignVCenter + clip: true + selectByMouse: true + activeFocusOnTab: true + inputMethodHints: Qt.ImhUrlCharactersOnly + onTextChanged: { + Settings.settings.profileImage = text; + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.IBeamCursor + onClicked: profileImageInput.forceActiveFocus() + } + } + } + } + } + + // Show Active Window Icon Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Show Active Window Icon" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: activeWindowIconSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.showActiveWindowIcon ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.showActiveWindowIcon ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: activeWindowIconThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.showActiveWindowIcon ? activeWindowIconSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.showActiveWindowIcon = !Settings.settings.showActiveWindowIcon; + } + } + } + } + + // Show System Info In Bar Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Show System Info In Bar" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: systemInfoSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.showSystemInfoInBar ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.showSystemInfoInBar ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: systemInfoThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.showSystemInfoInBar ? systemInfoSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.showSystemInfoInBar = !Settings.settings.showSystemInfoInBar; + } + } + } + } + + // Show Corners Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Show Corners" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: cornersSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.showCorners ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.showCorners ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: cornersThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.showCorners ? cornersSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.showCorners = !Settings.settings.showCorners; + } + } + } + } + + // Show Taskbar Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Show Taskbar" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: taskbarSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.showTaskbar ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.showTaskbar ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: taskbarThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.showTaskbar ? taskbarSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.showTaskbar = !Settings.settings.showTaskbar; + } + } + } + } + + // Show Dock Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Show Dock" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: dockSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.showDock ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.showDock ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: dockThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.showDock ? taskbarSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.showDock = !Settings.settings.showDock; + } + } + } + } + + // Show Media In Bar Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Show Media In Bar" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: mediaSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.showMediaInBar ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.showMediaInBar ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: mediaThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.showMediaInBar ? mediaSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.showMediaInBar = !Settings.settings.showMediaInBar; + } + } + } + } + + // Dim Windows Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Dim Desktop" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Rectangle { + id: dimSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.dimPanels ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.dimPanels ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: dimThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.dimPanels ? dimSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.dimPanels = !Settings.settings.dimPanels; + } + } + } + } + + // Visualizer Type Selection + ColumnLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 16 + + Text { + text: "Visualizer Type" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + ComboBox { + id: visualizerTypeComboBox + Layout.fillWidth: true + Layout.preferredHeight: 40 + model: ["radial", "fire", "diamond"] + currentIndex: model.indexOf(Settings.settings.visualizerType) + + background: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + color: Theme.surfaceVariant + border.color: visualizerTypeComboBox.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + radius: 16 + } + + contentItem: Text { + leftPadding: 12 + rightPadding: visualizerTypeComboBox.indicator.width + visualizerTypeComboBox.spacing + text: visualizerTypeComboBox.displayText.charAt(0).toUpperCase() + visualizerTypeComboBox.displayText.slice(1) + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + indicator: Text { + x: visualizerTypeComboBox.width - width - 12 + y: visualizerTypeComboBox.topPadding + (visualizerTypeComboBox.availableHeight - height) / 2 + text: "arrow_drop_down" + font.family: "Material Symbols Outlined" + font.pixelSize: 24 + color: Theme.textPrimary + } + + popup: Popup { + y: visualizerTypeComboBox.height + width: visualizerTypeComboBox.width + implicitHeight: contentItem.implicitHeight + padding: 1 + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: visualizerTypeComboBox.popup.visible ? visualizerTypeComboBox.delegateModel : null + currentIndex: visualizerTypeComboBox.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator {} + } + + background: Rectangle { + color: Theme.surfaceVariant + border.color: Theme.outline + border.width: 1 + radius: 16 + } + } + + delegate: ItemDelegate { + width: visualizerTypeComboBox.width + contentItem: Text { + text: modelData.charAt(0).toUpperCase() + modelData.slice(1) + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + highlighted: visualizerTypeComboBox.highlightedIndex === index + + background: Rectangle { + color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" + } + } + + onActivated: { + Settings.settings.visualizerType = model[index]; + } + } + } + + // Video Path Input Section + ColumnLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 16 + + Text { + text: "Video Path" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 40 + radius: 16 + color: Theme.surfaceVariant + border.color: videoPathInput.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + + TextInput { + id: videoPathInput + anchors.fill: parent + anchors.leftMargin: 12 + anchors.rightMargin: 12 + anchors.topMargin: 6 + anchors.bottomMargin: 6 + text: Settings.settings.videoPath !== undefined ? Settings.settings.videoPath : "" + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: TextInput.AlignVCenter + clip: true + selectByMouse: true + activeFocusOnTab: true + inputMethodHints: Qt.ImhUrlCharactersOnly + onTextChanged: { + Settings.settings.videoPath = text; + } + MouseArea { + anchors.fill: parent + cursorShape: Qt.IBeamCursor + onClicked: videoPathInput.forceActiveFocus() + } + } + } + } + } +} diff --git a/Widgets/Sidebar/Config/WallpaperSettings.qml b/Widgets/Sidebar/Config/WallpaperSettings.qml new file mode 100644 index 0000000..2f5b66d --- /dev/null +++ b/Widgets/Sidebar/Config/WallpaperSettings.qml @@ -0,0 +1,722 @@ +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import qs.Settings + +Rectangle { + id: wallpaperSettingsCard + + Layout.fillWidth: true + Layout.preferredHeight: Settings.settings.useSWWW ? 720 : 360 + color: Theme.surface + radius: 18 + + ColumnLayout { + anchors.fill: parent + anchors.margins: 18 + spacing: 12 + + // Header + RowLayout { + Layout.fillWidth: true + spacing: 12 + + Text { + text: "image" + font.family: "Material Symbols Outlined" + font.pixelSize: 20 + color: Theme.accentPrimary + } + + Text { + text: "Wallpaper Settings" + font.family: Theme.fontFamily + font.pixelSize: 16 + font.bold: true + color: Theme.textPrimary + Layout.fillWidth: true + } + } + + // Wallpaper Path + ColumnLayout { + spacing: 8 + Layout.fillWidth: true + + Text { + text: "Wallpaper Path" + font.family: Theme.fontFamily + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + // Folder Path Input + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 40 + radius: 16 + color: Theme.surfaceVariant + border.color: folderInput.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + + TextInput { + id: folderInput + + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.leftMargin: 12 + anchors.rightMargin: 12 + anchors.topMargin: 6 + anchors.bottomMargin: 6 + text: Settings.settings.wallpaperFolder + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: TextInput.AlignVCenter + clip: true + selectByMouse: true + activeFocusOnTab: true + inputMethodHints: Qt.ImhUrlCharactersOnly + onTextChanged: { + Settings.settings.wallpaperFolder = text; + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.IBeamCursor + onClicked: folderInput.forceActiveFocus() + } + + } + + } + + } + + + + // Random Wallpaper Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Random Wallpaper" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + // Custom Material 3 Switch + Rectangle { + id: randomWallpaperSwitch + + width: 52 + height: 32 + radius: 16 + color: Settings.settings.randomWallpaper ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.randomWallpaper ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: randomWallpaperThumb + + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.randomWallpaper ? randomWallpaperSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + + } + + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.randomWallpaper = !Settings.settings.randomWallpaper; + } + } + + } + + } + + // Use Wallpaper Theme Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Use Wallpaper Theme" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + // Custom Material 3 Switch + Rectangle { + id: wallpaperThemeSwitch + + width: 52 + height: 32 + radius: 16 + color: Settings.settings.useWallpaperTheme ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.useWallpaperTheme ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: wallpaperThemeThumb + + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.useWallpaperTheme ? wallpaperThemeSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + + } + + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.useWallpaperTheme = !Settings.settings.useWallpaperTheme; + } + } + + } + + } + + // Wallpaper Interval Setting + ColumnLayout { + spacing: 12 + Layout.fillWidth: true + Layout.topMargin: 8 + + RowLayout { + Layout.fillWidth: true + + Text { + text: "Wallpaper Interval (seconds)" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Text { + text: Settings.settings.wallpaperInterval + font.pixelSize: 13 + color: Theme.textPrimary + } + + } + + Slider { + id: intervalSlider + + Layout.fillWidth: true + from: 10 + to: 900 + stepSize: 10 + value: Settings.settings.wallpaperInterval + snapMode: Slider.SnapAlways + onMoved: { + Settings.settings.wallpaperInterval = Math.round(value); + } + + background: Rectangle { + x: intervalSlider.leftPadding + y: intervalSlider.topPadding + intervalSlider.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 4 + width: intervalSlider.availableWidth + height: implicitHeight + radius: 2 + color: Theme.surfaceVariant + + Rectangle { + width: intervalSlider.visualPosition * parent.width + height: parent.height + color: Theme.accentPrimary + radius: 2 + } + + } + + handle: Rectangle { + x: intervalSlider.leftPadding + intervalSlider.visualPosition * (intervalSlider.availableWidth - width) + y: intervalSlider.topPadding + intervalSlider.availableHeight / 2 - height / 2 + implicitWidth: 20 + implicitHeight: 20 + radius: 10 + color: intervalSlider.pressed ? Theme.surfaceVariant : Theme.surface + border.color: Theme.accentPrimary + border.width: 2 + } + + } + + } + + // Use SWWW Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Use SWWW" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + // Custom Material 3 Switch + Rectangle { + id: swwwSwitch + + width: 52 + height: 32 + radius: 16 + color: Settings.settings.useSWWW ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.useSWWW ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: swwwThumb + + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.useSWWW ? swwwSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + + } + + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.useSWWW = !Settings.settings.useSWWW; + } + } + + } + + } + + // Resize Mode Setting + ColumnLayout { + spacing: 12 + Layout.fillWidth: true + Layout.topMargin: 16 + visible: Settings.settings.useSWWW + + Text { + text: "Resize Mode" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + ComboBox { + id: resizeComboBox + + Layout.fillWidth: true + Layout.preferredHeight: 40 + model: ["no", "crop", "fit", "stretch"] + currentIndex: model.indexOf(Settings.settings.wallpaperResize) + onActivated: { + Settings.settings.wallpaperResize = model[index]; + } + + background: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + color: Theme.surfaceVariant + border.color: resizeComboBox.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + radius: 16 + } + + contentItem: Text { + leftPadding: 12 + rightPadding: resizeComboBox.indicator.width + resizeComboBox.spacing + text: resizeComboBox.displayText + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + indicator: Text { + x: resizeComboBox.width - width - 12 + y: resizeComboBox.topPadding + (resizeComboBox.availableHeight - height) / 2 + text: "arrow_drop_down" + font.family: "Material Symbols Outlined" + font.pixelSize: 24 + color: Theme.textPrimary + } + + popup: Popup { + y: resizeComboBox.height + width: resizeComboBox.width + implicitHeight: contentItem.implicitHeight + padding: 1 + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: resizeComboBox.popup.visible ? resizeComboBox.delegateModel : null + currentIndex: resizeComboBox.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { + } + + } + + background: Rectangle { + color: Theme.surfaceVariant + border.color: Theme.outline + border.width: 1 + radius: 16 + } + + } + + delegate: ItemDelegate { + width: resizeComboBox.width + highlighted: resizeComboBox.highlightedIndex === index + + contentItem: Text { + text: modelData + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + background: Rectangle { + color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" + } + + } + + } + + } + + // Transition Type Setting + ColumnLayout { + spacing: 12 + Layout.fillWidth: true + Layout.topMargin: 16 + visible: Settings.settings.useSWWW + + Text { + text: "Transition Type" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + ComboBox { + id: transitionTypeComboBox + + Layout.fillWidth: true + Layout.preferredHeight: 40 + model: ["none", "simple", "fade", "left", "right", "top", "bottom", "wipe", "wave", "grow", "center", "any", "outer", "random"] + currentIndex: model.indexOf(Settings.settings.transitionType) + onActivated: { + Settings.settings.transitionType = model[index]; + } + + background: Rectangle { + implicitWidth: 120 + implicitHeight: 40 + color: Theme.surfaceVariant + border.color: transitionTypeComboBox.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + radius: 16 + } + + contentItem: Text { + leftPadding: 12 + rightPadding: transitionTypeComboBox.indicator.width + transitionTypeComboBox.spacing + text: transitionTypeComboBox.displayText + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + indicator: Text { + x: transitionTypeComboBox.width - width - 12 + y: transitionTypeComboBox.topPadding + (transitionTypeComboBox.availableHeight - height) / 2 + text: "arrow_drop_down" + font.family: "Material Symbols Outlined" + font.pixelSize: 24 + color: Theme.textPrimary + } + + popup: Popup { + y: transitionTypeComboBox.height + width: transitionTypeComboBox.width + implicitHeight: contentItem.implicitHeight + padding: 1 + + contentItem: ListView { + clip: true + implicitHeight: contentHeight + model: transitionTypeComboBox.popup.visible ? transitionTypeComboBox.delegateModel : null + currentIndex: transitionTypeComboBox.highlightedIndex + + ScrollIndicator.vertical: ScrollIndicator { + } + + } + + background: Rectangle { + color: Theme.surfaceVariant + border.color: Theme.outline + border.width: 1 + radius: 16 + } + + } + + delegate: ItemDelegate { + width: transitionTypeComboBox.width + highlighted: transitionTypeComboBox.highlightedIndex === index + + contentItem: Text { + text: modelData + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + } + + background: Rectangle { + color: highlighted ? Theme.accentPrimary.toString().replace(/#/, "#1A") : "transparent" + } + + } + + } + + } + + // Transition FPS Setting + ColumnLayout { + spacing: 12 + Layout.fillWidth: true + Layout.topMargin: 16 + visible: Settings.settings.useSWWW + + RowLayout { + Layout.fillWidth: true + + Text { + text: "Transition FPS" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Text { + text: Settings.settings.transitionFps + font.pixelSize: 13 + color: Theme.textPrimary + } + + } + + Slider { + id: fpsSlider + + Layout.fillWidth: true + from: 30 + to: 500 + stepSize: 5 + value: Settings.settings.transitionFps + snapMode: Slider.SnapAlways + onMoved: { + Settings.settings.transitionFps = Math.round(value); + } + + background: Rectangle { + x: fpsSlider.leftPadding + y: fpsSlider.topPadding + fpsSlider.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 4 + width: fpsSlider.availableWidth + height: implicitHeight + radius: 2 + color: Theme.surfaceVariant + + Rectangle { + width: fpsSlider.visualPosition * parent.width + height: parent.height + color: Theme.accentPrimary + radius: 2 + } + + } + + handle: Rectangle { + x: fpsSlider.leftPadding + fpsSlider.visualPosition * (fpsSlider.availableWidth - width) + y: fpsSlider.topPadding + fpsSlider.availableHeight / 2 - height / 2 + implicitWidth: 20 + implicitHeight: 20 + radius: 10 + color: fpsSlider.pressed ? Theme.surfaceVariant : Theme.surface + border.color: Theme.accentPrimary + border.width: 2 + } + + } + + } + + // Transition Duration Setting + ColumnLayout { + spacing: 12 + Layout.fillWidth: true + Layout.topMargin: 16 + visible: Settings.settings.useSWWW + + RowLayout { + Layout.fillWidth: true + + Text { + text: "Transition Duration (seconds)" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + Text { + text: Settings.settings.transitionDuration.toFixed(3) + font.pixelSize: 13 + color: Theme.textPrimary + } + + } + + Slider { + id: durationSlider + + Layout.fillWidth: true + from: 0.25 + to: 10 + stepSize: 0.05 + value: Settings.settings.transitionDuration + snapMode: Slider.SnapAlways + onMoved: { + Settings.settings.transitionDuration = value; + } + + background: Rectangle { + x: durationSlider.leftPadding + y: durationSlider.topPadding + durationSlider.availableHeight / 2 - height / 2 + implicitWidth: 200 + implicitHeight: 4 + width: durationSlider.availableWidth + height: implicitHeight + radius: 2 + color: Theme.surfaceVariant + + Rectangle { + width: durationSlider.visualPosition * parent.width + height: parent.height + color: Theme.accentPrimary + radius: 2 + } + + } + + handle: Rectangle { + x: durationSlider.leftPadding + durationSlider.visualPosition * (durationSlider.availableWidth - width) + y: durationSlider.topPadding + durationSlider.availableHeight / 2 - height / 2 + implicitWidth: 20 + implicitHeight: 20 + radius: 10 + color: durationSlider.pressed ? Theme.surfaceVariant : Theme.surface + border.color: Theme.accentPrimary + border.width: 2 + } + + } + + } + + } + +} diff --git a/Widgets/Sidebar/Config/WeatherSettings.qml b/Widgets/Sidebar/Config/WeatherSettings.qml new file mode 100644 index 0000000..d7689dc --- /dev/null +++ b/Widgets/Sidebar/Config/WeatherSettings.qml @@ -0,0 +1,275 @@ +import QtQuick +import QtQuick.Layouts +import qs.Settings + +Rectangle { + id: weatherSettingsCard + Layout.fillWidth: true + Layout.preferredHeight: 320 + color: Theme.surface + radius: 18 + + ColumnLayout { + anchors.fill: parent + anchors.margins: 18 + spacing: 12 + + // Weather Settings Header + RowLayout { + Layout.fillWidth: true + spacing: 12 + + Text { + text: "wb_sunny" + font.family: "Material Symbols Outlined" + font.pixelSize: 20 + color: Theme.accentPrimary + } + + Text { + text: "Weather Settings" + font.family: Theme.fontFamily + font.pixelSize: 16 + font.bold: true + color: Theme.textPrimary + Layout.fillWidth: true + } + } + + // Weather City Setting + ColumnLayout { + spacing: 8 + Layout.fillWidth: true + + Text { + text: "City" + font.family: Theme.fontFamily + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Rectangle { + Layout.fillWidth: true + Layout.preferredHeight: 40 + radius: 16 + color: Theme.surfaceVariant + border.color: cityInput.activeFocus ? Theme.accentPrimary : Theme.outline + border.width: 1 + + TextInput { + id: cityInput + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.leftMargin: 12 + anchors.rightMargin: 12 + anchors.topMargin: 6 + anchors.bottomMargin: 6 + text: Settings.settings.weatherCity + font.family: Theme.fontFamily + font.pixelSize: 13 + color: Theme.textPrimary + verticalAlignment: TextInput.AlignVCenter + clip: true + focus: true + selectByMouse: true + activeFocusOnTab: true + inputMethodHints: Qt.ImhNone + + onTextChanged: { + Settings.settings.weatherCity = text; + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.IBeamCursor + onClicked: { + cityInput.forceActiveFocus(); + } + } + } + } + } + + // Temperature Unit Setting + RowLayout { + spacing: 12 + Layout.fillWidth: true + + Text { + text: "Temperature Unit" + font.family: Theme.fontFamily + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + // Custom Material 3 Switch + Rectangle { + id: customSwitch + width: 52 + height: 32 + radius: 16 + color: Theme.accentPrimary + border.color: Theme.accentPrimary + border.width: 2 + + Rectangle { + id: thumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.useFahrenheit ? customSwitch.width - width - 2 : 2 + + Text { + anchors.centerIn: parent + text: Settings.settings.useFahrenheit ? "\u00b0F" : "\u00b0C" + font.family: Theme.fontFamily + font.pixelSize: 12 + font.bold: true + color: Theme.textPrimary + } + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.useFahrenheit = !Settings.settings.useFahrenheit; + } + } + } + + + } + + // Random Wallpaper Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "Use 12 Hour Clock" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + // Custom Material 3 Switch + Rectangle { + id: use12HourClockSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.use12HourClock ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.use12HourClock ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: randomWallpaperThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.use12HourClock ? use12HourClockSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.use12HourClock = !Settings.settings.use12HourClock; + } + } + } + } + + // Reverse Day Month Setting + RowLayout { + spacing: 8 + Layout.fillWidth: true + Layout.topMargin: 8 + + Text { + text: "US Style Date" + font.pixelSize: 13 + font.bold: true + color: Theme.textPrimary + } + + Item { + Layout.fillWidth: true + } + + // Custom Material 3 Switch + Rectangle { + id: reverseDayMonthSwitch + width: 52 + height: 32 + radius: 16 + color: Settings.settings.reverseDayMonth ? Theme.accentPrimary : Theme.surfaceVariant + border.color: Settings.settings.reverseDayMonth ? Theme.accentPrimary : Theme.outline + border.width: 2 + + Rectangle { + id: reverseDayMonthThumb + width: 28 + height: 28 + radius: 14 + color: Theme.surface + border.color: Theme.outline + border.width: 1 + y: 2 + x: Settings.settings.reverseDayMonth ? reverseDayMonthSwitch.width - width - 2 : 2 + + Behavior on x { + NumberAnimation { + duration: 200 + easing.type: Easing.OutCubic + } + } + } + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + onClicked: { + Settings.settings.reverseDayMonth = !Settings.settings.reverseDayMonth; + } + } + } + } + } +}