diff options
Diffstat (limited to 'karlgui/src/main.rs')
-rw-r--r-- | karlgui/src/main.rs | 199 |
1 files changed, 15 insertions, 184 deletions
diff --git a/karlgui/src/main.rs b/karlgui/src/main.rs index b92d95b..3832044 100644 --- a/karlgui/src/main.rs +++ b/karlgui/src/main.rs @@ -1,17 +1,13 @@ pub mod client; +pub mod edit; use crate::client::Client; +use edit::ShowOrEdit; use eframe::CreationContext; -use egui::{text::LayoutJob, CentralPanel, Color32, DragValue, Response, TextFormat, Ui, Widget}; -use karlcommon::{ - socket_path, ClientboundPacket, Condition, Property, Schedule, ServerboundPacket, Task, -}; +use egui::CentralPanel; +use karlcommon::{socket_path, ClientboundPacket, ServerboundPacket, Task}; use log::{error, info}; -use std::{ - ops::{Deref, DerefMut, Range}, - os::unix::net::UnixStream, - process::exit, -}; +use std::{os::unix::net::UnixStream, process::exit}; fn main() { env_logger::init(); @@ -55,6 +51,9 @@ impl App { ClientboundPacket::TaskList(t) => { self.tasks = t.into_iter().map(|t| ShowOrEdit::new(t, false)).collect() } + ClientboundPacket::Sync => { + self.client.busy = false; + } _ => {} } } @@ -65,183 +64,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| { - for t in &mut self.tasks { - t.ui(ui); - ui.separator(); - } - }); - } -} - -struct ShowOrEdit<T> { - pub inner: T, - pub edit: bool, -} - -impl<T: EditableWidget> ShowOrEdit<T> { - pub fn new(inner: T, edit: bool) -> ShowOrEdit<T> { - Self { inner, edit } - } - pub fn ui(&mut self, ui: &mut Ui) { - match self.edit { - true => { - if ui.button("💾 Save").clicked() { - self.edit = false; - } - } - false => { - if ui.button("✏ Edit").clicked() { - self.edit = true; - } - } - } - self.inner.ui(ui, self.edit); - } -} - -trait EditableWidget { - fn ui(&mut self, ui: &mut Ui, edit: bool); -} - -impl EditableWidget for Task { - fn ui(&mut self, ui: &mut Ui, edit: bool) { - ui.heading(&self.name); - ui.indent((), |ui| { - if let Some(d) = &self.description { - ui.label(d); - } - ui.horizontal(|ui| { - ui.label("Tags:"); - for t in &self.tags { - ui.colored_label(Color32::LIGHT_GREEN, t); + 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(); } }); - self.schedule.ui(ui, edit); }); } } - -impl EditableWidget for Schedule { - fn ui(&mut self, ui: &mut Ui, edit: bool) { - match self { - Schedule::Never => { - let mut j = LayoutJob::default(); - j.append( - "No schedule", - 0.0, - TextFormat { - italics: true, - ..Default::default() - }, - ); - ui.label(j); - } - Schedule::Dynamic { - priority, - scheduled, - duration, - condition, - } => { - ui.horizontal(|ui| { - ui.label("Dynamic with priority"); - ui.label(&format!(" {} ", priority)); - }); - } - Schedule::Condition(c) => c.ui(ui, edit), - Schedule::Static(t) => t.ui(ui, edit), - } - } -} - -impl EditableWidget for Condition { - fn ui(&mut self, ui: &mut Ui, edit: bool) { - ui.group(|ui| match self { - Condition::Never => { - ui.label("never"); - } - Condition::From(c) => { - ui.horizontal(|ui| { - ui.label("Starting from"); - c.ui(ui, edit); - }); - } - Condition::Or(cs) => { - ui.vertical(|ui| { - for (i, c) in cs.iter_mut().enumerate() { - ui.push_id(i, |ui| { - ui.horizontal(|ui| { - ui.label(if i != 0 { "or " } else { " " }); - c.ui(ui, edit); - }); - }); - } - }); - } - Condition::And(cs) => { - ui.vertical(|ui| { - for (i, c) in cs.iter_mut().enumerate() { - ui.push_id(i, |ui| { - ui.horizontal(|ui| { - ui.label(if i != 0 { "and" } else { "" }); - c.ui(ui, edit); - }); - }); - } - }); - } - Condition::Invert(c) => { - ui.horizontal(|ui| { - ui.label("not when"); - c.ui(ui, edit); - }); - } - Condition::Equal { - prop, - value, - modulus, - } => { - ui.horizontal(|ui| { - ui.label("when"); - if edit { - egui::ComboBox::from_id_source(ui.id()) - .selected_text(prop.to_str()) - .show_ui(ui, |ui| { - for v in Property::VALUES { - ui.selectable_value(prop, *v, v.to_str()); - } - }); - } else { - ui.label(&format!("{:?}", prop)); - } - ui.label("="); - if edit { - ui.add(DragValue::new(value)); - } else { - ui.label(&format!("{}", value)); - } - }); - } - Condition::Range { - prop, - min, - max, - modulus, - } => { - ui.horizontal(|ui| { - ui.label("when "); - ui.label(&format!("{}", min)); - ui.label("≤"); - ui.label(&format!("{:?}", prop)); - ui.label("<"); - ui.label(&format!("{}", max)) - }); - } - }); - } -} - -impl EditableWidget for Range<i64> { - fn ui(&mut self, ui: &mut Ui, edit: bool) { - ui.label("todo"); - } -} |