use crate::icons::Icon;
use crate::theming;
use egui::{Color32, Response, Sense, Ui, Vec2};
use super::svg_helpers::render_svg_at_rect_themed;
use crate::tokens::DESIGN_TOKENS;
pub fn draw_icon_btn(
ui: &mut Ui,
icon: &Icon,
tooltip: &'static str,
is_active: bool,
size: f32,
) -> Response {
let (rect, response) = ui.allocate_exact_size(Vec2::splat(size), Sense::click());
let bg_color = if is_active && response.hovered() {
theming::active_hover_color(ui)
} else if is_active {
theming::sel_color(ui)
} else if response.hovered() {
theming::hover_color(ui)
} else {
Color32::TRANSPARENT };
ui.painter()
.rect_filled(rect, DESIGN_TOKENS.rounding.button, bg_color);
render_svg_at_rect_themed(ui, icon, rect, response.hovered(), is_active);
response.on_hover_text(tooltip)
}
pub fn draw_toggle_btn(
ui: &mut Ui,
icon: &Icon,
tooltip: &'static str,
is_toggled: bool,
size: f32,
) -> Response {
draw_icon_btn(ui, icon, tooltip, is_toggled, size)
}
pub fn draw_icon_button_padded(
ui: &mut Ui,
icon: &Icon,
tooltip: &str,
is_active: bool,
icon_size: f32,
padding: f32,
) -> Response {
let left_padding = padding;
let size = Vec2::splat(icon_size + padding * 2.0);
let (rect, response) = ui.allocate_exact_size(size, Sense::click());
let bg_color = if is_active {
theming::sel_color(ui)
} else if response.is_pointer_button_down_on() {
theming::active_hover_color(ui)
} else if response.hovered() {
theming::hover_color(ui)
} else {
Color32::TRANSPARENT };
let _left_padding_rect =
egui::Rect::from_min_size(rect.min, Vec2::new(left_padding, rect.height()));
let icon_button_rect = egui::Rect::from_center_size(rect.center(), Vec2::splat(icon_size));
ui.painter()
.rect_filled(icon_button_rect, DESIGN_TOKENS.rounding.button, bg_color);
let icon_center_x = rect.min.x + rect.width() / 2.0;
let icon_rect = egui::Rect::from_center_size(
egui::Pos2::new(icon_center_x, rect.center().y),
Vec2::splat(icon_size),
);
let is_hovered = response.hovered() || response.is_pointer_button_down_on();
render_svg_at_rect_themed(ui, icon, icon_rect, is_hovered, is_active);
response.on_hover_text(tooltip)
}
pub fn draw_tool_button(ui: &mut Ui, icon: &Icon, tooltip: &str, is_selected: bool) -> Response {
let tokens = &DESIGN_TOKENS.sizing.toolbar;
let btn_width = tokens.button_width; let btn_height = tokens.button_height; let margin_h = tokens.hover_margin_h; let margin_v = tokens.hover_margin_v; let inner_rounding = tokens.inner_rounding; let icon_size = tokens.icon_size;
let (rect, response) = ui.allocate_exact_size(Vec2::new(btn_width, btn_height), Sense::click());
if ui.is_rect_visible(rect) {
let inner_rect = egui::Rect::from_min_max(
egui::Pos2::new(rect.min.x + margin_h, rect.min.y + margin_v),
egui::Pos2::new(rect.max.x - margin_h, rect.max.y - margin_v),
);
if is_selected || response.hovered() {
let bg = if is_selected && response.hovered() {
theming::active_hover_color(ui)
} else if is_selected {
theming::sel_color(ui)
} else {
theming::hover_color(ui)
};
ui.painter().rect_filled(inner_rect, inner_rounding, bg);
}
let icon_rect = egui::Rect::from_center_size(rect.center(), Vec2::splat(icon_size));
render_svg_at_rect_themed(ui, icon, icon_rect, response.hovered(), is_selected);
}
response.on_hover_text(tooltip)
}