notedeck

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

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 }