added panel hook concept

This commit is contained in:
vurtun 2015-05-10 15:47:54 +02:00
parent 30800c95f2
commit 7644774cdb
5 changed files with 50 additions and 28 deletions

View File

@ -282,30 +282,30 @@ struct gui_stack stack;
gui_buffer_init_fixed(buffer, &memory);
gui_default_config(&config);
gui_panel_init(&hook.panel, 50, 50, 300, 200, 0, &config, &font);
gui_hook_init(&hook, 50, 50, 300, 200, 0, &config, &font);
gui_stack_clear(&stack);
gui_stack_push(&stack, &hook.panel);
gui_stack_push_hook(&stack, &hook);
while (1) {
struct gui_panel_layout layout;
struct gui_canvas canvas;
gui_buffer_begin(&canvas, &buffer, window_width, window_height);
gui_panel_begin_stacked(&layout, &win.panel, &stack, "Demo", &canvas, &input);
gui_hook_begin(&layout, &hook, &stack, "Demo", &canvas, &input);
gui_panel_row(&layout, 30, 1);
if (gui_panel_button_text(&layout, "button", GUI_BUTTON_DEFAULT))
fprintf(stdout, "button pressed!\n");
gui_panel_end(&layout, &win.panel);
gui_buffer_end(&win.list, buffer, &status);
gui_hook_end(&layout, &hook);
gui_buffer_end(gui_hook_list(&hook), buffer, &status);
/* draw each panel */
struct gui_panel *iter = stack.begin;
while (iter) {
const struct gui_panel_hook *h = iter;
const struct gui_command *cmd = gui_list_begin(&h->list);
struct gui_panel_hook *h = gui_hook(iter);
const struct gui_command *cmd = gui_list_begin(gui_hook_list(h));
while (cmd) {
/* execute command */
cmd = gui_list_next(&h->list, cmd);
cmd = gui_list_next(gui_hook_list(h), cmd);
}
iter = iter->next;
}

View File

@ -2,7 +2,7 @@
#define MAX_MEMORY (32 * 1024)
struct show_window {
struct gui_panel_hook win;
struct gui_panel_hook hook;
gui_char in_buf[MAX_BUFFER];
gui_size in_len;
gui_bool in_act;
@ -27,7 +27,7 @@ struct show_window {
};
struct control_window {
struct gui_panel_hook win;
struct gui_panel_hook hook;
gui_flags show_flags;
gui_bool flag_min;
gui_bool style_min;
@ -148,12 +148,12 @@ show_panel(struct show_window *show, struct gui_panel_stack *stack,
struct gui_input *in, struct gui_canvas *canvas)
{
struct gui_panel_layout layout;
gui_panel_begin_stacked(&layout, &show->win.panel, stack, "Show", canvas, in);
gui_hook_begin(&layout, &show->hook, stack, "Show", canvas, in);
combobox_panel(&layout, show);
widget_panel(&layout, show);
graph_panel(&layout, show);
table_panel(&layout, show);
gui_panel_end(&layout, &show->win.panel);
gui_hook_end(&layout, &show->hook);
}
static void
@ -287,11 +287,11 @@ control_panel(struct control_window *control, struct gui_panel_stack *stack,
{
gui_bool running;
struct gui_panel_layout layout;
running = gui_panel_begin_stacked(&layout, &control->win.panel, stack, "Control", canvas, in);
running = gui_hook_begin(&layout, &control->hook, stack, "Control", canvas, in);
flags_tab(&layout, control);
style_tab(&layout, control, config);
color_tab(&layout, control, config);
gui_panel_end(&layout, &control->win.panel);
gui_hook_end(&layout, &control->hook);
return running;
}
@ -301,11 +301,12 @@ init_demo(struct show_window *show, struct control_window *control,
{
memset(show, 0, sizeof(*show));
gui_default_config(config);
gui_panel_init(&show->win.panel, 50, 50, 300, 500,
gui_hook_init(&show->hook, 50, 50, 300, 500,
GUI_PANEL_BORDER|GUI_PANEL_MOVEABLE|
GUI_PANEL_CLOSEABLE|GUI_PANEL_SCALEABLE|
GUI_PANEL_MINIMIZABLE, config, font);
gui_stack_push(stack, &show->win.panel);
gui_stack_push_hook(stack, &show->hook);
show->wid_min = gui_true;
show->diff_min = gui_true;
@ -314,10 +315,10 @@ init_demo(struct show_window *show, struct control_window *control,
show->spinner = 100;
memset(control, 0, sizeof(*control));
gui_panel_init(&control->win.panel, 380, 50, 400, 350,
gui_hook_init(&control->hook, 380, 50, 400, 350,
GUI_PANEL_BORDER|GUI_PANEL_MOVEABLE|GUI_PANEL_CLOSEABLE|GUI_PANEL_SCALEABLE, config, font);
gui_stack_push(stack, &control->win.panel);
control->show_flags = show->win.panel.flags;
gui_stack_push_hook(stack, &control->hook);
control->show_flags = gui_hook_panel(&show->hook)->flags;
control->style_min = gui_true;
control->color_min = gui_true;
}
@ -334,14 +335,14 @@ run_demo(struct show_window *show, struct control_window *control, struct gui_pa
gui_buffer_begin(NULL, buffer, width, height);
gui_buffer_lock(&canvas, buffer, &sub, 0, width, height);
running = control_panel(control, stack, in, &canvas, config);
gui_buffer_unlock(&control->win.list, buffer, &sub, &canvas, NULL);
gui_buffer_unlock(gui_hook_list(&control->hook), buffer, &sub, &canvas, NULL);
show->win.panel.flags = control->show_flags;
gui_hook_panel(&show->hook)->flags = control->show_flags;
gui_buffer_lock(&canvas, buffer, &sub, 0, width, height);
show_panel(show, stack, in, &canvas);
if (show->win.panel.flags & GUI_PANEL_HIDDEN)
if (gui_hook_panel(&show->hook)->flags & GUI_PANEL_HIDDEN)
control->show_flags |= GUI_PANEL_HIDDEN;
gui_buffer_unlock(&show->win.list, buffer, &sub, &canvas, NULL);
gui_buffer_unlock(gui_hook_list(&show->hook), buffer, &sub, &canvas, NULL);
gui_buffer_end(NULL, buffer, NULL, NULL);
return running;
}

View File

@ -483,7 +483,7 @@ draw(struct gui_panel_stack *stack, int width, int height)
struct gui_panel *iter = stack->begin;
if (!stack->count) return;
while (iter) {
struct gui_panel_hook *hook = (void*)iter;
struct gui_panel_hook *hook = gui_hook(iter);
execute(&hook->list, width, height);
iter = iter->next;
}

View File

@ -347,8 +347,8 @@ draw(XSurface *surf, struct gui_panel_stack *stack)
struct gui_panel *iter = stack->begin;
if (!stack->count) return;
while (iter) {
struct gui_panel_hook *hook = (void*)iter;
execute(surf, &hook->list);
struct gui_panel_hook *hook = gui_hook(iter);
execute(surf, gui_hook_list(hook));
iter = iter->next;
}
}

25
gui.h
View File

@ -13,6 +13,10 @@ extern "C" {
#define GUI_UTF_SIZE 4
#define GUI_INPUT_MAX 16
#define GUI_UTF_INVALID 0xFFFD
#define GUI_HOOK_PANEL_NAME panel
#define GUI_HOOK_LIST_NAME list
#define GUI_HOOK_ATTR(T, name) struct T name
#define GUI_HOOK_OUT gui_command_list
#ifdef GUI_USE_FIXED_TYPES
#include <stdint.h>
@ -427,9 +431,10 @@ struct gui_panel_stack {
struct gui_panel *end;
};
struct gui_panel_hook {
struct gui_panel panel;
struct gui_command_list list;
GUI_HOOK_ATTR(gui_panel, GUI_HOOK_PANEL_NAME);
GUI_HOOK_ATTR(GUI_HOOK_OUT, GUI_HOOK_LIST_NAME);
};
/* Input */
@ -583,6 +588,22 @@ void gui_stack_clear(struct gui_panel_stack*);
void gui_stack_push(struct gui_panel_stack*, struct gui_panel*);
void gui_stack_pop(struct gui_panel_stack*, struct gui_panel*);
/* Hook */
#define gui_hook(p) ((struct gui_panel_hook*)(p))
#define gui_hook_panel(h) (&((h)->GUI_HOOK_PANEL_NAME))
#define gui_hook_list(h) (&((h)->GUI_HOOK_LIST_NAME))
#define gui_hook_init(hook, x, y, w, h, flags, config, font)\
gui_panel_init(&(*(hook)).GUI_HOOK_PANEL_NAME, x, y, w, h, flags, config, font)
#define gui_hook_begin(layout, hook, stack, title, canvas, in)\
gui_panel_begin_stacked(layout, &(*(hook)).GUI_HOOK_PANEL_NAME, stack, title, canvas, in)
#define gui_hook_end(layout, hook)\
gui_panel_end((layout), &(hook)->GUI_HOOK_PANEL_NAME)
#define gui_stack_push_hook(stack, hook)\
gui_stack_push(stack, &(*(hook)).GUI_HOOK_PANEL_NAME)
#define gui_stack_pop_hook(stack, hook)\
gui_stack_pop(stack, &(*(hook)).GUI_HOOK_PANEL_NAME)
#ifdef __cplusplus
}
#endif