Nuklear/demo/demo.c

408 lines
16 KiB
C
Raw Normal View History

2015-05-09 15:26:44 +03:00
#define MAX_BUFFER 64
2015-05-21 14:06:29 +03:00
#define MAX_MEMORY (64 * 1024)
2015-05-21 23:10:07 +03:00
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
2015-05-09 15:26:44 +03:00
struct show_window {
2015-05-10 16:47:54 +03:00
struct gui_panel_hook hook;
2015-05-13 15:47:11 +03:00
/* input buffer */
gui_char input_buffer[MAX_BUFFER];
gui_size input_length;
gui_bool input_active;
/* command buffer */
gui_char command_buffer[MAX_BUFFER];
gui_size command_length;
gui_bool command_active;
/* widgets state */
gui_bool checkbox;
2015-05-09 15:26:44 +03:00
gui_float slider;
2015-05-13 15:47:11 +03:00
gui_size progressbar;
2015-05-09 15:26:44 +03:00
gui_int spinner;
2015-05-13 15:47:11 +03:00
gui_bool spinner_active;
gui_size item_current;
gui_size shelf_selection;
gui_int combo_selection;
gui_bool toggle;
gui_int option;
/* tabs */
2015-05-13 15:47:11 +03:00
gui_bool combobox_tab;
gui_bool widget_tab;
gui_bool table_tab;
/* scrollbars */
2015-05-13 15:47:11 +03:00
gui_float shelf_scrollbar;
gui_float table_scrollbar;
2015-05-09 15:26:44 +03:00
};
struct control_window {
2015-05-10 16:47:54 +03:00
struct gui_panel_hook hook;
2015-05-09 15:26:44 +03:00
gui_flags show_flags;
/* tabs */
2015-05-13 15:47:11 +03:00
gui_bool flag_tab;
gui_bool style_tab;
gui_bool color_tab;
/* color picker */
2015-05-13 15:47:11 +03:00
gui_bool picker_active;
gui_bool spinner_r_active;
gui_bool spinner_g_active;
gui_bool spinner_b_active;
gui_bool spinner_a_active;
gui_size current_color;
2015-05-09 15:26:44 +03:00
struct gui_color color;
};
2015-05-13 15:47:11 +03:00
struct demo_gui {
gui_bool running;
2015-05-13 15:47:11 +03:00
struct show_window show;
struct control_window control;
struct gui_memory memory;
struct gui_command_buffer buffer;
2015-05-17 14:38:37 +03:00
struct gui_layout_config conf;
2015-05-21 23:10:07 +03:00
struct gui_panel_stack stack;
2015-05-09 15:26:44 +03:00
struct gui_panel_layout tab;
2015-05-13 15:47:11 +03:00
struct gui_config config;
struct gui_font font;
gui_size width, height;
};
2015-05-09 15:26:44 +03:00
static void
combobox_panel(struct gui_panel_layout *panel, struct show_window *demo)
{
gui_int i = 0;
static const char *options[] = {"easy", "normal", "hard", "hell", "doom", "godlike"};
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 3);
2015-05-09 15:26:44 +03:00
for (i = 0; i < (gui_int)LEN(options); i++) {
2015-05-13 15:47:11 +03:00
if (gui_panel_option(panel, options[i], demo->combo_selection == i))
demo->combo_selection = i;
2015-05-09 15:26:44 +03:00
}
}
static void
widget_panel(struct gui_panel_layout *panel, struct show_window *demo)
{
char buffer[MAX_BUFFER];
const char *items[] = {"Fist", "Pistol", "Shotgun", "Railgun", "BFG"};
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 1);
gui_panel_label(panel, "text left", GUI_TEXT_LEFT);
gui_panel_label(panel, "text center", GUI_TEXT_CENTERED);
gui_panel_label(panel, "text right", GUI_TEXT_RIGHT);
if (gui_panel_button_text(panel, "button", GUI_BUTTON_DEFAULT))
2015-05-09 15:26:44 +03:00
fprintf(stdout, "button pressed!\n");
2015-05-13 15:47:11 +03:00
demo->toggle = gui_panel_button_toggle(panel, "toggle", demo->toggle);
demo->checkbox = gui_panel_check(panel, "checkbox", demo->checkbox);
2015-05-09 15:26:44 +03:00
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 2);
if (gui_panel_option(panel, "option 0", demo->option == 0)) demo->option = 0;
if (gui_panel_option(panel, "option 1", demo->option == 1)) demo->option = 1;
demo->slider = gui_panel_slider(panel, 0, demo->slider, 10, 1.0f);
2015-05-09 15:26:44 +03:00
sprintf(buffer, "%.2f", demo->slider);
2015-05-13 15:47:11 +03:00
gui_panel_label(panel, buffer, GUI_TEXT_LEFT);
demo->progressbar = gui_panel_progress(panel, demo->progressbar, 100, gui_true);
sprintf(buffer, "%lu", demo->progressbar);
gui_panel_label(panel, buffer, GUI_TEXT_LEFT);
gui_panel_row(panel, 30, 1);
demo->item_current = gui_panel_selector(panel, items, LEN(items), demo->item_current);
demo->spinner = gui_panel_spinner(panel, 0, demo->spinner, 250, 10, &demo->spinner_active);
2015-05-21 14:06:29 +03:00
if (gui_panel_shell(panel, demo->command_buffer, &demo->command_length, MAX_BUFFER,
&demo->command_active)) demo->command_length = 0;
2015-05-13 15:47:11 +03:00
demo->input_length = gui_panel_edit(panel, demo->input_buffer, demo->input_length,
MAX_BUFFER, &demo->input_active, GUI_INPUT_DEFAULT);
}
static void
graph_panel(struct gui_panel_layout *panel, gui_size current)
{
enum {COL, PLOT};
2015-05-13 15:47:11 +03:00
static const gui_float values[] = {8.0f,15.0f,20.0f,12.0f,30.0f,12.0f,35.0f,40.0f,20.0f};
gui_panel_row(panel, 100, 1);
if (current == COL) {
gui_panel_graph(panel, GUI_GRAPH_COLUMN, values, LEN(values));
2015-05-13 15:47:11 +03:00
} else {
gui_panel_graph(panel, GUI_GRAPH_LINES, values, LEN(values));
}
}
static void
table_panel(struct gui_panel_layout *panel)
{
static const struct gui_color header = {178, 122, 1, 255};
gui_panel_table_begin(panel, GUI_TABLE_HHEADER, 30, 2);
gui_panel_label_colored(panel, "MOVEMENT", GUI_TEXT_CENTERED, header);
gui_panel_label_colored(panel, "KEY/BUTTON", GUI_TEXT_CENTERED, header);
gui_panel_table_row(panel);
gui_panel_label(panel, "Move foward", GUI_TEXT_LEFT);
gui_panel_label(panel, "w", GUI_TEXT_CENTERED);
gui_panel_table_row(panel);
gui_panel_label(panel, "Move back", GUI_TEXT_LEFT);
gui_panel_label(panel, "s", GUI_TEXT_CENTERED);
gui_panel_table_row(panel);
gui_panel_label(panel, "Move left", GUI_TEXT_LEFT);
gui_panel_label(panel, "a", GUI_TEXT_CENTERED);
gui_panel_table_row(panel);
gui_panel_label(panel, "Move right", GUI_TEXT_LEFT);
gui_panel_label(panel, "d", GUI_TEXT_CENTERED);
gui_panel_table_row(panel);
gui_panel_label(panel, "Jump", GUI_TEXT_LEFT);
gui_panel_label(panel, "SPACE", GUI_TEXT_CENTERED);
gui_panel_table_row(panel);
gui_panel_label(panel, "Duck", GUI_TEXT_LEFT);
gui_panel_label(panel, "CTRL", GUI_TEXT_CENTERED);
gui_panel_table_end(panel);
}
static void
init_show(struct show_window *win, struct gui_config *config, struct gui_font *font,
struct gui_panel_stack *stack)
{
2015-05-21 23:10:07 +03:00
gui_panel_hook_init(&win->hook, 20, 20, 300, 545,
2015-05-13 15:47:11 +03:00
GUI_PANEL_BORDER|GUI_PANEL_MOVEABLE|
GUI_PANEL_CLOSEABLE|GUI_PANEL_SCALEABLE|
2015-05-21 14:06:29 +03:00
GUI_PANEL_MINIMIZABLE|GUI_PANEL_HIDDEN, config, font);
2015-05-13 15:47:11 +03:00
gui_stack_push(stack, &win->hook);
win->widget_tab = GUI_MINIMIZED;
win->combobox_tab = GUI_MINIMIZED;
win->slider = 5.0f;
win->progressbar = 50;
win->spinner = 100;
2015-05-09 15:26:44 +03:00
}
static void
2015-05-13 15:47:11 +03:00
update_show(struct show_window *show, struct gui_panel_stack *stack,
2015-05-09 15:26:44 +03:00
struct gui_input *in, struct gui_canvas *canvas)
{
struct gui_panel_layout layout;
2015-05-13 15:47:11 +03:00
struct gui_panel_layout tab;
static const char *shelfs[] = {"Histogram", "Lines"};
2015-05-17 14:38:37 +03:00
gui_panel_hook_begin_stacked(&layout, &show->hook, stack, "Show", canvas, in);
2015-05-13 15:47:11 +03:00
show->combobox_tab = gui_panel_tab_begin(&layout, &tab, "Combobox", show->combobox_tab);
combobox_panel(&tab, show);
gui_panel_tab_end(&layout, &tab);
show->widget_tab = gui_panel_tab_begin(&layout, &tab, "Widgets", show->widget_tab);
widget_panel(&tab, show);
gui_panel_tab_end(&layout, &tab);
gui_panel_row(&layout, 180, 1);
show->shelf_selection = gui_panel_shelf_begin(&layout, &tab, shelfs,
LEN(shelfs), show->shelf_selection, show->shelf_scrollbar);
graph_panel(&tab, show->shelf_selection);
show->shelf_scrollbar = gui_panel_shelf_end(&layout, &tab);
gui_panel_row(&layout, 180, 1);
gui_panel_group_begin(&layout, &tab, "Table", show->table_scrollbar);
table_panel(&tab);
show->table_scrollbar = gui_panel_group_end(&layout, &tab);
2015-05-12 18:05:12 +03:00
gui_panel_hook_end(&layout, &show->hook);
2015-05-09 15:26:44 +03:00
}
static void
2015-05-13 15:47:11 +03:00
update_flags(struct gui_panel_layout *panel, struct control_window *control)
2015-05-09 15:26:44 +03:00
{
gui_flags i = 0x01;
gui_size n = 0;
gui_flags res = 0;
2015-05-21 14:06:29 +03:00
const char *options[] = {
"Hidden", "Border",
"Minimizable", "Closeable",
"Moveable", "Scaleable"
};
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 2);
2015-05-09 15:26:44 +03:00
do {
2015-05-13 15:47:11 +03:00
if (gui_panel_check(panel, options[n++], (control->show_flags & i) ? gui_true : gui_false))
res |= i;
2015-05-09 15:26:44 +03:00
i = i << 1;
} while (i <= GUI_PANEL_SCALEABLE);
control->show_flags = res;
}
static void
2015-05-13 15:47:11 +03:00
style_tab(struct gui_panel_layout *panel, struct gui_config *config)
2015-05-09 15:26:44 +03:00
{
2015-05-09 15:59:17 +03:00
gui_int tx, ty;
2015-05-18 16:18:47 +03:00
gui_panel_row(panel, 30, 2);
2015-05-13 15:47:11 +03:00
gui_panel_label(panel, "scrollbar width:", GUI_TEXT_LEFT);
tx = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_SCROLLBAR_WIDTH].x, 20, 1, NULL);
config->properties[GUI_PROPERTY_SCROLLBAR_WIDTH].x = (float)tx;
config->properties[GUI_PROPERTY_SCROLLBAR_WIDTH].y = (float)tx;
2015-05-09 15:26:44 +03:00
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 3);
2015-05-21 14:06:29 +03:00
gui_panel_label(panel, "panel padding:", GUI_TEXT_LEFT);
tx = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_PADDING].x, 20, 1, NULL);
ty = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_PADDING].y, 20, 1, NULL);
config->properties[GUI_PROPERTY_PADDING].x = (float)tx;
config->properties[GUI_PROPERTY_PADDING].y = (float)ty;
2015-05-09 15:26:44 +03:00
2015-05-13 15:47:11 +03:00
gui_panel_label(panel, "item spacing:", GUI_TEXT_LEFT);
tx = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_ITEM_SPACING].x, 20, 1, NULL);
ty = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_ITEM_SPACING].y, 20, 1, NULL);
config->properties[GUI_PROPERTY_ITEM_SPACING].x = (float)tx;
config->properties[GUI_PROPERTY_ITEM_SPACING].y = (float)ty;
2015-05-09 15:26:44 +03:00
2015-05-13 15:47:11 +03:00
gui_panel_label(panel, "item padding:", GUI_TEXT_LEFT);
tx = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_ITEM_PADDING].x, 20, 1, NULL);
ty = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_ITEM_PADDING].y, 20, 1, NULL);
config->properties[GUI_PROPERTY_ITEM_PADDING].x = (float)tx;
config->properties[GUI_PROPERTY_ITEM_PADDING].y = (float)ty;
2015-05-09 15:26:44 +03:00
2015-05-13 15:47:11 +03:00
gui_panel_label(panel, "scaler size:", GUI_TEXT_LEFT);
tx = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_SCALER_SIZE].x, 20, 1, NULL);
ty = gui_panel_spinner(panel, 0, (gui_int)config->properties[GUI_PROPERTY_SCALER_SIZE].y, 20, 1, NULL);
config->properties[GUI_PROPERTY_SCALER_SIZE].x = (float)tx;
config->properties[GUI_PROPERTY_SCALER_SIZE].y = (float)ty;
2015-05-09 15:26:44 +03:00
}
static struct gui_color
2015-05-09 21:26:23 +03:00
color_picker(struct gui_panel_layout *panel, struct control_window *control,
const char *name, struct gui_color color)
2015-05-09 15:26:44 +03:00
{
gui_float r, g, b, a;
2015-05-09 21:26:23 +03:00
gui_panel_row(panel, 30, 2);
gui_panel_label(panel, name, GUI_TEXT_LEFT);
gui_panel_button_color(panel, color, GUI_BUTTON_DEFAULT);
gui_panel_row(panel, 30, 2);
2015-05-09 15:26:44 +03:00
r = color.r; g = color.g; b = color.b; a = color.a;
2015-05-13 15:47:11 +03:00
2015-05-09 15:26:44 +03:00
r = gui_panel_slider(panel, 0, r, 255, 10);
color.r = (gui_byte)r;
2015-05-13 15:47:11 +03:00
color.r = (gui_byte)gui_panel_spinner(panel, 0, color.r, 255, 1, &control->spinner_r_active);
2015-05-09 15:26:44 +03:00
g = gui_panel_slider(panel, 0, g, 255, 10);
color.g = (gui_byte)g;
2015-05-13 15:47:11 +03:00
color.g = (gui_byte)gui_panel_spinner(panel, 0, color.g, 255, 1, &control->spinner_g_active);
2015-05-09 15:26:44 +03:00
b = gui_panel_slider(panel, 0, b, 255, 10);
color.b = (gui_byte)b;
2015-05-16 13:26:39 +03:00
color.b = (gui_byte)gui_panel_spinner(panel, 0,(gui_int)color.b, 255, 1, &control->spinner_b_active);
2015-05-13 15:47:11 +03:00
2015-05-09 15:26:44 +03:00
a = gui_panel_slider(panel, 0, a, 255, 10);
color.a = (gui_byte)a;
2015-05-13 15:47:11 +03:00
color.a = (gui_byte)gui_panel_spinner(panel, 0, (gui_int)color.a, 255, 1, &control->spinner_a_active);
2015-05-09 15:26:44 +03:00
return color;
}
static void
color_tab(struct gui_panel_layout *panel, struct control_window *control, struct gui_config *config)
{
gui_size i = 0;
2015-05-12 16:48:12 +03:00
static const char *labels[] = {"Text:", "Panel:", "Header:", "Border:", "Button:",
"Button Border:", "Button Hovering:", "Button Toggle:", "Button Hovering Text:",
"Check:", "Check BG:", "Check Active:", "Option:", "Option BG:", "Option Active:",
2015-05-12 16:57:53 +03:00
"Slider:", "Slider cursor:", "Progress:", "Progress Cursor:", "Editbox:", "Editbox cursor:",
"Editbox Border:", "Spinner:", "Spinner Border:", "Selector:", "Selector Border:",
"Histo:", "Histo Bars:", "Histo Negative:", "Histo Hovering:", "Plot:", "Plot Lines:",
"Plot Hightlight:", "Scrollbar:", "Scrollbar Cursor:", "Scrollbar Border:",
2015-05-16 13:26:39 +03:00
"Table lines:", "Shelf:", "Shelf Text:", "Shelf Active:", "Shelf Active Text:", "Scaler:"
2015-05-09 15:26:44 +03:00
};
2015-05-16 13:26:39 +03:00
2015-05-13 15:47:11 +03:00
if (control->picker_active) {
2015-05-16 13:26:39 +03:00
control->color = color_picker(panel,control,labels[control->current_color], control->color);
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 3);
gui_panel_seperator(panel, 1);
if (gui_panel_button_text(panel, "ok", GUI_BUTTON_DEFAULT)) {
config->colors[control->current_color] = control->color;
control->picker_active = gui_false;
2015-05-09 15:26:44 +03:00
}
2015-05-13 15:47:11 +03:00
if (gui_panel_button_text(panel, "cancel", GUI_BUTTON_DEFAULT))
control->picker_active = gui_false;
2015-05-09 15:26:44 +03:00
} else {
2015-05-13 15:47:11 +03:00
gui_panel_row(panel, 30, 2);
2015-05-09 15:26:44 +03:00
for (i = 0; i < GUI_COLOR_COUNT; ++i) {
2015-05-13 15:47:11 +03:00
gui_panel_label(panel, labels[i], GUI_TEXT_LEFT);
if (gui_panel_button_color(panel, config->colors[i], GUI_BUTTON_DEFAULT)) {
if (!control->picker_active) {
control->picker_active = gui_true;
2015-05-09 15:26:44 +03:00
control->color = config->colors[i];
2015-05-13 15:47:11 +03:00
control->current_color = i;
2015-05-09 15:26:44 +03:00
} else continue;
}
}
}
2015-05-13 15:47:11 +03:00
}
static void
init_control(struct control_window *win, struct gui_config *config, struct gui_font *font,
struct gui_panel_stack *stack)
{
2015-05-21 23:10:07 +03:00
gui_panel_hook_init(&win->hook, 380, 20, 320, 500,
2015-05-13 15:47:11 +03:00
GUI_PANEL_BORDER|GUI_PANEL_MOVEABLE|GUI_PANEL_CLOSEABLE|GUI_PANEL_SCALEABLE, config, font);
gui_stack_push(stack, &win->hook);
win->show_flags = gui_hook_panel(&win->hook)->flags;
win->color_tab = GUI_MINIMIZED;
2015-05-09 15:26:44 +03:00
}
static gui_bool
2015-05-13 15:47:11 +03:00
update_control(struct control_window *control, struct gui_panel_stack *stack,
2015-05-09 15:26:44 +03:00
struct gui_input *in, struct gui_canvas *canvas, struct gui_config *config)
{
gui_bool running;
struct gui_panel_layout layout;
2015-05-13 15:47:11 +03:00
struct gui_panel_layout tab;
2015-05-17 14:38:37 +03:00
running = gui_panel_hook_begin_stacked(&layout, &control->hook, stack, "Control", canvas, in);
2015-05-13 15:47:11 +03:00
control->flag_tab = gui_panel_tab_begin(&layout, &tab, "Options", control->flag_tab);
update_flags(&tab, control);
gui_panel_tab_end(&layout, &tab);
control->style_tab = gui_panel_tab_begin(&layout, &tab, "Style", control->style_tab);
style_tab(&tab, config);
gui_panel_tab_end(&layout, &tab);
control->color_tab = gui_panel_tab_begin(&layout, &tab, "Color", control->color_tab);
color_tab(&tab, control, config);
gui_panel_tab_end(&layout, &tab);
2015-05-12 18:05:12 +03:00
gui_panel_hook_end(&layout, &control->hook);
2015-05-09 15:26:44 +03:00
return running;
}
static void
2015-05-13 15:47:11 +03:00
init_demo(struct demo_gui *gui, struct gui_font *font)
2015-05-09 15:26:44 +03:00
{
2015-05-13 15:47:11 +03:00
struct gui_command_buffer *buffer = &gui->buffer;
struct gui_memory *memory = &gui->memory;
struct gui_config *config = &gui->config;
gui->font = *font;
gui->running = gui_true;
2015-05-13 15:47:11 +03:00
memory->memory = calloc(MAX_MEMORY, 1);
memory->size = MAX_MEMORY;
gui_buffer_init_fixed(buffer, memory, GUI_BUFFER_CLIPPING);
gui_config_default(config);
2015-05-17 14:38:37 +03:00
/* floating windows */
2015-05-21 23:10:07 +03:00
gui_stack_clear(&gui->stack);
init_show(&gui->show, config, font, &gui->stack);
init_control(&gui->control, config, font, &gui->stack);
2015-05-17 14:38:37 +03:00
}
static void
2015-05-21 23:10:07 +03:00
run_demo(struct demo_gui *gui, struct gui_input *input)
2015-05-09 15:26:44 +03:00
{
2015-05-21 23:10:07 +03:00
struct gui_command_buffer *buffer = &gui->buffer;
2015-05-13 15:47:11 +03:00
struct show_window *show = &gui->show;
struct control_window *control = &gui->control;
2015-05-09 15:26:44 +03:00
struct gui_command_buffer sub;
struct gui_canvas canvas;
2015-05-21 23:10:07 +03:00
/* control window */
gui_buffer_begin(NULL, buffer, gui->width, gui->height);
2015-05-13 15:47:11 +03:00
gui_buffer_lock(&canvas, buffer, &sub, 0, gui->width, gui->height);
2015-05-21 23:10:07 +03:00
gui->running = update_control(control, &gui->stack, input, &canvas, &gui->config);
gui_buffer_unlock(gui_hook_output(&control->hook), buffer, &sub, &canvas, NULL);
2015-05-09 15:26:44 +03:00
2015-05-21 23:10:07 +03:00
/* Show window */
2015-05-10 16:47:54 +03:00
gui_hook_panel(&show->hook)->flags = control->show_flags;
2015-05-13 15:47:11 +03:00
gui_buffer_lock(&canvas, buffer, &sub, 0, gui->width, gui->height);
2015-05-21 23:10:07 +03:00
update_show(show, &gui->stack, input, &canvas);
2015-05-10 16:47:54 +03:00
if (gui_hook_panel(&show->hook)->flags & GUI_PANEL_HIDDEN)
2015-05-09 15:26:44 +03:00
control->show_flags |= GUI_PANEL_HIDDEN;
gui_buffer_unlock(gui_hook_output(&show->hook), buffer, &sub, &canvas, NULL);
2015-05-09 15:26:44 +03:00
gui_buffer_end(NULL, buffer, NULL, NULL);
}