notedeck

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

commit 66b35c5026e00ddd786c0de707494bf30a66cdab
parent e37c14c9eb6d0c2dd9ce46d4f808194706e6b06b
Author: kernelkind <kernelkind@gmail.com>
Date:   Sat,  1 Mar 2025 18:15:49 -0500

add button for closing mention hints

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

Diffstat:
Mcrates/notedeck_columns/src/ui/search_results.rs | 52+++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 51 insertions(+), 1 deletion(-)

diff --git a/crates/notedeck_columns/src/ui/search_results.rs b/crates/notedeck_columns/src/ui/search_results.rs @@ -1,4 +1,4 @@ -use egui::{vec2, FontId, Pos2, Rect, ScrollArea, Vec2b}; +use egui::{vec2, FontId, Layout, Pos2, Rect, ScrollArea, Stroke, UiBuilder, Vec2b}; use nostrdb::{Ndb, ProfileRecord, Transaction}; use notedeck::{fonts::get_font_size, Images, NotedeckTextStyle}; use tracing::error; @@ -69,6 +69,28 @@ impl<'a> SearchResultsView<'a> { .inner_margin(inner_margin_size) .show(ui, |ui| { let width = rect.width() - (2.0 * inner_margin_size); + + let _close_button_resp = { + let close_button_size = 16.0; + let (close_section_rect, _) = ui.allocate_exact_size( + vec2(width, close_button_size), + egui::Sense::hover(), + ); + let (_, button_rect) = close_section_rect.split_left_right_at_x( + close_section_rect.right() - close_button_size, + ); + let button_resp = ui.allocate_rect(button_rect, egui::Sense::click()); + ui.allocate_new_ui( + UiBuilder::new() + .max_rect(close_section_rect) + .layout(Layout::right_to_left(egui::Align::Center)), + |ui| ui.add(close_button(button_resp.rect)).clicked(), + ) + .inner + }; + + ui.add_space(8.0); + let scroll_resp = ScrollArea::vertical() .max_width(width) .auto_shrink(Vec2b::FALSE) @@ -135,3 +157,31 @@ fn user_result<'a>( pfp_resp.union(helper.take_animation_response()) } } + +fn close_button(rect: egui::Rect) -> impl egui::Widget { + move |ui: &mut egui::Ui| -> egui::Response { + let max_width = rect.width(); + let helper = AnimationHelper::new_from_rect(ui, "user_search_close", rect); + + let fill_color = ui.visuals().text_color(); + + let radius = max_width / (2.0 * ICON_EXPANSION_MULTIPLE); + + let painter = ui.painter(); + let nw_edge = painter + .round_pos_to_pixel_center(helper.scale_pos_from_center(Pos2::new(-radius, radius))); + let se_edge = painter + .round_pos_to_pixel_center(helper.scale_pos_from_center(Pos2::new(radius, -radius))); + let sw_edge = painter + .round_pos_to_pixel_center(helper.scale_pos_from_center(Pos2::new(-radius, -radius))); + let ne_edge = painter + .round_pos_to_pixel_center(helper.scale_pos_from_center(Pos2::new(radius, radius))); + + let line_width = helper.scale_1d_pos(2.0); + + painter.line_segment([nw_edge, se_edge], Stroke::new(line_width, fill_color)); + painter.line_segment([ne_edge, sw_edge], Stroke::new(line_width, fill_color)); + + helper.take_animation_response() + } +}