azalea_shell/component/
login.rs

1use crate::{icon, service};
2use azalea_service::LocalStaticServiceManager;
3use gtk::prelude::*;
4use relm4::{ComponentParts, ComponentSender, SimpleComponent, component};
5use std::fmt::Debug;
6
7pub struct Model {}
8
9#[component(pub)]
10impl SimpleComponent for Model {
11    type Input = service::dbus::login::Input;
12    type Output = ();
13    type Init = ();
14
15    view! {
16        gtk::Box {
17            set_hexpand: true,
18            set_halign: gtk::Align::Fill,
19
20            gtk::Button {
21                set_hexpand: true,
22                set_halign: gtk::Align::Fill,
23
24                #[wrap(Some)]
25                set_child = &gtk::Box {
26                    set_halign: gtk::Align::Center,
27                    set_spacing: 6,
28
29                    gtk::Image {
30                        set_icon_name: Some(icon::SUSPEND),
31                    },
32
33                    gtk::Label {
34                        set_label: "Suspend",
35                    },
36                },
37
38                connect_clicked => Self::Input::Suspend
39            },
40            gtk::Button {
41                set_hexpand: true,
42                set_halign: gtk::Align::Fill,
43
44                #[wrap(Some)]
45                set_child = &gtk::Box {
46                    set_halign: gtk::Align::Center,
47                    set_spacing: 6,
48
49                    gtk::Image {
50                        set_icon_name: Some(icon::REBOOT),
51                    },
52
53                    gtk::Label {
54                        set_label: "Reboot",
55                    },
56                },
57
58                connect_clicked => Self::Input::Reboot
59            },
60            gtk::Button {
61                set_hexpand: true,
62                set_halign: gtk::Align::Fill,
63
64                #[wrap(Some)]
65                set_child = &gtk::Box {
66                    set_halign: gtk::Align::Center,
67                    set_spacing: 6,
68
69                    gtk::Image {
70                        set_icon_name: Some(icon::SHUTDOWN),
71                    },
72
73                    gtk::Label {
74                        set_label: "Shutdown",
75                    },
76                },
77
78                connect_clicked => Self::Input::PowerOff
79            },
80            gtk::Button {
81                set_hexpand: true,
82                set_halign: gtk::Align::Fill,
83
84                #[wrap(Some)]
85                set_child = &gtk::Box {
86                    set_halign: gtk::Align::Center,
87                    set_spacing: 6,
88
89                    gtk::Image {
90                        set_icon_name: Some(icon::HIBERNATE),
91                    },
92
93                    gtk::Label {
94                        set_label: "Hibernate",
95                    },
96                },
97
98                connect_clicked => Self::Input::Hibernate
99            },
100        }
101    }
102
103    fn init(
104        _init: Self::Init,
105        _root: Self::Root,
106        _sender: ComponentSender<Self>,
107    ) -> ComponentParts<Self> {
108        let model = Self {};
109
110        let widgets = view_output!();
111
112        service::dbus::login::Service::start();
113
114        ComponentParts { model, widgets }
115    }
116
117    fn update(&mut self, input: Self::Input, _sender: ComponentSender<Self>) {
118        service::dbus::login::Service::send(input);
119    }
120}