notedeck

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

commit e7113b17a81319c0743e5db4a523f98dadb9f220
parent e2be2ddd5800b4f077c83cf0be7b019174bbaf8f
Author: kernelkind <kernelkind@gmail.com>
Date:   Wed,  5 Mar 2025 17:20:08 -0500

fix note context menu placement inside rect

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck_columns/src/ui/note/mod.rs | 59++++++++++++++++-------------------------------------------
Mcrates/notedeck_columns/src/ui/note/post.rs | 8+++++---
Mcrates/notedeck_columns/src/ui/note/quote_repost.rs | 5+++--
3 files changed, 24 insertions(+), 48 deletions(-)

diff --git a/crates/notedeck_columns/src/ui/note/mod.rs b/crates/notedeck_columns/src/ui/note/mod.rs @@ -310,36 +310,19 @@ impl<'a> NoteView<'a> { note_cache: &mut NoteCache, note: &Note, profile: &Result<nostrdb::ProfileRecord<'_>, nostrdb::Error>, - options: NoteOptions, - container_right: Pos2, - ) -> NoteResponse { + ) { #[cfg(feature = "profiling")] puffin::profile_function!(); let note_key = note.key().unwrap(); - let inner_response = ui.horizontal(|ui| { + ui.horizontal(|ui| { ui.spacing_mut().item_spacing.x = 2.0; ui.add(ui::Username::new(profile.as_ref().ok(), note.pubkey()).abbreviated(20)); let cached_note = note_cache.cached_note_or_insert_mut(note_key, note); render_reltime(ui, cached_note, true); - - if options.has_options_button() { - let context_pos = { - let size = NoteContextButton::max_width(); - let min = Pos2::new(container_right.x - size, container_right.y); - Rect::from_min_size(min, egui::vec2(size, size)) - }; - - let resp = ui.add(NoteContextButton::new(note_key).place_at(context_pos)); - NoteContextButton::menu(ui, resp.clone()) - } else { - None - } }); - - NoteResponse::new(inner_response.response).select_option(inner_response.inner) } fn show_standard(&mut self, ui: &mut egui::Ui) -> NoteResponse { @@ -354,12 +337,6 @@ impl<'a> NoteView<'a> { let hitbox_id = note_hitbox_id(note_key, self.options(), self.parent); let profile = self.ndb.get_profile_by_pubkey(txn, self.note.pubkey()); let maybe_hitbox = maybe_note_hitbox(ui, hitbox_id); - let container_right = { - let r = ui.available_rect_before_wrap(); - let x = r.max.x; - let y = r.min.y; - Pos2::new(x, y) - }; // wide design let response = if self.options().has_wide() { @@ -375,15 +352,7 @@ impl<'a> NoteView<'a> { ui.vertical(|ui| { ui.add_sized([size.x, self.options().pfp_size()], |ui: &mut egui::Ui| { ui.horizontal_centered(|ui| { - selected_option = NoteView::note_header( - ui, - self.note_cache, - self.note, - &profile, - self.options(), - container_right, - ) - .context_selection; + NoteView::note_header(ui, self.note_cache, self.note, &profile); }) .response }); @@ -449,15 +418,7 @@ impl<'a> NoteView<'a> { }; ui.with_layout(egui::Layout::top_down(egui::Align::LEFT), |ui| { - selected_option = NoteView::note_header( - ui, - self.note_cache, - self.note, - &profile, - self.options(), - container_right, - ) - .context_selection; + NoteView::note_header(ui, self.note_cache, self.note, &profile); ui.horizontal(|ui| { ui.spacing_mut().item_spacing.x = 2.0; @@ -510,6 +471,18 @@ impl<'a> NoteView<'a> { .response }; + if self.options().has_options_button() { + let context_pos = { + let size = NoteContextButton::max_width(); + let top_right = response.rect.right_top(); + let min = Pos2::new(top_right.x - size, top_right.y); + Rect::from_min_size(min, egui::vec2(size, size)) + }; + + let resp = ui.add(NoteContextButton::new(note_key).place_at(context_pos)); + selected_option = NoteContextButton::menu(ui, resp.clone()); + } + let note_action = if note_hitbox_clicked(ui, hitbox_id, &response.rect, maybe_hitbox) { if let Ok(selection) = ThreadSelection::from_note_id( self.ndb, diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs @@ -323,8 +323,9 @@ impl<'a> PostView<'a> { context_selection = Frame::none() .show(ui, |ui| { ui.vertical(|ui| { - ui.set_max_width(avail_size.x * 0.8); - render_note_preview( + let set_width = avail_size.x * 0.8; + ui.set_max_width(set_width); + let resp = render_note_preview( ui, self.ndb, self.note_cache, @@ -333,7 +334,8 @@ impl<'a> PostView<'a> { id.bytes(), nostrdb::NoteKey::new(0), self.note_options, - ) + ); + resp }) .inner .context_selection diff --git a/crates/notedeck_columns/src/ui/note/quote_repost.rs b/crates/notedeck_columns/src/ui/note/quote_repost.rs @@ -51,7 +51,7 @@ impl<'a> QuoteRepostView<'a> { let id = self.id(); let quoting_note_id = self.quoting_note.id(); - ui::PostView::new( + let post_resp = ui::PostView::new( self.ndb, self.draft, PostType::Quote(NoteId::new(quoting_note_id.to_owned())), @@ -62,7 +62,8 @@ impl<'a> QuoteRepostView<'a> { self.note_options, ) .id_source(id) - .ui(self.quoting_note.txn().unwrap(), ui) + .ui(self.quoting_note.txn().unwrap(), ui); + post_resp } pub fn id_source(mut self, id: egui::Id) -> Self {