egui_flex 0.6.0

A flexbox-like layout system for egui.
Documentation
use egui::emath::TSTransform;
use egui::{Frame, Label, Response, Sense};
use egui_flex::{Flex, FlexInstance, FlexItem, FlexWidget};
use hello_egui_utils_dev::run;

fn main() {
    run!(move |ui| {
        Flex::horizontal().w_full().show(ui, |flex| {
            flex.add(FlexItem::new().grow(1.0), Button::new("Hi"));
            flex.add(FlexItem::new().grow(1.0), Button::new("Hi"));
        });
    });
}

struct Button {
    label: String,
}

impl Button {
    fn new(label: impl Into<String>) -> Self {
        Self {
            label: label.into(),
        }
    }
}

impl FlexWidget for Button {
    type Response = Response;

    fn flex_ui(self, item: FlexItem, flex_instance: &mut FlexInstance) -> Self::Response {
        flex_instance
            .add_ui(
                item.sense(Sense::click())
                    .min_height(60.0)
                    .frame_builder(|ui, response| {
                        let style = ui.style().interact(response);

                        (
                            Frame::NONE.fill(style.bg_fill).stroke(style.bg_stroke),
                            TSTransform::default(),
                        )
                    }),
                |ui| {
                    ui.add(Label::new(self.label.clone()));
                },
            )
            .response
    }
}