From 87b5dfad9c1a690e2817b525c0056fbc668d7512 Mon Sep 17 00:00:00 2001 From: Fredrick Brennan Date: Tue, 28 Mar 2023 00:38:10 -0400 Subject: [PATCH] Split binding icon buttons to responses from building icon buttons --- src/user_interface/gui/icons/mod.rs | 3 ++ src/user_interface/gui/mod.rs | 8 ++-- src/user_interface/gui/tool_bar.rs | 66 +++++------------------------ 3 files changed, 18 insertions(+), 59 deletions(-) diff --git a/src/user_interface/gui/icons/mod.rs b/src/user_interface/gui/icons/mod.rs index bb0c2f1..86b4b22 100644 --- a/src/user_interface/gui/icons/mod.rs +++ b/src/user_interface/gui/icons/mod.rs @@ -1,3 +1,6 @@ +mod button; +pub use self::button::build as build_button; + pub const _KNIFE: &str = "\u{F000}"; pub const MEASURE: &str = "\u{F001}"; pub const PAN: &str = "\u{F002}"; diff --git a/src/user_interface/gui/mod.rs b/src/user_interface/gui/mod.rs index d1d5a28..34bec58 100644 --- a/src/user_interface/gui/mod.rs +++ b/src/user_interface/gui/mod.rs @@ -1,15 +1,15 @@ pub mod icons; +pub use self::icons::build_button as build_icon_button; pub mod menu_bar; +#[macro_use] +pub(crate) mod msgbox; +pub(crate) use self::msgbox::gui_error as error; pub mod prompts; pub mod textedit_buffer; pub mod tool_bar; pub mod window; pub mod windows; -#[macro_use] -pub(crate) mod msgbox; - -pub(crate) use self::msgbox::gui_error as error; use self::window::{GlifWindow, WindowManager}; use super::{egui_manager::EguiManager, Interface}; use crate::editor::Editor; diff --git a/src/user_interface/gui/tool_bar.rs b/src/user_interface/gui/tool_bar.rs index 6b05379..2b4bc95 100644 --- a/src/user_interface/gui/tool_bar.rs +++ b/src/user_interface/gui/tool_bar.rs @@ -1,65 +1,21 @@ -use egui::{Align2, Color32, Context, Stroke, Ui}; -use lazy_static::lazy_static; +use egui::{Align2, Context, Ui}; +use crate::{constants::*, editor::Editor, tools::ToolEnum, user_interface::{Interface, gui::build_icon_button}}; -use super::super::icons; +use super::icons; -use crate::{constants::*, editor::Editor, tools::ToolEnum, user_interface::Interface}; - -pub fn build_button(v: &mut Editor, ui: &mut Ui, text: &str, te: ToolEnum) { - let stroke = if v.get_tool() == te { - Stroke { - width: 2.0, - color: Color32::from_rgb(255, 190, 0), - } - } else { - Stroke::NONE - }; - - let use_button_font = text - .chars() - .nth(0) - .map(u32::from) - .map(|c| c >= 0xF000 && c <= 0xF037) - .unwrap_or(false); - let icons_font_family = egui::FontFamily::Name("icons".into()); - let icons_font_id = egui::FontId { - family: icons_font_family.clone(), - ..Default::default() - }; - let size = ui.fonts(|f| f.row_height(&icons_font_id)); - let EGUI_DEFAULT_BUTTON_FONT_ID: egui::FontId = { - let s = ui.style_mut(); - s.text_styles.get(&egui::TextStyle::Button).unwrap().clone() - }; - if use_button_font { - let s = ui.style_mut(); - s.text_styles.insert( - egui::TextStyle::Button, - egui::FontId { - family: icons_font_family, - size, - }, - ); - } - { - let button = egui::Button::new(text) - .stroke(stroke) - .min_size(egui::vec2(22. * FONT_SCALE_FACTOR, 30. * FONT_SCALE_FACTOR)); - - let response = ui.add(button); +fn build_button<'a>(v: &mut Editor, ui: &mut Ui, text: &str, te: ToolEnum) { + // Must build button outside bind_response so that v can move into the closure. + let b = build_icon_button(v, ui, text, te); + let mut bind_response = |response: egui::Response| { if response.clicked() { v.set_tool(te); - response.on_hover_text(format!("{:?}", te)); + response.on_hover_text(format!("{:?}", te.to_string())); } - } - if use_button_font { - let s = ui.style_mut(); - *(s.text_styles.get_mut(&egui::TextStyle::Button).unwrap()) = EGUI_DEFAULT_BUTTON_FONT_ID; - let s = s.to_owned(); - ui.set_style(s.to_owned()); - } + }; + bind_response(b) } + pub fn tool_bar(ctx: &Context, v: &mut Editor, _i: &mut Interface) { egui::Window::new("Tools") .anchor(Align2::LEFT_TOP, [16., 31. * FONT_SCALE_FACTOR])