hachem.wtf
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-29 16:41:31 +0200
committerhachem <im@hachem.wtf>2026-09-29 16:41:31 +0200
commite715956c729e30f34ab03ce9f2baee2d50cdbb44 (patch)
treea953a37905d72a2800d42f8841de81068e38ba7e
parent50b8d6f791c91d2881f1aa16c95237c980303712 (diff)
feat: update ui
-rw-r--r--todo.c56
1 files 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 <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;