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();
}
|