use egui::{Align, Layout, Ui};
use crate::tokens::DESIGN_TOKENS;
pub struct ButtonGroup {
separator_after: bool,
separator_before: bool,
}
impl Default for ButtonGroup {
fn default() -> Self {
Self::new()
}
}
impl ButtonGroup {
pub fn new() -> Self {
Self {
separator_after: false,
separator_before: false,
}
}
#[must_use]
pub fn separator_after(mut self) -> Self {
self.separator_after = true;
self
}
#[must_use]
pub fn separator_before(mut self) -> Self {
self.separator_before = true;
self
}
pub fn show<R>(self, ui: &mut Ui, content: impl FnOnce(&mut Ui) -> R) -> R {
if self.separator_before {
render_toolbar_separator(ui);
}
let result = content(ui);
if self.separator_after {
render_toolbar_separator(ui);
}
result
}
}
fn render_toolbar_separator(ui: &mut Ui) {
ui.add_space(DESIGN_TOKENS.spacing.sm);
let stroke = ui.style().visuals.widgets.noninteractive.bg_stroke;
let available = ui.available_rect_before_wrap();
let x = available.left();
ui.painter().vline(x, available.y_range(), stroke);
ui.add_space(DESIGN_TOKENS.spacing.sm);
}
pub struct ToolbarLayout;
impl ToolbarLayout {
pub fn left_right<L, R>(
ui: &mut Ui,
left_content: impl FnOnce(&mut Ui) -> L,
right_content: impl FnOnce(&mut Ui) -> R,
) -> (L, R) {
let left = left_content(ui);
let right = ui
.with_layout(Layout::right_to_left(Align::Center), |ui| right_content(ui))
.inner;
(left, right)
}
pub fn centered<C, L, R>(
ui: &mut Ui,
left_content: impl FnOnce(&mut Ui) -> L,
center_content: impl FnOnce(&mut Ui) -> C,
right_content: impl FnOnce(&mut Ui) -> R,
) -> (L, C, R) {
let left = left_content(ui);
let center = ui
.with_layout(
Layout::centered_and_justified(ui.layout().main_dir()),
|ui| center_content(ui),
)
.inner;
let right = ui
.with_layout(Layout::right_to_left(Align::Center), |ui| right_content(ui))
.inner;
(left, center, right)
}
}