aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <yvchraiqi@protonmail.com>2022-08-17 08:38:33 +0200
committermetamuffin <yvchraiqi@protonmail.com>2022-08-17 08:38:33 +0200
commit5e6509163df53788799bb7aa97d07a90bf416eb7 (patch)
tree902f37c8ffcd7b94a60a230f51418c7b6fb84bc9
parentaca12bc6d0194364d9e36c455fbcd2390e00d8be (diff)
downloadkarlender-5e6509163df53788799bb7aa97d07a90bf416eb7.tar
karlender-5e6509163df53788799bb7aa97d07a90bf416eb7.tar.bz2
karlender-5e6509163df53788799bb7aa97d07a90bf416eb7.tar.zst
refactor
-rw-r--r--Cargo.lock10
-rw-r--r--karlgui/Cargo.toml1
-rw-r--r--karlgui/src/helper.rs63
-rw-r--r--karlgui/src/main.rs56
-rw-r--r--karlgui/src/views/calendar.rs34
-rw-r--r--karlgui/src/views/edit.rs (renamed from karlgui/src/edit.rs)58
-rw-r--r--karlgui/src/views/mod.rs2
7 files changed, 150 insertions, 74 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 279e57c..d5cf770 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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;