From ad319b643f58e44d5cb0aff9ba5888949504d160 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Thu, 19 Sep 2024 18:58:14 -0400 Subject: [PATCH] can left click note more options button egui doesn't support custom buttons so `stationary_arbitrary_menu_button` had to be hacked together Signed-off-by: kernelkind --- src/ui/note/mod.rs | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/ui/note/mod.rs b/src/ui/note/mod.rs index 62509a7..cbe5155 100644 --- a/src/ui/note/mod.rs +++ b/src/ui/note/mod.rs @@ -19,7 +19,7 @@ use crate::{ notecache::{CachedNote, NoteCache}, ui::{self, View}, }; -use egui::{Align, Id, Label, Layout, Response, RichText, Sense}; +use egui::{menu::BarState, Align, Id, InnerResponse, Label, Layout, Response, RichText, Sense}; use enostr::NoteId; use nostrdb::{Ndb, Note, NoteKey, NoteReply, Transaction}; @@ -412,7 +412,7 @@ impl<'a> NoteView<'a> { if use_options_button { ui.with_layout(Layout::right_to_left(Align::Center), |ui| { let more_options_resp = more_options_button(ui, note_key, 8.0); - options_context_menu(more_options_resp) + options_context_menu(ui, more_options_resp) }) .inner } else { @@ -728,10 +728,13 @@ fn more_options_button(ui: &mut egui::Ui, note_key: NoteKey, max_height: f32) -> response } -fn options_context_menu(more_options_button_resp: egui::Response) -> Option { +fn options_context_menu( + ui: &mut egui::Ui, + more_options_button_resp: egui::Response, +) -> Option { let mut selected_option: Option = None; - more_options_button_resp.context_menu(|ui| { + stationary_arbitrary_menu_button(ui, more_options_button_resp, |ui| { ui.set_max_width(200.0); if ui.button("Copy text").clicked() { selected_option = Some(NoteOptionSelection::CopyText); @@ -746,5 +749,20 @@ fn options_context_menu(more_options_button_resp: egui::Response) -> Option( + ui: &mut egui::Ui, + button_response: egui::Response, + add_contents: impl FnOnce(&mut egui::Ui) -> R, +) -> InnerResponse> { + let bar_id = ui.id(); + let mut bar_state = BarState::load(ui.ctx(), bar_id); + + let inner = bar_state.bar_menu(&button_response, add_contents); + + bar_state.store(ui.ctx(), bar_id); + InnerResponse::new(inner.map(|r| r.inner), button_response) +}