aboutsummaryrefslogtreecommitdiff
path: root/karlgui/src/edit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'karlgui/src/edit.rs')
-rw-r--r--karlgui/src/edit.rs230
1 files changed, 151 insertions, 79 deletions
diff --git a/karlgui/src/edit.rs b/karlgui/src/edit.rs
index d2f7150..b65feb2 100644
--- a/karlgui/src/edit.rs
+++ b/karlgui/src/edit.rs
@@ -1,8 +1,10 @@
use std::ops::Range;
-use egui::{Color32, DragValue, RichText, Ui};
+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,
@@ -12,6 +14,9 @@ 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 => {
@@ -49,12 +54,30 @@ impl EditableWidget for Task {
ui.label(&*d);
}
}
- ui.horizontal(|ui| {
- ui.label("Tags:");
- for t in &self.tags {
- ui.colored_label(Color32::LIGHT_GREEN, t);
- }
- });
+ 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);
});
}
@@ -74,7 +97,22 @@ impl EditableWidget for Schedule {
} => {
ui.horizontal(|ui| {
ui.label("Dynamic with priority");
- ui.label(&format!(" {} ", 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),
@@ -85,81 +123,108 @@ impl EditableWidget for Schedule {
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);
- 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());
- }
+ 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))
});
- } else {
- ui.label(prop.to_str());
- }
- 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))
+ }
+ });
+ }
+ 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) {
+ fn ui(&mut self, ui: &mut Ui, _edit: bool) {
ui.label("todo");
}
}
@@ -173,7 +238,7 @@ fn combine_condition(ui: &mut Ui, edit: bool, combinator: &str, cs: &mut Vec<Con
ui.label(if i != 0 { combinator } else { "" });
c.ui(ui, edit);
if edit {
- if ui.button(RichText::from("πŸ—‘").color(Color32::RED)).clicked() {
+ if ui.button("πŸ—‘").clicked() {
remove = Some(i);
}
}
@@ -196,14 +261,17 @@ fn combine_condition(ui: &mut Ui, edit: bool, combinator: &str, cs: &mut Vec<Con
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,
@@ -211,6 +279,7 @@ fn add_condition(ui: &mut Ui, mut add: impl FnMut(Condition) -> ()) {
})
}
if ui.button("Range").clicked() {
+ ui.close_menu();
add(Condition::Range {
prop: Property::Unix,
min: 0,
@@ -219,15 +288,18 @@ fn add_condition(ui: &mut Ui, mut add: impl FnMut(Condition) -> ()) {
})
}
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() {
- add(Condition::From(Box::new(Condition::Never)))
+ ui.close_menu();
+ add(Condition::From (Box::new(Condition::Never)))
}
});
}