use chrono::{DateTime, Datelike, Local, Timelike}; use iced::{ Alignment, Element, Length, widget::{column, row, text}, }; use iced_fonts::Bootstrap; use serde::Deserialize; use crate::{ config, msg::{Message, NanelWindowType}, panel::label, styles::{solid, transparent}, widgets::{ button_with_position::ButtonInfo, icon, small_icon, taskbar_button, taskbar_button_thin, taskbar_button_with_info, }, windows::{ calendar_menu, directory_menu, notification_menu, quick_settings_menu, start_menu, systray_menu, }, }; #[derive(Deserialize, Debug)] pub enum Module { StartMenu, Workspaces, DirectoryMenu, VerticalSeperator, Taskbar { merge_windows: bool, merge_pinned: bool, }, SystemTray { hidden: bool, }, QuickSettings { show_connection: bool, show_volume: bool, show_power: bool, }, DateTime { calendar: bool, upper_format: String, lower_format: String, }, NotificationTray, ViewDesktop { show_on_hover: bool, thin: bool, }, } pub fn get_connection<'a, Message>(show_connection: &bool) -> Option> { match show_connection { true => Some(small_icon(Bootstrap::Wifi).into()), false => None, } } pub fn get_volume<'a, Message>(show_volume: &bool) -> Option> { match show_volume { true => Some(small_icon(Bootstrap::VolumeUpFill).into()), false => None, } } pub fn get_power<'a, Message>(show_power: &bool) -> Option> { match show_power { true => Some(small_icon(Bootstrap::Battery).into()), false => None, } } pub fn start_menu<'a>(vertical: &bool) -> Element<'a, Message> { taskbar_button_with_info(icon(Bootstrap::Microsoft), true, vertical, transparent) .on_press_with(|info| Message::UserToggledWindow { x: info.position.x as i32, y: info.position.y as i32, viewport: (info.viewport.0 as i32, info.viewport.1 as i32), window_type: NanelWindowType::Start, container_id: start_menu::START_MENU.clone(), }) .into() } pub fn workspaces<'a>(vertical: &bool) -> Element<'a, Message> { taskbar_button(icon(Bootstrap::Stack), true, vertical, transparent) .on_press(Message::UserToggledWorkspaces) .into() } pub fn directory_menu<'a>(vertical: &bool) -> Element<'a, Message> { taskbar_button_with_info(icon(Bootstrap::FolderFill), true, vertical, transparent) .on_press_with(|info| Message::UserToggledWindow { x: info.position.x as i32, y: info.position.y as i32, viewport: (info.viewport.0 as i32, info.viewport.1 as i32), window_type: NanelWindowType::Directory, container_id: directory_menu::DIRECTORY_MENU.clone(), }) .into() } pub fn system_tray<'a>( hidden_menu: &bool, vertical: &bool, position: config::Position, ) -> Element<'a, Message> { let icon = match position { config::Position::Top => small_icon(Bootstrap::ChevronDown), config::Position::Bottom => small_icon(Bootstrap::ChevronUp), config::Position::Left => small_icon(Bootstrap::ChevronRight), config::Position::Right => small_icon(Bootstrap::ChevronLeft), }; match hidden_menu { false => text!("TODO: systray").into(), true => taskbar_button_with_info(icon, false, vertical, transparent) .on_press_with(|info| Message::UserToggledWindow { x: info.position.x as i32, y: info.position.y as i32, viewport: (info.viewport.0 as i32, info.viewport.1 as i32), window_type: NanelWindowType::SystemTray, container_id: systray_menu::SYSTRAY_MENU.clone(), }) .into(), } } pub fn notification_tray<'a>(vertical: &bool) -> Element<'a, Message> { taskbar_button_with_info(small_icon(Bootstrap::Bell), false, vertical, transparent) .on_press_with(|info| Message::UserToggledWindow { x: info.position.x as i32, y: info.position.y as i32, viewport: (info.viewport.0 as i32, info.viewport.1 as i32), window_type: NanelWindowType::Notification, container_id: notification_menu::NOTIFICATION_MENU.clone(), }) .into() } pub fn quick_settings<'a>( connection: Option>, volume: Option>, power: Option>, vertical: &bool, ) -> Element<'a, Message> { taskbar_button_with_info( match vertical { true => Into::>::into( column![] .push_maybe(connection) .push_maybe(volume) .push_maybe(power) .spacing(6) .align_x(Alignment::Center) .width(Length::Fill), ), false => Into::>::into( row![] .push_maybe(connection) .push_maybe(volume) .push_maybe(power) .spacing(6) .align_y(Alignment::Center) .height(Length::Fill), ), }, false, vertical, transparent, ) .on_press_with(|info| Message::UserToggledWindow { x: info.position.x as i32, y: info.position.y as i32, viewport: (info.viewport.0 as i32, info.viewport.1 as i32), window_type: NanelWindowType::QuickSettings, container_id: quick_settings_menu::QUICK_SETTINGS_MENU.clone(), }) .into() } pub fn date_time<'a>( datetime: DateTime, calendar: &bool, upper_format: &String, lower_format: &String, vertical: &bool, ) -> Element<'a, Message> { taskbar_button_with_info( match vertical { true => Into::>::into( row![text("TODO")].clip(false).align_y(Alignment::Center), ), false => Into::>::into( column![ label( (String::from(" ") + datetime.format(upper_format.as_str()).to_string().as_str() + " ") .as_str() ), label( (String::from(" ") + datetime.format(lower_format.as_str()).to_string().as_str() + " ") .as_str() ), ] .clip(false) .align_x(Alignment::Center), ), }, false, vertical, transparent, ) .on_press_with_maybe(match calendar { true => Some(|info: ButtonInfo| Message::UserToggledWindow { x: info.position.x as i32, y: info.position.y as i32, viewport: (info.viewport.0 as i32, info.viewport.1 as i32), window_type: NanelWindowType::Calendar, container_id: calendar_menu::CALENDAR_MENU.clone(), }), false => None, }) .padding(1) .into() } pub fn view_desktop<'a>(thin: &bool, vertical: &bool) -> Element<'a, Message> { match thin { true => taskbar_button_thin( text(if *vertical { "—" } else { "|" }) .align_x(Alignment::Center) .align_y(Alignment::Center), vertical, transparent, ) .on_press(Message::UserToggledDesktop) .into(), false => taskbar_button(icon(Bootstrap::Display), true, vertical, solid) .on_press(Message::UserToggledDesktop) .into(), } }