aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/views/bitview.rs95
-rw-r--r--src/views/countview.rs92
-rw-r--r--src/views/habitview.rs112
-rw-r--r--src/views/mod.rs6
4 files changed, 116 insertions, 189 deletions
diff --git a/src/views/bitview.rs b/src/views/bitview.rs
deleted file mode 100644
index b31b050..0000000
--- a/src/views/bitview.rs
+++ /dev/null
@@ -1,95 +0,0 @@
1use cursive::direction::Direction;
2use cursive::event::{Event, EventResult, Key};
3use cursive::theme::{BaseColor, Color, Style};
4use cursive::view::View;
5use cursive::{Printer, Vec2};
6
7use chrono::prelude::*;
8use chrono::{Local, NaiveDate};
9
10use crate::habit::Habit;
11
12pub struct BitView {
13 habit: Habit<bool>,
14 true_chr: char,
15 false_chr: char,
16 future_chr: char,
17
18 view_width: u32,
19 view_height: u32,
20 // color config
21}
22
23impl BitView {
24 pub fn new(habit: Habit<bool>) -> Self {
25 return BitView {
26 habit,
27 true_chr: '·',
28 false_chr: '·',
29 future_chr: '·',
30 view_width: 21,
31 view_height: 9,
32 };
33 }
34 pub fn get_title(&self) -> String {
35 return self.habit.get_name().to_owned();
36 }
37}
38
39impl View for BitView {
40 fn draw(&self, printer: &Printer) {
41 let now = Local::now();
42 let year = now.year();
43 let month = now.month();
44
45 let true_style = Style::from(Color::Dark(BaseColor::Cyan));
46 let false_style = Style::from(Color::Dark(BaseColor::Magenta));
47 let future_style = Style::from(Color::Light(BaseColor::Black));
48
49 for i in 1..=31 {
50 let day = NaiveDate::from_ymd_opt(year, month, i);
51 let day_style;
52
53 if let Some(d) = day {
54 let day_status = self.habit.get_by_date(d).unwrap_or(&false);
55 let coords = ((i % 7) * 3, i / 7 + 2);
56 let day_chr;
57
58 if d <= now.naive_utc().date() {
59 if *day_status {
60 day_chr = self.true_chr;
61 day_style = true_style;
62 } else {
63 day_chr = self.false_chr;
64 day_style = false_style;
65 }
66 } else {
67 day_chr = self.future_chr;
68 day_style = future_style;
69 }
70
71 printer.with_style(day_style, |p| {
72 p.print(coords, &format!("{:^3}", day_chr));
73 });
74 }
75 }
76 }
77
78 fn required_size(&mut self, _: Vec2) -> Vec2 {
79 (self.view_width, self.view_height).into()
80 }
81
82 fn take_focus(&mut self, _: Direction) -> bool {
83 true
84 }
85
86 fn on_event(&mut self, e: Event) -> EventResult {
87 match e {
88 Event::Key(Key::Enter) => {
89 self.habit.toggle(Local::now().naive_utc().date());
90 return EventResult::Consumed(None);
91 }
92 _ => return EventResult::Ignored,
93 }
94 }
95}
diff --git a/src/views/countview.rs b/src/views/countview.rs
deleted file mode 100644
index d906acb..0000000
--- a/src/views/countview.rs
+++ /dev/null
@@ -1,92 +0,0 @@
1use cursive::direction::Direction;
2use cursive::event::{Event, EventResult, Key};
3use cursive::theme::{BaseColor, Color, Style};
4use cursive::view::View;
5use cursive::{Printer, Vec2};
6
7use chrono::prelude::*;
8use chrono::{Local, NaiveDate};
9
10use crate::habit::Habit;
11
12pub struct CountView {
13 habit: Habit<u32>,
14 future_chr: char,
15
16 view_width: u32,
17 view_height: u32,
18 // color config
19}
20
21impl CountView {
22 pub fn new(habit: Habit<u32>) -> Self {
23 return CountView {
24 habit,
25 future_chr: '·',
26 view_width: 21,
27 view_height: 9,
28 };
29 }
30 pub fn get_title(&self) -> String {
31 return self.habit.get_name().to_owned();
32 }
33}
34
35impl View for CountView {
36 fn draw(&self, printer: &Printer) {
37 let now = Local::now();
38 let year = now.year();
39 let month = now.month();
40
41 let goal_reached_style = Style::from(Color::Dark(BaseColor::Cyan));
42 let not_reached_style = Style::from(Color::Dark(BaseColor::Magenta));
43 let future_style = Style::from(Color::Light(BaseColor::Black));
44
45 for i in 1..=31 {
46 let day = NaiveDate::from_ymd_opt(year, month, i);
47 let day_style;
48
49 if let Some(d) = day {
50 let coords = ((i % 7) * 3, i / 7 + 2);
51 let mut day_count = self.habit.get_by_date(d).unwrap_or(&0).to_string();
52
53 if d <= now.naive_utc().date() {
54 if self.habit.reached_goal(d) {
55 day_style = goal_reached_style;
56 } else {
57 day_style = not_reached_style;
58 }
59 } else {
60 day_count = format!("{:^3}", self.future_chr);
61 day_style = future_style;
62 }
63
64 printer.with_style(day_style, |p| {
65 p.print(coords, &format!("{:^3}", day_count));
66 });
67 }
68 }
69 }
70
71 fn required_size(&mut self, _: Vec2) -> Vec2 {
72 (self.view_width, self.view_height).into()
73 }
74
75 fn take_focus(&mut self, _: Direction) -> bool {
76 true
77 }
78
79 fn on_event(&mut self, e: Event) -> EventResult {
80 match e {
81 Event::Key(Key::Enter) | Event::Char('n') => {
82 self.habit.increment(Local::now().naive_utc().date());
83 return EventResult::Consumed(None);
84 }
85 Event::Key(Key::Backspace) | Event::Char('p') => {
86 self.habit.decrement(Local::now().naive_utc().date());
87 return EventResult::Consumed(None);
88 }
89 _ => return EventResult::Ignored,
90 }
91 }
92}
diff --git a/src/views/habitview.rs b/src/views/habitview.rs
new file mode 100644
index 0000000..3ae0c90
--- /dev/null
+++ b/src/views/habitview.rs
@@ -0,0 +1,112 @@
1use cursive::direction::Direction;
2use cursive::event::{Event, EventResult, Key};
3use cursive::theme::{BaseColor, Color, Style};
4use cursive::view::View;
5use cursive::{Printer, Vec2};
6
7use chrono::prelude::*;
8use chrono::{Local, NaiveDate};
9
10use crate::habit::{Habit, HabitTrait, HabitType, TrackEvent};
11
12pub struct HabitView {
13 habit: Habit,
14 // characters to use
15 true_chr: char,
16 false_chr: char,
17 future_chr: char,
18 // view dimensions
19 view_width: u32,
20 view_height: u32,
21 // color config
22 reached_color: Color,
23 todo_color: Color,
24 future_color: Color,
25}
26
27impl HabitView {
28 pub fn new(habit: Habit) -> Self {
29 return HabitView {
30 habit,
31 true_chr: '·',
32 false_chr: '·',
33 future_chr: '·',
34 view_width: 21,
35 view_height: 9,
36 reached_color: Color::Dark(BaseColor::Cyan),
37 todo_color: Color::Dark(BaseColor::Magenta),
38 future_color: Color::Light(BaseColor::Black),
39 };
40 }
41 pub fn get_title(&self) -> String {
42 return self.habit.get_name().to_owned();
43 }
44}
45
46impl View for HabitView {
47 fn draw(&self, printer: &Printer) {
48 let now = Local::now();
49 let year = now.year();
50 let month = now.month();
51
52 let goal_reached_style = Style::from(self.reached_color);
53 let todo_style = Style::from(self.todo_color);
54 let future_style = Style::from(self.future_color);
55
56 for i in 1..=31 {
57 let day = NaiveDate::from_ymd_opt(year, month, i);
58 let mut day_style;
59
60 if let Some(d) = day {
61 if self.habit.reached_goal(d) {
62 day_style = goal_reached_style;
63 } else {
64 day_style = todo_style;
65 }
66 let coords = ((i % 7) * 3, i / 7 + 2);
67 let day_chr: Box<dyn std::fmt::Display> = match self.habit.get_by_date(d) {
68 Some(val) => match val {
69 HabitType::Bit(b) => {
70 if *b {
71 Box::new(self.true_chr)
72 } else {
73 Box::new(self.false_chr)
74 }
75 }
76 HabitType::Count(c) => Box::new(c.to_string()),
77 },
78 None => {
79 day_style = future_style;
80 Box::new(self.future_chr)
81 }
82 };
83 printer.with_style(day_style, |p| {
84 p.print(coords, &format!("{:^3}", day_chr));
85 });
86 }
87 }
88 }
89
90 fn required_size(&mut self, _: Vec2) -> Vec2 {
91 (self.view_width, self.view_height).into()
92 }
93
94 fn take_focus(&mut self, _: Direction) -> bool {
95 true
96 }
97
98 fn on_event(&mut self, e: Event) -> EventResult {
99 let now = Local::now().naive_utc().date();
100 match e {
101 Event::Key(Key::Enter) | Event::Char('n') => {
102 self.habit.modify(now, TrackEvent::Increment);
103 return EventResult::Consumed(None);
104 }
105 Event::Key(Key::Backspace) | Event::Char('p') => {
106 self.habit.modify(now, TrackEvent::Decrement);
107 return EventResult::Consumed(None);
108 }
109 _ => return EventResult::Ignored,
110 }
111 }
112}
diff --git a/src/views/mod.rs b/src/views/mod.rs
index e1e8ca5..1e3732f 100644
--- a/src/views/mod.rs
+++ b/src/views/mod.rs
@@ -1,2 +1,4 @@
1pub mod bitview; 1// pub mod bitview;
2pub mod countview; 2// pub mod countview;
3
4pub mod habitview;