2#include "nuklear_internal.h"
14 NK_ASSERT(ctx->current);
15 NK_ASSERT(ctx->current->layout);
16 if (!ctx || !ctx->current || !ctx->current->layout)
19 layout = ctx->current->layout;
20 NK_ASSERT(layout->at_y == layout->bounds.y);
39 layout->menu.x = layout->at_x;
40 layout->menu.y = layout->at_y + layout->row.height;
41 layout->menu.w = layout->bounds.w;
42 layout->menu.offset.x = *layout->offset_x;
43 layout->menu.offset.y = *layout->offset_y;
44 *layout->offset_y = 0;
54 NK_ASSERT(ctx->current);
55 NK_ASSERT(ctx->current->layout);
56 if (!ctx || !ctx->current || !ctx->current->layout)
65 layout->menu.h = layout->at_y - layout->menu.y;
66 layout->menu.h += layout->row.height + ctx->style.window.spacing.y;
68 layout->bounds.y += layout->menu.h;
69 layout->bounds.h -= layout->menu.h;
71 *layout->offset_x = layout->menu.offset.x;
72 *layout->offset_y = layout->menu.offset.y;
73 layout->at_y = layout->bounds.y - layout->row.height;
75 layout->clip.y = layout->bounds.y;
76 layout->clip.h = layout->bounds.h;
77 nk_push_scissor(out, layout->clip);
81 const char *
id,
int is_clicked,
struct nk_rect header,
struct nk_vec2 size)
87 nk_hash hash = nk_murmur_hash(
id, (
int)nk_strlen(
id), NK_PANEL_MENU);
90 NK_ASSERT(ctx->current);
91 NK_ASSERT(ctx->current->layout);
92 if (!ctx || !ctx->current || !ctx->current->layout)
97 body.y = header.y + header.h;
100 popup = win->popup.win;
101 is_open = popup ? nk_true : nk_false;
102 is_active = (popup && (win->popup.name == hash) && win->popup.type == NK_PANEL_MENU);
103 if ((is_clicked && is_open && !is_active) || (is_open && !is_active) ||
104 (!is_open && !is_active && !is_clicked))
return 0;
105 if (!nk_nonblock_begin(ctx, NK_WINDOW_NO_SCROLLBAR, body, header, NK_PANEL_MENU))
108 win->popup.type = NK_PANEL_MENU;
109 win->popup.name = hash;
113nk_menu_begin_text(
struct nk_context *ctx,
const char *title,
int len,
114 nk_flags align,
struct nk_vec2 size)
119 int is_clicked = nk_false;
123 NK_ASSERT(ctx->current);
124 NK_ASSERT(ctx->current->layout);
125 if (!ctx || !ctx->current || !ctx->current->layout)
129 state = nk_widget(&header, ctx);
130 if (!state)
return 0;
132 if (nk_do_button_text(&ctx->last_widget_state, &win->buffer, header,
133 title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font))
134 is_clicked = nk_true;
135 return nk_menu_begin(ctx, win, title, is_clicked, header, size);
137NK_API nk_bool nk_menu_begin_label(
struct nk_context *ctx,
138 const char *text, nk_flags align,
struct nk_vec2 size)
140 return nk_menu_begin_text(ctx, text, nk_strlen(text), align, size);
149 int is_clicked = nk_false;
153 NK_ASSERT(ctx->current);
154 NK_ASSERT(ctx->current->layout);
155 if (!ctx || !ctx->current || !ctx->current->layout)
159 state = nk_widget(&header, ctx);
160 if (!state)
return 0;
162 if (nk_do_button_image(&ctx->last_widget_state, &win->buffer, header,
163 img, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in))
164 is_clicked = nk_true;
165 return nk_menu_begin(ctx, win,
id, is_clicked, header, size);
168nk_menu_begin_symbol(
struct nk_context *ctx,
const char *
id,
169 enum nk_symbol_type sym,
struct nk_vec2 size)
174 int is_clicked = nk_false;
178 NK_ASSERT(ctx->current);
179 NK_ASSERT(ctx->current->layout);
180 if (!ctx || !ctx->current || !ctx->current->layout)
184 state = nk_widget(&header, ctx);
185 if (!state)
return 0;
187 if (nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, header,
188 sym, NK_BUTTON_DEFAULT, &ctx->style.menu_button, in, ctx->style.font))
189 is_clicked = nk_true;
190 return nk_menu_begin(ctx, win,
id, is_clicked, header, size);
193nk_menu_begin_image_text(
struct nk_context *ctx,
const char *title,
int len,
199 int is_clicked = nk_false;
203 NK_ASSERT(ctx->current);
204 NK_ASSERT(ctx->current->layout);
205 if (!ctx || !ctx->current || !ctx->current->layout)
209 state = nk_widget(&header, ctx);
210 if (!state)
return 0;
212 if (nk_do_button_text_image(&ctx->last_widget_state, &win->buffer,
213 header, img, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button,
214 ctx->style.font, in))
215 is_clicked = nk_true;
216 return nk_menu_begin(ctx, win, title, is_clicked, header, size);
219nk_menu_begin_image_label(
struct nk_context *ctx,
220 const char *title, nk_flags align,
struct nk_image img,
struct nk_vec2 size)
222 return nk_menu_begin_image_text(ctx, title, nk_strlen(title), align, img, size);
225nk_menu_begin_symbol_text(
struct nk_context *ctx,
const char *title,
int len,
226 nk_flags align,
enum nk_symbol_type sym,
struct nk_vec2 size)
231 int is_clicked = nk_false;
235 NK_ASSERT(ctx->current);
236 NK_ASSERT(ctx->current->layout);
237 if (!ctx || !ctx->current || !ctx->current->layout)
241 state = nk_widget(&header, ctx);
242 if (!state)
return 0;
245 if (nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer,
246 header, sym, title, len, align, NK_BUTTON_DEFAULT, &ctx->style.menu_button,
247 ctx->style.font, in)) is_clicked = nk_true;
248 return nk_menu_begin(ctx, win, title, is_clicked, header, size);
251nk_menu_begin_symbol_label(
struct nk_context *ctx,
252 const char *title, nk_flags align,
enum nk_symbol_type sym,
struct nk_vec2 size )
254 return nk_menu_begin_symbol_text(ctx, title, nk_strlen(title), align,sym,size);
257nk_menu_item_text(
struct nk_context *ctx,
const char *title,
int len, nk_flags align)
259 return nk_contextual_item_text(ctx, title, len, align);
262nk_menu_item_label(
struct nk_context *ctx,
const char *label, nk_flags align)
264 return nk_contextual_item_label(ctx, label, align);
268 const char *label, nk_flags align)
270 return nk_contextual_item_image_label(ctx, img, label, align);
274 const char *text,
int len, nk_flags align)
276 return nk_contextual_item_image_text(ctx, img, text, len, align);
278NK_API nk_bool nk_menu_item_symbol_text(
struct nk_context *ctx,
enum nk_symbol_type sym,
279 const char *text,
int len, nk_flags align)
281 return nk_contextual_item_symbol_text(ctx, sym, text, len, align);
283NK_API nk_bool nk_menu_item_symbol_label(
struct nk_context *ctx,
enum nk_symbol_type sym,
284 const char *label, nk_flags align)
286 return nk_contextual_item_symbol_label(ctx, sym, label, align);
288NK_API
void nk_menu_close(
struct nk_context *ctx)
290 nk_contextual_close(ctx);
295 nk_contextual_end(ctx);
main API and documentation file
@ NK_WINDOW_MINIMIZED
marks the window as minimized
@ NK_WINDOW_HIDDEN
Hides window and stops any window interaction and drawing.
@ NK_WINDOW_ROM
sets window widgets into a read only mode and does not allow input changes
@ NK_WIDGET_DISABLED
The widget is manually disabled and acts like NK_WIDGET_ROM.
@ NK_WIDGET_ROM
The widget is partially visible and cannot be updated.