From a31fdd3ed2f5284a8c02c3bcb601a9bfc2990638 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Wed, 16 Jul 2025 20:20:41 -0400 Subject: [PATCH 1/3] use saturating sub Signed-off-by: kernelkind --- crates/notedeck_columns/src/multi_subscriber.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/notedeck_columns/src/multi_subscriber.rs b/crates/notedeck_columns/src/multi_subscriber.rs index d69d6776..3624f931 100644 --- a/crates/notedeck_columns/src/multi_subscriber.rs +++ b/crates/notedeck_columns/src/multi_subscriber.rs @@ -466,12 +466,10 @@ impl TimelineSub { let before = self.state.clone(); 's: { match &mut self.state { - SubState::NoSub { dependers } => { - *dependers -= 1; - } + SubState::NoSub { dependers } => *dependers = dependers.saturating_sub(1), SubState::LocalOnly { local, dependers } => { if *dependers > 1 { - *dependers -= 1; + *dependers = dependers.saturating_sub(1); break 's; } @@ -484,7 +482,7 @@ impl TimelineSub { } SubState::RemoteOnly { remote, dependers } => { if *dependers > 1 { - *dependers -= 1; + *dependers = dependers.saturating_sub(1); break 's; } @@ -494,7 +492,7 @@ impl TimelineSub { } SubState::Unified { unified, dependers } => { if *dependers > 1 { - *dependers -= 1; + *dependers = dependers.saturating_sub(1); break 's; } From 45490c918db7efce4030744be62940796b3ba905 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Wed, 9 Jul 2025 20:25:25 -0400 Subject: [PATCH 2/3] add new Accounts button to chrome sidebar Signed-off-by: kernelkind --- assets/icons/accounts.png | Bin 0 -> 1479 bytes crates/notedeck_chrome/src/chrome.rs | 14 ++++++++++++++ crates/notedeck_ui/src/app_images.rs | 4 ++++ 3 files changed, 18 insertions(+) create mode 100644 assets/icons/accounts.png diff --git a/assets/icons/accounts.png b/assets/icons/accounts.png new file mode 100644 index 0000000000000000000000000000000000000000..2671f225cdef40461757bb42c0493aa1fa311879 GIT binary patch literal 1479 zcmV;&1vvVNP)@~0drDELIAGL9O(c600d`2O+f$vv5yPpq)1xOmQNRdu* z5w~}N-AnQdjCZ_C`ExZ~~Z?au7?%o4cgAfn7%auWt7?73@| zOB1e4I5(l}^?K*nWsJZB6DB4sOt_$UE?nBNQ{HZ13OjNIZ<_@x1KWxz+?3L4I+kLq z6k!UJyFztMai@wP+s9Ao?m4Cn#)za@z+^Zyms1n6h-5sY!mCd^I95eeC@bwY97Yl7Q^>_Desks`Dw-*JQ@rnn81!WSCB z%{v*{8fL*p?mpP$BNWlD63hn=6`9U`LO3Ch0s?T{F$D%S6F;LcPtcO^!$3yd&qtp0 zT-ytZ=h&wRvMndH?igYdT;U5(21THdhqT$^h|^9sEMLrQvX;Ryr3*i$_Lw4F38zSb z?0_S|HItzm;a7xOg0H3JNKioG`CzEeYxvKE-%a?--D}7_`Hnp43PcL;tNj_$6?a8; zCiudHy;^wW;(VM1@}5&-xwS$RNLSozC*)orJaX?!j6L}eJY~OVO4Dx=0`eOF8T?3d z?;8`och?ZBci%?l0kaq2{l$S0&B|Hpy8Va@*i3aI#8pjRP0XPaeg(h#vk;e)X8<;3 zT$;;Lh(4@8xS@c65TV+a79A|i3&g`|q*jo_k5tyRC3j!>VQ=jR(*BKfB*l4Gc&-&( z3en^0kGcY+=D$Q3X~p#l=}2imLzrKM=igR;)DAmY&q>py_#S`}&x|YC#|Ky1eEy$v1RRM0~^-Y2ADwxy8V<;K25 z1Cq(HBaq)ZomJoMH6-RHk~e&JX-4CHgfq`!cb3u9rw5*)cxQL6u}zRQ-)9X`VHwEp zVabIw+;XPW-6^pt36^2<*Zvq9NEW1^npKrH_W-9-P=mja5}i8rkIXz7A60678%~LF z83wLQQ_p*2#6bRq3pcYf+8*97oILSj?e{zi$jwEbGk1#v$*#X_bqlwXVAfd&)xMlU`71qt{O@Nc9Ox9qGUG?X9&Y?tRK-0 zY*5kI7{3hdB!ea~_kjb1iShn!0$YkTUF!$UHd=jFnCuCQ&;dkN0(XHFZ?Fa)1Gx4> zUErA!eg*|mhozNDVA@s$3qFBv5L64#M4uKXyZSm(zRrr^0r3Um2Syf_Jwx2rwVtH| zg&Y3{T^^U`e*4M=zORoNEF_!CAGm9bJFP@l$K_X$HKCo*-E+MZz7r_k-q#idZIg|n zLq+h;bB1ljDPlqGvmnn2)vbf<7_m~uCV!k{JLRqQ@h<;5%QHuY4}XZNA9P}ORS9eU hTDI*3z2}~0-T`0>T}(F*7Cis}002ovPDHLkV1ltTyZitE literal 0 HcmV?d00001 diff --git a/crates/notedeck_chrome/src/chrome.rs b/crates/notedeck_chrome/src/chrome.rs index 54bf004e..114b4b4e 100644 --- a/crates/notedeck_chrome/src/chrome.rs +++ b/crates/notedeck_chrome/src/chrome.rs @@ -563,6 +563,16 @@ fn columns_button(ui: &mut egui::Ui) -> egui::Response { ) } +fn accounts_button(ui: &mut egui::Ui) -> egui::Response { + expanding_button( + "accounts-button", + 24.0, + app_images::accounts_image().tint(ui.visuals().text_color()), + app_images::accounts_image(), + ui, + ) +} + fn dave_sidebar_rect(ui: &mut egui::Ui) -> Rect { let size = vec2(60.0, 60.0); let available = ui.available_rect_before_wrap(); @@ -712,6 +722,7 @@ fn bottomup_sidebar( ui.add_space(8.0); let pfp_resp = pfp_button(ctx, ui).on_hover_cursor(egui::CursorIcon::PointingHand); + let accounts_resp = accounts_button(ui).on_hover_cursor(egui::CursorIcon::PointingHand); let settings_resp = settings_button(ui).on_hover_cursor(egui::CursorIcon::PointingHand); let theme_action = match ui.ctx().theme() { @@ -774,8 +785,11 @@ fn bottomup_sidebar( } } + #[allow(clippy::if_same_then_else)] if pfp_resp.clicked() { Some(ChromePanelAction::Account) + } else if accounts_resp.clicked() { + Some(ChromePanelAction::Account) } else if settings_resp.clicked() { Some(ChromePanelAction::Settings) } else if theme_action.is_some() { diff --git a/crates/notedeck_ui/src/app_images.rs b/crates/notedeck_ui/src/app_images.rs index 719fe92a..1306bd24 100644 --- a/crates/notedeck_ui/src/app_images.rs +++ b/crates/notedeck_ui/src/app_images.rs @@ -11,6 +11,10 @@ pub fn add_account_image() -> Image<'static> { )) } +pub fn accounts_image() -> Image<'static> { + Image::new(include_image!("../../../assets/icons/accounts.png")) +} + pub fn add_column_dark_image() -> Image<'static> { Image::new(include_image!( "../../../assets/icons/add_column_dark_4x.png" From 34afa755b809ce191ea02ab16ff40d4a2dbf820c Mon Sep 17 00:00:00 2001 From: kernelkind Date: Wed, 9 Jul 2025 20:30:09 -0400 Subject: [PATCH 3/3] add ChromePanelAction::Profile & use for pfp Signed-off-by: kernelkind --- crates/notedeck_chrome/src/chrome.rs | 63 ++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/crates/notedeck_chrome/src/chrome.rs b/crates/notedeck_chrome/src/chrome.rs index 114b4b4e..7ee7521b 100644 --- a/crates/notedeck_chrome/src/chrome.rs +++ b/crates/notedeck_chrome/src/chrome.rs @@ -56,6 +56,7 @@ pub enum ChromePanelAction { Wallet, Toolbar(ToolbarAction), SaveTheme(ThemePreference), + Profile(notedeck::enostr::Pubkey), } impl ChromePanelAction { @@ -102,7 +103,7 @@ impl ChromePanelAction { }; } - fn process(&self, ctx: &AppContext, chrome: &mut Chrome, ui: &mut egui::Ui) { + fn process(&self, ctx: &mut AppContext, chrome: &mut Chrome, ui: &mut egui::Ui) { match self { Self::SaveTheme(theme) => { ui.ctx().options_mut(|o| { @@ -154,6 +155,9 @@ impl ChromePanelAction { notedeck_columns::Route::Wallet(WalletType::Auto), ); } + Self::Profile(pk) => { + columns_route_to_profile(pk, chrome, ctx, ui); + } } } } @@ -695,6 +699,59 @@ fn chrome_handle_app_action( } } +fn columns_route_to_profile( + pk: ¬edeck::enostr::Pubkey, + chrome: &mut Chrome, + ctx: &mut AppContext, + ui: &mut egui::Ui, +) { + chrome.switch_to_columns(); + let Some(columns) = chrome.get_columns_app() else { + return; + }; + + let cols = columns + .decks_cache + .active_columns_mut(ctx.accounts) + .unwrap(); + + let router = cols.get_first_router(); + if router.routes().iter().any(|r| { + matches!( + r, + notedeck_columns::Route::Timeline(TimelineKind::Profile(_)) + ) + }) { + router.go_back(); + return; + } + + let txn = Transaction::new(ctx.ndb).unwrap(); + let m_action = notedeck_columns::actionbar::execute_and_process_note_action( + notedeck::NoteAction::Profile(*pk), + ctx.ndb, + cols, + 0, + &mut columns.timeline_cache, + &mut columns.threads, + ctx.note_cache, + ctx.pool, + &txn, + ctx.unknown_ids, + ctx.accounts, + ctx.global_wallet, + ctx.zaps, + ctx.img_cache, + ui, + ); + + if let Some(action) = m_action { + let col = cols.column_mut(0); + + action.process(&mut col.router, &mut col.sheet_router); + } +} + fn pfp_button(ctx: &mut AppContext, ui: &mut egui::Ui) -> egui::Response { let max_size = ICON_WIDTH * ICON_EXPANSION_MULTIPLE; // max size of the widget let helper = AnimationHelper::new(ui, "pfp-button", egui::vec2(max_size, max_size)); @@ -785,9 +842,9 @@ fn bottomup_sidebar( } } - #[allow(clippy::if_same_then_else)] if pfp_resp.clicked() { - Some(ChromePanelAction::Account) + let pk = ctx.accounts.get_selected_account().key.pubkey; + Some(ChromePanelAction::Profile(pk)) } else if accounts_resp.clicked() { Some(ChromePanelAction::Account) } else if settings_resp.clicked() {