aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/Drawer.qml
diff options
context:
space:
mode:
Diffstat (limited to 'desktop/Drawer.qml')
-rw-r--r--desktop/Drawer.qml58
1 files changed, 49 insertions, 9 deletions
diff --git a/desktop/Drawer.qml b/desktop/Drawer.qml
index 4ed37d3..c02a4ba 100644
--- a/desktop/Drawer.qml
+++ b/desktop/Drawer.qml
@@ -10,6 +10,7 @@
// GNU General Public License for more details.
import Quickshell
+import Quickshell.Io
import Quickshell.Wayland
import QtQuick
@@ -29,6 +30,25 @@ Scope {
// Which module's page is showing. Empty means the grid.
property string page: ""
+ // Set by NotificationList's History button and read by the history view
+ // loader below; reset when the drawer closes.
+ property bool history: false
+
+ // The balloons read this to stand down while the drawer holds the space.
+ FileView {
+ id: drawerFlag
+ path: (Quickshell.env("XDG_RUNTIME_DIR") || "/tmp") + "/notifyd/drawer"
+ atomicWrites: true
+ printErrors: false
+ }
+
+ onOpenChanged: drawerFlag.setText(root.open ? "1\n" : "0\n")
+
+ // onOpenChanged does not fire for the initial value, so a restart while
+ // the drawer was open would leave the flag stale and suppress every
+ // balloon. Publish the starting state explicitly.
+ Component.onCompleted: drawerFlag.setText(root.open ? "1\n" : "0\n")
+
readonly property var screenObj:
Quickshell.screens.find(s => s.name === root.monitor) ?? Quickshell.screens[0]
@@ -41,6 +61,9 @@ Scope {
}
function show(name) {
+ // Deep-linking to a page must leave the history view, or both loaders
+ // stay active and the later-declared history loader paints on top.
+ root.history = false;
root.page = root.modules.some(m => m.name === name) ? name : "";
root.open = true;
}
@@ -50,6 +73,7 @@ Scope {
// Reset to the grid: a panel that reopens somewhere unexpected is
// worse than one extra click.
root.page = "";
+ root.history = false;
}
function toggle(name) {
@@ -109,7 +133,8 @@ Scope {
// to it.
focus: true
Keys.onEscapePressed: {
- if (root.page) root.page = "";
+ if (root.history) root.history = false;
+ else if (root.page) root.page = "";
else root.close();
}
@@ -121,18 +146,17 @@ Scope {
Item {
anchors.fill: parent
anchors.margins: 16
- visible: root.page === ""
-
- // Reserved for the notification engine. An empty Item that
- // claims the space rather than a placeholder graphic: the
- // grid has to sit where it will sit once notifications
- // arrive, or the layout is tuned against a position that
- // does not survive.
- Item {
+ visible: root.page === "" && !root.history
+
+ // The notification engine's space. The live queue lists
+ // here while the drawer is open; the balloons stand down
+ // because the drawer flag above is set.
+ NotificationList {
id: notifications
anchors { top: parent.top; left: parent.left; right: parent.right }
anchors.bottom: grid.top
anchors.bottomMargin: 16
+ onHistory: root.history = true
}
// Fixed, never scrolled. Three columns at 600px with a
@@ -196,6 +220,22 @@ Scope {
}
Behavior on opacity { NumberAnimation { duration: 160 } }
}
+
+ // --- history view ---
+
+ Loader {
+ id: historyLoader
+ anchors.fill: parent
+ anchors.margins: 16
+ active: root.history
+ sourceComponent: Component {
+ Page {
+ title: "History"
+ NotificationHistory { width: parent.width }
+ }
+ }
+ onLoaded: if (item && item.back) item.back.connect(() => root.history = false)
+ }
}
}
}