summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAkshay <nerdy@peppe.rs>2020-07-16 21:46:26 +0530
committerAkshay <nerdy@peppe.rs>2020-07-16 21:46:26 +0530
commit7d5e46626110a351104ededeaebdcb9723c7e786 (patch)
tree8d8aa411e0d70120ba6d8e8010de0aef3ddaec9a
parent10e768b6e6255fda9f6f2a4aaa3c23bb2d829eb1 (diff)
add track commands
-rw-r--r--Cargo.toml1
-rw-r--r--src/app.rs33
-rw-r--r--src/command.rs17
3 files changed, 41 insertions, 10 deletions
diff --git a/Cargo.toml b/Cargo.toml
index acb56ca..eeae660 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,6 +12,7 @@ lazy_static = "1.4.0"
erased-serde = "0.3"
typetag = "0.1.4"
directories = "3.0.1"
+clap = "2.33"
[dependencies.cursive]
version = "0.15"
diff --git a/src/app.rs b/src/app.rs
index dafeed5..ab0bcd3 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -11,7 +11,7 @@ use cursive::{Printer, Vec2};
use chrono::Local;
-use crate::habit::{Bit, Count, HabitWrapper, ViewMode};
+use crate::habit::{Bit, Count, HabitWrapper, TrackEvent, ViewMode};
use crate::utils;
use crate::Command;
use crate::CONFIGURATION;
@@ -46,7 +46,7 @@ impl App {
}
pub fn delete_by_name(&mut self, name: &str) {
- self.habits.retain(|h| h.get_name() != name);
+ self.habits.retain(|h| h.name() != name);
}
pub fn get_mode(&self) -> ViewMode {
@@ -184,7 +184,7 @@ impl App {
// this function does IO
// TODO: convert this into non-blocking async function
- fn save_state(&self) {
+ pub fn save_state(&self) {
let (regular, auto): (Vec<_>, Vec<_>) = self.habits.iter().partition(|&x| !x.is_auto());
let (regular_f, auto_f) = (utils::habit_file(), utils::auto_habit_file());
@@ -205,8 +205,7 @@ impl App {
write_to_file(auto, auto_f);
}
- pub fn parse_command(&mut self, input: &str) {
- let c = Command::from_string(input);
+ pub fn parse_command(&mut self, c: Command) {
match c {
Command::Add(name, goal, auto) => {
let kind = if goal == Some(1) { "bit" } else { "count" };
@@ -224,6 +223,24 @@ impl App {
self.delete_by_name(&name);
self.focus = 0;
}
+ Command::TrackUp(name) => {
+ let target_habit = self
+ .habits
+ .iter_mut()
+ .find(|x| x.name() == name && x.is_auto());
+ if let Some(h) = target_habit {
+ h.modify(Local::now().naive_utc().date(), TrackEvent::Increment);
+ }
+ }
+ Command::TrackDown(name) => {
+ let target_habit = self
+ .habits
+ .iter_mut()
+ .find(|x| x.name() == name && x.is_auto());
+ if let Some(h) = target_habit {
+ h.modify(Local::now().naive_utc().date(), TrackEvent::Decrement);
+ }
+ }
Command::Quit => self.save_state(),
Command::MonthNext => self.sift_forward(),
Command::MonthPrev => self.sift_backward(),
@@ -253,10 +270,8 @@ impl View for App {
let status = self.status();
printer.print(offset, &status.0); // left status
- let full = grid_width * (view_width + 2);
- offset = offset
- .map_x(|_| full - status.1.len())
- .map_y(|_| self.max_size().y - 2);
+ let full = self.max_size().x;
+ offset = offset.map_x(|_| full - status.1.len());
printer.print(offset, &status.1); // right status
}
diff --git a/src/command.rs b/src/command.rs
index ae1b307..79d0fe5 100644
--- a/src/command.rs
+++ b/src/command.rs
@@ -11,7 +11,8 @@ pub fn open_command_window(s: &mut Cursive) {
fn call_on_app(s: &mut Cursive, input: &str) {
s.call_on_name("Main", |view: &mut App| {
- view.parse_command(input);
+ let cmd = Command::from_string(input);
+ view.parse_command(cmd);
});
// special command that requires access to
@@ -31,6 +32,8 @@ pub enum Command {
MonthPrev,
MonthNext,
Delete(String),
+ TrackUp(String),
+ TrackDown(String),
Quit,
Blank,
}
@@ -59,6 +62,18 @@ impl Command {
}
return Command::Delete(args[0].to_string());
}
+ "track-up" | "tup" => {
+ if args.len() < 1 {
+ return Command::Blank;
+ }
+ return Command::TrackUp(args[0].to_string());
+ }
+ "track-down" | "tdown" => {
+ if args.len() < 1 {
+ return Command::Blank;
+ }
+ return Command::TrackDown(args[0].to_string());
+ }
"mprev" | "month-prev" => return Command::MonthPrev,
"mnext" | "month-next" => return Command::MonthNext,
"q" | "quit" => return Command::Quit,