summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-06-16 15:02:10 -0700
committerKai Stevenson <kai@kaistevenson.com>2023-06-16 15:02:10 -0700
commit55a781a696524d9a00ad162d00555db6df76e32c (patch)
treee032d8bef211dfe5f60b7621445d368323fbe3a4
parentbd54d5deb33a3ce3a5c843eaf99337a0934eb2de (diff)
more work on console functions
-rw-r--r--Makefile2
-rw-r--r--src/console.c86
-rw-r--r--src/console.h40
3 files changed, 118 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index 2eaf791..7bf5db5 100644
--- a/Makefile
+++ b/Makefile
@@ -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