forked from max_ag/wayland_panel
86 lines
2.5 KiB
Rust
86 lines
2.5 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::Subscription;
|
|
use iced::Task;
|
|
use iced::{Color, Theme};
|
|
use iced::{Element, color};
|
|
|
|
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 {
|
|
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<Message> {
|
|
Subscription::batch(self.widgets.iter().map(|w| w.subscribe()))
|
|
}
|
|
}
|