From 9856b281b429fa3ba13b64f6c6cd99b3d05d1a2f Mon Sep 17 00:00:00 2001 From: metamuffin Date: Wed, 17 Aug 2022 17:48:42 +0200 Subject: modularize interfaces --- karlgui/src/views/calendar.rs | 168 ++++++++++++++++-------------------------- 1 file changed, 64 insertions(+), 104 deletions(-) (limited to 'karlgui/src') diff --git a/karlgui/src/views/calendar.rs b/karlgui/src/views/calendar.rs index a145f4a..1e869af 100644 --- a/karlgui/src/views/calendar.rs +++ b/karlgui/src/views/calendar.rs @@ -1,7 +1,7 @@ use crate::{helper::weekday_to_str, Globals}; use chrono::{Datelike, Duration, NaiveDateTime, Timelike}; -use egui::{Color32, Label, Layout, Rect, ScrollArea, Sense, Stroke, Ui, Vec2}; -use egui_extras::{Size, StripBuilder}; +use egui::{Color32, Rect, Sense, Stroke, Ui, Vec2}; +use egui_extras::{Size, TableBuilder}; use std::{collections::BTreeMap, ops::Range}; #[derive(Default)] @@ -24,21 +24,40 @@ impl Calendar { let height = 1500.0; - ScrollArea::vertical().show(ui, |ui| { - StripBuilder::new(ui) - .size(Size::exact(50.0)) - .sizes(Size::remainder(), 7) - .horizontal(|mut ui| { - ui.cell(|ui| { + TableBuilder::new(ui) + .column(Size::exact(50.0)) + .columns(Size::remainder(), 7) + .header(50.0, |mut tr| { + for d in 0..7 { + tr.col(|_| {}); + tr.col(|ui| { + ui.heading(weekday_to_str( + (start_dt + Duration::days(d as i64)) + .date() + .weekday() + .num_days_from_monday() + .into(), + )); + }); + } + }) + .body(|mut tb| { + tb.row(height, |mut tr| { + tr.col(|ui| { for h in 0..24 { - ui.add_sized( - Vec2::new(50.0, height / 24.0), - Label::new(&format!("{h:02}:00")), + let (response, p) = + ui.allocate_painter(Vec2::new(50.0, height), Sense::hover()); + p.text( + response.rect.min + Vec2::new(0.0, h as f32 / 24.0 * height), + egui::Align2::LEFT_TOP, + format!("{h:02}:00"), + egui::FontId::monospace(15.0), + Color32::from_gray(150), ); } }); for d in 0..7 { - ui.cell(|ui| { + tr.col(|ui| { let time = start_dt + Duration::days(d as i64); let time_end = time + Duration::days(1) - Duration::seconds(1); let instances_here = instances @@ -52,107 +71,48 @@ impl Calendar { ) }) .filter(|(_, l)| l.len() != 0); + ui.horizontal(|ui| { + for (id, rs) in instances_here { + let task = g.tasks.get(id).unwrap(); - ui.vertical(|ui| { - ui.heading(weekday_to_str( - time.date().weekday().num_days_from_monday().into(), - )); - ui.horizontal(|ui| { - for (id, rs) in instances_here { - let task = g.tasks.get(id).unwrap(); + let (rect, response) = ui.allocate_exact_size( + Vec2::new(10.0, height), + Sense::hover(), + ); - let (rect, response) = ui.allocate_exact_size( - Vec2::new(10.0, height), - Sense::hover(), + for r in &rs { + let r = r.start.unwrap_or(time)..r.end.unwrap_or(time_end); + let rect_start = (r.start.hour() as f32 + + (r.start.minute() as f32 / 60.0)) + / 24.0 + * height; + let rect_end = (r.end.hour() as f32 + + (r.end.minute() as f32 / 60.0)) + / 24.0 + * height; + ui.painter().rect( + Rect::from_two_pos( + rect.min + Vec2::new(0.0, rect_start), + rect.min + Vec2::new(10.0, rect_end), + ), + 0.0, + Color32::KHAKI, + Stroke::new(0.0, Color32::WHITE), ); + } - for r in &rs { - let r = - r.start.unwrap_or(time)..r.end.unwrap_or(time_end); - let rect_start = (r.start.hour() as f32 - + (r.start.minute() as f32 / 60.0)) - / 24.0 - * height; - let rect_end = (r.end.hour() as f32 - + (r.end.minute() as f32 / 60.0)) - / 24.0 - * height; - ui.painter().rect( - Rect::from_two_pos( - rect.min + Vec2::new(0.0, rect_start), - rect.min + Vec2::new(10.0, rect_end), - ), - 0.0, - Color32::KHAKI, - Stroke::new(0.0, Color32::WHITE), - ); + response.on_hover_ui_at_pointer(|ui| { + ui.heading(&task.name); + if let Some(d) = &task.description { + ui.label(d); } - - response.on_hover_ui_at_pointer(|ui| { - ui.heading(&task.name); - if let Some(d) = &task.description { - ui.label(d); - } - }); - } - }) + }); + } }); - // }); - // }); }); } }); - }); - - // 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(|mut ui| { - // let mut cols: [Vec; 7] = - // [vec![], vec![], vec![], vec![], vec![], vec![], vec![]]; - // for h in 0..24 { - // ui.row(height, |mut ui| { - // ui.col(|ui| { - // 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 time_end = time + Duration::hours(1) - Duration::seconds(1); - // let instances_here = - // instances.iter().filter(|(_, r)| r.overlaps(time..time_end)); - - // ui.col(|ui| { - // for (id, _) in instances_here { - // let task = g.tasks.get(id).unwrap(); - // let (rect, response) = - // ui.allocate_at_least(Vec2::new(10.0, 50.0), Sense::hover()); - // ui.painter().rect( - // rect, - // 0.0, - // Color32::KHAKI, - // Stroke::new(0.0, Color32::WHITE), - // ); - // response.on_hover_ui_at_pointer(|ui| { - // ui.heading(&task.name); - // if let Some(d) = &task.description { - // ui.label(d); - // } - // }); - // } - // }); - // } - // }) - // } - // }) + }); } } -- cgit v1.2.3-70-g09d2