diff --git a/.config/quickshell/modules/common/Directories.qml b/.config/quickshell/modules/common/Directories.qml new file mode 100644 index 00000000..db210d7a --- /dev/null +++ b/.config/quickshell/modules/common/Directories.qml @@ -0,0 +1,40 @@ +pragma Singleton +pragma ComponentBehavior: Bound + +import "root:/modules/common/functions/file_utils.js" as FileUtils +import Qt.labs.platform +import QtQuick +import Quickshell +import Quickshell.Hyprland + +Singleton { + // XDG Dirs, with "file://" + readonly property string config: StandardPaths.standardLocations(StandardPaths.ConfigLocation)[0] + readonly property string state: StandardPaths.standardLocations(StandardPaths.StateLocation)[0] + readonly property string cache: StandardPaths.standardLocations(StandardPaths.CacheLocation)[0] + readonly property string pictures: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0] + readonly property string downloads: StandardPaths.standardLocations(StandardPaths.DownloadLocation)[0] + + // Other dirs used by the shell, without "file://" + property string favicons: FileUtils.trimFileProtocol(`${Directories.cache}/media/favicons`) + property string coverArt: FileUtils.trimFileProtocol(`${Directories.cache}/media/coverart`) + property string booruPreviews: FileUtils.trimFileProtocol(`${Directories.cache}/media/boorus`) + property string booruDownloads: FileUtils.trimFileProtocol(Directories.pictures + "/homework") + property string booruDownloadsNsfw: FileUtils.trimFileProtocol(Directories.pictures + "/homework/🌶️") + property string latexOutput: FileUtils.trimFileProtocol(`${Directories.cache}/latex`) + property string shellConfig: FileUtils.trimFileProtocol(`${Directories.config}/illogical-impulse`) + property string shellConfigName: "config.json" + property string shellConfigPath: `${Directories.shellConfig}/${Directories.shellConfigName}` + property string todoPath: FileUtils.trimFileProtocol(`${Directories.state}/user/todo.json`) + property string notificationsPath: `${Directories.cache}/notifications/notifications.json` + property string generatedMaterialThemePath: `${Directories.state}/user/generated/colors.json` + // Cleanup on init + Component.onCompleted: { + Hyprland.dispatch(`exec mkdir -p ${Directories.shellConfig}`) + Hyprland.dispatch(`exec mkdir -p ${favicons}`) + Hyprland.dispatch(`exec rm -rf ${coverArt} && mkdir -p ${coverArt}`) + Hyprland.dispatch(`exec rm -rf '${booruPreviews}' && mkdir -p '${booruPreviews}'`) + Hyprland.dispatch(`exec mkdir -p '${booruDownloads}' && mkdir -p '${booruDownloadsNsfw}'`) + Hyprland.dispatch(`exec rm -rf ${latexOutput} && mkdir -p ${latexOutput}`) + } +} diff --git a/.config/quickshell/modules/common/XdgDirectories.qml b/.config/quickshell/modules/common/XdgDirectories.qml deleted file mode 100644 index c8297fbb..00000000 --- a/.config/quickshell/modules/common/XdgDirectories.qml +++ /dev/null @@ -1,13 +0,0 @@ -import Qt.labs.platform -import QtQuick -import Quickshell -pragma Singleton -pragma ComponentBehavior: Bound - -Singleton { - readonly property string config: StandardPaths.standardLocations(StandardPaths.ConfigLocation)[0] - readonly property string state: StandardPaths.standardLocations(StandardPaths.StateLocation)[0] - readonly property string cache: StandardPaths.standardLocations(StandardPaths.CacheLocation)[0] - readonly property string pictures: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0] - readonly property string downloads: StandardPaths.standardLocations(StandardPaths.DownloadLocation)[0] -} diff --git a/.config/quickshell/modules/common/widgets/Favicon.qml b/.config/quickshell/modules/common/widgets/Favicon.qml index e3688100..74fc6d74 100644 --- a/.config/quickshell/modules/common/widgets/Favicon.qml +++ b/.config/quickshell/modules/common/widgets/Favicon.qml @@ -19,7 +19,7 @@ IconImage { property real size: 32 property string downloadUserAgent: ConfigOptions?.networking.userAgent ?? "" - property string faviconDownloadPath: FileUtils.trimFileProtocol(`${XdgDirectories.cache}/media/favicons`) + property string faviconDownloadPath: Directories.favicons property string domainName: url.includes("vertexaisearch") ? displayText : StringUtils.getDomain(url) property string faviconUrl: `https://www.google.com/s2/favicons?domain=${domainName}&sz=32` property string fileName: `${domainName}.ico` @@ -31,21 +31,11 @@ IconImage { running: false command: ["bash", "-c", `[ -f ${faviconFilePath} ] || curl -s '${root.faviconUrl}' -o '${faviconFilePath}' -L -H 'User-Agent: ${downloadUserAgent}'`] onExited: (exitCode, exitStatus) => { - console.log("Favicon download process exited with code:", exitCode, "and status:", exitStatus) - console.log("Favicon file path:", faviconFilePath) root.urlToLoad = root.faviconFilePath } } Component.onCompleted: { - console.log("URL: ", root.url) - console.log("DOMAIN: ", root.domainName) - console.log("faviconDownloadPath: ", faviconDownloadPath) - console.log("faviconFilePath: ", faviconFilePath) - console.log("faviconUrl: ", root.faviconUrl) - console.log("domainName: ", root.domainName) - console.log("fileName: ", root.fileName) - console.log("downloading to ", faviconFilePath, "from", root.faviconUrl) faviconDownloadProcess.running = true } diff --git a/.config/quickshell/modules/mediaControls/MediaControls.qml b/.config/quickshell/modules/mediaControls/MediaControls.qml index def25936..8bdba860 100644 --- a/.config/quickshell/modules/mediaControls/MediaControls.qml +++ b/.config/quickshell/modules/mediaControls/MediaControls.qml @@ -27,7 +27,6 @@ Scope { property real contentPadding: 13 property real popupRounding: Appearance.rounding.screenRounding - Appearance.sizes.elevationMargin + 1 property real artRounding: Appearance.rounding.verysmall - property string baseCoverArtDir: FileUtils.trimFileProtocol(`${XdgDirectories.cache}/media/coverart`) property bool hasPlasmaIntegration: false function isRealPlayer(player) { @@ -70,10 +69,6 @@ Scope { return filtered; } - Component.onCompleted: { - Hyprland.dispatch(`exec rm -rf ${baseCoverArtDir} && mkdir -p ${baseCoverArtDir}`) - } - Loader { id: mediaControlsLoader active: false @@ -116,7 +111,6 @@ Scope { } delegate: PlayerControl { required property MprisPlayer modelData - artDownloadLocation: root.baseCoverArtDir player: modelData } } diff --git a/.config/quickshell/modules/mediaControls/PlayerControl.qml b/.config/quickshell/modules/mediaControls/PlayerControl.qml index 5c770192..ea8bd234 100644 --- a/.config/quickshell/modules/mediaControls/PlayerControl.qml +++ b/.config/quickshell/modules/mediaControls/PlayerControl.qml @@ -3,6 +3,7 @@ import "root:/modules/common/widgets" import "root:/services" import "root:/modules/common/functions/string_utils.js" as StringUtils import "root:/modules/common/functions/color_utils.js" as ColorUtils +import "root:/modules/common/functions/file_utils.js" as FileUtils import Qt5Compat.GraphicalEffects import QtQuick import QtQuick.Effects @@ -19,7 +20,7 @@ Item { // Player instance id: playerController required property MprisPlayer player property var artUrl: player?.trackArtUrl - property string artDownloadLocation: FileUtils.trimFileProtocol(`${XdgDirectories.cache}/media/coverart`) + property string artDownloadLocation: Directories.coverArt property string artFileName: Qt.md5(artUrl) + ".jpg" property string artFilePath: `${artDownloadLocation}/${artFileName}` property color artDominantColor: Appearance.m3colors.m3secondaryContainer diff --git a/.config/quickshell/modules/overview/SearchWidget.qml b/.config/quickshell/modules/overview/SearchWidget.qml index ce98da6f..ed8e5f01 100644 --- a/.config/quickshell/modules/overview/SearchWidget.qml +++ b/.config/quickshell/modules/overview/SearchWidget.qml @@ -15,7 +15,7 @@ import Quickshell.Hyprland Item { // Wrapper id: root - readonly property string xdgConfigHome: XdgDirectories.config + readonly property string xdgConfigHome: Directories.config property string searchingText: "" property bool showResults: searchingText != "" property real searchBarHeight: searchBar.height + Appearance.sizes.elevationMargin * 2 diff --git a/.config/quickshell/modules/sidebarLeft/AiChat.qml b/.config/quickshell/modules/sidebarLeft/AiChat.qml index 0bac7203..8bd6b683 100644 --- a/.config/quickshell/modules/sidebarLeft/AiChat.qml +++ b/.config/quickshell/modules/sidebarLeft/AiChat.qml @@ -23,10 +23,6 @@ Item { property var suggestionQuery: "" property var suggestionList: [] - Component.onCompleted: { - Hyprland.dispatch(`exec mkdir -p ${faviconDownloadPath}`) - } - onFocusChanged: (focus) => { if (focus) { root.inputField.forceActiveFocus() diff --git a/.config/quickshell/modules/sidebarLeft/Anime.qml b/.config/quickshell/modules/sidebarLeft/Anime.qml index 7ab051cd..3c0e6b63 100644 --- a/.config/quickshell/modules/sidebarLeft/Anime.qml +++ b/.config/quickshell/modules/sidebarLeft/Anime.qml @@ -20,9 +20,9 @@ Item { property var panelWindow property var inputField: tagInputField readonly property var responses: Booru.responses - property string previewDownloadPath: FileUtils.trimFileProtocol(`${XdgDirectories.cache}/media/waifus`) - property string downloadPath: FileUtils.trimFileProtocol(XdgDirectories.pictures + "/homework") - property string nsfwPath: FileUtils.trimFileProtocol(XdgDirectories.pictures + "/homework/🌶️") + property string previewDownloadPath: Directories.booruPreviews + property string downloadPath: Directories.booruDownloads + property string nsfwPath: Directories.booruDownloadsNsfw property string commandPrefix: "/" property real scrollOnNewResponse: 100 property int tagSuggestionDelay: 210 @@ -37,11 +37,6 @@ Item { } } - Component.onCompleted: { - Hyprland.dispatch(`exec rm -rf '${previewDownloadPath}' && mkdir -p '${previewDownloadPath}'`) - Hyprland.dispatch(`exec mkdir -p '${downloadPath}' && mkdir -p '${downloadPath}'`) - } - property var allCommands: [ { name: "mode", diff --git a/.config/quickshell/modules/sidebarLeft/aiChat/MessageCodeBlock.qml b/.config/quickshell/modules/sidebarLeft/aiChat/MessageCodeBlock.qml index c38afb9b..fa4af99e 100644 --- a/.config/quickshell/modules/sidebarLeft/aiChat/MessageCodeBlock.qml +++ b/.config/quickshell/modules/sidebarLeft/aiChat/MessageCodeBlock.qml @@ -95,8 +95,9 @@ ColumnLayout { buttonIcon: activated ? "check" : "save" onClicked: { - Hyprland.dispatch(`exec echo '${StringUtils.shellSingleQuoteEscape(segmentContent)}' > '${FileUtils.trimFileProtocol(XdgDirectories.downloads)}/code.${segmentLang || "txt"}'`) - Hyprland.dispatch(`exec notify-send 'Code saved to file' '${FileUtils.trimFileProtocol(XdgDirectories.downloads)}/code.${segmentLang || "txt"}'`) + const downloadPath = FileUtils.trimFileProtocol(Directories.downloads) + Hyprland.dispatch(`exec echo '${StringUtils.shellSingleQuoteEscape(segmentContent)}' > '${downloadPath}/code.${segmentLang || "txt"}'`) + Hyprland.dispatch(`exec notify-send 'Code saved to file' '${downloadPath}/code.${segmentLang || "txt"}'`) saveCodeButton.activated = true saveIconTimer.restart() } diff --git a/.config/quickshell/services/Ai.qml b/.config/quickshell/services/Ai.qml index c75b0933..fb7e6529 100644 --- a/.config/quickshell/services/Ai.qml +++ b/.config/quickshell/services/Ai.qml @@ -139,7 +139,7 @@ Singleton { Process { id: getOllamaModels - command: ["bash", "-c", `${XdgDirectories.config}/quickshell/scripts/ai/show-installed-ollama-models.sh`.replace(/file:\/\//, "")] + command: ["bash", "-c", `${Directories.config}/quickshell/scripts/ai/show-installed-ollama-models.sh`.replace(/file:\/\//, "")] stdout: SplitParser { onRead: data => { try { diff --git a/.config/quickshell/services/ConfigLoader.qml b/.config/quickshell/services/ConfigLoader.qml index 658019f1..e8e711d7 100644 --- a/.config/quickshell/services/ConfigLoader.qml +++ b/.config/quickshell/services/ConfigLoader.qml @@ -17,9 +17,7 @@ import Qt.labs.platform */ Singleton { id: root - property string fileDir: `${XdgDirectories.config}/illogical-impulse` - property string fileName: "config.json" - property string filePath: FileUtils.trimFileProtocol(`${root.fileDir}/${root.fileName}`) + property string filePath: Directories.shellConfigPath property bool firstLoad: true function loadConfig() { diff --git a/.config/quickshell/services/HyprlandKeybinds.qml b/.config/quickshell/services/HyprlandKeybinds.qml index f0001fe2..189ba76d 100644 --- a/.config/quickshell/services/HyprlandKeybinds.qml +++ b/.config/quickshell/services/HyprlandKeybinds.qml @@ -15,9 +15,9 @@ import Quickshell.Hyprland */ Singleton { id: root - property string keybindParserPath: FileUtils.trimFileProtocol(`${XdgDirectories.config}/quickshell/scripts/hyprland/get_keybinds.py`) - property string defaultKeybindConfigPath: FileUtils.trimFileProtocol(`${XdgDirectories.config}/hypr/hyprland/keybinds.conf`) - property string userKeybindConfigPath: FileUtils.trimFileProtocol(`${XdgDirectories.config}/hypr/custom/keybinds.conf`) + property string keybindParserPath: FileUtils.trimFileProtocol(`${Directories.config}/quickshell/scripts/hyprland/get_keybinds.py`) + property string defaultKeybindConfigPath: FileUtils.trimFileProtocol(`${Directories.config}/hypr/hyprland/keybinds.conf`) + property string userKeybindConfigPath: FileUtils.trimFileProtocol(`${Directories.config}/hypr/custom/keybinds.conf`) property var defaultKeybinds: {"children": []} property var userKeybinds: {"children": []} property var keybinds: ({ diff --git a/.config/quickshell/services/LatexRenderer.qml b/.config/quickshell/services/LatexRenderer.qml index c09f0af9..d3b9ade1 100644 --- a/.config/quickshell/services/LatexRenderer.qml +++ b/.config/quickshell/services/LatexRenderer.qml @@ -26,14 +26,10 @@ Singleton { property var processedExpressions: ({}) property var renderedImagePaths: ({}) property string microtexBinaryPath: Qt.resolvedUrl("/opt/MicroTeX/LaTeX") - property string latexOutputPath: FileUtils.trimFileProtocol(`${XdgDirectories.cache}/latex`) + property string latexOutputPath: Directories.latexOutput signal renderFinished(string hash, string imagePath) - Component.onCompleted: { - Hyprland.dispatch(`exec rm -rf ${latexOutputPath} && mkdir -p ${latexOutputPath}`) - } - /** * Requests rendering of a LaTeX expression. * Returns the [hash, isNew] diff --git a/.config/quickshell/services/MaterialThemeLoader.qml b/.config/quickshell/services/MaterialThemeLoader.qml index dcee32c2..cd4eb686 100644 --- a/.config/quickshell/services/MaterialThemeLoader.qml +++ b/.config/quickshell/services/MaterialThemeLoader.qml @@ -12,7 +12,7 @@ import Quickshell.Io */ Singleton { id: root - property string filePath: `${XdgDirectories.state}/user/generated/colors.json` + property string filePath: Directories.generatedMaterialThemePath function reapplyTheme() { themeFileView.reload() @@ -44,7 +44,7 @@ Singleton { FileView { id: themeFileView - path: root.filePath + path: Qt.resolvedUrl(root.filePath) watchChanges: true onFileChanged: { this.reload() diff --git a/.config/quickshell/services/Notifications.qml b/.config/quickshell/services/Notifications.qml index 39b6fb52..d5c7e63c 100644 --- a/.config/quickshell/services/Notifications.qml +++ b/.config/quickshell/services/Notifications.qml @@ -60,7 +60,7 @@ Singleton { destroy() } } - property var filePath: `${XdgDirectories.cache}/notifications/notifications.json` + property var filePath: Directories.notificationsPath property list list: [] property var popupList: list.filter((notif) => notif.popup); property bool popupInhibited: GlobalStates?.sidebarRightOpen ?? false @@ -233,7 +233,7 @@ Singleton { FileView { id: notifFileView - path: filePath + path: Qt.resolvedUrl(filePath) onLoaded: { const fileContents = notifFileView.text() root.list = JSON.parse(fileContents).map((notif) => { diff --git a/.config/quickshell/services/PersistentStateManager.qml b/.config/quickshell/services/PersistentStateManager.qml index a885d345..c3d1536e 100644 --- a/.config/quickshell/services/PersistentStateManager.qml +++ b/.config/quickshell/services/PersistentStateManager.qml @@ -15,7 +15,7 @@ import Qt.labs.platform */ Singleton { id: root - property string fileDir: XdgDirectories.state + property string fileDir: Directories.state property string fileName: "states.json" property string filePath: `${root.fileDir}/${root.fileName}` property bool allowWriteback: false diff --git a/.config/quickshell/services/Todo.qml b/.config/quickshell/services/Todo.qml index f452a017..2cbf0d7d 100644 --- a/.config/quickshell/services/Todo.qml +++ b/.config/quickshell/services/Todo.qml @@ -13,7 +13,7 @@ import QtQuick; */ Singleton { id: root - property var filePath: `${XdgDirectories.state}/user/todo.json` + property var filePath: Directories.todoPath property var list: [] function addItem(item) { @@ -68,7 +68,7 @@ Singleton { FileView { id: todoFileView - path: filePath + path: Qt.resolvedUrl(root.filePath) onLoaded: { const fileContents = todoFileView.text() root.list = JSON.parse(fileContents)