diff --git a/quickshell/DMSShellIPC.qml b/quickshell/DMSShellIPC.qml index 2d0e0f06..9c7185df 100644 --- a/quickshell/DMSShellIPC.qml +++ b/quickshell/DMSShellIPC.qml @@ -797,11 +797,9 @@ Item { const modal = PopoutService.settingsModal; if (modal) { if (type === "wallpaper") { - modal.wallpaperBrowser.allowStacking = false; - modal.wallpaperBrowser.open(); + modal.openWallpaperBrowser(false); } else if (type === "profile") { - modal.profileBrowser.allowStacking = false; - modal.profileBrowser.open(); + modal.openProfileBrowser(false); } } else { PopoutService.openSettings(); diff --git a/quickshell/Modals/Changelog/ChangelogModal.qml b/quickshell/Modals/Changelog/ChangelogModal.qml index 169bc16a..85221afa 100644 --- a/quickshell/Modals/Changelog/ChangelogModal.qml +++ b/quickshell/Modals/Changelog/ChangelogModal.qml @@ -128,7 +128,7 @@ FloatingWindow { iconName: "open_in_new" backgroundColor: Theme.surfaceContainerHighest textColor: Theme.surfaceText - onClicked: Qt.openUrlExternally("https://danklinux.com/blog/v1.2-release") + onClicked: Qt.openUrlExternally("https://danklinux.com/blog/v1-2-release") } DankButton { diff --git a/quickshell/Modals/Settings/ProfileSection.qml b/quickshell/Modals/Settings/ProfileSection.qml index 9e0e7302..29b49618 100644 --- a/quickshell/Modals/Settings/ProfileSection.qml +++ b/quickshell/Modals/Settings/ProfileSection.qml @@ -74,9 +74,7 @@ Rectangle { if (root.parentModal) { root.parentModal.allowFocusOverride = true; root.parentModal.shouldHaveFocus = false; - if (root.parentModal.profileBrowser) { - root.parentModal.profileBrowser.open(); - } + root.parentModal.openProfileBrowser(); } } } diff --git a/quickshell/Modals/Settings/SettingsModal.qml b/quickshell/Modals/Settings/SettingsModal.qml index b2459872..44b16953 100644 --- a/quickshell/Modals/Settings/SettingsModal.qml +++ b/quickshell/Modals/Settings/SettingsModal.qml @@ -8,8 +8,26 @@ import qs.Widgets FloatingWindow { id: settingsModal - property alias profileBrowser: profileBrowser - property alias wallpaperBrowser: wallpaperBrowser + property var profileBrowser: profileBrowserLoader.item + property var wallpaperBrowser: wallpaperBrowserLoader.item + + function openProfileBrowser(allowStacking) { + profileBrowserLoader.active = true; + if (!profileBrowserLoader.item) + return; + if (allowStacking !== undefined) + profileBrowserLoader.item.allowStacking = allowStacking; + profileBrowserLoader.item.open(); + } + + function openWallpaperBrowser(allowStacking) { + wallpaperBrowserLoader.active = true; + if (!wallpaperBrowserLoader.item) + return; + if (allowStacking !== undefined) + wallpaperBrowserLoader.item.allowStacking = allowStacking; + wallpaperBrowserLoader.item.open(); + } property alias sidebar: sidebar property int currentTabIndex: 0 property bool shouldHaveFocus: visible @@ -96,41 +114,51 @@ FloatingWindow { } } - FileBrowserModal { - id: profileBrowser + LazyLoader { + id: profileBrowserLoader + active: false - allowStacking: true - parentModal: settingsModal - browserTitle: I18n.tr("Select Profile Image", "profile image file browser title") - browserIcon: "person" - browserType: "profile" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - PortalService.setProfileImage(path); - close(); - } - onDialogClosed: () => { - allowStacking = true; + FileBrowserModal { + id: profileBrowserItem + + allowStacking: true + parentModal: settingsModal + browserTitle: I18n.tr("Select Profile Image", "profile image file browser title") + browserIcon: "person" + browserType: "profile" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + PortalService.setProfileImage(path); + close(); + } + onDialogClosed: () => { + allowStacking = true; + } } } - FileBrowserModal { - id: wallpaperBrowser + LazyLoader { + id: wallpaperBrowserLoader + active: false - allowStacking: true - parentModal: settingsModal - browserTitle: I18n.tr("Select Wallpaper", "wallpaper file browser title") - browserIcon: "wallpaper" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - SessionData.setWallpaper(path); - close(); - } - onDialogClosed: () => { - allowStacking = true; + FileBrowserModal { + id: wallpaperBrowserItem + + allowStacking: true + parentModal: settingsModal + browserTitle: I18n.tr("Select Wallpaper", "wallpaper file browser title") + browserIcon: "wallpaper" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + SessionData.setWallpaper(path); + close(); + } + onDialogClosed: () => { + allowStacking = true; + } } } diff --git a/quickshell/Modules/Settings/DesktopWidgetsTab.qml b/quickshell/Modules/Settings/DesktopWidgetsTab.qml index 2463447c..5fb27949 100644 --- a/quickshell/Modules/Settings/DesktopWidgetsTab.qml +++ b/quickshell/Modules/Settings/DesktopWidgetsTab.qml @@ -22,18 +22,38 @@ Item { readonly property var allInstances: SettingsData.desktopWidgetInstances || [] readonly property var allGroups: SettingsData.desktopWidgetGroups || [] - DesktopWidgetBrowser { - id: widgetBrowser - parentModal: root.parentModal - onWidgetAdded: widgetType => { - ToastService.showInfo(I18n.tr("Widget added")); + function showWidgetBrowser() { + widgetBrowserLoader.active = true; + if (widgetBrowserLoader.item) + widgetBrowserLoader.item.show(); + } + + function showDesktopPluginBrowser() { + desktopPluginBrowserLoader.active = true; + if (desktopPluginBrowserLoader.item) + desktopPluginBrowserLoader.item.show(); + } + + LazyLoader { + id: widgetBrowserLoader + active: false + + DesktopWidgetBrowser { + parentModal: root.parentModal + onWidgetAdded: widgetType => { + ToastService.showInfo(I18n.tr("Widget added")); + } } } - PluginBrowser { - id: desktopPluginBrowser - parentModal: root.parentModal - typeFilter: "desktop-widget" + LazyLoader { + id: desktopPluginBrowserLoader + active: false + + PluginBrowser { + parentModal: root.parentModal + typeFilter: "desktop-widget" + } } DankFlickable { @@ -74,13 +94,13 @@ Item { DankButton { text: I18n.tr("Add Widget") iconName: "add" - onClicked: widgetBrowser.show() + onClicked: root.showWidgetBrowser() } DankButton { text: I18n.tr("Browse Plugins") iconName: "store" - onClicked: desktopPluginBrowser.show() + onClicked: root.showDesktopPluginBrowser() } } } diff --git a/quickshell/Modules/Settings/PluginsTab.qml b/quickshell/Modules/Settings/PluginsTab.qml index 2ab7e557..5d5bcdbb 100644 --- a/quickshell/Modules/Settings/PluginsTab.qml +++ b/quickshell/Modules/Settings/PluginsTab.qml @@ -1,4 +1,5 @@ import QtQuick +import Quickshell import qs.Common import qs.Services import qs.Widgets @@ -209,7 +210,7 @@ FocusScope { iconName: "store" enabled: DMSService.dmsAvailable onClicked: { - pluginBrowser.show(); + showPluginBrowser(); } } @@ -382,9 +383,11 @@ FocusScope { Connections { target: DMSService function onPluginsListReceived(plugins) { - pluginBrowser.isLoading = false; - pluginBrowser.allPlugins = plugins; - pluginBrowser.updateFilteredPlugins(); + if (!pluginBrowserLoader.item) + return; + pluginBrowserLoader.item.isLoading = false; + pluginBrowserLoader.item.allPlugins = plugins; + pluginBrowserLoader.item.updateFilteredPlugins(); } function onInstalledPluginsReceived(plugins) { var pluginMap = {}; @@ -410,22 +413,36 @@ FocusScope { } Component.onCompleted: { - pluginBrowser.parentModal = pluginsTab.parentModal; if (DMSService.dmsAvailable && DMSService.apiVersion >= 8) DMSService.listInstalled(); if (PopoutService.pendingPluginInstall) - Qt.callLater(() => pluginBrowser.show()); + Qt.callLater(showPluginBrowser); } Connections { target: PopoutService function onPendingPluginInstallChanged() { if (PopoutService.pendingPluginInstall) - pluginBrowser.show(); + showPluginBrowser(); } } - PluginBrowser { - id: pluginBrowser + LazyLoader { + id: pluginBrowserLoader + active: false + + PluginBrowser { + id: pluginBrowserItem + + Component.onCompleted: { + pluginBrowserItem.parentModal = pluginsTab.parentModal; + } + } + } + + function showPluginBrowser() { + pluginBrowserLoader.active = true; + if (pluginBrowserLoader.item) + pluginBrowserLoader.item.show(); } } diff --git a/quickshell/Modules/Settings/ThemeColorsTab.qml b/quickshell/Modules/Settings/ThemeColorsTab.qml index db385721..b12ac3fe 100644 --- a/quickshell/Modules/Settings/ThemeColorsTab.qml +++ b/quickshell/Modules/Settings/ThemeColorsTab.qml @@ -131,7 +131,7 @@ Item { if (DMSService.dmsAvailable) DMSService.listInstalledThemes(); if (PopoutService.pendingThemeInstall) - Qt.callLater(() => themeBrowser.show()); + Qt.callLater(() => showThemeBrowser()); templateCheckProcess.running = true; if (CompositorService.isNiri || CompositorService.isHyprland || CompositorService.isDwl) checkCursorIncludeStatus(); @@ -169,7 +169,7 @@ Item { target: PopoutService function onPendingThemeInstallChanged() { if (PopoutService.pendingThemeInstall) - themeBrowser.show(); + showThemeBrowser(); } } @@ -939,7 +939,7 @@ Item { text: I18n.tr("Browse Themes", "browse themes button") iconName: "store" anchors.horizontalCenter: parent.horizontalCenter - onClicked: themeBrowser.show() + onClicked: showThemeBrowser() } } } @@ -2041,7 +2041,18 @@ Item { } } - ThemeBrowser { - id: themeBrowser + LazyLoader { + id: themeBrowserLoader + active: false + + ThemeBrowser { + id: themeBrowserItem + } + } + + function showThemeBrowser() { + themeBrowserLoader.active = true; + if (themeBrowserLoader.item) + themeBrowserLoader.item.show(); } } diff --git a/quickshell/Modules/Settings/WallpaperTab.qml b/quickshell/Modules/Settings/WallpaperTab.qml index 694befcd..6a66d1ea 100644 --- a/quickshell/Modules/Settings/WallpaperTab.qml +++ b/quickshell/Modules/Settings/WallpaperTab.qml @@ -139,7 +139,7 @@ Item { MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: mainWallpaperBrowser.open() + onClicked: root.openMainWallpaperBrowser() } } @@ -476,7 +476,7 @@ Item { MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: lightWallpaperBrowser.open() + onClicked: root.openLightWallpaperBrowser() } } @@ -660,7 +660,7 @@ Item { MouseArea { anchors.fill: parent cursorShape: Qt.PointingHandCursor - onClicked: darkWallpaperBrowser.open() + onClicked: root.openDarkWallpaperBrowser() } } @@ -1242,53 +1242,83 @@ Item { } } - FileBrowserModal { - id: mainWallpaperBrowser - parentModal: root.parentModal - browserTitle: I18n.tr("Select Wallpaper", "wallpaper file browser title") - browserIcon: "wallpaper" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - if (SessionData.perMonitorWallpaper) { - SessionData.setMonitorWallpaper(selectedMonitorName, path); - } else { - SessionData.setWallpaper(path); + function openMainWallpaperBrowser() { + mainWallpaperBrowserLoader.active = true; + if (mainWallpaperBrowserLoader.item) + mainWallpaperBrowserLoader.item.open(); + } + + function openLightWallpaperBrowser() { + lightWallpaperBrowserLoader.active = true; + if (lightWallpaperBrowserLoader.item) + lightWallpaperBrowserLoader.item.open(); + } + + function openDarkWallpaperBrowser() { + darkWallpaperBrowserLoader.active = true; + if (darkWallpaperBrowserLoader.item) + darkWallpaperBrowserLoader.item.open(); + } + + LazyLoader { + id: mainWallpaperBrowserLoader + active: false + + FileBrowserModal { + parentModal: root.parentModal + browserTitle: I18n.tr("Select Wallpaper", "wallpaper file browser title") + browserIcon: "wallpaper" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + if (SessionData.perMonitorWallpaper) { + SessionData.setMonitorWallpaper(selectedMonitorName, path); + } else { + SessionData.setWallpaper(path); + } + close(); } - close(); } } - FileBrowserModal { - id: lightWallpaperBrowser - parentModal: root.parentModal - browserTitle: I18n.tr("Select Wallpaper", "light mode wallpaper file browser title") - browserIcon: "light_mode" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - SessionData.wallpaperPathLight = path; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - close(); + LazyLoader { + id: lightWallpaperBrowserLoader + active: false + + FileBrowserModal { + parentModal: root.parentModal + browserTitle: I18n.tr("Select Wallpaper", "light mode wallpaper file browser title") + browserIcon: "light_mode" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + SessionData.wallpaperPathLight = path; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + close(); + } } } - FileBrowserModal { - id: darkWallpaperBrowser - parentModal: root.parentModal - browserTitle: I18n.tr("Select Wallpaper", "dark mode wallpaper file browser title") - browserIcon: "dark_mode" - browserType: "wallpaper" - showHiddenFiles: true - fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] - onFileSelected: path => { - SessionData.wallpaperPathDark = path; - SessionData.syncWallpaperForCurrentMode(); - SessionData.saveSettings(); - close(); + LazyLoader { + id: darkWallpaperBrowserLoader + active: false + + FileBrowserModal { + parentModal: root.parentModal + browserTitle: I18n.tr("Select Wallpaper", "dark mode wallpaper file browser title") + browserIcon: "dark_mode" + browserType: "wallpaper" + showHiddenFiles: true + fileExtensions: ["*.jpg", "*.jpeg", "*.png", "*.bmp", "*.gif", "*.webp"] + onFileSelected: path => { + SessionData.wallpaperPathDark = path; + SessionData.syncWallpaperForCurrentMode(); + SessionData.saveSettings(); + close(); + } } } } diff --git a/quickshell/Modules/Settings/WidgetsTab.qml b/quickshell/Modules/Settings/WidgetsTab.qml index 15b801ed..9af31bf9 100644 --- a/quickshell/Modules/Settings/WidgetsTab.qml +++ b/quickshell/Modules/Settings/WidgetsTab.qml @@ -1,5 +1,6 @@ import QtQuick import QtQuick.Layouts +import Quickshell import qs.Common import qs.Services import qs.Widgets @@ -916,14 +917,28 @@ Item { }); } - WidgetSelectionPopup { - id: widgetSelectionPopup - parentModal: widgetsTab.parentModal - onWidgetSelected: (widgetId, targetSection) => { - widgetsTab.addWidgetToSection(widgetId, targetSection); + LazyLoader { + id: widgetSelectionPopupLoader + active: false + + WidgetSelectionPopup { + id: widgetSelectionPopupItem + parentModal: widgetsTab.parentModal + onWidgetSelected: (widgetId, targetSection) => { + widgetsTab.addWidgetToSection(widgetId, targetSection); + } } } + function showWidgetSelectionPopup(sectionId) { + widgetSelectionPopupLoader.active = true; + if (!widgetSelectionPopupLoader.item) + return; + widgetSelectionPopupLoader.item.targetSection = sectionId; + widgetSelectionPopupLoader.item.allWidgets = widgetsTab.getWidgetsForPopup(); + widgetSelectionPopupLoader.item.show(); + } + DankFlickable { anchors.fill: parent clip: true @@ -1113,9 +1128,7 @@ Item { widgetsTab.handleItemOrderChanged(sectionId, newOrder); } onAddWidget: sectionId => { - widgetSelectionPopup.targetSection = sectionId; - widgetSelectionPopup.allWidgets = widgetsTab.getWidgetsForPopup(); - widgetSelectionPopup.show(); + showWidgetSelectionPopup(sectionId); } onRemoveWidget: (sectionId, index) => { widgetsTab.removeWidgetFromSection(sectionId, index); @@ -1170,9 +1183,7 @@ Item { widgetsTab.handleItemOrderChanged(sectionId, newOrder); } onAddWidget: sectionId => { - widgetSelectionPopup.targetSection = sectionId; - widgetSelectionPopup.allWidgets = widgetsTab.getWidgetsForPopup(); - widgetSelectionPopup.show(); + showWidgetSelectionPopup(sectionId); } onRemoveWidget: (sectionId, index) => { widgetsTab.removeWidgetFromSection(sectionId, index); @@ -1227,9 +1238,7 @@ Item { widgetsTab.handleItemOrderChanged(sectionId, newOrder); } onAddWidget: sectionId => { - widgetSelectionPopup.targetSection = sectionId; - widgetSelectionPopup.allWidgets = widgetsTab.getWidgetsForPopup(); - widgetSelectionPopup.show(); + showWidgetSelectionPopup(sectionId); } onRemoveWidget: (sectionId, index) => { widgetsTab.removeWidgetFromSection(sectionId, index);