diff --git a/src/widgets/request-item.ui b/src/widgets/request-item.ui
index af30a71..9435c30 100644
--- a/src/widgets/request-item.ui
+++ b/src/widgets/request-item.ui
@@ -32,6 +32,7 @@
Options
diff --git a/src/window.py b/src/window.py
index 16337ff..3baeaa1 100644
--- a/src/window.py
+++ b/src/window.py
@@ -224,6 +224,16 @@ class RosterWindow(Adw.ApplicationWindow):
min-width: 0;
}
+ /* Request menu button: hidden by default, visible on row hover or when open */
+ .request-menu-button {
+ opacity: 0;
+ transition: opacity 150ms ease;
+ }
+ row:hover .request-menu-button,
+ .request-menu-button:checked {
+ opacity: 1;
+ }
+
/* Method chips in sidebar request list */
.method-chip {
border-radius: 4px;
@@ -961,6 +971,14 @@ class RosterWindow(Adw.ApplicationWindow):
def _load_projects(self) -> None:
"""Load and display projects."""
+ # Remember which projects are currently expanded
+ expanded_ids = set()
+ child = self.projects_listbox.get_first_child()
+ while child:
+ if isinstance(child, ProjectItem) and child.expanded:
+ expanded_ids.add(child.project.id)
+ child = child.get_next_sibling()
+
# Clear existing
while child := self.projects_listbox.get_first_child():
self.projects_listbox.remove(child)
@@ -984,6 +1002,11 @@ class RosterWindow(Adw.ApplicationWindow):
item.connect('request-move-up-requested', self._on_request_move_up, project)
item.connect('request-move-down-requested', self._on_request_move_down, project)
item.connect('request-move-to-project-requested', self._on_request_move_to_project, project)
+ if project.id in expanded_ids:
+ item.expanded = True
+ item.requests_revealer.set_transition_duration(0)
+ item.requests_revealer.set_reveal_child(True)
+ GLib.idle_add(lambda r=item.requests_revealer: (r.set_transition_duration(250), False)[1])
self.projects_listbox.append(item)
def on_add_project_clicked(self, button):