notedeck

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

commit 44edffc59679af89a9e7e8bb1db6236e5f7ec94a
parent 6596e89e2903b56e942ed45a6c979ae0aa2c61de
Author: William Casarin <jb55@jb55.com>
Date:   Fri, 11 Jul 2025 15:36:56 -0700

android/input: add copy/paste context to post input

Fixes: https://github.com/damus-io/notedeck/issues/942
Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mcrates/notedeck/src/note/mod.rs | 1+
Mcrates/notedeck_columns/src/nav.rs | 3++-
Mcrates/notedeck_columns/src/ui/note/post.rs | 17+++++++++++++----
Mcrates/notedeck_columns/src/ui/search/mod.rs | 12++++--------
Mcrates/notedeck_dave/src/ui/dave.rs | 1+
5 files changed, 21 insertions(+), 13 deletions(-)

diff --git a/crates/notedeck/src/note/mod.rs b/crates/notedeck/src/note/mod.rs @@ -23,6 +23,7 @@ pub struct NoteContext<'d> { pub pool: &'d mut RelayPool, pub job_pool: &'d mut JobPool, pub unknown_ids: &'d mut UnknownIds, + pub clipboard: &'d mut egui_winit::clipboard::Clipboard, pub current_account_has_wallet: bool, } diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -432,6 +432,7 @@ fn render_nav_body( pool: ctx.pool, job_pool: ctx.job_pool, unknown_ids: ctx.unknown_ids, + clipboard: ctx.clipboard, current_account_has_wallet: get_current_wallet(ctx.accounts, ctx.global_wallet).is_some(), }; match top { @@ -604,7 +605,7 @@ fn render_nav_body( &(&ctx.accounts.get_selected_account().key).into(), &mut app.jobs, ) - .show(ui, ctx.clipboard) + .show(ui) .map(RenderNavAction::NoteAction) } Route::NewDeck => { diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs @@ -14,12 +14,13 @@ use egui::{ }; use enostr::{FilledKeypair, FullKeypair, KeypairUnowned, NoteId, Pubkey, RelayPool}; use nostrdb::{Ndb, Transaction}; -use notedeck_ui::app_images; -use notedeck_ui::blur::PixelDimensions; -use notedeck_ui::images::{get_render_state, RenderState}; -use notedeck_ui::jobs::JobsCache; use notedeck_ui::{ + app_images, + blur::PixelDimensions, + context_menu::{input_context, PasteBehavior}, gif::{handle_repaint, retrieve_latest_texture}, + images::{get_render_state, RenderState}, + jobs::JobsCache, note::render_note_preview, NoteOptions, ProfilePic, }; @@ -186,6 +187,13 @@ impl<'a, 'd> PostView<'a, 'd> { let out = textedit.show(ui); + input_context( + &out.response, + self.note_context.clipboard, + &mut self.draft.buffer.text_buffer, + PasteBehavior::Append, + ); + if updated_layout { self.draft.buffer.selected_mention = false; } @@ -792,6 +800,7 @@ mod preview { job_pool: app.job_pool, unknown_ids: app.unknown_ids, current_account_has_wallet: false, + clipboard: app.clipboard, }; PostView::new( diff --git a/crates/notedeck_columns/src/ui/search/mod.rs b/crates/notedeck_columns/src/ui/search/mod.rs @@ -52,22 +52,18 @@ impl<'a, 'd> SearchView<'a, 'd> { } } - pub fn show(&mut self, ui: &mut egui::Ui, clipboard: &mut Clipboard) -> Option<NoteAction> { - padding(8.0, ui, |ui| self.show_impl(ui, clipboard)).inner + pub fn show(&mut self, ui: &mut egui::Ui) -> Option<NoteAction> { + padding(8.0, ui, |ui| self.show_impl(ui)).inner } - pub fn show_impl( - &mut self, - ui: &mut egui::Ui, - clipboard: &mut Clipboard, - ) -> Option<NoteAction> { + pub fn show_impl(&mut self, ui: &mut egui::Ui) -> Option<NoteAction> { ui.spacing_mut().item_spacing = egui::vec2(0.0, 12.0); let search_resp = search_box( &mut self.query.string, self.query.focus_state.clone(), ui, - clipboard, + self.note_context.clipboard, ); search_resp.process(self.query); diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -217,6 +217,7 @@ impl<'a> DaveUi<'a> { pool: ctx.pool, job_pool: ctx.job_pool, unknown_ids: ctx.unknown_ids, + clipboard: ctx.clipboard, current_account_has_wallet: false, };