wayland_panel/src/app.rs

77 lines
2.1 KiB
Rust

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::Color;
use iced::Element;
use iced::Subscription;
use iced::Task;
pub struct App {
widgets: Vec<Box<dyn PanelWidget>>,
}
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<Message> {
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<Message> {
Subscription::batch(self.widgets.iter().map(|w| w.subscribe()))
}
}