#include #include #include #include #include "console.h" int selected = 0; int scroll = 0; consoleLineSet_t lineCache; consoleLine_t init_simple_consoleline(consoleColor_t color, char* content) { consoleLine_t consoleLine; consoleLine.color = color; consoleLine.content = content; consoleLine.isExpanded = 0; return consoleLine; } consoleLine_t init_expandable_consoleline(consoleColor_t color, char* content, char* expansionContent) { consoleLine_t consoleLine; consoleLine.color = color; consoleLine.content = content; consoleLine.expansionContent = expansionContent; consoleLine.isExpanded = 0; return consoleLine; } consoleLine_t init_interactable_consoleline(consoleColor_t color, char* content, void (*onInteract)(void)) { consoleLine_t consoleLine; consoleLine.color = color; consoleLine.content = content; consoleLine.onInteract = onInteract; consoleLine.isExpanded = 0; return consoleLine; } consoleLineSet_t init_consolelineset(consoleLine_t* lines, int count) { consoleLineSet_t lineSet; lineSet.lines = lines; lineSet.count = count; return lineSet; } void set_cache(consoleLineSet_t lines) { lineCache = lines; } void clear_screen() { /* clear screen, move cursor to the top */ printf("\033[2J\033[0;0H"); } void draw_screen() { clear_screen(); int linesDrawn = 0; struct winsize win; ioctl(fileno(stdout), TIOCGWINSZ, &win); int width = (int)(win.ws_col); int height = (int)(win.ws_row); int i = scroll; int e = 0; while (i - scroll + e < height && i - scroll < lineCache.count) { char c = lineCache.lines[i].color; if (i == selected) { printf("%s%s", BLK, c == CBLACK ? BLKB : c == CRED ? REDB : c == CGREEN ? GRNB : WHTB); } else { printf("%s%s", c == CBLACK ? BLK : c == CRED ? RED : c == CGREEN ? GRN : WHT, BLKB); } printf("%s\n", lineCache.lines[i].content); if (lineCache.lines[i].isExpanded) { printf("%s\n", lineCache.lines[i].expansionContent); e++; } i++; } printf("%s", RESET); } void move_selection(int amount) { selected = (((selected + amount) % lineCache.count) + lineCache.count) % lineCache.count; struct winsize win; ioctl(fileno(stdout), TIOCGWINSZ, &win); int height = (int)(win.ws_row); if (selected > height) { scroll++; } else if (selected < scroll) { scroll--; } } void interact_selected() { if (lineCache.lines[selected].onInteract == NULL) { lineCache.lines[selected].isExpanded = !lineCache.lines[selected].isExpanded; } else { lineCache.lines[selected].onInteract(); } draw_screen(); }