From 92ce718e8b7fa715ede5d42c15920c95c60d4f3e Mon Sep 17 00:00:00 2001 From: William Casarin Date: Tue, 28 May 2024 15:00:57 -0700 Subject: [PATCH] side_panel: return more detailed side panel responses We should be treating all ui widgets as pure functions that do not mutate anything. This will make testing easier, as well as avoiding shared mutable references. Signed-off-by: William Casarin --- src/app.rs | 10 +++++----- src/ui/side_panel.rs | 23 +++++++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/app.rs b/src/app.rs index 2d48a83..345b65c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -867,16 +867,16 @@ fn timelines_view(ui: &mut egui::Ui, sizes: Size, app: &mut Damus, timelines: us .clip(true) .horizontal(|mut strip| { strip.cell(|ui| { - if DesktopSidePanel::new( + let side_panel = DesktopSidePanel::new( app.account_manager .get_selected_account() .map(|a| a.pubkey.bytes()), SimpleProfilePreviewController::new(&app.ndb, &mut app.img_cache), ) - .show(ui) - .clicked() - { - // clicked pfp + .show(ui); + + if side_panel.response.clicked() { + info!("clicked {:?}", side_panel.action); } }); diff --git a/src/ui/side_panel.rs b/src/ui/side_panel.rs index 068f713..0284de7 100644 --- a/src/ui/side_panel.rs +++ b/src/ui/side_panel.rs @@ -9,9 +9,28 @@ pub struct DesktopSidePanel<'a> { simple_preview_controller: SimpleProfilePreviewController<'a>, } +#[derive(Debug, Eq, PartialEq, Clone, Copy)] +pub enum SidePanelAction { + Panel, + Account, + Settings, + Columns, +} + +pub struct SidePanelResponse { + pub response: egui::Response, + pub action: SidePanelAction, +} + +impl SidePanelResponse { + fn new(action: SidePanelAction, response: egui::Response) -> Self { + SidePanelResponse { action, response } + } +} + impl<'a> Widget for DesktopSidePanel<'a> { fn ui(self, ui: &mut egui::Ui) -> egui::Response { - self.show(ui) + self.show(ui).response } } @@ -32,7 +51,7 @@ impl<'a> DesktopSidePanel<'a> { .exact_width(40.0) } - pub fn show(self, ui: &mut egui::Ui) -> egui::Response { + pub fn show(self, ui: &mut egui::Ui) -> SidePanelResponse { let dark_mode = ui.ctx().style().visuals.dark_mode; let spacing_amt = 16.0;