From e715956c729e30f34ab03ce9f2baee2d50cdbb44 Mon Sep 17 00:00:00 2001 From: hachem Date: Tue, 29 Sep 2026 16:41:31 +0200 Subject: feat: update ui --- todo.c | 56 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/todo.c b/todo.c index 4c87bcf..7894a3f 100644 --- a/todo.c +++ b/todo.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #define todo_program "todo" @@ -215,23 +216,40 @@ static int screen_rows(void) return 24; } +static int content_rows(void) +{ + int rows = screen_rows() - 3; + + return rows < 1 ? 1 : rows; +} + static void render(const struct List* list, int cursor, int scroll, enum Mode mode) { int rows = screen_rows(); - int visible = rows - 1; - - if (visible < 1) - visible = 1; + int visible = content_rows(); int number_width = 1; for (int total = list->count; total >= 10; total /= 10) number_width++; + int done = 0; + + for (int i = 0; i < list->count; i++) + done += list->items[i].state == STATE_DONE; + + char date[64]; + time_t now = time(NULL); + struct tm* local = localtime(&now); + + if (local == NULL || strftime(date, sizeof date, "%a %d %b %Y", local) == 0) + date[0] = '\0'; + char buffer[64 * 1024]; int length = 0; - length += snprintf(buffer + length, sizeof buffer - (size_t) length, "\x1b[H"); + length += snprintf(buffer + length, sizeof buffer - (size_t) length, + "\x1b[H\x1b[2m%s\x1b[0m\x1b[K\r\n\x1b[K\r\n", date); for (int row = 0; row < visible; row++) { @@ -247,33 +265,24 @@ static void render(const struct List* list, int cursor, int scroll, enum Mode mo const char* background = index == cursor ? "\x1b[48;5;235m" : ""; const char* background_reset = index == cursor ? "\x1b[49m" : ""; - const char* box_color = item->state == STATE_DONE ? "\x1b[32m" - : item->state == STATE_DOING ? "\x1b[33m" - : ""; - const char* box_reset = item->state == STATE_TODO ? "" : "\x1b[39m"; - const char* box = item->state == STATE_DONE ? "⌜x⌟" - : item->state == STATE_DOING ? "⌜-⌟" - : "⌜ ⌟"; + const char* box = item->state == STATE_DONE ? "[x]" + : item->state == STATE_DOING ? "[-]" + : "[ ]"; const char* dim = item->state == STATE_DONE ? "\x1b[2m" : ""; const char* dim_reset = item->state == STATE_DONE ? "\x1b[22m" : ""; length += snprintf(buffer + length, sizeof buffer - (size_t) length, - "%s\x1b[2m%*d.\x1b[22m %s%s%s %s%s%s\x1b[K%s\r\n", + "%s\x1b[2m%*d.\x1b[22m %s %s%s%s\x1b[K%s\r\n", background, number_width, index + 1, - box_color, box, box_reset, dim, item->text, dim_reset, background_reset); + box, dim, item->text, dim_reset, background_reset); } - int done = 0; - - for (int i = 0; i < list->count; i++) - done += list->items[i].state == STATE_DONE; - length += snprintf(buffer + length, sizeof buffer - (size_t) length, - "\x1b[2m-- %s -- %d/%d done\x1b[0m\x1b[K\x1b[J", mode_name(mode), done, list->count); + "\x1b[%d;1H\x1b[2m-- %s -- %d/%d done\x1b[0m\x1b[K", rows, mode_name(mode), done, list->count); if (mode == MODE_INSERT && cursor >= 0 && cursor < list->count) { - int cursor_row = cursor - scroll + 1; + int cursor_row = cursor - scroll + 3; int cursor_column = number_width + 7 + (int) strlen(list->items[cursor].text); length += snprintf(buffer + length, sizeof buffer - (size_t) length, @@ -421,10 +430,7 @@ static void run(struct List* list, const char* path) for (;;) { - int visible = screen_rows() - 1; - - if (visible < 1) - visible = 1; + int visible = content_rows(); if (cursor >= list->count) cursor = list->count - 1; -- cgit v1.3