azalea_shell/window/wallpaper/
mod.rs

1//! # Azalea wallpaper window
2
3use gtk::glib::object::Cast;
4use relm4::{Component, ComponentController, ComponentParts, ComponentSender, component};
5
6use crate::component::image;
7
8crate::init! {
9    Model {
10        image: relm4::Controller<image::Model>,
11    }
12
13    Config {
14        image: Option<String>,
15    }
16}
17
18#[derive(Debug)]
19pub enum Input {
20    Update(String),
21}
22
23#[component(pub)]
24impl Component for Model {
25    type Init = Init;
26    type Input = Input;
27    type Output = ();
28    type CommandOutput = Input;
29
30    view! {
31        gtk::Window {
32            #[local_ref]
33            image_widget -> gtk::Widget {},
34        },
35    }
36
37    fn init(
38        init: Self::Init,
39        _root: Self::Root,
40        sender: ComponentSender<Self>,
41    ) -> ComponentParts<Self> {
42        let model = Model {
43            image: image::Model::builder()
44                .launch(image::Init {
45                    fallback: Some(
46                        gtk::gdk::Texture::from_bytes(&gtk::glib::Bytes::from_static(
47                            include_bytes!("../../../../assets/azalea-wallpaper.png"),
48                        ))
49                        .unwrap(),
50                    ),
51                    width: None,
52                    height: None,
53                })
54                .detach(),
55        };
56
57        if let Some(image) = init.config.image {
58            sender.input(Input::Update(image));
59        }
60
61        let image_widget: &gtk::Widget = model.image.widget().upcast_ref();
62        let widgets = view_output!();
63
64        ComponentParts { model, widgets }
65    }
66
67    fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>, _root: &Self::Root) {
68        match message {
69            Input::Update(image) => self.image.emit(image::Input::LoadImage(image)),
70        }
71    }
72
73    fn update_cmd(
74        &mut self,
75        message: Self::CommandOutput,
76        sender: ComponentSender<Self>,
77        _root: &Self::Root,
78    ) {
79        match message {
80            Input::Update(image) => sender.input(Input::Update(image)),
81        }
82    }
83}