diff options
Diffstat (limited to 'karlgui/src')
-rw-r--r-- | karlgui/src/main.rs | 102 |
1 files changed, 90 insertions, 12 deletions
diff --git a/karlgui/src/main.rs b/karlgui/src/main.rs index f4f9696..b92d95b 100644 --- a/karlgui/src/main.rs +++ b/karlgui/src/main.rs @@ -2,8 +2,10 @@ pub mod client; use crate::client::Client; use eframe::CreationContext; -use egui::{text::LayoutJob, CentralPanel, Color32, Response, TextFormat, Ui, Widget}; -use karlcommon::{socket_path, ClientboundPacket, Condition, Schedule, ServerboundPacket, Task}; +use egui::{text::LayoutJob, CentralPanel, Color32, DragValue, Response, TextFormat, Ui, Widget}; +use karlcommon::{ + socket_path, ClientboundPacket, Condition, Property, Schedule, ServerboundPacket, Task, +}; use log::{error, info}; use std::{ ops::{Deref, DerefMut, Range}, @@ -140,15 +142,10 @@ impl EditableWidget for Schedule { duration, condition, } => { - let mut j = LayoutJob::default(); - let f = TextFormat { - italics: true, - ..Default::default() - }; - j.append("Dynamic with priority", 0.0, f.clone()); - j.append(&format!(" {} ", priority), 0.0, f.clone()); - - ui.label(j); + 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), @@ -158,7 +155,88 @@ impl EditableWidget for Schedule { impl EditableWidget for Condition { fn ui(&mut self, ui: &mut Ui, edit: bool) { - ui.label("todo"); + 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)) + }); + } + }); } } |