tool_switcher.rs - icy_draw - icy_draw is the successor to mystic draw. fork / mirror
 (HTM) git clone https://git.drkhsh.at/icy_draw.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tool_switcher.rs (2332B)
       ---
            1 use crate::{MainWindow, Message};
            2 use eframe::{
            3     egui::{self, Sense},
            4     epaint::{Rect, Rounding, Vec2},
            5 };
            6 use egui::RichText;
            7 
            8 pub fn add_tool_switcher(_ctx: &egui::Context, ui: &mut egui::Ui, arg: &MainWindow<'_>) -> Option<Message> {
            9     let mut msg = None;
           10     let spacing = 4.0;
           11     let icon_size = 28.0;
           12 
           13     let tools = arg.document_behavior.tools.lock();
           14     if tools[arg.document_behavior.get_selected_tool()].is_exclusive() {
           15         return msg;
           16     }
           17     let (id, back_rect) = ui.allocate_space(Vec2::new(230., 68.0));
           18     let mut pos = back_rect.min + Vec2::new(spacing, spacing);
           19 
           20     for i in 0..tools.len() {
           21         let t = &tools[i];
           22         if !t.is_visible() {
           23             continue;
           24         }
           25 
           26         let rect = Rect::from_min_size(pos.floor(), Vec2::new(icon_size, icon_size));
           27         let response = ui.interact(rect, id.with(i), Sense::click());
           28         if i == arg.document_behavior.get_selected_tool() {
           29             ui.painter()
           30                 .rect_filled(rect.expand(2.0), Rounding::same(4.0), ui.style().visuals.extreme_bg_color);
           31             ui.painter()
           32                 .rect_stroke(rect.expand(2.0), Rounding::same(4.0), ui.style().visuals.window_stroke);
           33         }
           34 
           35         if response.hovered() {
           36             ui.painter()
           37                 .rect_filled(rect.expand(2.0), Rounding::same(4.0), ui.style().visuals.widgets.active.bg_fill);
           38             ui.painter()
           39                 .rect_stroke(rect.expand(2.0), Rounding::same(4.0), ui.style().visuals.window_stroke);
           40         }
           41 
           42         let tint = if i == arg.document_behavior.get_selected_tool() {
           43             ui.visuals().widgets.active.fg_stroke.color
           44         } else {
           45             ui.visuals().widgets.inactive.fg_stroke.color
           46         };
           47         let mut image = t.get_icon().clone();
           48         image = image.tint(tint);
           49         image.paint_at(ui, rect);
           50         let response = response.on_hover_ui(|ui| {
           51             ui.strong(RichText::new(t.tool_name()).small());
           52             ui.label(RichText::new(t.tooltip()).small());
           53         });
           54         pos.x += icon_size + spacing;
           55         if pos.x - back_rect.min.x - spacing > back_rect.width() {
           56             pos.x = back_rect.min.x + spacing;
           57             pos.y += icon_size + spacing;
           58         }
           59 
           60         if response.clicked() {
           61             msg = Some(Message::SelectTool(i));
           62         }
           63     }
           64     msg
           65 }