use crate::widget::{Message, PanelWidget}; use crate::widgets::battery::BatteryWidget; use crate::widgets::clock::ClockWidget; use crate::widgets::powerbutton::ShutdownWidget; use crate::widgets::spacer::Spacer; use iced::Color; use iced::Element; use iced::Subscription; use iced::Task; pub struct App { widgets: Vec>, } impl App { pub const WINDOW_HEIGHT: u32 = 32; pub fn new() -> Self { Self { widgets: vec![ Box::new(ClockWidget::new()), Box::new(Spacer::new(iced::Length::Fill)), Box::new(ShutdownWidget::new()), Box::new(Spacer::new(iced::Length::Fill)), Box::new(BatteryWidget::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(|widget| widget.has_window(id)) .map(|widget| widget.view(id)) { return elem; } iced::widget::Row::with_children(self.widgets.iter().map(|widget| widget.view(id))) .padding(iced::Padding::from([0, 5])) .height(iced::Length::Fill) .width(iced::Length::Fill) .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 { iced::Theme::GruvboxDark } pub fn subscription(&self) -> iced::Subscription { Subscription::batch(self.widgets.iter().map(|w| w.subscribe())) } }