azalea_shell/window/
mod.rs

1//! Azalea windows
2
3pub mod taskbar;
4pub mod wallpaper;
5
6#[derive(Debug, Clone)]
7pub struct Init<Model>
8where
9    Model: ModelExt,
10{
11    pub config: Model::Config,
12}
13
14impl<Model> Init<Model>
15where
16    Model: ModelExt,
17{
18    fn new(config: Model::Config) -> Self {
19        Self { config }
20    }
21}
22
23pub trait ModelExt {
24    type Config;
25}
26
27#[macro_export]
28macro_rules! init {
29    (
30        Model {
31            $($model_vis: vis $model_name: ident: $model_type: ty,)*
32        }
33
34        Config {
35            $($config_name: ident: $config_type: ty,)*
36        }
37    ) => {
38        pub struct Model {
39            $($model_vis $model_name: $model_type,)*
40        }
41
42        #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)]
43        pub struct Config {
44            $(
45                pub $config_name: $config_type,
46            )*
47        }
48
49        impl $crate::window::ModelExt for Model {
50            type Config = Config;
51        }
52
53        pub type Init = $crate::window::Init<Model>;
54    };
55}
56
57#[macro_export]
58macro_rules! register_widgets {
59    ($($window:ident, $model:ty;)+) => {
60        use relm4::component::Connector;
61        use relm4::prelude::Component;
62
63        #[allow(dead_code)]
64        pub enum WidgetWrapper {
65            $($window(Connector<$model>)),+
66        }
67
68        #[allow(dead_code)]
69        #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
70        pub enum ConfigWrapper {
71            $($window(<$model as crate::window::ModelExt>::Config)),+
72        }
73
74        #[allow(dead_code)]
75        impl ConfigWrapper {
76            pub fn build_widget(self) -> (WidgetWrapper, gtk::Widget) {
77                match self {
78                    $(ConfigWrapper::$window(config) => {
79                        let builder = <$model>::builder();
80                        let widget = builder.root.clone();
81                        let wrapper = WidgetWrapper::$window(
82                            builder.launch($crate::window::Init::new(config))
83                        );
84                        (wrapper, gtk::glib::object::Cast::upcast::<gtk::Widget>(widget))
85                    },)+
86                }
87            }
88        }
89    };
90}