raui_core/widget/component/containers/
switch_box.rs1use crate::{
2 PropsData, make_widget, pre_hooks,
3 widget::{
4 component::interactive::navigation::{
5 NavContainerActive, NavItemActive, NavJumpActive, use_nav_container_active,
6 use_nav_item, use_nav_jump_step_pages_active,
7 },
8 context::WidgetContext,
9 node::WidgetNode,
10 unit::content::{ContentBoxItemNode, ContentBoxNode},
11 utils::Transform,
12 },
13};
14use serde::{Deserialize, Serialize};
15
16#[derive(PropsData, Debug, Default, Clone, Serialize, Deserialize)]
17#[props_data(crate::props::PropsData)]
18#[prefab(crate::Prefab)]
19pub struct SwitchBoxProps {
20 #[serde(default)]
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub active_index: Option<usize>,
23 #[serde(default)]
24 pub clipping: bool,
25 #[serde(default)]
26 pub transform: Transform,
27}
28
29#[pre_hooks(use_nav_container_active, use_nav_jump_step_pages_active, use_nav_item)]
30pub fn nav_switch_box(mut context: WidgetContext) -> WidgetNode {
31 let WidgetContext {
32 key,
33 props,
34 listed_slots,
35 ..
36 } = context;
37
38 let props = props
39 .clone()
40 .without::<NavContainerActive>()
41 .without::<NavJumpActive>()
42 .without::<NavItemActive>();
43
44 make_widget!(switch_box)
45 .key(key)
46 .merge_props(props)
47 .listed_slots(listed_slots)
48 .into()
49}
50
51pub fn switch_box(context: WidgetContext) -> WidgetNode {
52 let WidgetContext {
53 id,
54 props,
55 listed_slots,
56 ..
57 } = context;
58
59 let SwitchBoxProps {
60 active_index,
61 clipping,
62 transform,
63 } = props.read_cloned_or_default();
64
65 let items = if let Some(index) = active_index {
66 if let Some(slot) = listed_slots.into_iter().nth(index) {
67 vec![ContentBoxItemNode {
68 slot,
69 ..Default::default()
70 }]
71 } else {
72 vec![]
73 }
74 } else {
75 vec![]
76 };
77
78 ContentBoxNode {
79 id: id.to_owned(),
80 props: props.clone(),
81 items,
82 clipping,
83 content_reposition: Default::default(),
84 transform,
85 }
86 .into()
87}