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:
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,
}