diff options
-rw-r--r-- | src/app.rs | 29 | ||||
-rw-r--r-- | src/habit.rs | 53 | ||||
-rw-r--r-- | src/views.rs | 51 |
3 files changed, 87 insertions, 46 deletions
@@ -9,26 +9,13 @@ use cursive::{Printer, Vec2}; | |||
9 | 9 | ||
10 | use chrono::{Local, NaiveDate}; | 10 | use chrono::{Local, NaiveDate}; |
11 | 11 | ||
12 | use crate::habit::{Bit, Count, Habit, HabitWrapper}; | 12 | use crate::habit::{Bit, Count, Habit, HabitWrapper, ViewMode}; |
13 | use crate::utils; | 13 | use crate::utils; |
14 | use crate::Command; | 14 | use crate::Command; |
15 | use crate::CONFIGURATION; | 15 | use crate::CONFIGURATION; |
16 | 16 | ||
17 | use serde::{Deserialize, Serialize}; | 17 | use serde::{Deserialize, Serialize}; |
18 | 18 | ||
19 | #[derive(PartialEq, Serialize, Deserialize)] | ||
20 | pub enum ViewMode { | ||
21 | Day, | ||
22 | Month, | ||
23 | Year, | ||
24 | } | ||
25 | |||
26 | impl std::default::Default for ViewMode { | ||
27 | fn default() -> Self { | ||
28 | ViewMode::Month | ||
29 | } | ||
30 | } | ||
31 | |||
32 | struct StatusLine(String, String); | 19 | struct StatusLine(String, String); |
33 | 20 | ||
34 | #[derive(Serialize, Deserialize)] | 21 | #[derive(Serialize, Deserialize)] |
@@ -41,9 +28,6 @@ pub struct App { | |||
41 | focus: usize, | 28 | focus: usize, |
42 | 29 | ||
43 | #[serde(skip)] | 30 | #[serde(skip)] |
44 | view_mode: ViewMode, | ||
45 | |||
46 | #[serde(skip)] | ||
47 | view_month_offset: u32, | 31 | view_month_offset: u32, |
48 | } | 32 | } |
49 | 33 | ||
@@ -51,7 +35,6 @@ impl App { | |||
51 | pub fn new() -> Self { | 35 | pub fn new() -> Self { |
52 | return App { | 36 | return App { |
53 | habits: vec![], | 37 | habits: vec![], |
54 | view_mode: ViewMode::Day, | ||
55 | focus: 0, | 38 | focus: 0, |
56 | view_month_offset: 0, | 39 | view_month_offset: 0, |
57 | }; | 40 | }; |
@@ -65,9 +48,9 @@ impl App { | |||
65 | self.habits.retain(|h| h.get_name() != name); | 48 | self.habits.retain(|h| h.get_name() != name); |
66 | } | 49 | } |
67 | 50 | ||
68 | pub fn set_mode(&mut self, set_mode: ViewMode) { | 51 | pub fn set_mode(&mut self, mode: ViewMode) { |
69 | if set_mode != self.view_mode { | 52 | if !self.habits.is_empty() { |
70 | self.view_mode = set_mode; | 53 | self.habits[self.focus].set_view_mode(mode); |
71 | } | 54 | } |
72 | } | 55 | } |
73 | 56 | ||
@@ -233,8 +216,8 @@ impl View for App { | |||
233 | } | 216 | } |
234 | 217 | ||
235 | offset = offset.map_x(|_| 0).map_y(|_| self.max_size().y - 2); | 218 | offset = offset.map_x(|_| 0).map_y(|_| self.max_size().y - 2); |
236 | printer.print(offset, &self.status().1); // right | 219 | printer.print(offset, &self.status().1); // right status |
237 | printer.print(offset, &self.status().0); // left | 220 | printer.print(offset, &self.status().0); // left status |
238 | } | 221 | } |
239 | 222 | ||
240 | fn required_size(&mut self, _: Vec2) -> Vec2 { | 223 | fn required_size(&mut self, _: Vec2) -> Vec2 { |
diff --git a/src/habit.rs b/src/habit.rs index 48dd363..92e0b9f 100644 --- a/src/habit.rs +++ b/src/habit.rs | |||
@@ -15,6 +15,19 @@ pub enum TrackEvent { | |||
15 | Decrement, | 15 | Decrement, |
16 | } | 16 | } |
17 | 17 | ||
18 | #[derive(Debug, PartialEq, Serialize, Deserialize)] | ||
19 | pub enum ViewMode { | ||
20 | Day, | ||
21 | Month, | ||
22 | Year, | ||
23 | } | ||
24 | |||
25 | impl std::default::Default for ViewMode { | ||
26 | fn default() -> Self { | ||
27 | ViewMode::Day | ||
28 | } | ||
29 | } | ||
30 | |||
18 | #[derive(Copy, Clone, Debug, Serialize, Deserialize)] | 31 | #[derive(Copy, Clone, Debug, Serialize, Deserialize)] |
19 | pub struct CustomBool(bool); | 32 | pub struct CustomBool(bool); |
20 | 33 | ||
@@ -51,8 +64,12 @@ pub trait Habit { | |||
51 | fn remaining(&self, date: NaiveDate) -> u32; | 64 | fn remaining(&self, date: NaiveDate) -> u32; |
52 | fn total(&self) -> u32; | 65 | fn total(&self) -> u32; |
53 | fn modify(&mut self, date: NaiveDate, event: TrackEvent); | 66 | fn modify(&mut self, date: NaiveDate, event: TrackEvent); |
67 | |||
54 | fn set_view_month_offset(&mut self, offset: u32); | 68 | fn set_view_month_offset(&mut self, offset: u32); |
55 | fn view_month_offset(&self) -> u32; | 69 | fn view_month_offset(&self) -> u32; |
70 | |||
71 | fn set_view_mode(&mut self, mode: ViewMode); | ||
72 | fn view_mode(&self) -> ViewMode; | ||
56 | } | 73 | } |
57 | 74 | ||
58 | #[typetag::serde(tag = "type")] | 75 | #[typetag::serde(tag = "type")] |
@@ -64,9 +81,13 @@ pub trait HabitWrapper: erased_serde::Serialize { | |||
64 | fn on_event(&mut self, event: Event) -> EventResult; | 81 | fn on_event(&mut self, event: Event) -> EventResult; |
65 | fn required_size(&mut self, _: Vec2) -> Vec2; | 82 | fn required_size(&mut self, _: Vec2) -> Vec2; |
66 | fn take_focus(&mut self, _: Direction) -> bool; | 83 | fn take_focus(&mut self, _: Direction) -> bool; |
84 | fn get_name(&self) -> String; | ||
85 | |||
67 | fn set_view_month_offset(&mut self, offset: u32); | 86 | fn set_view_month_offset(&mut self, offset: u32); |
68 | fn view_month_offset(&self) -> u32; | 87 | fn view_month_offset(&self) -> u32; |
69 | fn get_name(&self) -> String; | 88 | |
89 | fn set_view_mode(&mut self, mode: ViewMode); | ||
90 | fn view_mode(&self) -> ViewMode; | ||
70 | } | 91 | } |
71 | 92 | ||
72 | macro_rules! auto_habit_impl { | 93 | macro_rules! auto_habit_impl { |
@@ -97,11 +118,17 @@ macro_rules! auto_habit_impl { | |||
97 | fn set_view_month_offset(&mut self, offset: u32) { | 118 | fn set_view_month_offset(&mut self, offset: u32) { |
98 | Habit::set_view_month_offset(self, offset) | 119 | Habit::set_view_month_offset(self, offset) |
99 | } | 120 | } |
121 | fn get_name(&self) -> String { | ||
122 | Habit::name(self) | ||
123 | } | ||
100 | fn view_month_offset(&self) -> u32 { | 124 | fn view_month_offset(&self) -> u32 { |
101 | Habit::view_month_offset(self) | 125 | Habit::view_month_offset(self) |
102 | } | 126 | } |
103 | fn get_name(&self) -> String { | 127 | fn set_view_mode(&mut self, mode: ViewMode) { |
104 | Habit::name(self) | 128 | Habit::set_view_mode(&mut self, mode: ViewMode) |
129 | } | ||
130 | fn view_mode(&self) -> ViewMode { | ||
131 | Habit::view_mode(self) | ||
105 | } | 132 | } |
106 | } | 133 | } |
107 | }; | 134 | }; |
@@ -118,6 +145,9 @@ pub struct Count { | |||
118 | 145 | ||
119 | #[serde(skip)] | 146 | #[serde(skip)] |
120 | view_month_offset: u32, | 147 | view_month_offset: u32, |
148 | |||
149 | #[serde(skip)] | ||
150 | view_mode: ViewMode, | ||
121 | } | 151 | } |
122 | 152 | ||
123 | impl Count { | 153 | impl Count { |
@@ -127,6 +157,7 @@ impl Count { | |||
127 | stats: HashMap::new(), | 157 | stats: HashMap::new(), |
128 | goal, | 158 | goal, |
129 | view_month_offset: 0, | 159 | view_month_offset: 0, |
160 | view_mode: ViewMode::Day, | ||
130 | }; | 161 | }; |
131 | } | 162 | } |
132 | } | 163 | } |
@@ -193,6 +224,12 @@ impl Habit for Count { | |||
193 | fn view_month_offset(&self) -> u32 { | 224 | fn view_month_offset(&self) -> u32 { |
194 | self.view_month_offset | 225 | self.view_month_offset |
195 | } | 226 | } |
227 | fn set_view_mode(&mut self, mode: ViewMode) { | ||
228 | self.view_mode = mode; | ||
229 | } | ||
230 | fn view_mode(&self) -> ViewMode { | ||
231 | self.view_mode | ||
232 | } | ||
196 | } | 233 | } |
197 | 234 | ||
198 | #[derive(Debug, Serialize, Deserialize)] | 235 | #[derive(Debug, Serialize, Deserialize)] |
@@ -203,6 +240,9 @@ pub struct Bit { | |||
203 | 240 | ||
204 | #[serde(skip)] | 241 | #[serde(skip)] |
205 | view_month_offset: u32, | 242 | view_month_offset: u32, |
243 | |||
244 | #[serde(skip)] | ||
245 | view_mode: ViewMode, | ||
206 | } | 246 | } |
207 | 247 | ||
208 | impl Bit { | 248 | impl Bit { |
@@ -212,6 +252,7 @@ impl Bit { | |||
212 | stats: HashMap::new(), | 252 | stats: HashMap::new(), |
213 | goal: CustomBool(true), | 253 | goal: CustomBool(true), |
214 | view_month_offset: 0, | 254 | view_month_offset: 0, |
255 | view_mode: ViewMode::Day, | ||
215 | }; | 256 | }; |
216 | } | 257 | } |
217 | } | 258 | } |
@@ -268,4 +309,10 @@ impl Habit for Bit { | |||
268 | fn view_month_offset(&self) -> u32 { | 309 | fn view_month_offset(&self) -> u32 { |
269 | self.view_month_offset | 310 | self.view_month_offset |
270 | } | 311 | } |
312 | fn set_view_mode(&mut self, mode: ViewMode) { | ||
313 | self.view_mode = mode; | ||
314 | } | ||
315 | fn view_mode(&self) -> ViewMode { | ||
316 | self.view_mode | ||
317 | } | ||
271 | } | 318 | } |
diff --git a/src/views.rs b/src/views.rs index d25e59b..facbd55 100644 --- a/src/views.rs +++ b/src/views.rs | |||
@@ -7,7 +7,7 @@ use cursive::{Printer, Vec2}; | |||
7 | use chrono::prelude::*; | 7 | use chrono::prelude::*; |
8 | use chrono::{Duration, Local, NaiveDate}; | 8 | use chrono::{Duration, Local, NaiveDate}; |
9 | 9 | ||
10 | use crate::habit::{Bit, Count, Habit, TrackEvent}; | 10 | use crate::habit::{Bit, Count, Habit, TrackEvent, ViewMode}; |
11 | use crate::CONFIGURATION; | 11 | use crate::CONFIGURATION; |
12 | 12 | ||
13 | pub trait ShadowView { | 13 | pub trait ShadowView { |
@@ -62,26 +62,37 @@ where | |||
62 | }, | 62 | }, |
63 | ); | 63 | ); |
64 | 64 | ||
65 | let mut i = 1; | 65 | // fn draw_day(&self, p: &Printer) { }; |
66 | while let Some(d) = NaiveDate::from_ymd_opt(year, month, i) { | 66 | // fn draw_month(&self, p: &Printer) {}; |
67 | let day_style; | 67 | |
68 | if self.reached_goal(d) { | 68 | // match self.view_mode() { |
69 | day_style = goal_reached_style; | 69 | // ViewMode::Day => draw_day(self, p), |
70 | } else { | 70 | // ViewMode::Month => |
71 | day_style = todo_style; | 71 | // } |
72 | } | 72 | |
73 | let coords: Vec2 = ((i % 7) * 3, i / 7 + 2).into(); | 73 | let draw_day = |p: &Printer| { |
74 | if let Some(c) = self.get_by_date(d) { | 74 | let mut i = 1; |
75 | printer.with_style(day_style, |p| { | 75 | while let Some(d) = NaiveDate::from_ymd_opt(year, month, i) { |
76 | p.print(coords, &format!("{:^3}", c)); | 76 | let day_style; |
77 | }); | 77 | if self.reached_goal(d) { |
78 | } else { | 78 | day_style = goal_reached_style; |
79 | printer.with_style(future_style, |p| { | 79 | } else { |
80 | p.print(coords, &format!("{:^3}", CONFIGURATION.future_chr)); | 80 | day_style = todo_style; |
81 | }); | 81 | } |
82 | let coords: Vec2 = ((i % 7) * 3, i / 7 + 2).into(); | ||
83 | if let Some(c) = self.get_by_date(d) { | ||
84 | printer.with_style(day_style, |p| { | ||
85 | p.print(coords, &format!("{:^3}", c)); | ||
86 | }); | ||
87 | } else { | ||
88 | printer.with_style(future_style, |p| { | ||
89 | p.print(coords, &format!("{:^3}", CONFIGURATION.future_chr)); | ||
90 | }); | ||
91 | } | ||
92 | i += 1; | ||
82 | } | 93 | } |
83 | i += 1; | 94 | }; |
84 | } | 95 | draw_day(printer); |
85 | } | 96 | } |
86 | 97 | ||
87 | fn required_size(&mut self, _: Vec2) -> Vec2 { | 98 | fn required_size(&mut self, _: Vec2) -> Vec2 { |