diff options
-rw-r--r-- | src/app.rs | 29 | ||||
-rw-r--r-- | src/habit.rs | 53 | ||||
-rw-r--r-- | src/main.rs | 2 | ||||
-rw-r--r-- | src/views.rs | 12 |
4 files changed, 69 insertions, 27 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..5469aab 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, Clone, Copy, 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 { |
@@ -94,14 +115,20 @@ macro_rules! auto_habit_impl { | |||
94 | fn take_focus(&mut self, d: Direction) -> bool { | 115 | fn take_focus(&mut self, d: Direction) -> bool { |
95 | ShadowView::take_focus(self, d) | 116 | ShadowView::take_focus(self, d) |
96 | } | 117 | } |
118 | fn get_name(&self) -> String { | ||
119 | Habit::name(self) | ||
120 | } | ||
97 | fn set_view_month_offset(&mut self, offset: u32) { | 121 | fn set_view_month_offset(&mut self, offset: u32) { |
98 | Habit::set_view_month_offset(self, offset) | 122 | Habit::set_view_month_offset(self, offset) |
99 | } | 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(self, mode) |
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/main.rs b/src/main.rs index 4f91990..387dc64 100644 --- a/src/main.rs +++ b/src/main.rs | |||
@@ -9,7 +9,7 @@ mod theme; | |||
9 | mod utils; | 9 | mod utils; |
10 | mod views; | 10 | mod views; |
11 | 11 | ||
12 | use crate::app::{App, ViewMode}; | 12 | use crate::app::App; |
13 | use crate::command::{open_command_window, Command}; | 13 | use crate::command::{open_command_window, Command}; |
14 | use crate::habit::{Bit, Count, Habit}; | 14 | use crate::habit::{Bit, Count, Habit}; |
15 | use crate::utils::{load_configuration_file, AppConfig}; | 15 | use crate::utils::{load_configuration_file, AppConfig}; |
diff --git a/src/views.rs b/src/views.rs index d25e59b..3e623a9 100644 --- a/src/views.rs +++ b/src/views.rs | |||
@@ -8,6 +8,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}; |
11 | |||
11 | use crate::CONFIGURATION; | 12 | use crate::CONFIGURATION; |
12 | 13 | ||
13 | pub trait ShadowView { | 14 | pub trait ShadowView { |
@@ -62,6 +63,15 @@ where | |||
62 | }, | 63 | }, |
63 | ); | 64 | ); |
64 | 65 | ||
66 | // fn draw_day(&self, p: &Printer) { }; | ||
67 | // fn draw_month(&self, p: &Printer) {}; | ||
68 | |||
69 | // match self.view_mode() { | ||
70 | // ViewMode::Day => draw_day(self, p), | ||
71 | // ViewMode::Month => | ||
72 | // } | ||
73 | |||
74 | //let draw_day = |printer: &Printer| { | ||
65 | let mut i = 1; | 75 | let mut i = 1; |
66 | while let Some(d) = NaiveDate::from_ymd_opt(year, month, i) { | 76 | while let Some(d) = NaiveDate::from_ymd_opt(year, month, i) { |
67 | let day_style; | 77 | let day_style; |
@@ -82,6 +92,8 @@ where | |||
82 | } | 92 | } |
83 | i += 1; | 93 | i += 1; |
84 | } | 94 | } |
95 | //}; | ||
96 | //draw_day(printer); | ||
85 | } | 97 | } |
86 | 98 | ||
87 | fn required_size(&mut self, _: Vec2) -> Vec2 { | 99 | fn required_size(&mut self, _: Vec2) -> Vec2 { |