[MIRROR] https://codeberg.org/naomi/nanel
at main 247 lines 8.0 kB view raw
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}