#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 clear_screen() { printf("\033[2J"); } void draw_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) { char c = lineCache.lines[i].color; if (i == selected) { printf("%s%s", c == CBLACK ? BLKB : c == CRED ? REDB : c == CGREEN ? GRNB : WHTB, BLK); } else { printf("%s%s", BLKB, c == CBLACK ? BLK : c == CRED ? RED : c == CGREEN ? GRN : WHT); } printf("%s\n", lineCache.lines[i].content); if (lineCache.lines[i].isExpanded) { printf("%s\n", lineCache.lines[i].expansionContent); e++; } i++; } printf("%s\n", RESET); } void move_selection(int amount) { selected = (selected + amount) % 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(); } clear_screen(); draw_screen(); }