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])