diff options
| author | hachem <im@hachem.wtf> | 2026-09-29 16:41:31 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-29 16:41:31 +0200 |
| commit | e715956c729e30f34ab03ce9f2baee2d50cdbb44 (patch) | |
| tree | a953a37905d72a2800d42f8841de81068e38ba7e | |
| parent | 50b8d6f791c91d2881f1aa16c95237c980303712 (diff) | |
feat: update ui
| -rw-r--r-- | todo.c | 56 |
1 files changed, 31 insertions, 25 deletions
@@ -5,6 +5,7 @@ #include <string.h> #include <sys/ioctl.h> #include <termios.h> +#include <time.h> #include <unistd.h> #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; |
