diff options
author | metamuffin <yvchraiqi@protonmail.com> | 2022-08-17 08:38:33 +0200 |
---|---|---|
committer | metamuffin <yvchraiqi@protonmail.com> | 2022-08-17 08:38:33 +0200 |
commit | 5e6509163df53788799bb7aa97d07a90bf416eb7 (patch) | |
tree | 902f37c8ffcd7b94a60a230f51418c7b6fb84bc9 /karlgui/src/edit.rs | |
parent | aca12bc6d0194364d9e36c455fbcd2390e00d8be (diff) | |
download | karlender-5e6509163df53788799bb7aa97d07a90bf416eb7.tar karlender-5e6509163df53788799bb7aa97d07a90bf416eb7.tar.bz2 karlender-5e6509163df53788799bb7aa97d07a90bf416eb7.tar.zst |
refactor
Diffstat (limited to 'karlgui/src/edit.rs')
-rw-r--r-- | karlgui/src/edit.rs | 305 |
1 files changed, 0 insertions, 305 deletions
diff --git a/karlgui/src/edit.rs b/karlgui/src/edit.rs deleted file mode 100644 index b65feb2..0000000 --- a/karlgui/src/edit.rs +++ /dev/null @@ -1,305 +0,0 @@ -use std::ops::Range; - -use egui::{Color32, DragValue, TextEdit, Ui}; -use karlcommon::{Condition, Property, Schedule, Task}; - -use crate::helper::{edit_value, format_value}; - -pub 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 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 => { - if ui.button("πΎ Save").clicked() { - self.edit = false; - true - } else { - false - } - } - false => { - if ui.button("β Edit").clicked() { - self.edit = true; - } - false - } - }; - self.inner.ui(ui, self.edit); - changed - } -} - -pub 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) = &mut self.description { - if edit { - ui.text_edit_singleline(d); - } else { - ui.label(&*d); - } - } - if self.tags.len() != 0 || edit { - ui.horizontal(|ui| { - ui.label("Tags:"); - let mut remove = None; - for (i, t) in self.tags.iter_mut().enumerate() { - if edit { - TextEdit::singleline(t).desired_width(50.0).show(ui); - if ui.button("π").clicked() { - remove = Some(i); - } - } else { - ui.colored_label(Color32::LIGHT_GREEN, t); - } - } - if edit { - if ui.button("β").clicked() { - self.tags.push(String::from("blub")) - } - } - if let Some(remove) = remove { - self.tags.remove(remove); - } - }); - } - self.schedule.ui(ui, edit); - }); - } -} - -impl EditableWidget for Schedule { - fn ui(&mut self, ui: &mut Ui, edit: bool) { - match self { - Schedule::Never => { - ui.label("No schedule"); - } - Schedule::Dynamic { - priority, - scheduled, - duration, - condition, - } => { - ui.horizontal(|ui| { - ui.label("Dynamic with priority"); - match edit { - true => ui.add(DragValue::new(priority)), - false => ui.label(&format!("{}", priority)), - }; - ui.label("and duration"); - match edit { - true => ui.add(DragValue::new(duration)), - false => ui.label(&format!("{}", duration)), - }; - ui.label("seconds"); - if let Some(scheduled) = scheduled { - ui.label("at "); - scheduled.ui(ui, false) - } - ui.label("during"); - condition.ui(ui, edit); - }); - } - 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) { - let res = ui - .group(|ui| match self { - Condition::Never => { - ui.label("never"); - } - Condition::From(c) => { - ui.horizontal(|ui| { - ui.label("Starting from"); - c.ui(ui, edit); - if edit { - ui.menu_button("β Change type", |ui| { - add_condition(ui, |d| *c = Box::new(d)) - }); - } - }); - } - Condition::Invert(c) => { - ui.horizontal(|ui| { - ui.label("not when"); - c.ui(ui, edit); - if edit { - ui.menu_button("β Change type", |ui| { - add_condition(ui, |d| *c = Box::new(d)) - }); - } - }); - } - Condition::Or(cs) => combine_condition(ui, edit, "or", cs), - Condition::And(cs) => combine_condition(ui, edit, "and", cs), - 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(prop.to_str()); - } - ui.label("="); - if edit { - ui.push_id(0, |ui| edit_value(ui, *prop, value)); - } else { - ui.label(&format!("{}", format_value(*prop, *value))); - } - }); - } - Condition::Range { - prop, - min, - max, - modulus: _, - } => { - ui.horizontal(|ui| { - ui.label("when"); - match edit { - true => drop(ui.push_id(0, |ui| edit_value(ui, *prop, min))), - false => drop(ui.label(&format!("{}", format_value(*prop, *min)))), - } - ui.label("β€"); - 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(prop.to_str()); - } - ui.label("<"); - match edit { - true => drop(ui.push_id(1, |ui| edit_value(ui, *prop, max))), - false => drop(ui.label(&format!("{}", format_value(*prop, *max)))), - } - }); - } - }) - .response; - if edit { - res.context_menu(|ui| { - ui.menu_button("Replace withβ¦", |ui| { - add_condition(ui, |c| { - *self = c; - }) - }); - }); - } - } -} - -impl EditableWidget for Range<i64> { - fn ui(&mut self, ui: &mut Ui, _edit: bool) { - ui.label("todo"); - } -} - -fn combine_condition(ui: &mut Ui, edit: bool, combinator: &str, cs: &mut Vec<Condition>) { - ui.vertical(|ui| { - let mut remove = None; - for (i, c) in cs.iter_mut().enumerate() { - ui.push_id(i, |ui| { - ui.horizontal(|ui| { - ui.label(if i != 0 { combinator } else { "" }); - c.ui(ui, edit); - if edit { - if ui.button("π").clicked() { - remove = Some(i); - } - } - }); - }); - } - if edit { - ui.menu_button("β Add condition", |ui| { - add_condition(ui, |e| { - cs.push(e); - }) - }); - } - if let Some(remove) = remove { - cs.remove(remove); - } - }); -} - -fn add_condition(ui: &mut Ui, mut add: impl FnMut(Condition) -> ()) { - ui.menu_button("Combinators", |ui| { - if ui.button("And").clicked() { - ui.close_menu(); - add(Condition::And(vec![])) - } - if ui.button("Or").clicked() { - ui.close_menu(); - add(Condition::Or(vec![])) - } - }); - ui.menu_button("Constraints", |ui| { - if ui.button("Equal").clicked() { - ui.close_menu(); - add(Condition::Equal { - modulus: None, - prop: Property::Unix, - value: 0, - }) - } - if ui.button("Range").clicked() { - ui.close_menu(); - add(Condition::Range { - prop: Property::Unix, - min: 0, - max: 10, - modulus: None, - }) - } - if ui.button("Never").clicked() { - ui.close_menu(); - add(Condition::Never) - } - }); - ui.menu_button("Modifier", |ui| { - if ui.button("Invert").clicked() { - ui.close_menu(); - add(Condition::Invert(Box::new(Condition::Never))) - } - if ui.button("Starting from").clicked() { - ui.close_menu(); - add(Condition::From (Box::new(Condition::Never))) - } - }); -} |