From f5faf5ae8c4f36a8e8845ba2f5b93fc53be07eda Mon Sep 17 00:00:00 2001 From: Artsiom Dzenisiuk Date: Sat, 18 Oct 2025 18:18:29 +0200 Subject: [PATCH] I decided that using 4 SPACES is better than mixing with tabs. --- box.c | 237 +++++++++++++++++++++++++++++---------------------------- box.h | 27 +++---- main.c | 66 ++++++++-------- ui.c | 29 +++---- 4 files changed, 182 insertions(+), 177 deletions(-) diff --git a/box.c b/box.c index 893da97..3d17b10 100644 --- a/box.c +++ b/box.c @@ -23,199 +23,206 @@ static void draw_container(struct box *, double x, double y, double width, doubl static void draw_button(struct box *, double x, double y, double width, double height); +void +append_box(struct box *parent, struct box *child) +{ + parent->children[parent->length++] = child; +} + + static void draw_rectangle(double fx, double fy, double fwidth, double fheight) { - size_t x = llround(fx); - size_t y = llround(fy); - size_t w = llround(fwidth) - 1; - size_t h = llround(fheight) - 1; + size_t x = llround(fx); + size_t y = llround(fy); + size_t w = llround(fwidth) - 1; + size_t h = llround(fheight) - 1; - /* corners */ + /* corners */ - ui_char(x, y, '+'); - ui_char(x, y + h, '+'); - ui_char(x + w, y + h, '+'); - ui_char(x + w, y, '+'); + ui_char(x, y, '+'); + ui_char(x, y + h, '+'); + ui_char(x + w, y + h, '+'); + ui_char(x + w, y, '+'); - /* vertical borders */ + /* vertical borders */ - for (size_t i = 1; i < h; i++) { - ui_char(x, y + i, '|'); - } + for (size_t i = 1; i < h; i++) { + ui_char(x, y + i, '|'); + } - for (size_t i = 1; i < h; i++) { - ui_char(x + w, y + i, '|'); - } + for (size_t i = 1; i < h; i++) { + ui_char(x + w, y + i, '|'); + } - /* horizontal borders */ + /* horizontal borders */ - for (size_t i = 1; i < w; i++) { - ui_char(x + i, y, '-'); - } + for (size_t i = 1; i < w; i++) { + ui_char(x + i, y, '-'); + } - for (size_t i = 1; i < w; i++) { - ui_char(x + i, y + h, '-'); - } -} + for (size_t i = 1; i < w; i++) { + ui_char(x + i, y + h, '-'); + } +} static void draw_chart(struct box *chart, double x, double y, double width, double height) { - char c = '@'; - long int actual_diff; - double diff, price; - enum ui_color color; + char c = '@'; + long int actual_diff; + double diff, price; + enum ui_color color; - draw_rectangle(x, y, width, height); + draw_rectangle(x, y, width, height); - x += 1; - y += 1; - width -= 2; - height -= 2; - - price = height / 2; - actual_diff = 0; + x += 1; + y += 1; + width -= 2; + height -= 2; + + price = height / 2; + actual_diff = 0; - for (size_t i = 0; i < width; i++) { - diff = (double)rand() / RAND_MAX - 0.6; - actual_diff = (size_t)(height + y - price) - (size_t)(height + y - (price + diff)); + for (size_t i = 0; i < width; i++) { + diff = (double)rand() / RAND_MAX - 0.6; + actual_diff = (size_t)(height + y - price) - (size_t)(height + y - (price + diff)); - if (actual_diff > 0) { - color = UI_GREEN; - } else if (actual_diff == 0) { - color = UI_NONE; - } else if (actual_diff < 0) { - color = UI_RED; - } + if (actual_diff > 0) { + color = UI_GREEN; + } else if (actual_diff == 0) { + color = UI_NONE; + } else if (actual_diff < 0) { + color = UI_RED; + } - ui_color_on(color); - ui_char(x + i, height + y - price, c); - ui_color_off(color); + ui_color_on(color); + ui_char(x + i, height + y - price, c); + ui_color_off(color); - price += diff; - } + price += diff; + } } static void draw_button(struct box *b, double x, double y, double width, double height) { - ui_color_on(b->color); - draw_rectangle(x, y, width, height); - ui_string(x + width / 2 - strlen(b->name) / 2, y + height / 2, b->name); - ui_color_off(b->color); + ui_color_on(b->color); + draw_rectangle(x, y, width, height); + ui_string(x + width / 2 - strlen(b->name) / 2, y + height / 2, b->name); + ui_color_off(b->color); } static void draw_container(struct box *b, double x, double y, double width, double height) { - double current, length, total_fills, pixels_per_fill; - struct box *child; + double current, length, total_fills, pixels_per_fill; + struct box *child; - switch (b->type) { - case BOX_VERTICAL: - length = height; - current = y; - break; - case BOX_HORIZONTAL: - length = width; - current = x; - break; - } - - total_fills = 0; - for (size_t i = 0; i < b->length; i++) { - total_fills += b->children[i]->fills; - } + switch (b->type) { + case BOX_VERTICAL: + length = height; + current = y; + break; + case BOX_HORIZONTAL: + length = width; + current = x; + break; + } + + total_fills = 0; + for (size_t i = 0; i < b->length; i++) { + total_fills += b->children[i]->fills; + } - pixels_per_fill = length / total_fills; + pixels_per_fill = length / total_fills; - for (size_t i = 0; i < b->length; i++) { - child = b->children[i]; - length = child->fills * pixels_per_fill; + for (size_t i = 0; i < b->length; i++) { + child = b->children[i]; + length = child->fills * pixels_per_fill; - switch (b->type) { - case BOX_VERTICAL: draw_box(child, x, current, width, length); break; - case BOX_HORIZONTAL: draw_box(child, current, y, length, height); break; - } + switch (b->type) { + case BOX_VERTICAL: draw_box(child, x, current, width, length); break; + case BOX_HORIZONTAL: draw_box(child, current, y, length, height); break; + } - current += length; - } + current += length; + } } struct box * new_chart_box(void) { - struct box *chart = malloc(sizeof(struct box)); + struct box *chart = malloc(sizeof(struct box)); - chart->type = BOX_CHART; - chart->prices = emalloc(sizeof(double) * 100); - chart->fills = 1; - chart->color = UI_NONE; + chart->type = BOX_CHART; + chart->prices = emalloc(sizeof(double) * 100); + chart->fills = 1; + chart->color = UI_NONE; - return chart; + return chart; } struct box * new_button_box(char *name) { - struct box *button = malloc(sizeof(struct box)); + struct box *button = malloc(sizeof(struct box)); - button->type = BOX_BUTTON; - button->name = name; - button->fills = 1; - button->color = UI_NONE; + button->type = BOX_BUTTON; + button->name = name; + button->fills = 1; + button->color = UI_NONE; - return button; + return button; } struct box * new_container_box(enum box_type type) { - struct box *box = emalloc(sizeof(struct box)); + struct box *box = emalloc(sizeof(struct box)); - box->type = type; - box->fills = 1; - box->color = UI_NONE; - box->children = emalloc(sizeof(struct box *) * 100); - box->length = 0; + box->type = type; + box->fills = 1; + box->color = UI_NONE; + box->children = emalloc(sizeof(struct box *) * 100); + box->length = 0; - return box; + return box; } struct box * new_horizontal_box(void) { - return new_container_box(BOX_HORIZONTAL); + return new_container_box(BOX_HORIZONTAL); } struct box * new_vertical_box(void) { - return new_container_box(BOX_VERTICAL); + return new_container_box(BOX_VERTICAL); } void draw_box(struct box *b, double x, double y, double width, double height) { - switch (b->type) { - case BOX_BUTTON: - draw_button(b, x, y, width, height); - break; - case BOX_CHART: - draw_chart(b, x, y, width, height); - break; - case BOX_HORIZONTAL: - case BOX_VERTICAL: - draw_container(b, x, y, width, height); - break; - } + switch (b->type) { + case BOX_BUTTON: + draw_button(b, x, y, width, height); + break; + case BOX_CHART: + draw_chart(b, x, y, width, height); + break; + case BOX_HORIZONTAL: + case BOX_VERTICAL: + draw_container(b, x, y, width, height); + break; + } } diff --git a/box.h b/box.h index 22f33c4..a0495c4 100644 --- a/box.h +++ b/box.h @@ -24,22 +24,22 @@ struct box { double fills; union { - /* button */ - char *name; + /* button */ + char *name; - /* chart and vertical/horizontal box */ - struct { - /* chart and vertical/horizontal box */ - size_t length; + /* chart and vertical/horizontal box */ + struct { + /* chart and vertical/horizontal box */ + size_t length; - union { - /* vertical/horizontal box */ - struct box **children; + union { + /* vertical/horizontal box */ + struct box **children; - /* chart */ - double *prices; - }; - }; + /* chart */ + double *prices; + }; + }; }; }; @@ -49,5 +49,6 @@ struct box *new_vertical_box(void); struct box *new_horizontal_box(void); struct box *new_chart_box(void); +void append_box(struct box *parent, struct box *child); void draw_box(struct box *, double x, double y, double width, double height); diff --git a/main.c b/main.c index f92e837..d299ba1 100644 --- a/main.c +++ b/main.c @@ -16,50 +16,46 @@ int main(void) { - struct box *ui, *top, *bottom, *left, *right, *buy, *sell, *scam, *title, *desc; + struct box *ui, *top, *bottom, *left, *right, *buy, *sell, *scam, *title, *desc; - ui_init(); + ui_init(); - title = new_button_box("Bitcoin"); - desc = new_button_box("A crypto-scam :-)"); + title = new_button_box("Bitcoin"); + desc = new_button_box("A crypto-scam :-)"); - top = new_vertical_box(); - top->length = 2; - top->children[0] = title; - top->children[1] = desc; + top = new_vertical_box(); + append_box(top, title); + append_box(top, desc); - left = new_chart_box(); - left->fills = 5; + left = new_chart_box(); + left->fills = 5; - buy = new_button_box("buy"); - buy->color = UI_GREEN; - sell = new_button_box("sell"); - sell->color = UI_RED; - scam = new_button_box("scam"); - sell->color = UI_BLUE; + buy = new_button_box("buy"); + buy->color = UI_GREEN; + sell = new_button_box("sell"); + sell->color = UI_RED; + scam = new_button_box("scam"); + sell->color = UI_BLUE; - right = new_vertical_box(); - right->length = 3; - right->children[0] = buy; - right->children[1] = sell; - right->children[2] = scam; + right = new_vertical_box(); + append_box(right, buy); + append_box(right, sell); + append_box(right, scam); - bottom = new_horizontal_box(); - bottom->fills = 3; - bottom->length = 2; - bottom->children[0] = left; - bottom->children[1] = right; + bottom = new_horizontal_box(); + bottom->fills = 3; + append_box(bottom, left); + append_box(bottom, right); - ui = new_vertical_box(); - ui->length = 2; - ui->children[0] = top; - ui->children[1] = bottom; + ui = new_vertical_box(); + append_box(ui, top); + append_box(ui, bottom); - draw_box(ui, 0, 0, ui_width(), 40); + draw_box(ui, 0, 0, ui_width()-1, ui_height()-1); - ui_refresh(); - - sleep(300); + ui_refresh(); + + sleep(300); - ui_end(); + ui_end(); } diff --git a/ui.c b/ui.c index eaa4de4..bd556b2 100644 --- a/ui.c +++ b/ui.c @@ -11,26 +11,27 @@ #include "ui.h" -void ui_init(void) +void +ui_init(void) { srand(time(NULL)); - initscr(); - start_color(); - init_pair(UI_GREEN, COLOR_GREEN, COLOR_BLACK); - init_pair(UI_RED, COLOR_RED, COLOR_BLACK); - init_pair(UI_BLUE, COLOR_BLUE, COLOR_BLACK); - cbreak(); - noecho(); - nonl(); - intrflush(stdscr, FALSE); - keypad(stdscr, TRUE); - clear(); - refresh(); + initscr(); + start_color(); + init_pair(UI_GREEN, COLOR_GREEN, COLOR_BLACK); + init_pair(UI_RED, COLOR_RED, COLOR_BLACK); + init_pair(UI_BLUE, COLOR_BLUE, COLOR_BLACK); + cbreak(); + noecho(); + nonl(); + intrflush(stdscr, FALSE); + keypad(stdscr, TRUE); + clear(); + refresh(); } void ui_end() { - endwin(); + endwin(); } void ui_string(size_t x, size_t y, char *s)