aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c104
-rw-r--r--readme.md5
2 files changed, 54 insertions, 55 deletions
diff --git a/main.c b/main.c
index c128475..6ecec1e 100644
--- a/main.c
+++ b/main.c
@@ -263,7 +263,6 @@ task_st *get_selected_task(database_st *db) {
return task;
}
-
// Creates new task stored at location given by task pointer.
// If necessary, expands database capacity.
// Returns success.
@@ -432,6 +431,9 @@ void update_times(database_st *db) {
// Get last modified on UTC time.
time_t start_time = db->modified_on;
+ // Keep track of this update.
+ db->modified_on = stop_time;
+
if (db->active_task < 0) {
return;
}
@@ -456,8 +458,6 @@ void update_times(database_st *db) {
start_time = next_start;
}
-
- db->modified_on = stop_time;
}
// Recalculates database totals.
@@ -714,6 +714,40 @@ bool append_to_csv(task_st *task, const char *path) {
return true;
}
+// TODO Add description.
+void select_task_by_index(database_st *db, ptrdiff_t idx) {
+ assert(db != NULL);
+ db->selected_task = db->count == 0 ? -1
+ : idx < 0 ? 0
+ : idx >= db->count ? db->count - 1
+ : idx;
+}
+
+// TODO Add description.
+void select_task_by_delta(database_st *db, ptrdiff_t delta) {
+ assert(db != NULL);
+ ptrdiff_t idx = (delta > 0 && db->selected_task > PTRDIFF_MAX - delta) ? PTRDIFF_MAX
+ : (delta < 0 && db->selected_task < PTRDIFF_MIN + delta) ? PTRDIFF_MIN
+ : db->selected_task + delta;
+ select_task_by_index(db, idx);
+}
+
+// TODO Add description.
+void select_task(database_st *db, task_st *task) {
+ assert(db != NULL);
+ assert(task != NULL);
+ assert(task >= db->tasks && task < &db->tasks[db->count]);
+ db->selected_task = task - db->tasks;
+}
+
+// TODO Add description.
+void set_active_task(database_st *db, task_st *task) {
+ assert(db != NULL);
+ assert(task == NULL || (task >= db->tasks && task < &db->tasks[db->count]));
+ update_times(db);
+ db->active_task = (task == NULL) ? -1 : task - db->tasks;
+}
+
#define INPUT_TIMEOUT_MS 1000
#define INPUT_AWAIT_INF -1
@@ -1288,8 +1322,8 @@ int main(int argc, char *argv[]) {
strftime(new_task->name, TASK_NAME_BYTES, "%Y-%m-%d %H:%M:%S", now_local);
// Select new task. TODO Maybe do this on the database?
- selected_task = new_task;
- db->selected_task = selected_task - db->tasks;
+ select_task(db, new_task);
+ selected_task = get_selected_task(db);
trigger_autosave();
// Force rename action.
@@ -1337,7 +1371,6 @@ int main(int argc, char *argv[]) {
if (getch() == '\n') {
reset_task_times(db, selected_task);
-
trigger_autosave();
}
@@ -1531,10 +1564,7 @@ int main(int argc, char *argv[]) {
break;
}
- db->selected_task = input < 0 ? 0 :
- input >= db->count ? db->count - 1 :
- input;
-
+ select_task_by_index(db, input < 0 ? 0 : input > MAX_DATABASE_TASKS ? MAX_DATABASE_TASKS : input);
break;
}
@@ -1543,7 +1573,6 @@ int main(int argc, char *argv[]) {
if (selected_task == NULL) {
break;
}
-
duplicate_task(db, selected_task);
trigger_autosave();
break;
@@ -1557,27 +1586,20 @@ int main(int argc, char *argv[]) {
case 'c':
case 'C': {
- if (active_task != NULL) {
- db->selected_task = db->active_task;
+ if (active_task == NULL) {
+ break;
}
+ select_task(db, active_task);
break;
}
-
+
case '\n':
case ' ': {
- if (db != &database) {
+ if (db != &database || selected_task == NULL) {
break;
}
- task_st *next_task = selected_task;
- if (active_task != NULL) {
- update_times(db); // TODO Should I keep this even though it always does?
- db->active_task = -1;
- }
- if (active_task != next_task) {
- db->active_task = next_task - db->tasks;
- }
- db->modified_on = time(NULL);
- active_task = get_active_task(db);
+ set_active_task(db, (active_task == selected_task) ? NULL : selected_task);
+ active_task = get_active_task(db);
trigger_autosave();
break;
}
@@ -1618,53 +1640,33 @@ int main(int argc, char *argv[]) {
break;
}
- // TODO Should I change the selected_task directly?
-
case KEY_HOME: {
- if (db->count > 0) {
- db->selected_task = 0;
- }
+ select_task_by_index(db, 0);
break;
}
case KEY_UP: {
- if (db->selected_task > 0) {
- db->selected_task--;
- }
+ select_task_by_delta(db, -1);
break;
}
case KEY_PPAGE: {
- if (db->selected_task >= layout_tasks_rows) {
- db->selected_task -= layout_tasks_rows;
- }
- else if (db->count > 0) {
- db->selected_task = 0;
- }
+ select_task_by_delta(db, -layout_tasks_rows);
break;
}
case KEY_END: {
- if (db->count > 0) {
- db->selected_task = db->count - 1;
- }
+ select_task_by_index(db, db->count-1);
break;
}
case KEY_DOWN: {
- if (db->selected_task + 1 < db->count) {
- db->selected_task++;
- }
+ select_task_by_delta(db, 1);
break;
}
case KEY_NPAGE: {
- if (db->count >= layout_tasks_rows && db->selected_task < db->count - layout_tasks_rows) {
- db->selected_task += layout_tasks_rows;
- }
- else if (db->count > 0) {
- db->selected_task = db->count - 1;
- }
+ select_task_by_delta(db, layout_tasks_rows);
break;
}
}
diff --git a/readme.md b/readme.md
index 7715fa6..ea37932 100644
--- a/readme.md
+++ b/readme.md
@@ -65,10 +65,7 @@ Task Time Tracker
- [x] Re-do truncate_string_utf8: 0 delta LOC;
- [x] Implement `read_input_to_string_buffer`: -24 delta LOC;
- [x] Wrap malloc (and maybe others) in a function with error checking;
- - [ ] Move database actions into functions:
- - `select_task_by_delta(database_st *db, ptrdiff???)`
- - `select_task_by_index(database_st *db, size_t???)`
- - `sect_active(database_st *db, task_st *task)`
+ - [x] Move database actions into functions;
- [ ] Check if draw_tui may be simplified by drawing entire lines of tasks at once and draw columns separators after;
- [ ] Fix bug: archiving/unarchiving task introduces " ," at end of name and increases the number of spaces before comma;
- [ ] Review all code for bugs related to auto-cast on ptrdiff_t/size_t (signed/unsigned);