2023-08-09 17:54:56 +00:00
|
|
|
use crate::{
|
|
|
|
components::{Date, TransitClock},
|
|
|
|
types::State,
|
|
|
|
};
|
|
|
|
use gtk::prelude::*;
|
|
|
|
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct ApplicationWindow {
|
|
|
|
pub window: gtk::ApplicationWindow,
|
|
|
|
pub date_label: Date,
|
2023-08-09 18:02:20 +00:00
|
|
|
pub next_event: gtk::Label,
|
2023-08-09 17:54:56 +00:00
|
|
|
pub transit_clock: TransitClock,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ApplicationWindow {
|
|
|
|
pub fn new(app: >k::Application) -> Self {
|
|
|
|
let window = gtk::ApplicationWindow::new(app);
|
|
|
|
|
|
|
|
let layout = gtk::Box::builder()
|
|
|
|
.orientation(gtk::Orientation::Vertical)
|
|
|
|
.hexpand(true)
|
|
|
|
.vexpand(true)
|
|
|
|
.build();
|
|
|
|
|
2023-08-09 18:02:20 +00:00
|
|
|
let date_label = Date::new();
|
2023-08-09 17:54:56 +00:00
|
|
|
layout.append(&date_label);
|
2023-08-09 18:02:20 +00:00
|
|
|
|
|
|
|
let next_event = gtk::Label::builder()
|
|
|
|
.margin_bottom(8)
|
|
|
|
.margin_top(8)
|
|
|
|
.margin_start(8)
|
|
|
|
.margin_end(8)
|
|
|
|
.build();
|
|
|
|
next_event.add_css_class("card");
|
|
|
|
next_event.add_css_class("activatable");
|
|
|
|
layout.append(&next_event);
|
|
|
|
|
|
|
|
let transit_clock = TransitClock::new();
|
2023-08-09 17:54:56 +00:00
|
|
|
layout.append(&transit_clock);
|
|
|
|
|
|
|
|
window.set_child(Some(&layout));
|
|
|
|
|
|
|
|
Self {
|
|
|
|
window,
|
|
|
|
date_label,
|
2023-08-09 18:02:20 +00:00
|
|
|
next_event,
|
2023-08-09 17:54:56 +00:00
|
|
|
transit_clock,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn update_state(&self, state: State) {
|
|
|
|
self.date_label.update_date(state.date);
|
2023-08-09 18:02:20 +00:00
|
|
|
self.next_event.set_text(&format!("{:?}", state.next_event));
|
2023-08-09 17:54:56 +00:00
|
|
|
if let Some(transit) = state.transit {
|
|
|
|
self.transit_clock.update_transit(transit);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|