[MIRROR] https://codeberg.org/naomi/nanel
1use chrono::{DateTime, Datelike, Local, Timelike};
2use iced::{
3 Alignment, Element, Length,
4 widget::{column, row, text},
5};
6use iced_fonts::Bootstrap;
7use serde::Deserialize;
8
9use crate::{
10 config,
11 msg::{Message, NanelWindowType},
12 panel::label,
13 styles::{solid, transparent},
14 widgets::{
15 button_with_position::ButtonInfo, icon, small_icon, taskbar_button, taskbar_button_thin,
16 taskbar_button_with_info,
17 },
18 windows::{
19 calendar_menu, directory_menu, notification_menu, quick_settings_menu, start_menu,
20 systray_menu,
21 },
22};
23
24#[derive(Deserialize, Debug)]
25pub enum Module {
26 StartMenu,
27 Workspaces,
28 DirectoryMenu,
29 VerticalSeperator,
30 Taskbar {
31 merge_windows: bool,
32 merge_pinned: bool,
33 },
34 SystemTray {
35 hidden: bool,
36 },
37 QuickSettings {
38 show_connection: bool,
39 show_volume: bool,
40 show_power: bool,
41 },
42 DateTime {
43 calendar: bool,
44 upper_format: String,
45 lower_format: String,
46 },
47 NotificationTray,
48 ViewDesktop {
49 show_on_hover: bool,
50 thin: bool,
51 },
52}
53
54pub fn get_connection<'a, Message>(show_connection: &bool) -> Option<Element<'a, Message>> {
55 match show_connection {
56 true => Some(small_icon(Bootstrap::Wifi).into()),
57 false => None,
58 }
59}
60
61pub fn get_volume<'a, Message>(show_volume: &bool) -> Option<Element<'a, Message>> {
62 match show_volume {
63 true => Some(small_icon(Bootstrap::VolumeUpFill).into()),
64 false => None,
65 }
66}
67
68pub fn get_power<'a, Message>(show_power: &bool) -> Option<Element<'a, Message>> {
69 match show_power {
70 true => Some(small_icon(Bootstrap::Battery).into()),
71 false => None,
72 }
73}
74pub fn start_menu<'a>(vertical: &bool) -> Element<'a, Message> {
75 taskbar_button_with_info(icon(Bootstrap::Microsoft), true, vertical, transparent)
76 .on_press_with(|info| Message::UserToggledWindow {
77 x: info.position.x as i32,
78 y: info.position.y as i32,
79 viewport: (info.viewport.0 as i32, info.viewport.1 as i32),
80 window_type: NanelWindowType::Start,
81 container_id: start_menu::START_MENU.clone(),
82 })
83 .into()
84}
85
86pub fn workspaces<'a>(vertical: &bool) -> Element<'a, Message> {
87 taskbar_button(icon(Bootstrap::Stack), true, vertical, transparent)
88 .on_press(Message::UserToggledWorkspaces)
89 .into()
90}
91
92pub fn directory_menu<'a>(vertical: &bool) -> Element<'a, Message> {
93 taskbar_button_with_info(icon(Bootstrap::FolderFill), true, vertical, transparent)
94 .on_press_with(|info| Message::UserToggledWindow {
95 x: info.position.x as i32,
96 y: info.position.y as i32,
97 viewport: (info.viewport.0 as i32, info.viewport.1 as i32),
98 window_type: NanelWindowType::Directory,
99 container_id: directory_menu::DIRECTORY_MENU.clone(),
100 })
101 .into()
102}
103
104pub fn system_tray<'a>(
105 hidden_menu: &bool,
106 vertical: &bool,
107 position: config::Position,
108) -> Element<'a, Message> {
109 let icon = match position {
110 config::Position::Top => small_icon(Bootstrap::ChevronDown),
111 config::Position::Bottom => small_icon(Bootstrap::ChevronUp),
112 config::Position::Left => small_icon(Bootstrap::ChevronRight),
113 config::Position::Right => small_icon(Bootstrap::ChevronLeft),
114 };
115
116 match hidden_menu {
117 false => text!("TODO: systray").into(),
118 true => taskbar_button_with_info(icon, false, vertical, transparent)
119 .on_press_with(|info| Message::UserToggledWindow {
120 x: info.position.x as i32,
121 y: info.position.y as i32,
122 viewport: (info.viewport.0 as i32, info.viewport.1 as i32),
123 window_type: NanelWindowType::SystemTray,
124 container_id: systray_menu::SYSTRAY_MENU.clone(),
125 })
126 .into(),
127 }
128}
129
130pub fn notification_tray<'a>(vertical: &bool) -> Element<'a, Message> {
131 taskbar_button_with_info(small_icon(Bootstrap::Bell), false, vertical, transparent)
132 .on_press_with(|info| Message::UserToggledWindow {
133 x: info.position.x as i32,
134 y: info.position.y as i32,
135 viewport: (info.viewport.0 as i32, info.viewport.1 as i32),
136 window_type: NanelWindowType::Notification,
137 container_id: notification_menu::NOTIFICATION_MENU.clone(),
138 })
139 .into()
140}
141
142pub fn quick_settings<'a>(
143 connection: Option<Element<'a, Message>>,
144 volume: Option<Element<'a, Message>>,
145 power: Option<Element<'a, Message>>,
146 vertical: &bool,
147) -> Element<'a, Message> {
148 taskbar_button_with_info(
149 match vertical {
150 true => Into::<Element<Message>>::into(
151 column![]
152 .push_maybe(connection)
153 .push_maybe(volume)
154 .push_maybe(power)
155 .spacing(6)
156 .align_x(Alignment::Center)
157 .width(Length::Fill),
158 ),
159 false => Into::<Element<Message>>::into(
160 row![]
161 .push_maybe(connection)
162 .push_maybe(volume)
163 .push_maybe(power)
164 .spacing(6)
165 .align_y(Alignment::Center)
166 .height(Length::Fill),
167 ),
168 },
169 false,
170 vertical,
171 transparent,
172 )
173 .on_press_with(|info| Message::UserToggledWindow {
174 x: info.position.x as i32,
175 y: info.position.y as i32,
176 viewport: (info.viewport.0 as i32, info.viewport.1 as i32),
177 window_type: NanelWindowType::QuickSettings,
178 container_id: quick_settings_menu::QUICK_SETTINGS_MENU.clone(),
179 })
180 .into()
181}
182
183pub fn date_time<'a>(
184 datetime: DateTime<Local>,
185 calendar: &bool,
186 upper_format: &String,
187 lower_format: &String,
188 vertical: &bool,
189) -> Element<'a, Message> {
190 taskbar_button_with_info(
191 match vertical {
192 true => Into::<Element<Message>>::into(
193 row![text("TODO")].clip(false).align_y(Alignment::Center),
194 ),
195 false => Into::<Element<Message>>::into(
196 column![
197 label(
198 (String::from(" ")
199 + datetime.format(upper_format.as_str()).to_string().as_str()
200 + " ")
201 .as_str()
202 ),
203 label(
204 (String::from(" ")
205 + datetime.format(lower_format.as_str()).to_string().as_str()
206 + " ")
207 .as_str()
208 ),
209 ]
210 .clip(false)
211 .align_x(Alignment::Center),
212 ),
213 },
214 false,
215 vertical,
216 transparent,
217 )
218 .on_press_with_maybe(match calendar {
219 true => Some(|info: ButtonInfo| Message::UserToggledWindow {
220 x: info.position.x as i32,
221 y: info.position.y as i32,
222 viewport: (info.viewport.0 as i32, info.viewport.1 as i32),
223 window_type: NanelWindowType::Calendar,
224 container_id: calendar_menu::CALENDAR_MENU.clone(),
225 }),
226 false => None,
227 })
228 .padding(1)
229 .into()
230}
231
232pub fn view_desktop<'a>(thin: &bool, vertical: &bool) -> Element<'a, Message> {
233 match thin {
234 true => taskbar_button_thin(
235 text(if *vertical { "—" } else { "|" })
236 .align_x(Alignment::Center)
237 .align_y(Alignment::Center),
238 vertical,
239 transparent,
240 )
241 .on_press(Message::UserToggledDesktop)
242 .into(),
243 false => taskbar_button(icon(Bootstrap::Display), true, vertical, solid)
244 .on_press(Message::UserToggledDesktop)
245 .into(),
246 }
247}