widgets.rs (2616B)
1 use crate::anim::{AnimationHelper, ICON_EXPANSION_MULTIPLE}; 2 use egui::{emath::GuiRounding, Pos2, Stroke}; 3 use notedeck::NotedeckTextStyle; 4 5 pub fn x_button(rect: egui::Rect) -> impl egui::Widget { 6 move |ui: &mut egui::Ui| -> egui::Response { 7 let max_width = rect.width(); 8 let helper = AnimationHelper::new_from_rect(ui, "user_search_close", rect); 9 10 let fill_color = ui.visuals().text_color(); 11 12 let radius = max_width / (2.0 * ICON_EXPANSION_MULTIPLE); 13 14 let painter = ui.painter(); 15 let ppp = ui.ctx().pixels_per_point(); 16 let nw_edge = helper 17 .scale_pos_from_center(Pos2::new(-radius, radius)) 18 .round_to_pixel_center(ppp); 19 let se_edge = helper 20 .scale_pos_from_center(Pos2::new(radius, -radius)) 21 .round_to_pixel_center(ppp); 22 let sw_edge = helper 23 .scale_pos_from_center(Pos2::new(-radius, -radius)) 24 .round_to_pixel_center(ppp); 25 let ne_edge = helper 26 .scale_pos_from_center(Pos2::new(radius, radius)) 27 .round_to_pixel_center(ppp); 28 29 let line_width = helper.scale_1d_pos(2.0); 30 31 painter.line_segment([nw_edge, se_edge], Stroke::new(line_width, fill_color)); 32 painter.line_segment([ne_edge, sw_edge], Stroke::new(line_width, fill_color)); 33 34 helper.take_animation_response() 35 } 36 } 37 38 /// Button styled in the Notedeck theme 39 pub fn styled_button_toggleable( 40 text: &str, 41 fill_color: egui::Color32, 42 enabled: bool, 43 ) -> impl egui::Widget + '_ { 44 move |ui: &mut egui::Ui| -> egui::Response { 45 let painter = ui.painter(); 46 let text_color = if ui.visuals().dark_mode { 47 egui::Color32::WHITE 48 } else { 49 egui::Color32::BLACK 50 }; 51 52 let galley = painter.layout( 53 text.to_owned(), 54 NotedeckTextStyle::Button.get_font_id(ui.ctx()), 55 text_color, 56 ui.available_width(), 57 ); 58 59 let size = galley.rect.expand2(egui::vec2(16.0, 8.0)).size(); 60 let mut button = egui::Button::new(galley).corner_radius(8.0); 61 62 if !enabled { 63 button = button 64 .sense(egui::Sense::focusable_noninteractive()) 65 .fill(ui.visuals().noninteractive().bg_fill) 66 .stroke(ui.visuals().noninteractive().bg_stroke); 67 } else { 68 button = button.fill(fill_color); 69 } 70 71 let mut resp = ui.add_sized(size, button); 72 73 if !enabled { 74 resp = resp.on_hover_cursor(egui::CursorIcon::NotAllowed); 75 } 76 77 resp 78 } 79 }