diff options
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 104 |
1 files changed, 53 insertions, 51 deletions
@@ -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; } } |
