diff --git a/demo/demo.c b/demo/demo.c index 2c79c18..9501e45 100644 --- a/demo/demo.c +++ b/demo/demo.c @@ -48,6 +48,14 @@ struct demo { struct icons icons; enum theme theme; struct zr_memory_status status; + + int show_simple; + int show_replay; + int show_demo; + int show_node; + int show_grid; + int show_button; + int show_basic; }; static void @@ -271,7 +279,36 @@ control_window(struct zr_context *ctx, struct demo *gui) ZR_WINDOW_CLOSABLE|ZR_WINDOW_MINIMIZABLE|ZR_WINDOW_MOVABLE| ZR_WINDOW_SCALABLE|ZR_WINDOW_BORDER)) { - /* Style */ + if (zr_layout_push(ctx, ZR_LAYOUT_TAB, "Windows", ZR_MINIMIZED)) { + zr_layout_row_dynamic(ctx, 25, 2); + gui->show_simple = !zr_window_is_closed(ctx, "Show"); + gui->show_replay = !zr_window_is_closed(ctx, "Recorded"); + gui->show_node = !zr_window_is_closed(ctx, "Node Editor"); + gui->show_demo = !zr_window_is_closed(ctx, "Demo"); +#ifndef DEMO_DO_NOT_DRAW_IMAGES + gui->show_grid = !zr_window_is_closed(ctx, "Grid Demo"); + gui->show_basic = !zr_window_is_closed(ctx, "Basic Demo"); + gui->show_button = !zr_window_is_closed(ctx, "Button Demo"); +#endif + + if (zr_checkbox(ctx, "Show", &gui->show_simple) && !gui->show_simple) + zr_window_close(ctx, "Show"); + if (zr_checkbox(ctx, "Recorded", &gui->show_replay) && !gui->show_replay) + zr_window_close(ctx, "Recorded"); + if (zr_checkbox(ctx, "Demo", &gui->show_demo) && !gui->show_demo) + zr_window_close(ctx, "Demo"); + if (zr_checkbox(ctx, "Node Editor", &gui->show_node) && !gui->show_node) + zr_window_close(ctx, "Node Editor"); +#ifndef DEMO_DO_NOT_DRAW_IMAGES + if (zr_checkbox(ctx, "Grid", &gui->show_grid) && !gui->show_grid) + zr_window_close(ctx, "Grid Demo"); + if (zr_checkbox(ctx, "Basic", &gui->show_basic) && !gui->show_basic) + zr_window_close(ctx, "Basic Demo"); + if (zr_checkbox(ctx, "Button", &gui->show_button) && !gui->show_button) + zr_window_close(ctx, "Button Demo"); +#endif + zr_layout_pop(ctx); + } if (zr_layout_push(ctx, ZR_LAYOUT_TAB, "Metrics", ZR_MINIMIZED)) { zr_layout_row_dynamic(ctx, 20, 2); zr_label(ctx,"Total:", ZR_TEXT_LEFT); @@ -774,7 +811,7 @@ demo_window(struct zr_context *ctx) sprintf(buffer, "%02d:%02d:%02d", sel_time.tm_hour, sel_time.tm_min, sel_time.tm_sec); if (zr_combo_begin_text(ctx, &combo, buffer, 250)) { time_selected = 1; - zr_layout_row_dynamic(ctx, 20, 1); + zr_layout_row_dynamic(ctx, 25, 1); sel_time.tm_sec = zr_propertyi(ctx, "#S:", 0, sel_time.tm_sec, 60, 1, 1); sel_time.tm_min = zr_propertyi(ctx, "#M:", 0, sel_time.tm_min, 60, 1, 1); sel_time.tm_hour = zr_propertyi(ctx, "#H:", 0, sel_time.tm_hour, 23, 1, 1); @@ -784,7 +821,7 @@ demo_window(struct zr_context *ctx) /* date combobox */ zr_layout_row_static(ctx, 25, 350, 1); sprintf(buffer, "%02d-%02d-%02d", sel_date.tm_mday, sel_date.tm_mon+1, sel_date.tm_year+1900); - if (zr_combo_begin_text(ctx, &combo, buffer, 350)) { + if (zr_combo_begin_text(ctx, &combo, buffer, 400)) { int i = 0; const char *month[] = {"January", "February", "March", "Apil", "May", "June", "July", "August", "September", "Ocotober", "November", "December"}; const char *week_days[] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; @@ -806,7 +843,7 @@ demo_window(struct zr_context *ctx) } else sel_date.tm_mon--; } zr_layout_row_push(ctx, 0.9f); - sprintf(buffer, "%s %0000d", month[sel_date.tm_mon], year); + sprintf(buffer, "%s %d", month[sel_date.tm_mon], year); zr_label(ctx, buffer, ZR_TEXT_DEFAULT_CENTER); zr_layout_row_push(ctx, 0.05f); if (zr_button_symbol(ctx, ZR_SYMBOL_TRIANGLE_RIGHT, ZR_BUTTON_DEFAULT)) { @@ -2404,6 +2441,17 @@ run_demo(struct demo *gui) struct zr_context *ctx = &gui->ctx; if (!init) { + gui->show_demo = 0; + gui->show_node = 0; + gui->show_replay = 0; + gui->show_simple = 0; + + #ifndef DEMO_DO_NOT_DRAW_IMAGES + gui->show_grid = 0; + gui->show_basic = 0; + gui->show_button = 0; + #endif + memset(&nodedit, 0, sizeof(nodedit)); zr_buffer_init_fixed(&record, record_memory, sizeof(record_memory)); record_window(ctx, &record); @@ -2411,17 +2459,24 @@ run_demo(struct demo *gui) init = 1; } - simple_window(ctx); - replay_window(ctx, &record); - demo_window(ctx); - node_editor_demo(ctx, &nodedit); -#ifndef DEMO_DO_NOT_DRAW_IMAGES - grid_demo(ctx); - button_demo(ctx, &gui->icons); - basic_demo(ctx, &gui->icons); -#endif - + if (gui->show_simple) + simple_window(ctx); + if (gui->show_replay) + replay_window(ctx, &record); + if (gui->show_demo) + demo_window(ctx); + if (gui->show_node) + node_editor_demo(ctx, &nodedit); ret = control_window(ctx, gui); + +#ifndef DEMO_DO_NOT_DRAW_IMAGES + if (gui->show_grid) + grid_demo(ctx); + if (gui->show_button) + button_demo(ctx, &gui->icons); + if (gui->show_basic) + basic_demo(ctx, &gui->icons); +#endif zr_buffer_info(&gui->status, &gui->ctx.memory); return ret; } diff --git a/zahnrad.c b/zahnrad.c index 43e74c8..0c9bd33 100644 --- a/zahnrad.c +++ b/zahnrad.c @@ -6967,6 +6967,7 @@ zr_pool_alloc(struct zr_pool *pool) * CONTEXT * * ===============================================================*/ +static void zr_remove_window(struct zr_context*, struct zr_window*); static void* zr_create_window(struct zr_context *ctx); static void zr_free_window(struct zr_context *ctx, struct zr_window *win); static void zr_free_table(struct zr_context *ctx, struct zr_table *tbl); @@ -7120,10 +7121,10 @@ zr_clear(struct zr_context *ctx) }} /* window itself is not used anymore so free */ - if (iter->seq != ctx->seq) { + if (iter->seq != ctx->seq || iter->flags & ZR_WINDOW_HIDDEN) { next = iter->next; + zr_remove_window(ctx, iter); zr_free_window(ctx, iter); - ctx->count--; iter = next; } else iter = iter->next; } @@ -7290,7 +7291,11 @@ zr__next(struct zr_context *ctx, const struct zr_command *cmd) * ---------------------------------------------------------------*/ static struct zr_table* zr_create_table(struct zr_context *ctx) -{void *tbl = (void*)zr_create_window(ctx); return (struct zr_table*)tbl;} +{ + void *tbl = (void*)zr_create_window(ctx); + zr_zero(tbl, sizeof(struct zr_table)); + return (struct zr_table*)tbl; +} static void zr_free_table(struct zr_context *ctx, struct zr_table *tbl) @@ -7504,7 +7509,9 @@ zr_create_window(struct zr_context *ctx) ZR_ASSERT(win); if (!win) return 0; } - zr_zero(win, sizeof(union zr_page_data)); + zr_zero(win, sizeof(*win)); + win->next = 0; + win->prev = 0; win->seq = ctx->seq; return win; } @@ -7514,21 +7521,6 @@ zr_free_window(struct zr_context *ctx, struct zr_window *win) { /* unlink windows from list */ struct zr_table *n, *it = win->tables; - - if (win == ctx->begin) { - ctx->begin = win->next; - if (win->next) - ctx->begin->prev = 0; - } else if (win == ctx->end) { - ctx->end = win->prev; - if (win->prev) - ctx->end->next = 0; - } else { - if (win->next) - win->next->prev = win->next; - if (win->prev) - win->prev->next = win->prev; - } if (win->popup.win) { zr_free_window(ctx, win->popup.win); win->popup.win = 0; @@ -7564,6 +7556,7 @@ zr_find_window(struct zr_context *ctx, zr_hash hash) struct zr_window *iter; iter = ctx->begin; while (iter) { + ZR_ASSERT(iter != iter->next); if (iter->name == hash) return iter; iter = iter->next; @@ -7582,6 +7575,8 @@ zr_insert_window(struct zr_context *ctx, struct zr_window *win) iter = ctx->begin; while (iter) { + ZR_ASSERT(iter != iter->next); + ZR_ASSERT(iter != win); if (iter == win) return; iter = iter->next; } @@ -7606,14 +7601,28 @@ zr_insert_window(struct zr_context *ctx, struct zr_window *win) static void zr_remove_window(struct zr_context *ctx, struct zr_window *win) { - if (win->prev) - win->prev->next = win->next; - if (win->next) - win->next->prev = win->prev; - if (ctx->begin == win) - ctx->begin = win->next; - if (ctx->end == win) - ctx->end = win->prev; + if (win == ctx->begin || win == ctx->end) { + if (win == ctx->begin) { + ctx->begin = win->next; + if (win->next) + win->next->prev = 0; + } + if (win == ctx->end) { + ctx->end = win->prev; + if (win->prev) + win->prev->next = 0; + } + } else { + if (win->next) + win->next->prev = win->prev; + if (win->prev) + win->prev->next = win->next; + } + if (win == ctx->active) { + ctx->active = ctx->end; + if (ctx->end) + ctx->end->flags &= ~(zr_flags)ZR_WINDOW_ROM; + } win->next = 0; win->prev = 0; @@ -8038,13 +8047,13 @@ zr_window_is_closed(struct zr_context *ctx, const char *name) zr_hash title_hash; struct zr_window *win; ZR_ASSERT(ctx); - if (!ctx) return 0; + if (!ctx) return 1; title_len = (int)zr_strsiz(name); title_hash = zr_murmur_hash(name, (int)title_len, ZR_WINDOW_TITLE); win = zr_find_window(ctx, title_hash); - if (!win) return 0; - return win->flags & ZR_WINDOW_HIDDEN; + if (!win) return 1; + return (win->flags & ZR_WINDOW_HIDDEN); } int @@ -8076,6 +8085,8 @@ zr_window_close(struct zr_context *ctx, const char *name) title_hash = zr_murmur_hash(name, (int)title_len, ZR_WINDOW_TITLE); win = zr_find_window(ctx, title_hash); if (!win) return; + ZR_ASSERT(ctx->current != win && "You cannot close a current window"); + if (ctx->current == win) return; win->flags |= ZR_WINDOW_HIDDEN; } @@ -13508,6 +13519,7 @@ zr_recording_end(struct zr_context *ctx) union zr_param p[2]; union zr_event evt; struct zr_event_queue queue; + zr_size size; ZR_ASSERT(ctx); ZR_ASSERT(ctx->op_buffer); @@ -13518,8 +13530,10 @@ zr_recording_end(struct zr_context *ctx) zr_event_queue_init_fixed(&queue, 0, &evt, 1); zr_op_handle(ctx, p, &queue); + size = ctx->memory.size; ctx->op_buffer = 0; ctx->memory = ctx->op_memory; + ctx->memory.size = size; ctx->next_id = 0; } diff --git a/zahnrad.h b/zahnrad.h index 78fa619..5da77d3 100644 --- a/zahnrad.h +++ b/zahnrad.h @@ -1724,7 +1724,7 @@ int zr_window_is_collapsed(struct zr_context*, const char*); int zr_window_is_closed(struct zr_context*, const char*); int zr_window_is_active(struct zr_context*, const char*); -void zr_window_close(struct zr_context*, const char *name); +void zr_window_close(struct zr_context *ctx, const char *name); void zr_window_set_bounds(struct zr_context*, struct zr_rect); void zr_window_set_position(struct zr_context*, struct zr_vec2); void zr_window_set_size(struct zr_context*, struct zr_vec2);