notedeck

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

commit e32059054091170394a555e1454545fbf98e675b
parent 0ca4db572dd95f0e5b4df8deb56eb5c7c148f086
Author: Martti Malmi <sirius@iki.fi>
Date:   Wed,  5 Nov 2025 16:12:11 +0200

autofocus new post form

Changelog-Changed: Auto focus input field on new posts

Diffstat:
Mcrates/notedeck_columns/src/draft.rs | 8+++++++-
Mcrates/notedeck_columns/src/nav.rs | 11+++++++++++
Mcrates/notedeck_columns/src/ui/note/post.rs | 7+++++++
Mcrates/notedeck_columns/src/ui/search/state.rs | 3++-
4 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/crates/notedeck_columns/src/draft.rs b/crates/notedeck_columns/src/draft.rs @@ -1,7 +1,12 @@ use egui::text::LayoutJob; use poll_promise::Promise; -use crate::{media_upload::Nip94Event, post::PostBuffer, ui::note::PostType, Error}; +use crate::{ + media_upload::Nip94Event, + post::PostBuffer, + ui::{note::PostType, search::FocusState}, + Error, +}; use std::collections::HashMap; #[derive(Default)] @@ -12,6 +17,7 @@ pub struct Draft { pub uploaded_media: Vec<Nip94Event>, // media uploads to include pub uploading_media: Vec<Promise<Result<Nip94Event, Error>>>, // promises that aren't ready yet pub upload_errors: Vec<String>, // media upload errors to show the user + pub focus_state: FocusState, } pub struct MentionHint { diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -782,8 +782,19 @@ fn render_nav_body( let Some(kp) = ctx.accounts.get_selected_account().key.to_full() else { return BodyResponse::none(); }; + let navigating = + get_active_columns_mut(note_context.i18n, ctx.accounts, &mut app.decks_cache) + .column(col) + .router() + .navigating; let draft = app.drafts.compose_mut(); + if navigating { + draft.focus_state = FocusState::Navigating + } else if draft.focus_state == FocusState::Navigating { + draft.focus_state = FocusState::ShouldRequestFocus; + } + let txn = Transaction::new(ctx.ndb).expect("txn"); let post_response = ui::PostView::new( &mut note_context, diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs @@ -210,6 +210,13 @@ impl<'a, 'd> PostView<'a, 'd> { let out = textedit.show(ui); + if self.draft.focus_state == crate::ui::search::FocusState::ShouldRequestFocus { + out.response.request_focus(); + self.draft.focus_state = crate::ui::search::FocusState::RequestedFocus; + } else if self.draft.focus_state == crate::ui::search::FocusState::RequestedFocus { + self.draft.focus_state = crate::ui::search::FocusState::Navigating; + } + input_context( ui, &out.response, diff --git a/crates/notedeck_columns/src/ui/search/state.rs b/crates/notedeck_columns/src/ui/search/state.rs @@ -23,7 +23,7 @@ pub enum RecentSearchItem { Profile { pubkey: Pubkey, query: String }, } -#[derive(Debug, Eq, PartialEq, Clone)] +#[derive(Debug, Eq, PartialEq, Clone, Default)] pub enum FocusState { /// Get ready to focus Navigating, @@ -32,6 +32,7 @@ pub enum FocusState { ShouldRequestFocus, /// We already focused, we don't need to do that again + #[default] RequestedFocus, }