mod button_group;
pub use button_group::{ButtonGroup, ToolbarLayout};
use std::hash::Hash;
use egui::{Id, Ui};
use crate::styles::responsive::LayoutContext;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Orientation {
#[default]
Horizontal,
Vertical,
}
pub struct ResponsiveToolbar {
id: Id,
orientation: Orientation,
height: Option<f32>,
}
impl ResponsiveToolbar {
pub fn horizontal(id: impl Hash) -> Self {
Self {
id: Id::new(id),
orientation: Orientation::Horizontal,
height: None,
}
}
pub fn vertical(id: impl Hash) -> Self {
Self {
id: Id::new(id),
orientation: Orientation::Vertical,
height: None,
}
}
#[must_use]
pub fn height(mut self, h: f32) -> Self {
self.height = Some(h);
self
}
pub fn show<R>(self, ui: &mut Ui, content: impl FnOnce(&mut Ui, &LayoutContext) -> R) -> R {
let layout_ctx = LayoutContext::from_egui(ui.ctx());
let id = self.id;
ui.push_id(id, |ui| match self.orientation {
Orientation::Horizontal => self.show_horizontal(ui, &layout_ctx, content),
Orientation::Vertical => self.show_vertical(ui, &layout_ctx, content),
})
.inner
}
fn show_horizontal<R>(
self,
ui: &mut Ui,
layout_ctx: &LayoutContext,
content: impl FnOnce(&mut Ui, &LayoutContext) -> R,
) -> R {
let full_rect = ui.max_rect();
let bg_color = ui.style().visuals.panel_fill;
ui.painter().rect_filled(full_rect, 0.0, bg_color);
let _ = ui.allocate_rect(full_rect, egui::Sense::hover());
let mut child_ui = ui.new_child(
egui::UiBuilder::new()
.max_rect(full_rect)
.layout(egui::Layout::left_to_right(egui::Align::Center)),
);
content(&mut child_ui, layout_ctx)
}
fn show_vertical<R>(
self,
ui: &mut Ui,
layout_ctx: &LayoutContext,
content: impl FnOnce(&mut Ui, &LayoutContext) -> R,
) -> R {
ui.vertical(|ui| content(ui, layout_ctx)).inner
}
}