Enhanced the canvas example a little bit

Removed some global varibles and made the canvas a little bit easier
to use and embed into code.
This commit is contained in:
vurtun 2016-08-15 10:35:42 +02:00
parent 3771eb1dab
commit 2dab85fde1
1 changed files with 35 additions and 25 deletions

View File

@ -332,27 +332,37 @@ pump_input(struct nk_context *ctx, GLFWwindow *win)
nk_input_end(ctx); nk_input_end(ctx);
} }
struct nk_canvas {
struct nk_panel layout;
struct nk_command_buffer *painter;
struct nk_vec2 item_spacing;
struct nk_vec2 panel_padding;
};
static void static void
canvas_begin(struct nk_context *ctx, int x, int y, int width, int height, struct nk_command_buffer **out) canvas_begin(struct nk_context *ctx, struct nk_canvas *canvas, int x, int y, int width, int height)
{ {
static struct nk_panel layout; canvas->panel_padding = ctx->style.window.padding;
struct nk_rect total_space; canvas->item_spacing = ctx->style.window.spacing;
ctx->style.window.spacing = nk_vec2(0,0); ctx->style.window.spacing = nk_vec2(0,0);
ctx->style.window.padding = nk_vec2(0,0); ctx->style.window.padding = nk_vec2(0,0);
nk_begin(ctx, &layout, "Window", nk_rect(x, y, width, height), NK_WINDOW_NO_SCROLLBAR);
nk_begin(ctx, &canvas->layout, "Window", nk_rect(x, y, width, height), NK_WINDOW_NO_SCROLLBAR);
nk_window_set_bounds(ctx, nk_rect(x, y, width, height)); nk_window_set_bounds(ctx, nk_rect(x, y, width, height));
{struct nk_rect total_space;
total_space = nk_window_get_content_region(ctx); total_space = nk_window_get_content_region(ctx);
nk_layout_row_dynamic(ctx, total_space.h, 1); nk_layout_row_dynamic(ctx, total_space.h, 1);
nk_widget(&total_space, ctx); nk_widget(&total_space, ctx);
*out = nk_window_get_canvas(ctx); canvas->painter = nk_window_get_canvas(ctx);}
} }
static void static void
canvas_end(struct nk_context *ctx) canvas_end(struct nk_context *ctx, struct nk_canvas *canvas)
{ {
nk_end(ctx); nk_end(ctx);
ctx->style.window.spacing = nk_vec2(4,4); ctx->style.window.spacing = canvas->panel_padding;
ctx->style.window.padding = nk_vec2(8,8); ctx->style.window.padding = canvas->item_spacing;
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -409,17 +419,17 @@ int main(int argc, char *argv[])
pump_input(&ctx, win); pump_input(&ctx, win);
/* draw */ /* draw */
{struct nk_command_buffer *canvas; {struct nk_canvas canvas;
canvas_begin(&ctx, 0, 0, width, height, &canvas); canvas_begin(&ctx, &canvas, 0, 0, width, height);
{ {
nk_fill_rect(canvas, nk_rect(0,0,width,height), 0, nk_rgb(150,150,150)); nk_fill_rect(canvas.painter, nk_rect(0,0,width,height), 0, nk_rgb(150,150,150));
nk_fill_rect(canvas, nk_rect(15,15,210,210), 5, nk_rgb(247, 230, 154)); nk_fill_rect(canvas.painter, nk_rect(15,15,210,210), 5, nk_rgb(247, 230, 154));
nk_fill_rect(canvas, nk_rect(20,20,200,200), 5, nk_rgb(188, 174, 118)); nk_fill_rect(canvas.painter, nk_rect(20,20,200,200), 5, nk_rgb(188, 174, 118));
nk_draw_text(canvas, nk_rect(30, 30, 150, 20), "Text to draw", 12, &font->handle, nk_rgb(188,174,118), nk_rgb(0,0,0)); nk_draw_text(canvas.painter, nk_rect(30, 30, 150, 20), "Text to draw", 12, &font->handle, nk_rgb(188,174,118), nk_rgb(0,0,0));
nk_fill_rect(canvas, nk_rect(250,20,100,100), 0, nk_rgb(0,0,255)); nk_fill_rect(canvas.painter, nk_rect(250,20,100,100), 0, nk_rgb(0,0,255));
nk_fill_circle(canvas, nk_rect(20,250,100,100), nk_rgb(255,0,0)); nk_fill_circle(canvas.painter, nk_rect(20,250,100,100), nk_rgb(255,0,0));
nk_fill_triangle(canvas, 250, 250, 350, 250, 300, 350, nk_rgb(0,255,0)); nk_fill_triangle(canvas.painter, 250, 250, 350, 250, 300, 350, nk_rgb(0,255,0));
nk_fill_arc(canvas, 300, 180, 50, 0, 3.141592654f * 3.0f / 4.0f, nk_rgb(255,255,0)); nk_fill_arc(canvas.painter, 300, 180, 50, 0, 3.141592654f * 3.0f / 4.0f, nk_rgb(255,255,0));
{float points[12]; {float points[12];
points[0] = 200; points[1] = 250; points[0] = 200; points[1] = 250;
@ -428,15 +438,15 @@ int main(int argc, char *argv[])
points[6] = 200; points[7] = 300; points[6] = 200; points[7] = 300;
points[8] = 175; points[9] = 350; points[8] = 175; points[9] = 350;
points[10] = 150; points[11] = 350; points[10] = 150; points[11] = 350;
nk_fill_polygon(canvas, points, 6, nk_rgb(255,255,255));} nk_fill_polygon(canvas.painter, points, 6, nk_rgb(255,255,255));}
nk_stroke_line(canvas, 15, 10, 200, 10, 2.0f, nk_rgb(189,45,75)); nk_stroke_line(canvas.painter, 15, 10, 200, 10, 2.0f, nk_rgb(189,45,75));
nk_stroke_rect(canvas, nk_rect(370, 20, 100, 100), 10, 3, nk_rgb(0,0,255)); nk_stroke_rect(canvas.painter, nk_rect(370, 20, 100, 100), 10, 3, nk_rgb(0,0,255));
nk_stroke_curve(canvas, 380, 200, 405, 270, 455, 120, 480, 200, 2, nk_rgb(0,150,220)); nk_stroke_curve(canvas.painter, 380, 200, 405, 270, 455, 120, 480, 200, 2, nk_rgb(0,150,220));
nk_stroke_circle(canvas, nk_rect(20, 370, 100, 100), 5, nk_rgb(0,255,120)); nk_stroke_circle(canvas.painter, nk_rect(20, 370, 100, 100), 5, nk_rgb(0,255,120));
nk_stroke_triangle(canvas, 370, 250, 470, 250, 420, 350, 6, nk_rgb(255,0,143)); nk_stroke_triangle(canvas.painter, 370, 250, 470, 250, 420, 350, 6, nk_rgb(255,0,143));
} }
canvas_end(&ctx);} canvas_end(&ctx, &canvas);}
/* Draw */ /* Draw */
glfwGetWindowSize(win, &width, &height); glfwGetWindowSize(win, &width, &height);