notedeck

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

commit 119456e2b39c666bb679182d5bccb3c4f6824786
parent cd560cb7bf9f56968a8fa9bc81fc21b0a1340b50
Author: William Casarin <jb55@jb55.com>
Date:   Tue, 15 Jul 2025 12:42:20 -0700

columns: switch to bitflag app options

we're adding a ScrollToTop bool for an updating change
to the toolbar, but we have too many flags now. Let's switch
to bitflags

Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mcrates/notedeck_columns/src/app.rs | 50+++++++++++++++++++++++++++-----------------------
Mcrates/notedeck_columns/src/lib.rs | 1+
Acrates/notedeck_columns/src/options.rs | 26++++++++++++++++++++++++++
Mcrates/notedeck_columns/src/ui/add_column.rs | 5+++--
4 files changed, 57 insertions(+), 25 deletions(-)

diff --git a/crates/notedeck_columns/src/app.rs b/crates/notedeck_columns/src/app.rs @@ -4,6 +4,7 @@ use crate::{ decks::{Decks, DecksCache}, draft::Drafts, nav::{self, ProcessNavResult}, + options::AppOptions, route::Route, storage, subscriptions::{SubKind, Subscriptions}, @@ -14,22 +15,18 @@ use crate::{ Result, }; +use egui_extras::{Size, StripBuilder}; +use enostr::{ClientMessage, PoolRelay, Pubkey, RelayEvent, RelayMessage, RelayPool}; +use nostrdb::Transaction; use notedeck::{ ui::is_narrow, Accounts, AppAction, AppContext, DataPath, DataPathType, FilterState, UnknownIds, }; use notedeck_ui::{jobs::JobsCache, NoteOptions}; - -use enostr::{ClientMessage, PoolRelay, Pubkey, RelayEvent, RelayMessage, RelayPool}; -use uuid::Uuid; - -use egui_extras::{Size, StripBuilder}; - -use nostrdb::Transaction; - use std::collections::{BTreeSet, HashMap}; use std::path::Path; use std::time::Duration; use tracing::{debug, error, info, trace, warn}; +use uuid::Uuid; #[derive(Debug, Eq, PartialEq, Clone)] pub enum DamusState { @@ -53,9 +50,7 @@ pub struct Damus { // TODO: make these bitflags /// Were columns loaded from the commandline? If so disable persistence. - pub tmp_columns: bool, - pub debug: bool, - pub since_optimize: bool, + pub options: AppOptions, pub note_options: NoteOptions, pub unrecognized_args: BTreeSet<String>, @@ -117,7 +112,7 @@ fn try_process_event( .send_initial_filters(app_ctx.pool, &ev.relay); timeline::send_initial_timeline_filters( - damus.since_optimize, + damus.options.contains(AppOptions::SinceOptimize), &mut damus.timeline_cache, &mut damus.subscriptions, app_ctx.pool, @@ -394,7 +389,10 @@ impl Damus { let account = ctx.accounts.selected_account_pubkey_bytes(); let mut timeline_cache = TimelineCache::default(); + let mut options = AppOptions::default(); let tmp_columns = !parsed_args.columns.is_empty(); + options.set(AppOptions::TmpColumns, tmp_columns); + let decks_cache = if tmp_columns { info!("DecksCache: loading from command line arguments"); let mut columns: Columns = Columns::new(); @@ -436,7 +434,6 @@ impl Damus { //} }; - let debug = ctx.args.debug; let support = Support::new(ctx.path); let mut note_options = NoteOptions::default(); note_options.set( @@ -451,6 +448,11 @@ impl Damus { NoteOptions::HideMedia, parsed_args.is_flag_set(ColumnsFlag::NoMedia), ); + options.set(AppOptions::Debug, ctx.args.debug); + options.set( + AppOptions::SinceOptimize, + parsed_args.is_flag_set(ColumnsFlag::SinceOptimize), + ); let jobs = JobsCache::default(); @@ -458,23 +460,27 @@ impl Damus { Self { subscriptions: Subscriptions::default(), - since_optimize: parsed_args.is_flag_set(ColumnsFlag::SinceOptimize), timeline_cache, drafts: Drafts::default(), state: DamusState::Initializing, note_options, + options, //frame_history: FrameHistory::default(), view_state: ViewState::default(), - tmp_columns, support, decks_cache, - debug, unrecognized_args, jobs, threads, } } + /// Scroll to the top of the currently selected column. This is called + /// by the chrome when you click the toolbar + pub fn scroll_to_top(&mut self) { + self.options.insert(AppOptions::ScrollToTop) + } + pub fn columns_mut(&mut self, accounts: &Accounts) -> &mut Columns { get_active_columns_mut(accounts, &mut self.decks_cache) } @@ -484,7 +490,7 @@ impl Damus { } pub fn gen_subid(&self, kind: &SubKind) -> String { - if self.debug { + if self.options.contains(AppOptions::Debug) { format!("{:?}", kind) } else { Uuid::new_v4().to_string() @@ -497,22 +503,20 @@ impl Damus { let path = DataPath::new(&data_path); let imgcache_dir = path.path(DataPathType::Cache); let _ = std::fs::create_dir_all(imgcache_dir.clone()); - let debug = true; + let options = AppOptions::default() | AppOptions::Debug | AppOptions::TmpColumns; let support = Support::new(&path); Self { - debug, subscriptions: Subscriptions::default(), - since_optimize: true, timeline_cache: TimelineCache::default(), drafts: Drafts::default(), state: DamusState::Initializing, note_options: NoteOptions::default(), - tmp_columns: true, //frame_history: FrameHistory::default(), view_state: ViewState::default(), support, + options, decks_cache, unrecognized_args: BTreeSet::default(), jobs: JobsCache::default(), @@ -562,7 +566,7 @@ fn render_damus_mobile( if let Some(r) = &r { match r { ProcessNavResult::SwitchOccurred => { - if !app.tmp_columns { + if !app.options.contains(AppOptions::TmpColumns) { storage::save_decks_cache(app_ctx.path, &app.decks_cache); } } @@ -782,7 +786,7 @@ fn timelines_view( } } - if app.tmp_columns { + if app.options.contains(AppOptions::TmpColumns) { save_cols = false; } diff --git a/crates/notedeck_columns/src/lib.rs b/crates/notedeck_columns/src/lib.rs @@ -17,6 +17,7 @@ pub mod login_manager; mod media_upload; mod multi_subscriber; mod nav; +pub mod options; mod post; mod profile; mod route; diff --git a/crates/notedeck_columns/src/options.rs b/crates/notedeck_columns/src/options.rs @@ -0,0 +1,26 @@ +use bitflags::bitflags; + +bitflags! { + // Attributes can be applied to flags types + #[repr(transparent)] + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + pub struct AppOptions: u64 { + /// Explicitly enable/disable column persistence for the sessions + const TmpColumns = 1 << 0; + + /// Debug mode for debug ui controls + const Debug = 1 << 1; + + /// Should we explicitly disable since optimization? + const SinceOptimize = 1 << 2; + + /// Should we scroll to top on the active column? + const ScrollToTop = 1 << 3; + } +} + +impl Default for AppOptions { + fn default() -> AppOptions { + AppOptions::SinceOptimize + } +} diff --git a/crates/notedeck_columns/src/ui/add_column.rs b/crates/notedeck_columns/src/ui/add_column.rs @@ -11,6 +11,7 @@ use tracing::error; use crate::{ login_manager::AcquireKeyState, + options::AppOptions, route::Route, timeline::{kind::ListKind, PubkeySource, TimelineKind}, Damus, @@ -622,7 +623,7 @@ pub fn render_add_column_routes( &mut app.subscriptions, ctx.pool, ctx.note_cache, - app.since_optimize, + app.options.contains(AppOptions::SinceOptimize), ctx.accounts, ); @@ -664,7 +665,7 @@ pub fn render_add_column_routes( &mut app.subscriptions, ctx.pool, ctx.note_cache, - app.since_optimize, + app.options.contains(AppOptions::SinceOptimize), ctx.accounts, );