mod tab_button;
mod tab_content;
use crate::prelude::*;
use bevy::prelude::*;
pub use tab_button::*;
pub use tab_content::*;
#[derive(Component, Default, Clone, PartialEq, Reflect)]
pub struct TabContext {
current_index: usize,
}
#[derive(Widget, Component, Default, Clone, PartialEq, Reflect)]
#[auto_update(render)]
#[props(TabContextProvider)]
pub struct TabContextProvider {
initial_tab_index: usize,
}
#[derive(Bundle, Clone, Default)]
pub struct TabContextProviderBundle {
pub provider: TabContextProvider,
pub styles: WoodpeckerStyle,
pub children: PassedChildren,
pub internal_children: WidgetChildren,
}
fn render(
mut commands: Commands,
mut hooks: ResMut<HookHelper>,
current_widget: Res<CurrentWidget>,
mut query: Query<(&TabContextProvider, &mut WidgetChildren, &PassedChildren)>,
) {
let Ok((provider, mut children, passed_children)) = query.get_mut(**current_widget) else {
return;
};
let _context_entity = hooks.use_context(
&mut commands,
*current_widget,
TabContext {
current_index: provider.initial_tab_index,
},
);
children.add::<Element>((
Element,
WoodpeckerStyle {
background_color: colors::BACKGROUND_LIGHT,
border_color: colors::BACKGROUND_LIGHT,
border: Edge::all(2.0),
border_radius: Corner::all(8.0),
..Default::default()
},
WidgetChildren::default().with_child::<Clip>((
Clip,
WoodpeckerStyle {
border_radius: Corner::all(8.0),
flex_direction: WidgetFlexDirection::Column,
width: Units::Percentage(100.0),
height: Units::Percentage(100.0),
..Default::default()
},
passed_children.0.clone(),
)),
WidgetRender::Quad,
));
children.apply(current_widget.as_parent());
}