diff options
-rw-r--r-- | Cargo.lock | 10 | ||||
-rw-r--r-- | karlgui/Cargo.toml | 1 | ||||
-rw-r--r-- | karlgui/src/helper.rs | 63 | ||||
-rw-r--r-- | karlgui/src/main.rs | 56 | ||||
-rw-r--r-- | karlgui/src/views/calendar.rs | 34 | ||||
-rw-r--r-- | karlgui/src/views/edit.rs (renamed from karlgui/src/edit.rs) | 58 | ||||
-rw-r--r-- | karlgui/src/views/mod.rs | 2 |
7 files changed, 150 insertions, 74 deletions
@@ -494,6 +494,15 @@ dependencies = [ ] [[package]] +name = "egui_extras" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877bfcce06463cdbcfd7f4efd57608b1384d6d9ae03b33e503fbba1d1a899a52" +dependencies = [ + "egui", +] + +[[package]] name = "egui_glow" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -847,6 +856,7 @@ dependencies = [ "crossbeam-channel", "eframe", "egui", + "egui_extras", "env_logger", "karlcommon", "log", diff --git a/karlgui/Cargo.toml b/karlgui/Cargo.toml index c41c874..fd1aec0 100644 --- a/karlgui/Cargo.toml +++ b/karlgui/Cargo.toml @@ -14,3 +14,4 @@ log = "0.4.17" eframe = "0.18.0" egui = "0.18.1" +egui_extras = "0.18.0" diff --git a/karlgui/src/helper.rs b/karlgui/src/helper.rs index 1ae29c8..eb4c981 100644 --- a/karlgui/src/helper.rs +++ b/karlgui/src/helper.rs @@ -4,40 +4,11 @@ use karlcommon::Property; pub fn format_value(prop: Property, value: i64) -> String { match prop { Property::Year => format!("{value}"), - Property::Monthofyear => format!( - "{}", - match value { - 0 => "January", - 1 => "February", - 2 => "March", - 3 => "April", - 4 => "May", - 5 => "June", - 6 => "July", - 7 => "August", - 8 => "September", - 9 => "October", - 10 => "November", - 11 => "December", - _ => "(invalid)", - } - ), + Property::Monthofyear => format!("{}", month_to_str(value)), Property::Weekofmonth => format!("{value}"), Property::Dayofyear => format!("{value}"), Property::Dayofmonth => format!("{value}"), - Property::Dayofweek => format!( - "{}", - match value { - 0 => "Monday", - 1 => "Thuesday", - 2 => "Wednesday", - 3 => "Thursday", - 4 => "Friday", - 5 => "Saturday", - 6 => "Sunday", - _ => "(invalid)", - } - ), + Property::Dayofweek => format!("{}", weekday_to_str(value)), Property::Hour => format!("{value}h"), Property::Minute => format!("{value}min"), Property::Second => format!("{value}s"), @@ -91,3 +62,33 @@ pub fn edit_value(ui: &mut Ui, prop: Property, value: &mut i64) { } } } + +pub fn weekday_to_str(value: i64) -> &'static str { + match value { + 0 => "Monday", + 1 => "Thuesday", + 2 => "Wednesday", + 3 => "Thursday", + 4 => "Friday", + 5 => "Saturday", + 6 => "Sunday", + _ => "(invalid)", + } +} +pub fn month_to_str(value: i64) -> &'static str { + match value { + 0 => "January", + 1 => "February", + 2 => "March", + 3 => "April", + 4 => "May", + 5 => "June", + 6 => "July", + 7 => "August", + 8 => "September", + 9 => "October", + 10 => "November", + 11 => "December", + _ => "(invalid)", + } +} diff --git a/karlgui/src/main.rs b/karlgui/src/main.rs index a85459e..d683a78 100644 --- a/karlgui/src/main.rs +++ b/karlgui/src/main.rs @@ -1,14 +1,14 @@ pub mod client; -pub mod edit; pub mod helper; +pub mod views; use crate::client::Client; -use edit::ShowOrEdit; use eframe::CreationContext; use egui::CentralPanel; use karlcommon::{socket_path, ClientboundPacket, ServerboundPacket, Task}; use log::{error, info}; use std::{os::unix::net::UnixStream, process::exit}; +use views::{calendar::Calendar, edit::ShowAndEdit}; fn main() { env_logger::init(); @@ -19,9 +19,24 @@ fn main() { ) } -struct App { +pub struct Globals { client: Client, - tasks: Vec<ShowOrEdit<Task>>, + tasks: Vec<Task>, +} + +struct App { + g: Globals, + + current_tab: Tab, + + show_and_edit: ShowAndEdit, + calendar: Calendar, +} + +#[derive(PartialEq)] +enum Tab { + ShowAndEdit, + CalendarWeek, } impl App { @@ -41,19 +56,22 @@ impl App { client.send(ServerboundPacket::ListTasks); App { - client, - tasks: vec![], + current_tab: Tab::ShowAndEdit, + g: Globals { + client, + tasks: vec![], + }, + show_and_edit: Default::default(), + calendar: Default::default(), } } pub fn update_network(&mut self) { - for p in self.client.receiver.try_iter() { + for p in self.g.client.receiver.try_iter() { match p { - ClientboundPacket::TaskList(t) => { - self.tasks = t.into_iter().map(|t| ShowOrEdit::new(t, false)).collect() - } + ClientboundPacket::TaskList(t) => self.g.tasks = t, ClientboundPacket::Sync => { - self.client.busy = false; + self.g.client.busy = false; } _ => {} } @@ -65,13 +83,15 @@ impl eframe::App for App { fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { self.update_network(); CentralPanel::default().show(ctx, |ui| { - ui.add_enabled_ui(!self.client.busy, |ui| { - for t in &mut self.tasks { - if t.changed(ui) { - self.client - .send_sync(ServerboundPacket::UpdateTask(t.inner.clone())) - } - ui.separator(); + ui.add_enabled_ui(!self.g.client.busy, |ui| { + ui.horizontal(|ui| { + ui.selectable_value(&mut self.current_tab, Tab::ShowAndEdit, "Tasks"); + ui.selectable_value(&mut self.current_tab, Tab::CalendarWeek, "Calendar: Week"); + }); + ui.separator(); + match self.current_tab { + Tab::ShowAndEdit => self.show_and_edit.ui(ui, &mut self.g), + Tab::CalendarWeek => self.calendar.ui(ui, &mut self.g), } }); }); diff --git a/karlgui/src/views/calendar.rs b/karlgui/src/views/calendar.rs new file mode 100644 index 0000000..b216504 --- /dev/null +++ b/karlgui/src/views/calendar.rs @@ -0,0 +1,34 @@ +use crate::{helper::weekday_to_str, Globals}; +use egui::Ui; +use egui_extras::TableBuilder; + +#[derive(Default)] +pub struct Calendar; + +impl Calendar { + pub fn ui(&mut self, ui: &mut Ui, _g: &mut Globals) { + TableBuilder::new(ui) + .column(egui_extras::Size::exact(50.0)) + .columns(egui_extras::Size::remainder(), 7) + .header(25.0, |mut ui| { + ui.col(|_| {}); + for d in 0..7 { + ui.col(|ui| { + ui.heading(weekday_to_str(d)); + }); + } + }) + .body(|ui| { + ui.rows(50.0, 24, |h, mut ui| { + ui.col(|ui| { + ui.heading(&format!("{h:02}:00")); + }); + for d in 0..7 { + ui.col(|ui| { + ui.label(&format!("day {d} at {h}:00")); + }); + } + }) + }) + } +} diff --git a/karlgui/src/edit.rs b/karlgui/src/views/edit.rs index b65feb2..04146dd 100644 --- a/karlgui/src/edit.rs +++ b/karlgui/src/views/edit.rs @@ -1,41 +1,49 @@ use std::ops::Range; use egui::{Color32, DragValue, TextEdit, Ui}; -use karlcommon::{Condition, Property, Schedule, Task}; +use karlcommon::{Condition, Property, Schedule, ServerboundPacket, Task}; -use crate::helper::{edit_value, format_value}; +use crate::{ + helper::{edit_value, format_value}, + Globals, +}; -pub struct ShowOrEdit<T> { - pub inner: T, - pub edit: bool, +#[derive(Default)] +pub struct ShowAndEdit { + edit: Option<u64>, } -impl<T: EditableWidget> ShowOrEdit<T> { - pub fn new(inner: T, edit: bool) -> ShowOrEdit<T> { - Self { inner, edit } - } - pub fn show_only(&mut self, ui: &mut Ui) { - self.inner.ui(ui, false); - } - pub fn changed(&mut self, ui: &mut Ui) -> bool { - let changed = match self.edit { - true => { +impl ShowAndEdit { + pub fn ui(&mut self, ui: &mut Ui, g: &mut Globals) { + for t in &mut g.tasks { + let edit = self.edit == Some(t.id); + let changed = if edit { if ui.button("💾 Save").clicked() { - self.edit = false; + self.edit = None; true } else { false } - } - false => { - if ui.button("✏ Edit").clicked() { - self.edit = true; - } + } else { + ui.add_enabled_ui(self.edit.is_none(), |ui| { + if ui + .button("✏ Edit") + .on_disabled_hover_text( + "Some other task is still being edited, save that one first.", + ) + .clicked() + { + self.edit = Some(t.id); + } + }); false + }; + if changed { + g.client.send_sync(ServerboundPacket::UpdateTask(t.clone())); } - }; - self.inner.ui(ui, self.edit); - changed + t.ui(ui, edit); + ui.separator(); + } } } @@ -299,7 +307,7 @@ fn add_condition(ui: &mut Ui, mut add: impl FnMut(Condition) -> ()) { } if ui.button("Starting from").clicked() { ui.close_menu(); - add(Condition::From (Box::new(Condition::Never))) + add(Condition::From(Box::new(Condition::Never))) } }); } diff --git a/karlgui/src/views/mod.rs b/karlgui/src/views/mod.rs new file mode 100644 index 0000000..9c6ea7c --- /dev/null +++ b/karlgui/src/views/mod.rs @@ -0,0 +1,2 @@ +pub mod edit; +pub mod calendar; |