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 }