Files
gambling-curses/box.c

118 lines
2.4 KiB
C
Raw Normal View History

#include "box.h"
static void draw_rectangle(size_t x, size_t y, size_t width, size_t height)
{
mvaddch(y, x, '+');
mvaddch(y + height - 1, x, '+');
mvaddch(y + height - 1, x + width - 1, '+');
mvaddch(y, x + width - 1, '+');
for (size_t i = 1; i < height - 1; i++) {
mvaddch(y + i, x, '|');
}
for (size_t i = 1; i < height - 1; i++) {
mvaddch(y + i, x + width - 1, '|');
}
for (size_t i = 1; i < width - 1; i++) {
mvaddch(y, x + i, '-');
}
for (size_t i = 1; i < width - 1; i++) {
mvaddch(y + height - 1, x + i, '-');
}
}
void draw_button(struct box *b)
{
draw_rectangle(x, y, b->width, b->height);
if (b->highlighted) {
attron(A_UNDERLINE);
}
attron(COLOR_PAIR(b->color));
mvaddstr(y + b->height / 2, x + b->width / 2 - strlen(b->name) / 2, b->name);
if (b->highlighted) {
attroff(A_UNDERLINE);
}
attroff(COLOR_PAIR(b->color));
}
void draw_chart(struct box *b, size_t x, size_t y, size_t width, size_t height)
{
draw_rectangle(x, y, width, height);
size_t chart_width = width - 2;
size_t chart_height = height - 2;
size_t chart_x = x + 1;
size_t chart_y = y + 1;
for (size_t i = 0; i < chart->length; i++) {
for (size_t j = 0; j < chart->prices[i]; j++) {
mvaddch(chart_height - (chart_y + j), chart_x * i, '?');
}
}
}
void draw_vertical(struct box *b, size_t x, size_t y, size_t width, size_t height)
{
size_t total_pixels = 0;
double total_fills = 0;
for (size_t i = 0; i < b->length; i++) {
struct box *child = b->children[i];
switch (child.length.type) {
case LENGTH_PIXEL:
total_pixels += child.length.pixels;
break;
case LENGTH_FILL:
total_fills += child.length.fills;
break;
}
}
size_t fill_pixels = height - total_pixels;
double pixels_per_fill = fill_pixels / total_fills;
double current_y = 0;
for (size_t i = 0; i < b->length; i++) {
struct box *child = b->children[i];
double width;
switch (child.length.type) {
case LENGTH_PIXEL:
width = child.length.pixels;
break;
case LENGTH_FILL:
width = child.length.fills * pixels_per_fill;
break;
}
}
}
void draw_box(struct box *b, size_t x, size_t y, size_t width, size_t 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_VERTICAL:
draw_vertical(b, x, y, width, height);
break;
case BOX_HORIZONTAL:
draw_horizontal(b, x, y, width, height);
break;
}
}