azalea_shell/window/taskbar/
mod.rs

1//! # Azalea taskbar window
2
3use gtk::prelude::BoxExt;
4use relm4::{ComponentParts, ComponentSender, SimpleComponent, component};
5use widget::WidgetWrapper;
6
7pub mod widget;
8
9crate::init! {
10    Model {
11        widgets: Vec<WidgetWrapper>,
12    }
13
14    Config {
15        spacing: i32,
16        start: Vec<widget::ConfigWrapper>,
17        center: Vec<widget::ConfigWrapper>,
18        end: Vec<widget::ConfigWrapper>,
19    }
20}
21
22#[component(pub)]
23impl SimpleComponent for Model {
24    type Init = Init;
25    type Input = ();
26    type Output = ();
27
28    view! {
29        gtk::Window {
30            #[name(center_box)]
31            gtk::CenterBox {
32                #[name(start_widget)]
33                #[wrap(Some)]
34                set_start_widget = &gtk::Box {
35
36                },
37
38                #[name(center_widget)]
39                #[wrap(Some)]
40                set_center_widget = &gtk::Box {
41
42                },
43
44                #[name(end_widget)]
45                #[wrap(Some)]
46                set_end_widget = &gtk::Box {
47
48                },
49            }
50        }
51    }
52
53    fn init(
54        init: Self::Init,
55        _root: Self::Root,
56        _sender: ComponentSender<Self>,
57    ) -> ComponentParts<Self> {
58        let mut model = Model { widgets: vec![] };
59        let widgets = view_output!();
60
61        for widget_config in init.config.start {
62            let (wrapper, widget) = widget_config.build_widget();
63            model.widgets.push(wrapper);
64            widgets.start_widget.append(&widget);
65            widgets.start_widget.set_spacing(init.config.spacing);
66        }
67
68        for widget_config in init.config.center {
69            let (wrapper, widget) = widget_config.build_widget();
70            model.widgets.push(wrapper);
71            widgets.center_widget.append(&widget);
72            widgets.center_widget.set_spacing(init.config.spacing);
73        }
74
75        for widget_config in init.config.end {
76            let (wrapper, widget) = widget_config.build_widget();
77            model.widgets.push(wrapper);
78            widgets.end_widget.append(&widget);
79            widgets.end_widget.set_spacing(init.config.spacing);
80        }
81
82        ComponentParts { model, widgets }
83    }
84}