aboutsummaryrefslogtreecommitdiff
path: root/karlgui/src/views
diff options
context:
space:
mode:
Diffstat (limited to 'karlgui/src/views')
-rw-r--r--karlgui/src/views/calendar.rs68
-rw-r--r--karlgui/src/views/edit.rs2
2 files changed, 58 insertions, 12 deletions
diff --git a/karlgui/src/views/calendar.rs b/karlgui/src/views/calendar.rs
index b216504..c332b80 100644
--- a/karlgui/src/views/calendar.rs
+++ b/karlgui/src/views/calendar.rs
@@ -1,12 +1,32 @@
+use std::ops::Range;
+
use crate::{helper::weekday_to_str, Globals};
+use chrono::{Duration, NaiveDateTime};
use egui::Ui;
use egui_extras::TableBuilder;
#[derive(Default)]
-pub struct Calendar;
+pub struct Calendar {
+ // offset: NaiveDate,
+}
impl Calendar {
- pub fn ui(&mut self, ui: &mut Ui, _g: &mut Globals) {
+ pub fn ui(&mut self, ui: &mut Ui, g: &mut Globals) {
+ let start_date = chrono::Utc::now().date_naive(); //self.offset;
+ let end_date = start_date + chrono::Duration::days(7);
+ let start_dt = start_date.and_hms(0, 0, 0);
+ let end_dt = end_date.and_hms(0, 0, 0);
+
+ let instances = if let Some(instances) = g.get_all_instances_range(start_dt, end_dt) {
+ instances
+ } else {
+ ui.horizontal(|ui| {
+ ui.spinner();
+ ui.label("Loading…");
+ });
+ return;
+ };
+
TableBuilder::new(ui)
.column(egui_extras::Size::exact(50.0))
.columns(egui_extras::Size::remainder(), 7)
@@ -18,17 +38,43 @@ impl Calendar {
});
}
})
- .body(|ui| {
- ui.rows(50.0, 24, |h, mut ui| {
- ui.col(|ui| {
- ui.heading(&format!("{h:02}:00"));
- });
- for d in 0..7 {
+ .body(|mut ui| {
+ let mut cols: [Vec<u64>; 7] =
+ [vec![], vec![], vec![], vec![], vec![], vec![], vec![]];
+ for h in 0..24 {
+ ui.row(50.0, |mut ui| {
ui.col(|ui| {
- ui.label(&format!("day {d} at {h}:00"));
+ ui.heading(&format!("{h:02}:00"));
});
- }
- })
+ for d in 0..7 {
+ let _col = &mut cols[d];
+ let time = start_dt + Duration::days(d as i64) + Duration::hours(h);
+ let instances_here =
+ instances.iter().filter(|(_, r)| r.includes(&time));
+
+ ui.col(|ui| {
+ for (id, _) in instances_here {
+ g.tasks.get(id).unwrap();
+ ui.label(&format!("{id}"));
+ }
+ });
+ }
+ })
+ }
})
}
}
+
+trait Includes<T> {
+ fn includes(&self, p: &T) -> bool;
+}
+impl Includes<NaiveDateTime> for Range<Option<NaiveDateTime>> {
+ fn includes(&self, p: &NaiveDateTime) -> bool {
+ match (&self.start, &self.end) {
+ (None, None) => false,
+ (None, Some(e)) => p < e,
+ (Some(s), None) => s <= p,
+ (Some(s), Some(e)) => s <= p && p < e,
+ }
+ }
+}
diff --git a/karlgui/src/views/edit.rs b/karlgui/src/views/edit.rs
index 04146dd..0a8058c 100644
--- a/karlgui/src/views/edit.rs
+++ b/karlgui/src/views/edit.rs
@@ -15,7 +15,7 @@ pub struct ShowAndEdit {
impl ShowAndEdit {
pub fn ui(&mut self, ui: &mut Ui, g: &mut Globals) {
- for t in &mut g.tasks {
+ for t in g.tasks.values_mut() {
let edit = self.edit == Some(t.id);
let changed = if edit {
if ui.button("💾 Save").clicked() {