notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 8e62f43c4a175bffe1a62b781bc0ad50ec0a13a3
parent d37ae5dbf744b65b4ef4d0b09a102a4f39d38950
Author: William Casarin <jb55@jb55.com>
Date:   Thu, 19 Feb 2026 12:30:07 -0800

dave: add notification dot on hamburger menu for pending permissions

Shows a dot using the selection/focus color on the mobile hamburger
icon when a permission request is waiting for user action.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Diffstat:
Mcrates/notedeck_dave/src/ui/dave.rs | 3++-
Mcrates/notedeck_dave/src/ui/top_buttons.rs | 13++++++++++++-
2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -264,7 +264,8 @@ impl<'a> DaveUi<'a> { let action = if is_compact { None } else { - let result = top_buttons_ui(app_ctx, ui); + let has_pending = self.flags.contains(DaveUiFlags::HasPendingPerm); + let result = top_buttons_ui(app_ctx, ui, has_pending); // Render session details inline, to the right of the buttons if let Some(details) = self.details { diff --git a/crates/notedeck_dave/src/ui/top_buttons.rs b/crates/notedeck_dave/src/ui/top_buttons.rs @@ -17,7 +17,11 @@ pub struct TopButtonsResult { } /// Render the top buttons UI (profile pic, settings, session list toggle) -pub fn top_buttons_ui(app_ctx: &mut AppContext, ui: &mut egui::Ui) -> TopButtonsResult { +pub fn top_buttons_ui( + app_ctx: &mut AppContext, + ui: &mut egui::Ui, + has_pending: bool, +) -> TopButtonsResult { let mut action: Option<DaveAction> = None; let mut rect = ui.available_rect_before_wrap(); rect = rect.translate(egui::vec2(20.0, 20.0)); @@ -31,6 +35,13 @@ pub fn top_buttons_ui(app_ctx: &mut AppContext, ui: &mut egui::Ui) -> TopButtons .on_hover_text("Show chats") .on_hover_cursor(egui::CursorIcon::PointingHand); + // Draw notification dot when something needs attention + if has_pending { + let dot_center = rect.right_top() + egui::vec2(-2.0, 6.0); + ui.painter() + .circle_filled(dot_center, 4.0, ui.visuals().selection.stroke.color); + } + if r.clicked() { action = Some(DaveAction::ShowSessionList); }