use egui::{InnerResponse, Response, Ui};
pub trait StyledWidget {
fn show(self, ui: &mut Ui) -> Response;
}
pub trait StyledContainer {
fn show<R>(self, ui: &mut Ui, body: impl FnOnce(&mut Ui) -> R) -> InnerResponse<R>;
}
#[macro_export]
macro_rules! impl_styled_widget {
([$($gen:tt)*], $ty:ty) => {
impl <$($gen)*> $crate::StyledWidget for $ty {
fn show(self, ui: &mut egui::Ui) -> egui::Response {
<$ty>::show(self, ui)
}
}
};
($ty:ty) => {
impl $crate::StyledWidget for $ty {
fn show(self, ui: &mut egui::Ui) -> egui::Response {
<$ty>::show(self, ui)
}
}
};
}
#[macro_export]
macro_rules! impl_styled_container {
([$($gen:tt)*], $ty:ty) => {
impl <$($gen)*> $crate::StyledContainer for $ty {
fn show<R>(self, ui: &mut egui::Ui, body: impl FnOnce(&mut egui::Ui) -> R) -> egui::InnerResponse<R> {
<$ty>::show(self, ui, body)
}
}
};
($ty:ty) => {
impl $crate::StyledContainer for $ty {
fn show<R>(self, ui: &mut egui::Ui, body: impl FnOnce(&mut egui::Ui) -> R) -> egui::InnerResponse<R> {
<$ty>::show(self, ui, body)
}
}
};
}
#[cfg(test)]
mod tests {
use crate::{
StyledButton, StyledCheckbox, StyledColumn, StyledContainer, StyledDistributedRow,
StyledFrame, StyledImage, StyledLabel, StyledRow, StyledSlider, StyledSpacer, StyledStack,
StyledTextEdit, StyledWidget, StyledWrappingRow,
};
fn assert_widget<T: StyledWidget>() {}
fn assert_container<T: StyledContainer>() {}
#[test]
fn every_widget_and_container_implements_its_show_trait() {
assert_widget::<StyledButton>();
assert_widget::<StyledCheckbox<'_>>();
assert_widget::<StyledSlider<'_, f32>>();
assert_widget::<StyledLabel>();
assert_widget::<StyledTextEdit<'_>>();
assert_widget::<StyledImage>();
assert_widget::<StyledSpacer>();
assert_widget::<StyledDistributedRow<'_>>();
assert_widget::<StyledWrappingRow<'_>>();
assert_widget::<StyledStack<'_>>();
assert_container::<StyledFrame>();
assert_container::<StyledRow>();
assert_container::<StyledColumn>();
}
}