summaryrefslogtreecommitdiff
path: root/client/ui.c
blob: 1f42db5ee90f89b84d813b90cb46a10901af86fb (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <string.h>

#include "../shared/bin.h"
#include "../shared/util.h"
#include "i18n.h"
#include "main.h"
#include "term.h"
#include "ui.h"

w2_s_ui_tty_canvas g_w2_ui_canvas;

void w2_ui_main() {
	w2_ui_update();
	w2_ui_paint();
}

void w2_ui_update() { w2_term_props(); }

void w2_ui_paint() { w2_ui_paint_statusbar(); }

void w2_ui_align(char *text, w2_e_alignment align, unsigned int length) {
	unsigned int padding = 0;

	switch (align) {
		case W2_UI_ALIGN_LEFT: {
			break;
		}
		case W2_UI_ALIGN_CENTER: {
			unsigned int middle = length / 2;
			unsigned int offset = strlen(text) / 2;
			padding				= W2_MAX(0, middle - offset);
			break;
		}
		case W2_UI_ALIGN_RIGHT: {
			unsigned int right	= length;
			unsigned int offset = strlen(text);
			padding				= W2_MAX(0, right - offset);
			break;
		}
	}

	char *temp = calloc(length, 1);
	sprintf(temp, "%*s%s", padding, "", text);
	memcpy(text, temp, length);
	free(temp);
}

char *w2_ui_pt_sb_con_sts() {
	char *connected =
		g_w2_state.connected ? W2_UI_CONN_STAT_CONNECTED : W2_UI_CONN_STAT_DISCONNECTED;
	char *out = calloc(g_w2_ui_canvas.width, 1);
	sprintf(out, "%s, %ims %s", connected, g_w2_state.ping, W2_UI_CONN_STAT_PING);
	w2_ui_align(out, W2_UI_ALIGN_LEFT, g_w2_ui_canvas.width);
	return out;
}
char *w2_ui_pt_sb_ver_num() {
	char *out = calloc(g_w2_ui_canvas.width, 1);
	sprintf(out, "(%s)", g_w2_state.info.build_str);
	w2_ui_align(out, W2_UI_ALIGN_CENTER, g_w2_ui_canvas.width);
	return out;
}
char *w2_ui_pt_sb_bat_sts() {
	char *out = calloc(g_w2_ui_canvas.width, 1);
	sprintf(out, "%s %i%%", W2_UI_BATT_STAT_BATTERY, g_w2_state.battery_level);
	w2_ui_align(out, W2_UI_ALIGN_RIGHT, g_w2_ui_canvas.width);
	return out;
}

void w2_ui_nullsub(char *str, unsigned int length) {
	for (int i = 0; i < length; i++)
		if (str[i] == 0x00) str[i] = ' ';
}

void w2_ui_overlay(char *bottom, char *top, unsigned int length) {
	w2_ui_nullsub(bottom, length);
	w2_ui_nullsub(top, length);

	unsigned int start = 0;
	for (int i = 0; i < length; i++) {
		start = i;
		if (top[start] != ' ') break;
	}
	unsigned int stop = 0;
	for (int i = 0; i < length; i++) {
		stop = length - i;
		if (top[stop] != ' ') break;
	}

	for (int i = 0; i < length; i++) {
		if (i >= start && i <= stop) bottom[i] = top[i];
	}
}

// char* w2_ui_pt_sb_logic_mode() {}
// char* w2_ui_pt_sb_exceptions() {}
// char* w2_ui_pt_sb_tabbar() {}

void w2_ui_paint_statusbar() {
	char top_row[g_w2_ui_canvas.width];

	char *con_sts = w2_ui_pt_sb_con_sts();
	char *ver_num = w2_ui_pt_sb_ver_num();
	char *bat_sts = w2_ui_pt_sb_bat_sts();

	w2_ui_overlay(top_row, con_sts, g_w2_ui_canvas.width);
	w2_ui_overlay(top_row, ver_num, g_w2_ui_canvas.width);
	w2_ui_overlay(top_row, bat_sts, g_w2_ui_canvas.width);

	printf("%s", top_row);

	free(con_sts);
	free(ver_num);
	free(bat_sts);

	// w2_ui_pt_sb_connection_status();
	// w2_ui_pt_sb_connection_status();
	// w2_ui_pt_sb_connection_status();
	printf("\n");
}