widget_gallery/
widget_gallery.rs

1
2struct Gallery {
3    docking_state: pierro::DockingState<GalleryTab>
4}
5
6struct Basic {
7    text_edit_text: String,
8    checkbox_state: bool,
9    dropdown_state: String
10}
11
12impl Basic {
13
14    fn new() -> Self {
15        Self {
16            text_edit_text: "A text edit box".to_owned(),
17            checkbox_state: true,
18            dropdown_state: "Option A".to_owned()
19        }
20    }
21
22    fn ui(&mut self, ui: &mut pierro::UI) {
23        pierro::scroll_area(ui, |ui| {
24            pierro::margin(ui, |ui| { 
25                pierro::label(ui, "A label");
26                pierro::v_spacing(ui, 10.0);
27
28                pierro::button(ui, "A button");
29                pierro::v_spacing(ui, 10.0);
30
31                pierro::text_edit(ui, &mut self.text_edit_text);
32                pierro::v_spacing(ui, 10.0);
33
34                pierro::checkbox_labeled(ui, "A checkbox", &mut self.checkbox_state);
35                pierro::v_spacing(ui, 10.0);
36
37                let context_menu_response = pierro::label(ui, "Context menu (right click me!)");
38                pierro::context_menu(ui, &context_menu_response, |ui| {
39                    pierro::label(ui, "Inside the context menu");
40                });
41                pierro::v_spacing(ui, 10.0);
42
43                pierro::collapsing_header(ui, "A collapsing header", |ui| {
44                    for i in 0..50 {
45                        pierro::label(ui, i.to_string());
46                    }
47                });
48                pierro::v_spacing(ui, 10.0);
49
50                pierro::dropdown(ui, self.dropdown_state.clone(), |ui| {
51                    for option in ["Option A", "Option B", "Option C"] {
52                        if pierro::menu_button(ui, option).mouse_clicked() {
53                            self.dropdown_state = option.to_owned();
54                        }
55                    }
56                });
57
58            });
59        });
60    }
61
62}
63
64struct Layout {
65    axis: pierro::Axis,
66    justify: pierro::Justify,
67    align: pierro::Align
68}
69
70impl Layout {
71    
72    fn new() -> Self {
73        Self {
74            axis: pierro::Axis::X,
75            justify: pierro::Justify::Center,
76            align: pierro::Align::Center
77        }
78    }
79
80    fn node(&self, ui: &mut pierro::UI, color: pierro::Color) {
81        ui.node(
82            pierro::UINodeParams::new(pierro::Size::px(100.0), pierro::Size::px(100.0))
83                .with_fill(color)
84        );
85    }
86
87    fn ui(&mut self, ui: &mut pierro::UI) {
88
89        pierro::margin(ui, |ui| {
90            pierro::dropdown_labeled(ui, "Axis: ", match self.axis {
91                pierro::Axis::X => "X",
92                pierro::Axis::Y => "Y",
93            }, |ui| {
94                if pierro::menu_button(ui, "X").mouse_clicked() {
95                    self.axis = pierro::Axis::X;
96                }
97                if pierro::menu_button(ui, "Y").mouse_clicked() {
98                    self.axis = pierro::Axis::Y;
99                }
100            });
101            pierro::v_spacing(ui, 5.0);
102
103            pierro::dropdown_labeled(ui, "Justify: ", match self.justify {
104                pierro::Justify::Min => "Min",
105                pierro::Justify::Center => "Center",
106                pierro::Justify::Max => "Max",
107            }, |ui| {
108                if pierro::menu_button(ui, "Min").mouse_clicked() {
109                    self.justify = pierro::Justify::Min;
110                }
111                if pierro::menu_button(ui, "Center").mouse_clicked() {
112                    self.justify = pierro::Justify::Center;
113                }
114                if pierro::menu_button(ui, "Max").mouse_clicked() {
115                    self.justify = pierro::Justify::Max;
116                }
117            });
118            pierro::v_spacing(ui, 5.0);
119
120            pierro::dropdown_labeled(ui, "Align: ", match self.align {
121                pierro::Align::Min => "Min",
122                pierro::Align::Center => "Center",
123                pierro::Align::Max => "Max",
124            }, |ui| {
125                if pierro::menu_button(ui, "Min").mouse_clicked() {
126                    self.align = pierro::Align::Min;
127                }
128                if pierro::menu_button(ui, "Center").mouse_clicked() {
129                    self.align = pierro::Align::Center;
130                }
131                if pierro::menu_button(ui, "Max").mouse_clicked() {
132                    self.align = pierro::Align::Max;
133                }
134            });
135        });
136
137        pierro::h_divider(ui);
138        pierro::container(ui,
139            pierro::Size::fr(1.0),
140            pierro::Size::fr(1.0),
141            pierro::Layout::new(self.axis).with_justify(self.justify).with_align(self.align),
142            |ui| {
143                self.node(ui, pierro::Color::RED);   
144                self.node(ui, pierro::Color::GREEN);   
145                self.node(ui, pierro::Color::BLUE);
146            });
147    }
148
149}
150
151enum GalleryTab {
152    Basic(Basic),
153    Layout(Layout)
154}
155
156impl pierro::DockingTab for GalleryTab {
157
158    type Context = ();
159
160    fn title(&self) -> String {
161        match self {
162            GalleryTab::Basic(..) => "Basic Widgets".to_owned(),
163            GalleryTab::Layout(..) => "Layout".to_owned()
164        }
165    }
166
167    fn render(&mut self, ui: &mut pierro::UI, _context: &mut ()) {
168            match self {
169                GalleryTab::Basic(basic) => basic.ui(ui),
170                GalleryTab::Layout(layout) => layout.ui(ui)
171            }
172    }
173
174    fn add_tab_dropdown<F: FnMut(Self)>(ui: &mut pierro::UI, mut add_tab: F, _context: &mut ()) {
175        if pierro::menu_button(ui, "Basic Widgets").mouse_clicked() {
176            add_tab(Self::Basic(Basic::new()));
177        }
178        if pierro::menu_button(ui, "Layout").mouse_clicked() {
179            add_tab(Self::Layout(Layout::new()));
180        }
181    }
182
183}
184
185impl pierro::App for Gallery {
186
187    fn window_config() -> pierro::WindowConfig {
188        pierro::WindowConfig::default()
189            .with_title("Pierro Widget Gallery")
190    }
191
192    fn tick(&mut self, ui: &mut pierro::UI) {
193        pierro::menu_bar(ui, |ui| {
194            pierro::menu_bar_item(ui, "Menubar", |ui| {
195                pierro::menu_button(ui, "Button A");
196                pierro::menu_button(ui, "Button B");
197                pierro::menu_button(ui, "Button C");
198                pierro::menu_category(ui, "Category", |ui| {
199                    pierro::menu_button(ui, "Button X");
200                    pierro::menu_button(ui, "Button Y");
201                });
202            });
203        });
204        self.docking_state.render(ui, &mut ());
205    }
206
207}
208
209fn main() {
210    pierro::run(Gallery {
211        docking_state: pierro::DockingState::new(vec![
212            GalleryTab::Basic(Basic::new())
213        ])
214    });
215}