use crate::widget::{Message, PanelWidget}; use crate::widgets::battery::BatteryWidget; use crate::widgets::clock::ClockWidget; use crate::widgets::power_management::PowerManagementWidget; use crate::widgets::powerbutton::ShutdownWidget; use crate::widgets::spacer::Spacer; use iced::Subscription; use iced::Task; use iced::{Color, Theme}; use iced::{Element, color}; pub struct App { widgets: Vec>, } impl App { pub const WINDOW_HEIGHT: u32 = 32; pub fn new() -> Self { Self { widgets: vec![ Box::new(ShutdownWidget::new()), Box::new(ClockWidget::new()), Box::new(Spacer::new(iced::Length::Fill)), Box::new(BatteryWidget::new()), Box::new(PowerManagementWidget::new()), ], } } pub fn name() -> String { "wayland_panel".into() } pub fn view(&self, id: iced::window::Id) -> Element<'_, Message> { if let Some(elem) = self .widgets .iter() .find_map(|widget| widget.render_window(id)) { return elem; } iced::widget::Row::with_children(self.widgets.iter().filter_map(|widget| widget.view())) .padding(iced::Padding::from([0, 5])) .height(iced::Length::Fill) .width(iced::Length::Fill) .spacing(5) .align_y(iced::Alignment::Center) .into() } pub fn update(&mut self, message: Message) -> Task { let mut output = Vec::new(); for widget in &mut self.widgets { output.push(widget.update(&message)); } Task::batch(output) } pub fn style(&self, theme: &iced::Theme) -> iced::theme::Style { iced::theme::Style { background_color: Color::TRANSPARENT, text_color: theme.palette().text, } } pub fn theme(&self, _id: iced::window::Id) -> iced::Theme { let palette = iced::theme::Palette { background: color!(0x282828), // dark BG_0 text: color!(0xfbf1c7), // dark FG0_29 primary: color!(0x8A493B), // dark BLUE_4 success: color!(0x98971a), // dark GREEN_2 warning: color!(0xd79921), // dark YELLOW_3 danger: color!(0xcc241d), // dark RED_1 }; Theme::custom("Better gruvbox", palette) } pub fn subscription(&self) -> iced::Subscription { Subscription::batch(self.widgets.iter().map(|w| w.subscribe())) } }