diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/arrow-right-filled.svg b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-right-filled.svg new file mode 100644 index 000000000..0e4e5daaa --- /dev/null +++ b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-right-filled.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/arrow-right.svg b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-right.svg new file mode 100644 index 000000000..db97a6e38 --- /dev/null +++ b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-right.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/arrow-up-left-filled.svg b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-up-left-filled.svg new file mode 100644 index 000000000..dd5011358 --- /dev/null +++ b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-up-left-filled.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dots/.config/quickshell/ii/assets/icons/fluent/arrow-up-left.svg b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-up-left.svg new file mode 100644 index 000000000..8b6683c69 --- /dev/null +++ b/dots/.config/quickshell/ii/assets/icons/fluent/arrow-up-left.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/WMenu.qml b/dots/.config/quickshell/ii/modules/waffle/looks/WMenu.qml index 3b0d2cd42..3a42e666d 100644 --- a/dots/.config/quickshell/ii/modules/waffle/looks/WMenu.qml +++ b/dots/.config/quickshell/ii/modules/waffle/looks/WMenu.qml @@ -95,6 +95,5 @@ Menu { delegate: WMenuItem { id: menuItemDelegate - width: ListView.view?.width } } diff --git a/dots/.config/quickshell/ii/modules/waffle/looks/WMenuItem.qml b/dots/.config/quickshell/ii/modules/waffle/looks/WMenuItem.qml index 3030bc122..731b0d704 100644 --- a/dots/.config/quickshell/ii/modules/waffle/looks/WMenuItem.qml +++ b/dots/.config/quickshell/ii/modules/waffle/looks/WMenuItem.qml @@ -55,6 +55,9 @@ MenuItem { rightInset: inset horizontalPadding: 11 + width: ListView.view?.width + height: visible ? implicitHeight : 0 + background: Rectangle { id: backgroundRect radius: Looks.radius.medium diff --git a/dots/.config/quickshell/ii/modules/waffle/sessionScreen/WaffleSessionScreen.qml b/dots/.config/quickshell/ii/modules/waffle/sessionScreen/WaffleSessionScreen.qml index 41c52b151..7f0d1a5d7 100644 --- a/dots/.config/quickshell/ii/modules/waffle/sessionScreen/WaffleSessionScreen.qml +++ b/dots/.config/quickshell/ii/modules/waffle/sessionScreen/WaffleSessionScreen.qml @@ -57,7 +57,6 @@ Scope { Item { anchors.fill: parent - focus: true Keys.onPressed: (event) => { if (event.key === Qt.Key_Escape) { sessionRoot.hide(); diff --git a/dots/.config/quickshell/ii/modules/waffle/startMenu/searchPage/SearchResults.qml b/dots/.config/quickshell/ii/modules/waffle/startMenu/searchPage/SearchResults.qml index e02d56a50..aeaa4748c 100644 --- a/dots/.config/quickshell/ii/modules/waffle/startMenu/searchPage/SearchResults.qml +++ b/dots/.config/quickshell/ii/modules/waffle/startMenu/searchPage/SearchResults.qml @@ -200,6 +200,16 @@ RowLayout { resultPreview.entry.execute(); } }), + ...(isAppEntry ? [ + searchResultComp.createObject(null, { + name: startPinned ? Translation.tr("Unpin from Start") : Translation.tr("Pin to Start"), + iconName: startPinned ? "keep_off" : "keep", + iconType: LauncherSearchResult.IconType.Material, + execute: () => { + LauncherApps.togglePin(appId); + } + }) + ] : []), ...(isAppEntry ? [ searchResultComp.createObject(null, { name: pinned ? Translation.tr("Unpin from taskbar") : Translation.tr("Pin to taskbar"), @@ -210,20 +220,6 @@ RowLayout { } }) ] : []), - ...(isAppEntry ? [ - searchResultComp.createObject(null, { - name: startPinned ? Translation.tr("Unpin from start") : Translation.tr("Pin to start"), - iconName: startPinned ? "keep_off" : "keep", - iconType: LauncherSearchResult.IconType.Material, - execute: () => { - if (Config.options.launcher.pinnedApps.indexOf(appId) !== -1) { - Config.options.launcher.pinnedApps = Config.options.launcher.pinnedApps.filter(id => id !== appId) - } else { - Config.options.launcher.pinnedApps = Config.options.launcher.pinnedApps.concat([appId]) - } - } - }) - ] : []) ]; result = result.concat(resultPreview.entry.actions); return result; diff --git a/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/AppCategoryGrid.qml b/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/AppCategoryGrid.qml index e1ab25c54..bc584def3 100644 --- a/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/AppCategoryGrid.qml +++ b/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/AppCategoryGrid.qml @@ -274,6 +274,9 @@ Rectangle { id: smallGridAppButton property DesktopEntry desktopEntry + property bool pinnedStart: LauncherApps.isPinned(smallGridAppButton.desktopEntry.id); + property bool pinnedTaskbar: TaskbarApps.isPinned(smallGridAppButton.desktopEntry.id); + onClicked: { GlobalStates.searchOpen = false; desktopEntry.execute(); @@ -298,6 +301,30 @@ Rectangle { WToolTip { text: smallGridAppButton.desktopEntry.name } + + altAction: () => { + appMenu.popup(); + } + + WMenu { + id: appMenu + downDirection: true + + WMenuItem { + icon.name: smallGridAppButton.pinnedStart ? "pin-off" : "pin" + text: smallGridAppButton.pinnedStart ? Translation.tr("Unpin from Start") : Translation.tr("Pin to Start") + onTriggered: { + LauncherApps.togglePin(smallGridAppButton.desktopEntry.id); + } + } + WMenuItem { + icon.name: smallGridAppButton.pinnedTaskbar ? "pin-off" : "pin" + text: smallGridAppButton.pinnedTaskbar ? Translation.tr("Unpin from taskbar") : Translation.tr("Pin to taskbar") + onTriggered: { + TaskbarApps.togglePin(smallGridAppButton.desktopEntry.id); + } + } + } } component SmallGridButton: WButton { diff --git a/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/BigAppGrid.qml b/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/BigAppGrid.qml index 3142466b9..dbc44adf8 100644 --- a/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/BigAppGrid.qml +++ b/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/BigAppGrid.qml @@ -23,9 +23,7 @@ GridLayout { uniformCellWidths: true Repeater { - model: ScriptModel { - values: root.desktopEntries - } + model: root.desktopEntries delegate: StartAppButton { id: pinnedAppButton required property var modelData diff --git a/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/StartAppButton.qml b/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/StartAppButton.qml index 4b27b58bd..8df30bd85 100644 --- a/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/StartAppButton.qml +++ b/dots/.config/quickshell/ii/modules/waffle/startMenu/startPage/StartAppButton.qml @@ -14,6 +14,10 @@ import qs.modules.waffle.looks WButton { id: root required property DesktopEntry desktopEntry + + property bool pinnedStart: LauncherApps.isPinned(root.desktopEntry.id); + property bool pinnedTaskbar: TaskbarApps.isPinned(root.desktopEntry.id); + implicitWidth: 96 implicitHeight: 84 horizontalPadding: 0 @@ -43,4 +47,52 @@ WButton { WToolTip { text: root.desktopEntry.name } + + altAction: () => { + appMenu.popup() + } + + WMenu { + id: appMenu + downDirection: true + + WMenuItem { + visible: root.pinnedStart + icon.name: "arrow-up-left" + text: Translation.tr("Move to front") + onTriggered: { + LauncherApps.moveToFront(root.desktopEntry.id); + } + } + WMenuItem { + visible: root.pinnedStart + icon.name: "arrow-left" + text: Translation.tr("Move left") + onTriggered: { + LauncherApps.moveLeft(root.desktopEntry.id); + } + } + WMenuItem { + visible: root.pinnedStart + icon.name: "arrow-right" + text: Translation.tr("Move right") + onTriggered: { + LauncherApps.moveRight(root.desktopEntry.id); + } + } + WMenuItem { + icon.name: root.pinnedStart ? "pin-off" : "pin" + text: root.pinnedStart ? Translation.tr("Unpin from Start") : Translation.tr("Pin to Start") + onTriggered: { + LauncherApps.togglePin(root.desktopEntry.id); + } + } + WMenuItem { + icon.name: root.pinnedTaskbar ? "pin-off" : "pin" + text: root.pinnedTaskbar ? Translation.tr("Unpin from taskbar") : Translation.tr("Pin to taskbar") + onTriggered: { + TaskbarApps.togglePin(root.desktopEntry.id); + } + } + } } diff --git a/dots/.config/quickshell/ii/services/LauncherApps.qml b/dots/.config/quickshell/ii/services/LauncherApps.qml new file mode 100644 index 000000000..0017f3812 --- /dev/null +++ b/dots/.config/quickshell/ii/services/LauncherApps.qml @@ -0,0 +1,41 @@ +pragma Singleton + +import qs.modules.common +import QtQuick +import Quickshell + +Singleton { + id: root + + function isPinned(appId) { + return Config.options.launcher.pinnedApps.indexOf(appId) !== -1; + } + + function togglePin(appId) { + if (root.isPinned(appId)) { + Config.options.launcher.pinnedApps = Config.options.launcher.pinnedApps.filter(id => id !== appId) + } else { + Config.options.launcher.pinnedApps = Config.options.launcher.pinnedApps.concat([appId]) + } + } + + function moveToFront(appId) { + if (!root.isPinned(appId)) return; + const pinnedApps = Config.options.launcher.pinnedApps; + Config.options.launcher.pinnedApps = [appId].concat(pinnedApps.filter(id => id !== appId)); + } + + function moveLeft(appId) { + const pinnedApps = Config.options.launcher.pinnedApps; + const index = pinnedApps.indexOf(appId); + if (index === -1 || index === 0) return; + Config.options.launcher.pinnedApps = pinnedApps.slice(0, index - 1).concat([appId]).concat(pinnedApps[index - 1]).concat(pinnedApps.slice(index + 1)); + } + + function moveRight(appId) { + const pinnedApps = Config.options.launcher.pinnedApps; + const index = pinnedApps.indexOf(appId); + if (index === -1 || index === pinnedApps.length - 1) return; + Config.options.launcher.pinnedApps = pinnedApps.slice(0, index).concat(pinnedApps[index + 1]).concat([appId]).concat(pinnedApps.slice(index + 2)); + } +} diff --git a/dots/.config/quickshell/ii/services/TaskbarApps.qml b/dots/.config/quickshell/ii/services/TaskbarApps.qml index 052abcaec..6351896b8 100644 --- a/dots/.config/quickshell/ii/services/TaskbarApps.qml +++ b/dots/.config/quickshell/ii/services/TaskbarApps.qml @@ -8,8 +8,12 @@ import Quickshell.Wayland Singleton { id: root + function isPinned(appId) { + return Config.options.dock.pinnedApps.indexOf(appId) !== -1; + } + function togglePin(appId) { - if (Config.options.dock.pinnedApps.indexOf(appId) !== -1) { + if (root.isPinned(appId)) { Config.options.dock.pinnedApps = Config.options.dock.pinnedApps.filter(id => id !== appId) } else { Config.options.dock.pinnedApps = Config.options.dock.pinnedApps.concat([appId])