From 55a781a696524d9a00ad162d00555db6df76e32c Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Fri, 16 Jun 2023 15:02:10 -0700 Subject: more work on console functions --- src/console.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/console.c (limited to 'src/console.c') diff --git a/src/console.c b/src/console.c new file mode 100644 index 0000000..dba8c85 --- /dev/null +++ b/src/console.c @@ -0,0 +1,86 @@ +#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(); +} -- cgit v1.3.1