diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2023-06-16 15:02:10 -0700 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2023-06-16 15:02:10 -0700 |
| commit | 55a781a696524d9a00ad162d00555db6df76e32c (patch) | |
| tree | e032d8bef211dfe5f60b7621445d368323fbe3a4 | |
| parent | bd54d5deb33a3ce3a5c843eaf99337a0934eb2de (diff) | |
more work on console functions
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | src/console.c | 86 | ||||
| -rw-r--r-- | src/console.h | 40 |
3 files changed, 118 insertions, 10 deletions
@@ -5,7 +5,7 @@ PREFIX ?= /usr BINDIR ?= ${PREFIX}/bin generate: - $(CC) -o operetta src/operetta.c src/proposition.c src/parse.c src/lexer.c src/eval.c $(CFLAGS) + $(CC) -o operetta src/operetta.c src/proposition.c src/parse.c src/lexer.c src/eval.c src/console.c $(CFLAGS) install: operetta install operetta ${DESTDIR}${BINDIR} 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 <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <sys/ioctl.h> +#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(); +} diff --git a/src/console.h b/src/console.h index 6a4d27f..88eb8a4 100644 --- a/src/console.h +++ b/src/console.h @@ -1,17 +1,39 @@ -#ifndef +#ifndef CONSOLE #define CONSOLE +#define BLK "\033[0;30m" #define RED "\033[0:31m" #define GRN "\033[0:32m" #define WHT "\033[0:37m" -struct ConsoleLine { - char* color; +#define BLKB "\033[40m" +#define REDB "\033[41m" +#define GRNB "\033[42m" +#define WHTB "\033[47m" +#define RESET "\033[0m" +typedef enum ConsoleColors { + CBLACK, + CRED, + CGREEN, + CWHITE +} consoleColor_t; +typedef struct ConsoleLine { + consoleColor_t color; char* content; - /* pointer to a function accepting a void pointer */ - void (*onInteract)(void*); + /* set to NULL to use oninteract */ + char* expansionContent; + void (*onInteract)(void); + char isExpanded; } consoleLine_t; -consoleLine_t init_consoleline(char* color, char* content); -void clear_screen(); -void draw_screen(); +consoleLine_t init_simple_consoleline(consoleColor_t color, char* content); +consoleLine_t init_expandable_consoleline(consoleColor_t color, char* content, char* expansionContent); +consoleLine_t init_interactable_consoleline(consoleColor_t color, char* content, void (*onInteract)(void)); +typedef struct ConsoleLineSet { + consoleLine_t* lines; + int count; +} consoleLineSet_t; +consoleLineSet_t init_consolelineset(consoleLine_t* lines, int count); +void set_lines(consoleLineSet_t lines); +void clear_screen(void); +void draw_screen(void); void move_selection(int amount); -void interact_selected(); +void interact_selected(void); #endif |
