use egui::Ui;
#[derive(Clone, Copy, Default)]
pub enum ColumnWidth {
#[default]
Auto,
Fixed(f32),
Initial(f32),
Remainder,
}
pub struct Strip {
sizes: Vec<StripSize>,
direction: StripDirection,
}
#[derive(Clone, Copy)]
pub enum StripSize {
Exact(f32),
Initial(f32),
Relative(f32),
Remainder,
}
#[derive(Clone, Copy, Default)]
pub enum StripDirection {
#[default]
Horizontal,
Vertical,
}
impl Strip {
pub fn horizontal() -> Self {
Self {
sizes: Vec::new(),
direction: StripDirection::Horizontal,
}
}
pub fn vertical() -> Self {
Self {
sizes: Vec::new(),
direction: StripDirection::Vertical,
}
}
pub fn exact(mut self, size: f32) -> Self {
self.sizes.push(StripSize::Exact(size));
self
}
pub fn initial(mut self, size: f32) -> Self {
self.sizes.push(StripSize::Initial(size));
self
}
pub fn relative(mut self, ratio: f32) -> Self {
self.sizes.push(StripSize::Relative(ratio));
self
}
pub fn remainder(mut self) -> Self {
self.sizes.push(StripSize::Remainder);
self
}
pub fn show<R>(self, ui: &mut Ui, mut add_contents: impl FnMut(usize, &mut Ui) -> R) -> Vec<R> {
let mut results = Vec::new();
match self.direction {
StripDirection::Horizontal => {
let mut builder = egui_extras::StripBuilder::new(ui);
for size in &self.sizes {
builder = match size {
StripSize::Exact(s) => builder.size(egui_extras::Size::exact(*s)),
StripSize::Initial(s) => builder.size(egui_extras::Size::initial(*s)),
StripSize::Relative(r) => builder.size(egui_extras::Size::relative(*r)),
StripSize::Remainder => builder.size(egui_extras::Size::remainder()),
};
}
builder.horizontal(|mut strip| {
for i in 0..self.sizes.len() {
strip.cell(|ui| {
results.push(add_contents(i, ui));
});
}
});
}
StripDirection::Vertical => {
let mut builder = egui_extras::StripBuilder::new(ui);
for size in &self.sizes {
builder = match size {
StripSize::Exact(s) => builder.size(egui_extras::Size::exact(*s)),
StripSize::Initial(s) => builder.size(egui_extras::Size::initial(*s)),
StripSize::Relative(r) => builder.size(egui_extras::Size::relative(*r)),
StripSize::Remainder => builder.size(egui_extras::Size::remainder()),
};
}
builder.vertical(|mut strip| {
for i in 0..self.sizes.len() {
strip.cell(|ui| {
results.push(add_contents(i, ui));
});
}
});
}
}
results
}
}
pub mod raw {
pub use egui_extras::*;
}