summaryrefslogtreecommitdiff
path: root/src/console.c
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 /src/console.c
parentbd54d5deb33a3ce3a5c843eaf99337a0934eb2de (diff)
more work on console functions
Diffstat (limited to 'src/console.c')
-rw-r--r--src/console.c86
1 files changed, 86 insertions, 0 deletions
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();
+}