diff --git a/components/composite/WallpaperItem.qml b/components/composite/WallpaperItem.qml deleted file mode 100644 index 779fb62..0000000 --- a/components/composite/WallpaperItem.qml +++ /dev/null @@ -1,14 +0,0 @@ -import QtQuick - -Image { - asynchronous: true - fillMode: Image.PreserveAspectCrop - sourceSize.width: parent.width - sourceSize.height: parent.height - - Behavior on scale { - NumberAnimation { - duration: 200 - } - } -} diff --git a/components/composite/WallpaperList.qml b/components/composite/WallpaperList.qml deleted file mode 100644 index 2a67f31..0000000 --- a/components/composite/WallpaperList.qml +++ /dev/null @@ -1,65 +0,0 @@ -pragma ComponentBehavior: Bound - -import qs.config -import qs.services -import QtQuick -import Qt.labs.folderlistmodel 2.9 -import Quickshell.Widgets - -ListView { - id: list - - orientation: ListView.Horizontal - - clip: true - spacing: 8 - snapMode: ListView.SnapToItem - - implicitWidth: 160 * 3 - implicitHeight: 90 - model: FolderListModel { - nameFilters: ["*.jpg"] - folder: `${Paths.home}/Wallpapers` - showDirs: false - } - delegate: Item { - id: delegate - - required property url fileUrl - required property int index - property bool hovered: ListView.isCurrentItem - - implicitWidth: 160 - implicitHeight: 90 - - Rectangle { - color: Styling.theme.base200 - anchors.fill: parent - radius: 12 - scale: delegate.hovered ? 1.0 : 0.9 - Behavior on scale { - NumberAnimation { - duration: Styling.animations.veryFast - } - } - - Image { - id: image - - asynchronous: true - anchors.fill: parent - fillMode: Image.PreserveAspectCrop - source: delegate.fileUrl - } - - MouseArea { - anchors.fill: image - - cursorShape: Qt.PointingHandCursor - hoverEnabled: true - onEntered: list.currentIndex = delegate.index - onClicked: WallpaperService.currentWallpaper = delegate.fileUrl - } - } - } -} diff --git a/modules/Shell.qml b/modules/Shell.qml index be31896..b25fbe3 100644 --- a/modules/Shell.qml +++ b/modules/Shell.qml @@ -5,7 +5,6 @@ import "launcher" import "pomodoro" import "powermenu" import "storybook" -import "wallpaper" import QtQuick import Quickshell import Quickshell.Wayland @@ -18,23 +17,6 @@ Variants { required property ShellScreen modelData - PanelWindow { - id: background - - // visible: false - anchors.top: true - anchors.left: true - anchors.right: true - anchors.bottom: true - - color: "transparent" - - WlrLayershell.exclusionMode: ExclusionMode.Ignore - WlrLayershell.layer: WlrLayer.Background - - Wallpaper {} - } - PanelWindow { id: exclusionZone diff --git a/modules/configuration/Configuration.qml b/modules/configuration/Configuration.qml index 4c70926..a453993 100644 --- a/modules/configuration/Configuration.qml +++ b/modules/configuration/Configuration.qml @@ -118,6 +118,12 @@ StyledPanelWindow { title: "Styling" view: StylingView {} } + + ConfigurationView { + icon: Styling.lucide.icons.swatchBook + title: "Wallpapers" + view: Wallpaper {} + } } component ConfigurationView: QtObject { diff --git a/modules/configuration/StylingView.qml b/modules/configuration/StylingView.qml index 02461a3..5454953 100644 --- a/modules/configuration/StylingView.qml +++ b/modules/configuration/StylingView.qml @@ -1,40 +1,19 @@ -pragma ComponentBehavior: Bound - import qs.components import qs.components.composite import qs.config -import qs.services import QtQuick import QtQuick.Layouts -import Qt.labs.folderlistmodel 2.9 -import Quickshell.Widgets -ColumnLayout { - StyledPane { - GridLayout { +StyledPane { + GridLayout { - columnSpacing: Styling.layout.spacing.xl + columnSpacing: Styling.layout.spacing.xl - StyledText { - text: "Theme" - font.pixelSize: Styling.typography.textSize.lg - } - - ThemeComboBox {} + StyledText { + text: "Theme" + font.pixelSize: Styling.typography.textSize.lg } - } - // StyledPane { - // WallpaperList {} - // } - StyledPane { - padding: 2 - ClippingWrapperRectangle { - - radius: Styling.theme.radiusBox - color: "transparent" - - WallpaperList {} - } + ThemeComboBox {} } } diff --git a/modules/configuration/Wallpaper.qml b/modules/configuration/Wallpaper.qml new file mode 100644 index 0000000..d75a04a --- /dev/null +++ b/modules/configuration/Wallpaper.qml @@ -0,0 +1,13 @@ +import qs.services +import QtQuick +import QtQuick.Layouts + +ColumnLayout { + Repeater { + model: WallpaperService.files + delegate: Text { + required property string dataModel + text: dataModel + } + } +} diff --git a/modules/storybook/Components.qml b/modules/storybook/Components.qml index 0ff3836..1d90cbd 100644 --- a/modules/storybook/Components.qml +++ b/modules/storybook/Components.qml @@ -1,7 +1,7 @@ import qs.components import qs.components.composite import qs.config -import qs.services +import qs.config import QtQuick import QtQuick.Controls import QtQuick.Layouts diff --git a/modules/wallpaper/Wallpaper.qml b/modules/wallpaper/Wallpaper.qml deleted file mode 100644 index d396074..0000000 --- a/modules/wallpaper/Wallpaper.qml +++ /dev/null @@ -1,32 +0,0 @@ -import qs.services -import QtQuick -import QtQuick.Controls - -StackView { - id: stack - property url wallpaper: WallpaperService.currentWallpaper - - anchors.fill: parent - - replaceEnter: Transition { - OpacityAnimator { - from: 0.0 - to: 1.0 - duration: 1000 - } - } - replaceExit: Transition { - PauseAnimation { - duration: 1100 - } - } - - Component { - id: img - Image {} - } - - onWallpaperChanged: stack.replace(img, { - "source": stack.wallpaper - }) -} diff --git a/services/WallpaperService.qml b/services/WallpaperService.qml index ea6bd0e..2c0026f 100644 --- a/services/WallpaperService.qml +++ b/services/WallpaperService.qml @@ -1,7 +1,5 @@ pragma Singleton -import qs.config -import qs.utils import Quickshell import Quickshell.Io @@ -9,44 +7,18 @@ Singleton { id: root property string directory: "~/Wallpapers/" - property alias files: properties.files - property alias currentWallpaper: properties.currentWallpaper + property list files: [] property list fileTypes: ["jpg", "jpeg", "png"] - property string command: `find ${root.directory} -maxdepth 1 -type f` Process { running: true - command: ["bash", "-c", `find ${root.directory} -maxdepth 1 -type f`] - stdout: StdioCollector { - onStreamFinished: { - root.files = this.text.split("\n"); - } + command: ["bash", "-c", `find "$dir" -maxdepth 1 -type f & inotifywait -m -r ${root.directory} -e modify,move,create,delete | while read dir action; do find "$dir" -maxdepth 1 -type f; done`] + stderr: StdioCollector { + onStreamFinished: console.log(`line read: ${this.text}`) } - } - - DirectoryWatcher { - path: root.directory - fileFilter: ["jpg", "jpeg", "png"] - onCreated: path => root.files.push(path) - onDeleted: path => root.files.filter(file => file != path) - onMovedFrom: path => root.files.filter(file => file != path) - onMovedTo: path => path => root.files.push(path) - } - - FileView { - path: `${Paths.cache}/wallpaper.json` - - watchChanges: true - onFileChanged: reload() - - // when changes are made to properties in the adapter, save them - onAdapterUpdated: writeAdapter() - - JsonAdapter { - id: properties - - property url currentWallpaper: "" - property list files: [] + stdout: SplitParser { + splitMarker: "\n" + onRead: data => root.files = data?.split("\n") ?? [] } } } diff --git a/utils/DirectoryWatcher.qml b/utils/DirectoryWatcher.qml deleted file mode 100644 index 776e4cf..0000000 --- a/utils/DirectoryWatcher.qml +++ /dev/null @@ -1,43 +0,0 @@ -import QtQuick -import Quickshell.Io - -Item { - id: root - - required property string path - property bool recursive: true - property list fileFilter: [] - signal created(path: string) - signal modified(path: string) - signal deleted(path: string) - signal movedFrom(path: string) - signal movedTo(path: string) - - Process { - running: true - command: ["bash", "-c", `inotifywait -m ${root.recursive ? "-r" : ""} ${root.path} -e modify,move,create,delete --format "%e-%w%f"`] - stderr: StdioCollector { - onStreamFinished: console.error(`DirectoryWatcher: ${this.text}`) - } - stdout: SplitParser { - splitMarker: "\n" - onRead: data => { - const [action, path] = data.split("-"); - if (path.endsWith("~") || root.fileFilter.length > 0 && !root.fileFilter.some(filter => path.endsWith(filter))) { - return; - } - if (action.includes("CREATE")) { - root.created(path); - } else if (action.includes("MODIFY")) { - root.modified(path); - } else if (action.includes("DELETE")) { - root.deleted(path); - } else if (action.includes("MOVED_FROM")) { - root.movedFrom(path); - } else if (action.includes("MOVED_TO")) { - root.movedTo(path); - } - } - } - } -}