widget_tree/
widget_tree.rs

1extern crate orbtk;
2
3use orbtk::{Action, Button, ComboBox, Grid, Image, Label, Menu, Orientation, Point, ProgressBar,
4            Rect, Separator, StackLayout, TextBox, Widget, Window};
5use orbtk::traits::{Click, Enter, Place, Text};
6
7// commit: widgets (update, button, label, list, remove test_button, start documentation), widget tree example, css updae
8
9fn main() {
10    let mut window = Window::new(Rect::new(100, 100, 420, 768), "OrbTK");
11
12    let stack_layout = StackLayout::new(Orientation::Vertical);
13    stack_layout.position(10, 0).size(400, 768).spacing(10);
14
15    let menu = Menu::new("Menu");
16    menu.size(32, 16);
17    stack_layout.add(menu.clone());
18
19    let label = Label::new();
20    label.size(400, 16).text("Test Label");
21    stack_layout.add(label);
22
23    let horizontal_stack_layout = StackLayout::new(Orientation::Horizontal);
24    horizontal_stack_layout.size(400, 28).spacing(10);
25    stack_layout.add(horizontal_stack_layout.clone());
26
27    let text_box = TextBox::new();
28    text_box.size(332, 28).text_offset(6, 6);
29    horizontal_stack_layout.add(text_box.clone());
30
31    let button = Button::new();
32    button
33        .text("Update")
34        .on_click(move |_button: &Button, _point: Point| {
35            text_box.emit_enter();
36        });
37    horizontal_stack_layout.add(button);
38
39    let progress_label = Label::new();
40    progress_label.text("Progress: 0%");
41    stack_layout.add(progress_label.clone());
42
43    let progress_bar = ProgressBar::new();
44    progress_bar.size(400, 16).value(50).on_click(
45        move |progress_bar: &ProgressBar, point: Point| {
46            let progress = point.x * 100 / progress_bar.rect.get().width as i32;
47            progress_label.text.set(format!("Progress: {}%", progress));
48            progress_bar.value.set(progress);
49        },
50    );
51    stack_layout.add(progress_bar);
52
53    let combo_box = ComboBox::new();
54    stack_layout.add(combo_box.clone());
55
56    for i in 1..11 {
57        combo_box.push(&format!("Entry {}", i));
58    }
59
60    let multi_line_label = Label::new();
61    multi_line_label.text("Multi-Line Text").size(400, 16);
62    stack_layout.add(multi_line_label);
63
64    let multi_line_text_box = TextBox::new();
65    multi_line_text_box.size(400, 130).text_offset(1, 1);
66    stack_layout.add(multi_line_text_box);
67
68    let offset_label = Label::new();
69    offset_label
70        .size(400, 120)
71        .text("Test Offset")
72        .text_offset(50, 50)
73        .on_click(|label: &Label, _point: Point| {
74            label.text("Clicked");
75        });
76    stack_layout.add(offset_label.clone());
77
78    match Image::from_path("res/icon_small.png") {
79        Ok(image) => {
80            stack_layout.add(image.clone());
81        }
82        Err(err) => {
83            let label = Label::new();
84            label.size(400, 16).text(err);
85            stack_layout.add(label.clone());
86        }
87    }
88
89    {
90        let action = Action::new("Label One");
91        let offset_label_clone = offset_label.clone();
92        action.on_click(move |_action: &Action, _point: Point| {
93            offset_label_clone.text.set("One".to_owned());
94        });
95        menu.add(&action);
96    }
97
98    {
99        let action = Action::new("Label Two");
100        let offset_label_clone = offset_label.clone();
101        action.on_click(move |_action: &Action, _point: Point| {
102            offset_label_clone.text.set("Two".to_owned());
103        });
104        menu.add(&action);
105    }
106
107    menu.add(&Separator::new());
108
109    {
110        let action = Action::new("Reset Label");
111        let offset_label_clone = offset_label.clone();
112        action.on_click(move |_action: &Action, _point: Point| {
113            offset_label_clone.text.set("Text Offset".to_owned());
114        });
115        menu.add(&action);
116    }
117
118    let grid = Grid::new();
119    grid.spacing(8, 8);
120
121    let label = Label::new();
122    label.size(32, 16).text("Grid");
123    grid.insert(0, 0, &label);
124
125    let label = Label::new();
126    label.size(32, 16).text("Test");
127    grid.insert(1, 0, &label);
128
129    let label = Label::new();
130    label.size(32, 16).text("With");
131    grid.insert(2, 0, &label);
132
133    let label = Label::new();
134    label.size(48, 16).text("Resize");
135    grid.insert(3, 0, &label);
136
137    let mut i = 0;
138    for row in 1..6 {
139        for col in 0..5 {
140            let cell = TextBox::new();
141            let text = format!("{}: {}, {}", i, col, row);
142            cell.size(text.len() as u32 * 8 + 2, 18)
143                .text(text)
144                .text_offset(1, 1);
145            grid.insert(col, row, &cell);
146            i += 1;
147        }
148    }
149
150    stack_layout.add(grid.clone());
151    grid.arrange(true);
152
153    window.add(&stack_layout);
154
155    window.exec();
156}