From 22264e70f5f5355dd4013907edfc78d5bb6d7870 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Fri, 24 May 2024 18:18:22 -0400 Subject: [PATCH] Integrate account switcher to side panel Signed-off-by: kernelkind --- src/ui/account_switcher.rs | 12 +++- src/ui/global_popup.rs | 74 ++++++++++++++------ src/ui/profile/profile_preview_controller.rs | 6 +- src/ui/side_panel.rs | 7 +- src/ui/state_in_memory.rs | 6 +- 5 files changed, 76 insertions(+), 29 deletions(-) diff --git a/src/ui/account_switcher.rs b/src/ui/account_switcher.rs index 034c22f..352f895 100644 --- a/src/ui/account_switcher.rs +++ b/src/ui/account_switcher.rs @@ -6,7 +6,10 @@ use egui::{ use crate::account_manager::AccountManager; -use super::profile::{preview::SimpleProfilePreview, SimpleProfilePreviewController}; +use super::{ + profile::{preview::SimpleProfilePreview, SimpleProfilePreviewController}, + state_in_memory::{STATE_ACCOUNT_MANAGEMENT, STATE_ACCOUNT_SWITCHER, STATE_SIDE_PANEL}, +}; pub struct AccountSelectionWidget<'a> { account_manager: &'a mut AccountManager, @@ -157,7 +160,12 @@ fn top_section_widget() -> impl egui::Widget { Layout::right_to_left(egui::Align::Center), |ui| { if ui.add(manage_accounts_button()).clicked() { - // TODO: route to AccountLoginView + STATE_ACCOUNT_SWITCHER.set_state(ui.ctx(), false); + STATE_SIDE_PANEL.set_state( + ui.ctx(), + Some(ui::global_popup::GlobalPopupType::AccountManagement), + ); + STATE_ACCOUNT_MANAGEMENT.set_state(ui.ctx(), true); } }, ); diff --git a/src/ui/global_popup.rs b/src/ui/global_popup.rs index 75edd85..2619187 100644 --- a/src/ui/global_popup.rs +++ b/src/ui/global_popup.rs @@ -3,21 +3,25 @@ use egui::{Align2, CentralPanel, RichText, Vec2, Window}; use crate::Damus; use super::{ - state_in_memory::{STATE_GLOBAL_POPUP, STATE_SIDE_PANEL}, - AccountManagementView, View, + profile::SimpleProfilePreviewController, + state_in_memory::{STATE_ACCOUNT_MANAGEMENT, STATE_ACCOUNT_SWITCHER, STATE_SIDE_PANEL}, + AccountManagementView, AccountSelectionWidget, View, }; #[derive(Clone, Copy, Debug)] pub enum GlobalPopupType { AccountManagement, + AccountSwitcher, } static ACCOUNT_MANAGEMENT_TITLE: &str = "Manage accounts"; +static ACCOUNT_SWITCHER_TITLE: &str = "Account switcher"; impl GlobalPopupType { pub fn title(&self) -> &'static str { match self { Self::AccountManagement => ACCOUNT_MANAGEMENT_TITLE, + Self::AccountSwitcher => ACCOUNT_SWITCHER_TITLE, } } } @@ -46,6 +50,16 @@ fn overlay_window<'a>( .default_size(window_size) } +fn account_switcher_window(open: &'_ mut bool) -> Window<'_> { + egui::Window::new("account switcher") + .title_bar(false) + .collapsible(false) + .anchor(Align2::LEFT_BOTTOM, Vec2::new(0.0, -52.0)) + .fixed_size(Vec2::new(360.0, 406.0)) + .open(open) + .movable(false) +} + static MARGIN: Vec2 = Vec2 { x: 100.0, y: 100.0 }; pub struct DesktopGlobalPopup<'a> { @@ -64,29 +78,49 @@ impl<'a> DesktopGlobalPopup<'a> { } pub fn global_popup(app: &mut Damus, ctx: &egui::Context) { CentralPanel::default().show(ctx, |ui| { - let available_size = ui.available_size(); - let window_size = available_size - MARGIN; - if let Some(popup) = STATE_SIDE_PANEL.get_state(ctx) { - let mut show_global_popup = STATE_GLOBAL_POPUP.get_state(ctx); - if show_global_popup { - overlay_window(&mut show_global_popup, window_size, popup.title()).show( - ctx, - |ui| { - match popup { - GlobalPopupType::AccountManagement => { - AccountManagementView::from_app(app).ui(ui) - } - }; - }, - ); - - // user could have closed the window, set the new state in egui memory - STATE_GLOBAL_POPUP.set_state(ctx, show_global_popup); + match popup { + GlobalPopupType::AccountManagement => { + Self::account_management(app, ctx, ui, popup.title()); + } + GlobalPopupType::AccountSwitcher => { + let mut show_account_switcher = STATE_ACCOUNT_SWITCHER.get_state(ctx); + if show_account_switcher { + STATE_ACCOUNT_MANAGEMENT.set_state(ctx, false); + account_switcher_window(&mut show_account_switcher).show(ctx, |ui| { + AccountSelectionWidget::new( + &mut app.account_manager, + SimpleProfilePreviewController::new( + &app.ndb, + &mut app.img_cache, + ), + ) + .ui(ui); + }); + } + } } } }); } + + fn account_management( + app: &mut Damus, + ctx: &egui::Context, + ui: &mut egui::Ui, + title: &'static str, + ) { + let available_size = ui.available_size(); + let window_size = available_size - MARGIN; + let mut show_account_management = STATE_ACCOUNT_MANAGEMENT.get_state(ctx); + if show_account_management { + overlay_window(&mut show_account_management, window_size, title).show(ctx, |ui| { + AccountManagementView::from_app(app).ui(ui); + }); + // user could have closed the window, set the new state in egui memory + STATE_ACCOUNT_MANAGEMENT.set_state(ctx, show_account_management); + } + } } mod preview { diff --git a/src/ui/profile/profile_preview_controller.rs b/src/ui/profile/profile_preview_controller.rs index 15e9e25..1a74884 100644 --- a/src/ui/profile/profile_preview_controller.rs +++ b/src/ui/profile/profile_preview_controller.rs @@ -1,7 +1,10 @@ use enostr::Pubkey; use nostrdb::{Ndb, Transaction}; -use crate::{account_manager::AccountManager, imgcache::ImageCache, DisplayName}; +use crate::{ + account_manager::AccountManager, imgcache::ImageCache, + ui::state_in_memory::STATE_ACCOUNT_SWITCHER, DisplayName, +}; use super::preview::{get_display_name, SimpleProfilePreview}; @@ -105,6 +108,7 @@ impl<'a> SimpleProfilePreviewController<'a> { if add_preview_ui(ui, preview, width, is_selected, i) { account_manager.select_account(i); + STATE_ACCOUNT_SWITCHER.set_state(ui.ctx(), false); } } } diff --git a/src/ui/side_panel.rs b/src/ui/side_panel.rs index 2c9bb71..b705b44 100644 --- a/src/ui/side_panel.rs +++ b/src/ui/side_panel.rs @@ -3,7 +3,7 @@ use egui::{Button, Layout, SidePanel, Vec2}; use crate::ui::global_popup::GlobalPopupType; use super::{ - state_in_memory::{STATE_GLOBAL_POPUP, STATE_SIDE_PANEL}, + state_in_memory::{STATE_ACCOUNT_SWITCHER, STATE_SIDE_PANEL}, View, }; @@ -32,8 +32,9 @@ impl DesktopSidePanel { .add_sized(Vec2::new(32.0, 32.0), Button::new("A")) .clicked() { - STATE_SIDE_PANEL.set_state(ui.ctx(), Some(GlobalPopupType::AccountManagement)); - STATE_GLOBAL_POPUP.set_state(ui.ctx(), true); + STATE_SIDE_PANEL.set_state(ui.ctx(), Some(GlobalPopupType::AccountSwitcher)); + let previous_val = STATE_ACCOUNT_SWITCHER.get_state(ui.ctx()); + STATE_ACCOUNT_SWITCHER.set_state(ui.ctx(), !previous_val); } ui.add_space(spacing_amt); ui.add(settings_button(dark_mode)); diff --git a/src/ui/state_in_memory.rs b/src/ui/state_in_memory.rs index 7823cb8..09d37f1 100644 --- a/src/ui/state_in_memory.rs +++ b/src/ui/state_in_memory.rs @@ -33,11 +33,11 @@ pub static STATE_SIDE_PANEL: StateInMemory> = default_state: None, }; -pub static STATE_GLOBAL_POPUP: StateInMemory = StateInMemory:: { - id: GLOBAL_POPUP_VIEW_STATE_ID, +pub static STATE_ACCOUNT_SWITCHER: StateInMemory = StateInMemory:: { + id: ACCOUNT_SWITCHER_VIEW_STATE_ID, default_state: false, }; static ACCOUNT_MANAGEMENT_VIEW_STATE_ID: &str = "account management view state"; static SIDE_PANEL_VIEW_STATE_ID: &str = "side panel view state"; -static GLOBAL_POPUP_VIEW_STATE_ID: &str = "global popup view state"; +static ACCOUNT_SWITCHER_VIEW_STATE_ID: &str = "account switcher view state";