summaryrefslogtreecommitdiff
path: root/src/console.c
blob: 8d0cebb6b0d851fc3e31971dc9e7bc250910d547 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#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 set_cache(consoleLineSet_t lines) {
	lineCache = lines;
}
void clear_screen() {
	/* clear screen, move cursor to the top */
	printf("\033[2J\033[0;0H");
}
void draw_screen() {
	clear_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 && i - scroll < lineCache.count) {
		char c = lineCache.lines[i].color;
		if (i == selected) {
			printf("%s%s", BLK, c == CBLACK ? BLKB : c == CRED ? REDB : c == CGREEN ? GRNB : WHTB);
		}
		else {
			printf("%s%s", c == CBLACK ? BLK : c == CRED ? RED : c == CGREEN ? GRN : WHT, BLKB);
		}
		printf("%s\n", lineCache.lines[i].content);
		if (lineCache.lines[i].isExpanded) {
			printf("%s\n", lineCache.lines[i].expansionContent);
			e++;
		}
		i++;
	}
	printf("%s", RESET);
}
void move_selection(int amount) {
	selected = (((selected + amount) % lineCache.count) + lineCache.count) % 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();
}