azalea_shell/window/
mod.rs1pub 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}