1 
2 //          Copyright Mateusz Muszyński 2018.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 module bindbc.nuklear.types;
8 
9 enum NuklearSupport {
10     noLibrary,
11     badLibrary,
12     Nuklear4,
13 }
14 
15 version (NK_ALL)
16 {
17     version = NK_INCLUDE_FIXED_TYPES;
18     version = NK_INCLUDE_DEFAULT_ALLOCATOR;
19     version = NK_INCLUDE_STANDARD_IO;
20     version = NK_INCLUDE_STANDARD_VARARGS;
21     version = NK_INCLUDE_VERTEX_BUFFER_OUTPUT;
22     version = NK_INCLUDE_FONT_BAKING;
23     version = NK_INCLUDE_DEFAULT_FONT;
24     version = NK_INCLUDE_COMMAND_USERDATA;
25     version = NK_BUTTON_TRIGGER_ON_RELEASE;
26     version = NK_ZERO_COMMAND_MEMORY;
27     version = NK_UINT_DRAW_INDEX;
28 }
29 
30 enum NK_UNDEFINED = -1.0f;
31 enum NK_UTF_INVALID = 0xFFFD;
32 enum NK_UTF_SIZE = 4;
33 enum NK_INPUT_MAX = 16;
34 enum NK_MAX_NUMBER_BUFFER = 64;
35 enum NK_SCROLLBAR_HIDING_TIMEOUT = 4.0f;
36 
37 pragma(inline, true) {
38     auto NK_FLAG(T)(T x) { return 1 << x; }
39     auto NK_MAX(T)(T a, T b) {return a < b? b:a;} 
40 }
41 
42 import core.stdc.stdint;
43 alias nk_char = byte;
44 alias nk_uchar = ubyte;
45 alias nk_byte = ubyte;
46 alias nk_short = short;
47 alias nk_ushort = ushort;
48 alias nk_int = int;
49 alias nk_uint = uint;
50 alias nk_size = size_t;
51 alias nk_ptr = size_t;
52 
53 alias nk_hash = ulong;
54 alias nk_flags = uint;
55 alias nk_rune = uint;
56 alias nk_float = float;
57 
58 enum { nk_false, nk_true }
59 struct nk_color { nk_byte r,g,b,a; }
60 struct nk_colorf { float r,g,b,a; }
61 struct nk_vec2 { float x,y; }
62 struct nk_vec2i { short x, y; }
63 struct nk_rect { float x,y,w,h; }
64 struct nk_recti { short x,y,w,h; }
65 alias nk_glyph = char[NK_UTF_SIZE];
66 union nk_handle { void *ptr; int id; }
67 struct nk_image { nk_handle handle; short w,h; short[4] region; }
68 struct nk_cursor { nk_image img; nk_vec2 size, offset; }
69 struct nk_scroll { ushort x, y; }
70 
71 enum nk_heading         { NK_UP, NK_RIGHT, NK_DOWN, NK_LEFT };
72 enum nk_button_behavior { NK_BUTTON_DEFAULT, NK_BUTTON_REPEATER };
73 enum nk_modify          { NK_FIXED = nk_false, NK_MODIFIABLE = nk_true };
74 enum nk_orientation     { NK_VERTICAL, NK_HORIZONTAL };
75 enum nk_collapse_states { NK_MINIMIZED = nk_false, NK_MAXIMIZED = nk_true };
76 enum nk_show_states     { NK_HIDDEN = nk_false, NK_SHOWN = nk_true };
77 enum nk_chart_type      { NK_CHART_LINES, NK_CHART_COLUMN, NK_CHART_MAX };
78 enum nk_chart_event     { NK_CHART_HOVERING = 0x01, NK_CHART_CLICKED = 0x02 };
79 enum nk_color_format    { NK_RGB, NK_RGBA };
80 enum nk_popup_type      { NK_POPUP_STATIC, NK_POPUP_DYNAMIC };
81 enum nk_layout_format   { NK_DYNAMIC, NK_STATIC };
82 enum nk_tree_type       { NK_TREE_NODE, NK_TREE_TAB };
83 
84 extern(C) @nogc nothrow {
85     alias nk_plugin_alloc = void* function(nk_handle, void *old, nk_size);
86     alias nk_plugin_free = void function(nk_handle, void *old);
87     alias nk_plugin_filter = int function(const(nk_text_edit)*, nk_rune unicode);
88     alias nk_plugin_paste = void function(nk_handle, nk_text_edit*);
89     alias nk_plugin_copy = void function(nk_handle, const(char)*, int len);
90 }
91 
92 struct nk_allocator {
93     nk_handle userdata;
94     nk_plugin_alloc alloc;
95     nk_plugin_free free;
96 }
97 
98 enum nk_symbol_type {
99     NK_SYMBOL_NONE,
100     NK_SYMBOL_X,
101     NK_SYMBOL_UNDERSCORE,
102     NK_SYMBOL_CIRCLE_SOLID,
103     NK_SYMBOL_CIRCLE_OUTLINE,
104     NK_SYMBOL_RECT_SOLID,
105     NK_SYMBOL_RECT_OUTLINE,
106     NK_SYMBOL_TRIANGLE_UP,
107     NK_SYMBOL_TRIANGLE_DOWN,
108     NK_SYMBOL_TRIANGLE_LEFT,
109     NK_SYMBOL_TRIANGLE_RIGHT,
110     NK_SYMBOL_PLUS,
111     NK_SYMBOL_MINUS,
112     NK_SYMBOL_MAX
113 }
114 
115 //  INPUT
116 
117 enum nk_keys {
118     NK_KEY_NONE,
119     NK_KEY_SHIFT,
120     NK_KEY_CTRL,
121     NK_KEY_DEL,
122     NK_KEY_ENTER,
123     NK_KEY_TAB,
124     NK_KEY_BACKSPACE,
125     NK_KEY_COPY,
126     NK_KEY_CUT,
127     NK_KEY_PASTE,
128     NK_KEY_UP,
129     NK_KEY_DOWN,
130     NK_KEY_LEFT,
131     NK_KEY_RIGHT,
132     /* Shortcuts: text field */
133     NK_KEY_TEXT_INSERT_MODE,
134     NK_KEY_TEXT_REPLACE_MODE,
135     NK_KEY_TEXT_RESET_MODE,
136     NK_KEY_TEXT_LINE_START,
137     NK_KEY_TEXT_LINE_END,
138     NK_KEY_TEXT_START,
139     NK_KEY_TEXT_END,
140     NK_KEY_TEXT_UNDO,
141     NK_KEY_TEXT_REDO,
142     NK_KEY_TEXT_SELECT_ALL,
143     NK_KEY_TEXT_WORD_LEFT,
144     NK_KEY_TEXT_WORD_RIGHT,
145     /* Shortcuts: scrollbar */
146     NK_KEY_SCROLL_START,
147     NK_KEY_SCROLL_END,
148     NK_KEY_SCROLL_DOWN,
149     NK_KEY_SCROLL_UP,
150     NK_KEY_MAX
151 }
152 
153 enum nk_buttons {
154     NK_BUTTON_LEFT,
155     NK_BUTTON_MIDDLE,
156     NK_BUTTON_RIGHT,
157     NK_BUTTON_DOUBLE,
158     NK_BUTTON_MAX
159 }
160 
161 // DRAWING
162 
163 enum nk_anti_aliasing { NK_ANTI_ALIASING_OFF, NK_ANTI_ALIASING_ON };
164 
165 enum nk_convert_result {
166     NK_CONVERT_SUCCESS = 0,
167     NK_CONVERT_INVALID_PARAM = 1,
168     NK_CONVERT_COMMAND_BUFFER_FULL = NK_FLAG(1),
169     NK_CONVERT_VERTEX_BUFFER_FULL = NK_FLAG(2),
170     NK_CONVERT_ELEMENT_BUFFER_FULL = NK_FLAG(3)
171 }
172 
173 struct nk_draw_null_texture {
174     nk_handle texture; /* texture handle to a texture with a white pixel */
175     nk_vec2 uv; /* coordinates to a white pixel in the texture  */
176 }
177 
178 struct nk_convert_config {
179     float global_alpha; /* global alpha value */
180     nk_anti_aliasing line_AA; /* line anti-aliasing flag can be turned off if you are tight on memory */
181     nk_anti_aliasing shape_AA; /* shape anti-aliasing flag can be turned off if you are tight on memory */
182     uint circle_segment_count; /* number of segments used for circles: default to 22 */
183     uint arc_segment_count; /* number of segments used for arcs: default to 22 */
184     uint curve_segment_count; /* number of segments used for curves: default to 22 */
185     nk_draw_null_texture null_; /* handle to texture with a white pixel for shape drawing */
186     const(nk_draw_vertex_layout_element) *vertex_layout; /* describes the vertex output format and packing */
187     nk_size vertex_size; /* sizeof one vertex for vertex packing */
188     nk_size vertex_alignment; /* vertex alignment: Can be obtained by NK_ALIGNOF */
189 }
190 
191 // WINDOW
192 
193 enum nk_panel_flags {
194     NK_WINDOW_BORDER            = NK_FLAG(0),
195     NK_WINDOW_MOVABLE           = NK_FLAG(1),
196     NK_WINDOW_SCALABLE          = NK_FLAG(2),
197     NK_WINDOW_CLOSABLE          = NK_FLAG(3),
198     NK_WINDOW_MINIMIZABLE       = NK_FLAG(4),
199     NK_WINDOW_NO_SCROLLBAR      = NK_FLAG(5),
200     NK_WINDOW_TITLE             = NK_FLAG(6),
201     NK_WINDOW_SCROLL_AUTO_HIDE  = NK_FLAG(7),
202     NK_WINDOW_BACKGROUND        = NK_FLAG(8),
203     NK_WINDOW_SCALE_LEFT        = NK_FLAG(9),
204     NK_WINDOW_NO_INPUT          = NK_FLAG(10)
205 }
206 
207 // LIST VIEW
208 
209 struct nk_list_view {
210     /* public: */
211     int begin, end, count;
212     /* private: */
213     int total_height;
214     nk_context *ctx;
215     nk_uint *scroll_pointer;
216     nk_uint scroll_value;
217 }
218 
219 // WIDGET
220 
221 enum nk_widget_layout_states {
222     NK_WIDGET_INVALID, /* The widget cannot be seen and is completely out of view */
223     NK_WIDGET_VALID, /* The widget is completely inside the window and can be updated and drawn */
224     NK_WIDGET_ROM /* The widget is partially visible and cannot be updated */
225 }
226 
227 enum nk_widget_states {
228     NK_WIDGET_STATE_MODIFIED    = NK_FLAG(1),
229     NK_WIDGET_STATE_INACTIVE    = NK_FLAG(2), /* widget is neither active nor hovered */
230     NK_WIDGET_STATE_ENTERED     = NK_FLAG(3), /* widget has been hovered on the current frame */
231     NK_WIDGET_STATE_HOVER       = NK_FLAG(4), /* widget is being hovered */
232     NK_WIDGET_STATE_ACTIVED     = NK_FLAG(5),/* widget is currently activated */
233     NK_WIDGET_STATE_LEFT        = NK_FLAG(6), /* widget is from this frame on not hovered anymore */
234     NK_WIDGET_STATE_HOVERED     = NK_WIDGET_STATE_HOVER|NK_WIDGET_STATE_MODIFIED, /* widget is being hovered */
235     NK_WIDGET_STATE_ACTIVE      = NK_WIDGET_STATE_ACTIVED|NK_WIDGET_STATE_MODIFIED /* widget is currently activated */
236 }
237 
238 // TEXT
239 
240 enum nk_text_align {
241     NK_TEXT_ALIGN_LEFT        = 0x01,
242     NK_TEXT_ALIGN_CENTERED    = 0x02,
243     NK_TEXT_ALIGN_RIGHT       = 0x04,
244     NK_TEXT_ALIGN_TOP         = 0x08,
245     NK_TEXT_ALIGN_MIDDLE      = 0x10,
246     NK_TEXT_ALIGN_BOTTOM      = 0x20
247 }
248 
249 enum nk_text_alignment {
250     NK_TEXT_LEFT        = nk_text_align.NK_TEXT_ALIGN_MIDDLE|nk_text_align.NK_TEXT_ALIGN_LEFT,
251     NK_TEXT_CENTERED    = nk_text_align.NK_TEXT_ALIGN_MIDDLE|nk_text_align.NK_TEXT_ALIGN_CENTERED,
252     NK_TEXT_RIGHT       = nk_text_align.NK_TEXT_ALIGN_MIDDLE|nk_text_align.NK_TEXT_ALIGN_RIGHT
253 }
254 
255 //  TEXT EDIT
256 
257 enum nk_edit_flags {
258     NK_EDIT_DEFAULT                 = 0,
259     NK_EDIT_READ_ONLY               = NK_FLAG(0),
260     NK_EDIT_AUTO_SELECT             = NK_FLAG(1),
261     NK_EDIT_SIG_ENTER               = NK_FLAG(2),
262     NK_EDIT_ALLOW_TAB               = NK_FLAG(3),
263     NK_EDIT_NO_CURSOR               = NK_FLAG(4),
264     NK_EDIT_SELECTABLE              = NK_FLAG(5),
265     NK_EDIT_CLIPBOARD               = NK_FLAG(6),
266     NK_EDIT_CTRL_ENTER_NEWLINE      = NK_FLAG(7),
267     NK_EDIT_NO_HORIZONTAL_SCROLL    = NK_FLAG(8),
268     NK_EDIT_ALWAYS_INSERT_MODE      = NK_FLAG(9),
269     NK_EDIT_MULTILINE               = NK_FLAG(10),
270     NK_EDIT_GOTO_END_ON_ACTIVATE    = NK_FLAG(11)
271 }
272 
273 enum nk_edit_types {
274     NK_EDIT_SIMPLE  = nk_edit_flags.NK_EDIT_ALWAYS_INSERT_MODE,
275     NK_EDIT_FIELD   = nk_edit_flags.NK_EDIT_ALWAYS_INSERT_MODE|nk_edit_flags.NK_EDIT_SELECTABLE|nk_edit_flags.NK_EDIT_CLIPBOARD,
276     NK_EDIT_BOX     = nk_edit_flags.NK_EDIT_ALWAYS_INSERT_MODE| nk_edit_flags.NK_EDIT_SELECTABLE| nk_edit_flags.NK_EDIT_MULTILINE|nk_edit_flags.NK_EDIT_ALLOW_TAB|nk_edit_flags.NK_EDIT_CLIPBOARD,
277     NK_EDIT_EDITOR  = nk_edit_flags.NK_EDIT_SELECTABLE|nk_edit_flags.NK_EDIT_MULTILINE|nk_edit_flags.NK_EDIT_ALLOW_TAB| nk_edit_flags.NK_EDIT_CLIPBOARD
278 }
279 
280 enum nk_edit_events {
281     NK_EDIT_ACTIVE      = NK_FLAG(0), /* edit widget is currently being modified */
282     NK_EDIT_INACTIVE    = NK_FLAG(1), /* edit widget is not active and is not being modified */
283     NK_EDIT_ACTIVATED   = NK_FLAG(2), /* edit widget went from state inactive to state active */
284     NK_EDIT_DEACTIVATED = NK_FLAG(3), /* edit widget went from state active to state inactive */
285     NK_EDIT_COMMITED    = NK_FLAG(4) /* edit widget has received an enter and lost focus */
286 }
287 
288 // STYLE
289 
290 enum nk_style_colors {
291     NK_COLOR_TEXT,
292     NK_COLOR_WINDOW,
293     NK_COLOR_HEADER,
294     NK_COLOR_BORDER,
295     NK_COLOR_BUTTON,
296     NK_COLOR_BUTTON_HOVER,
297     NK_COLOR_BUTTON_ACTIVE,
298     NK_COLOR_TOGGLE,
299     NK_COLOR_TOGGLE_HOVER,
300     NK_COLOR_TOGGLE_CURSOR,
301     NK_COLOR_SELECT,
302     NK_COLOR_SELECT_ACTIVE,
303     NK_COLOR_SLIDER,
304     NK_COLOR_SLIDER_CURSOR,
305     NK_COLOR_SLIDER_CURSOR_HOVER,
306     NK_COLOR_SLIDER_CURSOR_ACTIVE,
307     NK_COLOR_PROPERTY,
308     NK_COLOR_EDIT,
309     NK_COLOR_EDIT_CURSOR,
310     NK_COLOR_COMBO,
311     NK_COLOR_CHART,
312     NK_COLOR_CHART_COLOR,
313     NK_COLOR_CHART_COLOR_HIGHLIGHT,
314     NK_COLOR_SCROLLBAR,
315     NK_COLOR_SCROLLBAR_CURSOR,
316     NK_COLOR_SCROLLBAR_CURSOR_HOVER,
317     NK_COLOR_SCROLLBAR_CURSOR_ACTIVE,
318     NK_COLOR_TAB_HEADER,
319     NK_COLOR_COUNT
320 }
321 
322 enum nk_style_cursor {
323     NK_CURSOR_ARROW,
324     NK_CURSOR_TEXT,
325     NK_CURSOR_MOVE,
326     NK_CURSOR_RESIZE_VERTICAL,
327     NK_CURSOR_RESIZE_HORIZONTAL,
328     NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT,
329     NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT,
330     NK_CURSOR_COUNT
331 }
332 
333 // FONT
334 
335 version(NK_INCLUDE_VERTEX_BUFFER_OUTPUT) 
336 {
337     struct nk_user_font_glyph {
338         nk_vec2[2] uv;
339         /* texture coordinates */
340         nk_vec2 offset;
341         /* offset between top left and glyph */
342         float width, height;
343         /* size of the glyph  */
344         float xadvance;
345         /* offset to the next glyph */
346     }
347 }
348 else version(NK_INCLUDE_SOFTWARE_FONT)
349 {
350     struct nk_user_font_glyph {
351         nk_vec2[2] uv;
352         /* texture coordinates */
353         nk_vec2 offset;
354         /* offset between top left and glyph */
355         float width, height;
356         /* size of the glyph  */
357         float xadvance;
358         /* offset to the next glyph */
359     }
360 }
361 else
362 {
363     struct nk_user_font_glyph;
364 }
365 
366 extern(C) @nogc nothrow {
367     alias nk_text_width_f =  float function(nk_handle, float h, const(char)*, int len);
368     alias nk_query_font_glyph_f = void function (nk_handle handle, float font_height, nk_user_font_glyph *glyph, nk_rune codepoint, nk_rune next_codepoint);
369 }
370 
371 struct nk_user_font {
372     nk_handle userdata;
373     /* user provided font handle */
374     float height;
375     /* max height of the font */
376     nk_text_width_f width;
377     /* font string width in pixel callback */
378     version(NK_INCLUDE_VERTEX_BUFFER_OUTPUT) {
379         nk_query_font_glyph_f query;
380         /* font glyph callback to query drawing info */
381         nk_handle texture;
382         /* texture handle to the used font atlas or texture */
383     }
384 }
385 
386 version(NK_INCLUDE_FONT_BAKING)
387 {
388     enum nk_font_coord_type {
389         NK_COORD_UV, /* texture coordinates inside font glyphs are clamped between 0-1 */
390         NK_COORD_PIXEL /* texture coordinates inside font glyphs are in absolute pixel */
391     }	
392 
393     struct nk_baked_font {
394         float height;
395         /* height of the font  */
396         float ascent, descent;
397         /* font glyphs ascent and descent  */
398         nk_rune glyph_offset;
399         /* glyph array offset inside the font glyph baking output array  */
400         nk_rune glyph_count;
401         /* number of glyphs of this font inside the glyph baking array output */
402         const(nk_rune) *ranges;
403         /* font codepoint ranges as pairs of (from/to) and 0 as last element */
404     }
405 
406     struct nk_font_config {
407         nk_font_config *next;
408         /* NOTE: only used internally */
409         void *ttf_blob;
410         /* pointer to loaded TTF file memory block.
411         * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */
412         nk_size ttf_size;
413         /* size of the loaded TTF file memory block
414         * NOTE: not needed for nk_font_atlas_add_from_memory and nk_font_atlas_add_from_file. */
415 
416         ubyte ttf_data_owned_by_atlas;
417         /* used inside font atlas: default to: 0*/
418         ubyte merge_mode;
419         /* merges this font into the last font */
420         ubyte pixel_snap;
421         /* align every character to pixel boundary (if true set oversample (1,1)) */
422         ubyte oversample_v, oversample_h;
423         /* rasterize at hight quality for sub-pixel position */
424         ubyte[3] padding;
425 
426         float size;
427         /* baked pixel height of the font */
428         nk_font_coord_type coord_type;
429         /* texture coordinate format with either pixel or UV coordinates */
430         nk_vec2 spacing;
431         /* extra pixel spacing between glyphs  */
432         const(nk_rune) *range;
433         /* list of unicode ranges (2 values per range, zero terminated) */
434         nk_baked_font *font;
435         /* font to setup in the baking process: NOTE: not needed for font atlas */
436         nk_rune fallback_glyph;
437         /* fallback glyph to use if a given rune is not found */
438         nk_font_config *n;
439         nk_font_config *p;
440     }
441 
442     struct nk_font_glyph {
443         nk_rune codepoint;
444         float xadvance;
445         float x0, y0, x1, y1, w, h;
446         float u0, v0, u1, v1;
447     }
448 
449     struct nk_font {
450         nk_font *next;
451         nk_user_font handle;
452         nk_baked_font info;
453         float scale;
454         nk_font_glyph *glyphs;
455         const(nk_font_glyph) *fallback;
456         nk_rune fallback_codepoint;
457         nk_handle texture;
458         nk_font_config *config;
459     }
460 
461     enum nk_font_atlas_format {
462         NK_FONT_ATLAS_ALPHA8,
463         NK_FONT_ATLAS_RGBA32
464     }
465 
466     struct nk_font_atlas {
467         void *pixel;
468         int tex_width;
469         int tex_height;
470 
471         nk_allocator permanent;
472         nk_allocator temporary;
473 
474         nk_recti custom;
475         nk_cursor[nk_style_cursor.NK_CURSOR_COUNT] cursors;
476 
477         int glyph_count;
478         nk_font_glyph *glyphs;
479         nk_font *default_font;
480         nk_font *fonts;
481         nk_font_config *config;
482         int font_num;
483     }
484 }
485 
486 // MEMORY BUFFER
487 
488 struct nk_memory_status {
489     void *memory;
490     uint type;
491     nk_size size;
492     nk_size allocated;
493     nk_size needed;
494     nk_size calls;
495 }
496 
497 enum nk_allocation_type {
498     NK_BUFFER_FIXED,
499     NK_BUFFER_DYNAMIC
500 }
501 
502 enum nk_buffer_allocation_type {
503     NK_BUFFER_FRONT,
504     NK_BUFFER_BACK,
505     NK_BUFFER_MAX
506 }
507 
508 struct nk_buffer_marker {
509     int active;
510     nk_size offset;
511 }
512 
513 struct nk_memory { void *ptr; nk_size size; }
514 
515 struct nk_buffer {
516     nk_buffer_marker[nk_buffer_allocation_type.NK_BUFFER_MAX] marker;
517     /* buffer marker to free a buffer to a certain offset */
518     nk_allocator pool;
519     /* allocator callback for dynamic buffers */
520     nk_allocation_type type;
521     /* memory management type */
522     nk_memory memory;
523     /* memory and size of the current memory block */
524     float grow_factor;
525     /* growing factor for dynamic memory management */
526     nk_size allocated;
527     /* total amount of memory allocated */
528     nk_size needed;
529     /* totally consumed memory given that enough memory is present */
530     nk_size calls;
531     /* number of allocation calls */
532     nk_size size;
533     /* current size of the buffer */
534 };
535 
536 // STRING
537 
538 struct nk_str {
539     nk_buffer buffer;
540     int len; /* in codepoints/runes/glyphs */
541 }
542 
543 // TEXT EDITOR
544 
545 enum NK_TEXTEDIT_UNDOSTATECOUNT = 99;
546 enum NK_TEXTEDIT_UNDOCHARCOUNT = 999;
547 
548 struct nk_clipboard {
549     nk_handle userdata;
550     nk_plugin_paste paste;
551     nk_plugin_copy copy;
552 }
553 
554 struct nk_text_undo_record {
555     int where;
556     short insert_length;
557     short delete_length;
558     short char_storage;
559 }
560 
561 struct nk_text_undo_state {
562     nk_text_undo_record[NK_TEXTEDIT_UNDOSTATECOUNT] undo_rec;
563     nk_rune[NK_TEXTEDIT_UNDOCHARCOUNT] undo_char;
564     short undo_point;
565     short redo_point;
566     short undo_char_point;
567     short redo_char_point;
568 }
569 
570 enum nk_text_edit_type {
571     NK_TEXT_EDIT_SINGLE_LINE,
572     NK_TEXT_EDIT_MULTI_LINE
573 }
574 
575 enum nk_text_edit_mode {
576     NK_TEXT_EDIT_MODE_VIEW,
577     NK_TEXT_EDIT_MODE_INSERT,
578     NK_TEXT_EDIT_MODE_REPLACE
579 }
580 
581 struct nk_text_edit {
582     nk_clipboard clip;
583     nk_str string;
584     nk_plugin_filter filter;
585     nk_vec2 scrollbar;
586 
587     int cursor;
588     int select_start;
589     int select_end;
590     ubyte mode;
591     ubyte cursor_at_end_of_line;
592     ubyte initialized;
593     ubyte has_preferred_x;
594     ubyte single_line;
595     ubyte active;
596     ubyte padding1;
597     float preferred_x;
598     nk_text_undo_state undo;
599 }
600 
601 // DRAWING
602 
603 enum nk_command_type {
604     NK_COMMAND_NOP,
605     NK_COMMAND_SCISSOR,
606     NK_COMMAND_LINE,
607     NK_COMMAND_CURVE,
608     NK_COMMAND_RECT,
609     NK_COMMAND_RECT_FILLED,
610     NK_COMMAND_RECT_MULTI_COLOR,
611     NK_COMMAND_CIRCLE,
612     NK_COMMAND_CIRCLE_FILLED,
613     NK_COMMAND_ARC,
614     NK_COMMAND_ARC_FILLED,
615     NK_COMMAND_TRIANGLE,
616     NK_COMMAND_TRIANGLE_FILLED,
617     NK_COMMAND_POLYGON,
618     NK_COMMAND_POLYGON_FILLED,
619     NK_COMMAND_POLYLINE,
620     NK_COMMAND_TEXT,
621     NK_COMMAND_IMAGE,
622     NK_COMMAND_CUSTOM
623 }
624 
625 /* command base and header of every command inside the buffer */
626 struct nk_command {
627     nk_command_type type;
628     nk_size next;
629     version(NK_INCLUDE_COMMAND_USERDATA){
630         nk_handle userdata;
631     }
632 }
633 
634 struct nk_command_scissor {
635     nk_command header;
636     short x, y;
637     ushort w, h;
638 }
639 
640 struct nk_command_line {
641     nk_command header;
642     ushort line_thickness;
643     nk_vec2i begin;
644     nk_vec2i end;
645     nk_color color;
646 }
647 
648 struct nk_command_curve {
649     nk_command header;
650     ushort line_thickness;
651     nk_vec2i begin;
652     nk_vec2i end;
653     nk_vec2i[2] ctrl;
654     nk_color color;
655 }
656 
657 struct nk_command_rect {
658     nk_command header;
659     ushort rounding;
660     ushort line_thickness;
661     short x, y;
662     ushort w, h;
663     nk_color color;
664 }
665 
666 struct nk_command_rect_filled {
667     nk_command header;
668     ushort rounding;
669     short x, y;
670     ushort w, h;
671     nk_color color;
672 }
673 
674 struct nk_command_rect_multi_color {
675     nk_command header;
676     short x, y;
677     ushort w, h;
678     nk_color left;
679     nk_color top;
680     nk_color bottom;
681     nk_color right;
682 }
683 
684 struct nk_command_triangle {
685     nk_command header;
686     ushort line_thickness;
687     nk_vec2i a;
688     nk_vec2i b;
689     nk_vec2i c;
690     nk_color color;
691 }
692 
693 struct nk_command_triangle_filled {
694     nk_command header;
695     nk_vec2i a;
696     nk_vec2i b;
697     nk_vec2i c;
698     nk_color color;
699 }
700 
701 struct nk_command_circle {
702     nk_command header;
703     short x, y;
704     ushort line_thickness;
705     ushort w, h;
706     nk_color color;
707 }
708 
709 struct nk_command_circle_filled {
710     nk_command header;
711     short x, y;
712     ushort w, h;
713     nk_color color;
714 }
715 
716 struct nk_command_arc {
717     nk_command header;
718     short cx, cy;
719     ushort r;
720     ushort line_thickness;
721     float[2] a;
722     nk_color color;
723 }
724 
725 struct nk_command_arc_filled {
726     nk_command header;
727     short cx, cy;
728     ushort r;
729     float[2] a;
730     nk_color color;
731 }
732 
733 struct nk_command_polygon {
734     nk_command header;
735     nk_color color;
736     ushort line_thickness;
737     ushort point_count;
738     nk_vec2i[1] points;
739 }
740 
741 struct nk_command_polygon_filled {
742     nk_command header;
743     nk_color color;
744     ushort point_count;
745     nk_vec2i[1] points;
746 }
747 
748 struct nk_command_polyline {
749     nk_command header;
750     nk_color color;
751     ushort line_thickness;
752     ushort point_count;
753     nk_vec2i[1] points;
754 }
755 
756 struct nk_command_image {
757     nk_command header;
758     short x, y;
759     ushort w, h;
760     nk_image img;
761     nk_color col;
762 }
763 
764 extern(C) @nogc nothrow {
765     alias nk_command_custom_callback = void function(void *canvas, short x,short y, ushort w, ushort h, nk_handle callback_data);
766 }
767 
768 struct nk_command_custom {
769     nk_command header;
770     short x, y;
771     ushort w, h;
772     nk_handle callback_data;
773     nk_command_custom_callback callback;
774 }
775 
776 struct nk_command_text {
777     nk_command header;
778     const(nk_user_font) *font;
779     nk_color background;
780     nk_color foreground;
781     short x, y;
782     ushort w, h;
783     float height;
784     int length;
785     char[1] string;
786 }
787 
788 enum nk_command_clipping {
789     NK_CLIPPING_OFF = nk_false,
790     NK_CLIPPING_ON = nk_true
791 }
792 
793 struct nk_command_buffer {
794     nk_buffer *base;
795     nk_rect clip;
796     int use_clipping;
797     nk_handle userdata;
798     nk_size begin, end, last;
799 }
800 
801 // INPUT
802 
803 struct nk_mouse_button {
804     int down;
805     uint clicked;
806     nk_vec2 clicked_pos;
807 }
808 
809 struct nk_mouse {
810     nk_mouse_button[nk_buttons.NK_BUTTON_MAX] buttons;
811     nk_vec2 pos;
812     nk_vec2 prev;
813     nk_vec2 delta;
814     nk_vec2 scroll_delta;
815     ubyte grab;
816     ubyte grabbed;
817     ubyte ungrab;
818 }
819 
820 struct nk_key {
821     int down;
822     uint clicked;
823 }
824 
825 struct nk_keyboard {
826     nk_key[nk_keys.NK_KEY_MAX] keys;
827     char[NK_INPUT_MAX] text;
828     int text_len;
829 }
830 
831 struct nk_input {
832     nk_keyboard keyboard;
833     nk_mouse mouse;
834 }
835 
836 // DRAW LIST
837 
838 version(NK_INCLUDE_VERTEX_BUFFER_OUTPUT)
839 {
840     version(NK_UINT_DRAW_INDEX)
841     {
842         alias nk_draw_index = nk_uint;
843     }
844     else
845     {
846         alias nk_draw_index = nk_ushort;
847     }
848 
849     enum nk_draw_list_stroke {
850         NK_STROKE_OPEN = nk_false,
851         /* build up path has no connection back to the beginning */
852         NK_STROKE_CLOSED = nk_true
853             /* build up path has a connection back to the beginning */
854     }
855 
856     enum nk_draw_vertex_layout_attribute {
857         NK_VERTEX_POSITION,
858         NK_VERTEX_COLOR,
859         NK_VERTEX_TEXCOORD,
860         NK_VERTEX_ATTRIBUTE_COUNT
861     }
862 
863     enum nk_draw_vertex_layout_format {
864         NK_FORMAT_SCHAR,
865         NK_FORMAT_SSHORT,
866         NK_FORMAT_SINT,
867         NK_FORMAT_UCHAR,
868         NK_FORMAT_USHORT,
869         NK_FORMAT_UINT,
870         NK_FORMAT_FLOAT,
871         NK_FORMAT_DOUBLE,
872 
873         NK_FORMAT_COLOR_BEGIN,
874         NK_FORMAT_R8G8B8 = NK_FORMAT_COLOR_BEGIN,
875         NK_FORMAT_R16G15B16,
876         NK_FORMAT_R32G32B32,
877 
878         NK_FORMAT_R8G8B8A8,
879         NK_FORMAT_B8G8R8A8,
880         NK_FORMAT_R16G15B16A16,
881         NK_FORMAT_R32G32B32A32,
882         NK_FORMAT_R32G32B32A32_FLOAT,
883         NK_FORMAT_R32G32B32A32_DOUBLE,
884 
885         NK_FORMAT_RGB32,
886         NK_FORMAT_RGBA32,
887         NK_FORMAT_COLOR_END = NK_FORMAT_RGBA32,
888         NK_FORMAT_COUNT
889     }
890 
891     struct nk_draw_vertex_layout_element {
892         nk_draw_vertex_layout_attribute attribute;
893         nk_draw_vertex_layout_format format;
894         nk_size offset;
895     }
896     
897     const(nk_draw_vertex_layout_element) NK_VERTEX_LAYOUT_END = { nk_draw_vertex_layout_attribute.NK_VERTEX_ATTRIBUTE_COUNT,nk_draw_vertex_layout_format.NK_FORMAT_COUNT,0 };
898 
899     struct nk_draw_command {
900         uint elem_count;
901         /* number of elements in the current draw batch */
902         nk_rect clip_rect;
903         /* current screen clipping rectangle */
904         nk_handle texture;
905         /* current texture to set */
906         version(NK_INCLUDE_COMMAND_USERDATA)
907         {
908             nk_handle userdata;
909         }
910     }
911 
912     struct nk_draw_list {
913         nk_rect clip_rect;
914         nk_vec2[12] circle_vtx;
915         nk_convert_config config;
916 
917         nk_buffer *buffer;
918         nk_buffer *vertices;
919         nk_buffer *elements;
920 
921         uint element_count;
922         uint vertex_count;
923         uint cmd_count;
924         nk_size cmd_offset;
925 
926         uint path_count;
927         uint path_offset;
928 
929         nk_anti_aliasing line_AA;
930         nk_anti_aliasing shape_AA;
931 
932         version(NK_INCLUDE_COMMAND_USERDATA)
933         {
934             nk_handle userdata;
935         }
936     }
937 }
938 else
939 {
940     struct nk_draw_vertex_layout_element;
941 }
942 
943 // GUI
944 
945 enum nk_style_item_type {
946     NK_STYLE_ITEM_COLOR,
947     NK_STYLE_ITEM_IMAGE
948 }
949 
950 union nk_style_item_data {
951     nk_image image;
952     nk_color color;
953 }
954 
955 struct nk_style_item {
956     nk_style_item_type type;
957     nk_style_item_data data;
958 };
959 
960 struct nk_style_text {
961     nk_color color;
962     nk_vec2 padding;
963 }
964 
965 extern(C) @nogc nothrow {
966     alias draw_begin_fn = void function(nk_command_buffer*, nk_handle userdata);
967     alias draw_end_fn = void function(nk_command_buffer*, nk_handle userdata);
968 }
969 
970 struct nk_style_button {
971     /* background */
972     nk_style_item normal;
973     nk_style_item hover;
974     nk_style_item active;
975     nk_color border_color;
976 
977     /* text */
978     nk_color text_background;
979     nk_color text_normal;
980     nk_color text_hover;
981     nk_color text_active;
982     nk_flags text_alignment;
983 
984     /* properties */
985     float border;
986     float rounding;
987     nk_vec2 padding;
988     nk_vec2 image_padding;
989     nk_vec2 touch_padding;
990 
991     /* optional user callbacks */
992     nk_handle userdata;
993     draw_begin_fn draw_begin;
994     draw_end_fn draw_end;
995 }
996 
997 struct nk_style_toggle {
998     /* background */
999     nk_style_item normal;
1000     nk_style_item hover;
1001     nk_style_item active;
1002     nk_color border_color;
1003 
1004     /* cursor */
1005     nk_style_item cursor_normal;
1006     nk_style_item cursor_hover;
1007 
1008     /* text */
1009     nk_color text_normal;
1010     nk_color text_hover;
1011     nk_color text_active;
1012     nk_color text_background;
1013     nk_flags text_alignment;
1014 
1015     /* properties */
1016     nk_vec2 padding;
1017     nk_vec2 touch_padding;
1018     float spacing;
1019     float border;
1020 
1021     /* optional user callbacks */
1022     nk_handle userdata;
1023     draw_begin_fn draw_begin;
1024     draw_end_fn draw_end;
1025 }
1026 
1027 struct nk_style_selectable {
1028     /* background (inactive) */
1029     nk_style_item normal;
1030     nk_style_item hover;
1031     nk_style_item pressed;
1032 
1033     /* background (active) */
1034     nk_style_item normal_active;
1035     nk_style_item hover_active;
1036     nk_style_item pressed_active;
1037 
1038     /* text color (inactive) */
1039     nk_color text_normal;
1040     nk_color text_hover;
1041     nk_color text_pressed;
1042 
1043     /* text color (active) */
1044     nk_color text_normal_active;
1045     nk_color text_hover_active;
1046     nk_color text_pressed_active;
1047     nk_color text_background;
1048     nk_flags text_alignment;
1049 
1050     /* properties */
1051     float rounding;
1052     nk_vec2 padding;
1053     nk_vec2 touch_padding;
1054     nk_vec2 image_padding;
1055 
1056     /* optional user callbacks */
1057     nk_handle userdata;
1058     draw_begin_fn draw_begin;
1059     draw_end_fn draw_end;
1060 }
1061 
1062 struct nk_style_slider {
1063     /* background */
1064     nk_style_item normal;
1065     nk_style_item hover;
1066     nk_style_item active;
1067     nk_color border_color;
1068 
1069     /* background bar */
1070     nk_color bar_normal;
1071     nk_color bar_hover;
1072     nk_color bar_active;
1073     nk_color bar_filled;
1074 
1075     /* cursor */
1076     nk_style_item cursor_normal;
1077     nk_style_item cursor_hover;
1078     nk_style_item cursor_active;
1079 
1080     /* properties */
1081     float border;
1082     float rounding;
1083     float bar_height;
1084     nk_vec2 padding;
1085     nk_vec2 spacing;
1086     nk_vec2 cursor_size;
1087 
1088     /* optional buttons */
1089     int show_buttons;
1090     nk_style_button inc_button;
1091     nk_style_button dec_button;
1092     nk_symbol_type inc_symbol;
1093     nk_symbol_type dec_symbol;
1094 
1095     /* optional user callbacks */
1096     nk_handle userdata;
1097     draw_begin_fn draw_begin;
1098     draw_end_fn draw_end;
1099 }
1100 
1101 struct nk_style_progress {
1102     /* background */
1103     nk_style_item normal;
1104     nk_style_item hover;
1105     nk_style_item active;
1106     nk_color border_color;
1107 
1108     /* cursor */
1109     nk_style_item cursor_normal;
1110     nk_style_item cursor_hover;
1111     nk_style_item cursor_active;
1112     nk_color cursor_border_color;
1113 
1114     /* properties */
1115     float rounding;
1116     float border;
1117     float cursor_border;
1118     float cursor_rounding;
1119     nk_vec2 padding;
1120 
1121     /* optional user callbacks */
1122     nk_handle userdata;
1123     draw_begin_fn draw_begin;
1124     draw_end_fn draw_end;
1125 }
1126 
1127 struct nk_style_scrollbar {
1128     /* background */
1129     nk_style_item normal;
1130     nk_style_item hover;
1131     nk_style_item active;
1132     nk_color border_color;
1133 
1134     /* cursor */
1135     nk_style_item cursor_normal;
1136     nk_style_item cursor_hover;
1137     nk_style_item cursor_active;
1138     nk_color cursor_border_color;
1139 
1140     /* properties */
1141     float border;
1142     float rounding;
1143     float border_cursor;
1144     float rounding_cursor;
1145     nk_vec2 padding;
1146 
1147     /* optional buttons */
1148     int show_buttons;
1149     nk_style_button inc_button;
1150     nk_style_button dec_button;
1151     nk_symbol_type inc_symbol;
1152     nk_symbol_type dec_symbol;
1153 
1154     /* optional user callbacks */
1155     nk_handle userdata;
1156     draw_begin_fn draw_begin;
1157     draw_end_fn draw_end;
1158 }
1159 
1160 struct nk_style_edit {
1161     /* background */
1162     nk_style_item normal;
1163     nk_style_item hover;
1164     nk_style_item active;
1165     nk_color border_color;
1166     nk_style_scrollbar scrollbar;
1167 
1168     /* cursor  */
1169     nk_color cursor_normal;
1170     nk_color cursor_hover;
1171     nk_color cursor_text_normal;
1172     nk_color cursor_text_hover;
1173 
1174     /* text (unselected) */
1175     nk_color text_normal;
1176     nk_color text_hover;
1177     nk_color text_active;
1178 
1179     /* text (selected) */
1180     nk_color selected_normal;
1181     nk_color selected_hover;
1182     nk_color selected_text_normal;
1183     nk_color selected_text_hover;
1184 
1185     /* properties */
1186     float border;
1187     float rounding;
1188     float cursor_size;
1189     nk_vec2 scrollbar_size;
1190     nk_vec2 padding;
1191     float row_padding;
1192 }
1193 
1194 struct nk_style_property {
1195     /* background */
1196     nk_style_item normal;
1197     nk_style_item hover;
1198     nk_style_item active;
1199     nk_color border_color;
1200 
1201     /* text */
1202     nk_color label_normal;
1203     nk_color label_hover;
1204     nk_color label_active;
1205 
1206     /* symbols */
1207     nk_symbol_type sym_left;
1208     nk_symbol_type sym_right;
1209 
1210     /* properties */
1211     float border;
1212     float rounding;
1213     nk_vec2 padding;
1214 
1215     nk_style_edit edit;
1216     nk_style_button inc_button;
1217     nk_style_button dec_button;
1218 
1219     /* optional user callbacks */
1220     nk_handle userdata;
1221     draw_begin_fn draw_begin;
1222     draw_end_fn draw_end;
1223 }
1224 
1225 struct nk_style_chart {
1226     /* colors */
1227     nk_style_item background;
1228     nk_color border_color;
1229     nk_color selected_color;
1230     nk_color color;
1231 
1232     /* properties */
1233     float border;
1234     float rounding;
1235     nk_vec2 padding;
1236 }
1237 
1238 struct nk_style_combo {
1239     /* background */
1240     nk_style_item normal;
1241     nk_style_item hover;
1242     nk_style_item active;
1243     nk_color border_color;
1244 
1245     /* label */
1246     nk_color label_normal;
1247     nk_color label_hover;
1248     nk_color label_active;
1249 
1250     /* symbol */
1251     nk_color symbol_normal;
1252     nk_color symbol_hover;
1253     nk_color symbol_active;
1254 
1255     /* button */
1256     nk_style_button button;
1257     nk_symbol_type sym_normal;
1258     nk_symbol_type sym_hover;
1259     nk_symbol_type sym_active;
1260 
1261     /* properties */
1262     float border;
1263     float rounding;
1264     nk_vec2 content_padding;
1265     nk_vec2 button_padding;
1266     nk_vec2 spacing;
1267 }
1268 
1269 struct nk_style_tab {
1270     /* background */
1271     nk_style_item background;
1272     nk_color border_color;
1273     nk_color text;
1274 
1275     /* button */
1276     nk_style_button tab_maximize_button;
1277     nk_style_button tab_minimize_button;
1278     nk_style_button node_maximize_button;
1279     nk_style_button node_minimize_button;
1280     nk_symbol_type sym_minimize;
1281     nk_symbol_type sym_maximize;
1282 
1283     /* properties */
1284     float border;
1285     float rounding;
1286     float indent;
1287     nk_vec2 padding;
1288     nk_vec2 spacing;
1289 }
1290 
1291 enum nk_style_header_align {
1292     NK_HEADER_LEFT,
1293     NK_HEADER_RIGHT
1294 }
1295 struct nk_style_window_header {
1296     /* background */
1297     nk_style_item normal;
1298     nk_style_item hover;
1299     nk_style_item active;
1300 
1301     /* button */
1302     nk_style_button close_button;
1303     nk_style_button minimize_button;
1304     nk_symbol_type close_symbol;
1305     nk_symbol_type minimize_symbol;
1306     nk_symbol_type maximize_symbol;
1307 
1308     /* title */
1309     nk_color label_normal;
1310     nk_color label_hover;
1311     nk_color label_active;
1312 
1313     /* properties */
1314     nk_style_header_align align_;
1315     nk_vec2 padding;
1316     nk_vec2 label_padding;
1317     nk_vec2 spacing;
1318 }
1319 
1320 struct nk_style_window {
1321     nk_style_window_header header;
1322     nk_style_item fixed_background;
1323     nk_color background;
1324 
1325     nk_color border_color;
1326     nk_color popup_border_color;
1327     nk_color combo_border_color;
1328     nk_color contextual_border_color;
1329     nk_color menu_border_color;
1330     nk_color group_border_color;
1331     nk_color tooltip_border_color;
1332     nk_style_item scaler;
1333 
1334     float border;
1335     float combo_border;
1336     float contextual_border;
1337     float menu_border;
1338     float group_border;
1339     float tooltip_border;
1340     float popup_border;
1341     float min_row_height_padding;
1342 
1343     float rounding;
1344     nk_vec2 spacing;
1345     nk_vec2 scrollbar_size;
1346     nk_vec2 min_size;
1347 
1348     nk_vec2 padding;
1349     nk_vec2 group_padding;
1350     nk_vec2 popup_padding;
1351     nk_vec2 combo_padding;
1352     nk_vec2 contextual_padding;
1353     nk_vec2 menu_padding;
1354     nk_vec2 tooltip_padding;
1355 }
1356 
1357 struct nk_style {
1358     const(nk_user_font) *font;
1359     const(nk_cursor)*[nk_style_cursor.NK_CURSOR_COUNT] cursors;
1360     const(nk_cursor) *cursor_active;
1361     nk_cursor *cursor_last;
1362     int cursor_visible;
1363 
1364     nk_style_text text;
1365     nk_style_button button;
1366     nk_style_button contextual_button;
1367     nk_style_button menu_button;
1368     nk_style_toggle option;
1369     nk_style_toggle checkbox;
1370     nk_style_selectable selectable;
1371     nk_style_slider slider;
1372     nk_style_progress progress;
1373     nk_style_property property;
1374     nk_style_edit edit;
1375     nk_style_chart chart;
1376     nk_style_scrollbar scrollh;
1377     nk_style_scrollbar scrollv;
1378     nk_style_tab tab;
1379     nk_style_combo combo;
1380     nk_style_window window;
1381 }
1382 
1383 // PANEL
1384 
1385 enum NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS = 16;
1386 enum NK_CHART_MAX_SLOT = 4;
1387 
1388 enum nk_panel_type {
1389     NK_PANEL_NONE       = 0,
1390     NK_PANEL_WINDOW     = NK_FLAG(0),
1391     NK_PANEL_GROUP      = NK_FLAG(1),
1392     NK_PANEL_POPUP      = NK_FLAG(2),
1393     NK_PANEL_CONTEXTUAL = NK_FLAG(4),
1394     NK_PANEL_COMBO      = NK_FLAG(5),
1395     NK_PANEL_MENU       = NK_FLAG(6),
1396     NK_PANEL_TOOLTIP    = NK_FLAG(7)
1397 }
1398 
1399 enum nk_panel_set {
1400     NK_PANEL_SET_NONBLOCK = nk_panel_type.NK_PANEL_CONTEXTUAL| nk_panel_type.NK_PANEL_COMBO| nk_panel_type.NK_PANEL_MENU| nk_panel_type.NK_PANEL_TOOLTIP,
1401     NK_PANEL_SET_POPUP =  NK_PANEL_SET_NONBLOCK| cast(nk_panel_set)nk_panel_type.NK_PANEL_POPUP,
1402     NK_PANEL_SET_SUB =  NK_PANEL_SET_POPUP| cast(nk_panel_set)nk_panel_type.NK_PANEL_GROUP
1403 }
1404 
1405 struct nk_chart_slot {
1406     nk_chart_type type;
1407     nk_color color;
1408     nk_color highlight;
1409     float min, max, range;
1410     int count;
1411     nk_vec2 last;
1412     int index;
1413 }
1414 
1415 struct nk_chart {
1416     int slot;
1417     float x, y, w, h;
1418     nk_chart_slot[NK_CHART_MAX_SLOT] slots;
1419 }
1420 
1421 enum nk_panel_row_layout_type {
1422     NK_LAYOUT_DYNAMIC_FIXED = 0,
1423     NK_LAYOUT_DYNAMIC_ROW,
1424     NK_LAYOUT_DYNAMIC_FREE,
1425     NK_LAYOUT_DYNAMIC,
1426     NK_LAYOUT_STATIC_FIXED,
1427     NK_LAYOUT_STATIC_ROW,
1428     NK_LAYOUT_STATIC_FREE,
1429     NK_LAYOUT_STATIC,
1430     NK_LAYOUT_TEMPLATE,
1431     NK_LAYOUT_COUNT
1432 }
1433 
1434 struct nk_row_layout {
1435     nk_panel_row_layout_type type;
1436     int index;
1437     float height;
1438     float min_height;
1439     int columns;
1440     const(float) *ratio;
1441     float item_width;
1442     float item_height;
1443     float item_offset;
1444     float filled;
1445     nk_rect item;
1446     int tree_depth;
1447     float[NK_MAX_LAYOUT_ROW_TEMPLATE_COLUMNS] templates;
1448 }
1449 
1450 struct nk_popup_buffer {
1451     nk_size begin;
1452     nk_size parent;
1453     nk_size last;
1454     nk_size end;
1455     int active;
1456 }
1457 
1458 struct nk_menu_state {
1459     float x, y, w, h;
1460     nk_scroll offset;
1461 }
1462 
1463 struct nk_panel {
1464     nk_panel_type type;
1465     nk_flags flags;
1466     nk_rect bounds;
1467     nk_uint *offset_x;
1468     nk_uint *offset_y;
1469     float at_x, at_y, max_x;
1470     float footer_height;
1471     float header_height;
1472     float border;
1473     uint has_scrolling;
1474     nk_rect clip;
1475     nk_menu_state menu;
1476     nk_row_layout row;
1477     nk_chart chart;
1478     nk_command_buffer *buffer;
1479     nk_panel *parent;
1480 }
1481 
1482 // WINDOW
1483 
1484 enum NK_WINDOW_MAX_NAME = 64;
1485 
1486 enum nk_window_flags {
1487     NK_WINDOW_PRIVATE       = NK_FLAG(11),
1488     NK_WINDOW_DYNAMIC       = NK_WINDOW_PRIVATE,
1489     /* special window type growing up in height while being filled to a certain maximum height */
1490     NK_WINDOW_ROM           = NK_FLAG(12),
1491     /* sets window widgets into a read only mode and does not allow input changes */
1492     NK_WINDOW_NOT_INTERACTIVE = NK_WINDOW_ROM|cast(nk_window_flags)nk_panel_flags.NK_WINDOW_NO_INPUT,
1493     /* prevents all interaction caused by input to either window or widgets inside */
1494     NK_WINDOW_HIDDEN        = NK_FLAG(13),
1495     /* Hides window and stops any window interaction and drawing */
1496     NK_WINDOW_CLOSED        = NK_FLAG(14),
1497     /* Directly closes and frees the window at the end of the frame */
1498     NK_WINDOW_MINIMIZED     = NK_FLAG(15),
1499     /* marks the window as minimized */
1500     NK_WINDOW_REMOVE_ROM    = NK_FLAG(16)
1501         /* Removes read only mode at the end of the window */
1502 }
1503 
1504 struct nk_popup_state {
1505     nk_window *win;
1506     nk_panel_type type;
1507     nk_popup_buffer buf;
1508     nk_hash name;
1509     int active;
1510     uint combo_count;
1511     uint con_count, con_old;
1512     uint active_con;
1513     nk_rect header;
1514 }
1515 
1516 struct nk_edit_state {
1517     nk_hash name;
1518     uint seq;
1519     uint old;
1520     int active, prev;
1521     int cursor;
1522     int sel_start;
1523     int sel_end;
1524     nk_scroll scrollbar;
1525     ubyte mode;
1526     ubyte single_line;
1527 }
1528 
1529 struct nk_property_state {
1530     int active, prev;
1531     char[NK_MAX_NUMBER_BUFFER] buffer;
1532     int length;
1533     int cursor;
1534     int select_start;
1535     int select_end;
1536     nk_hash name;
1537     uint seq;
1538     uint old;
1539     int state;
1540 }
1541 
1542 struct nk_window {
1543     uint seq;
1544     nk_hash name;
1545     char[NK_WINDOW_MAX_NAME] name_string;
1546     nk_flags flags;
1547 
1548     nk_rect bounds;
1549     nk_scroll scrollbar;
1550     nk_command_buffer buffer;
1551     nk_panel *layout;
1552     float scrollbar_hiding_timer;
1553 
1554     /* persistent widget state */
1555     nk_property_state property;
1556     nk_popup_state popup;
1557     nk_edit_state edit;
1558     uint scrolled;
1559 
1560     nk_table *tables;
1561     uint table_count;
1562 
1563     /* window list hooks */
1564     nk_window *next;
1565     nk_window *prev;
1566     nk_window *parent;
1567 }
1568 
1569 // STACK
1570 
1571 enum NK_BUTTON_BEHAVIOR_STACK_SIZE = 8;
1572 enum NK_FONT_STACK_SIZE = 8;
1573 enum NK_STYLE_ITEM_STACK_SIZE = 16;
1574 enum NK_FLOAT_STACK_SIZE = 32;
1575 enum NK_VECTOR_STACK_SIZE = 16;
1576 enum NK_FLAGS_STACK_SIZE = 32;
1577 enum NK_COLOR_STACK_SIZE = 32;
1578 
1579 template NK_CONFIGURATION_STACK_TYPE(string prefix, string name, string type)
1580 {
1581     const char[] NK_CONFIGURATION_STACK_TYPE = "struct nk_config_stack_"~name~"_element {"~
1582         prefix ~ "_"~type~" *address;" ~
1583         prefix ~ "_"~type~" old_value;"~
1584         "}";
1585 }
1586 
1587 template NK_CONFIG_STACK(string type, string size)
1588 {
1589     const char[] NK_CONFIG_STACK = "struct nk_config_stack_"~type~" {"~
1590         "int head;"~
1591         "nk_config_stack_"~type~"_element["~size~"] elements;"~
1592         "}";
1593 }
1594 
1595 mixin(NK_CONFIGURATION_STACK_TYPE!("nk", "style_item", "style_item"));
1596 mixin(NK_CONFIGURATION_STACK_TYPE!("nk" ,"float", "float"));
1597 mixin(NK_CONFIGURATION_STACK_TYPE!("nk", "vec2", "vec2"));
1598 mixin(NK_CONFIGURATION_STACK_TYPE!("nk" ,"flags", "flags"));
1599 mixin(NK_CONFIGURATION_STACK_TYPE!("nk", "color", "color"));
1600 mixin(NK_CONFIGURATION_STACK_TYPE!("nk", "user_font", "user_font*"));
1601 mixin(NK_CONFIGURATION_STACK_TYPE!("nk", "button_behavior", "button_behavior"));
1602 
1603 mixin(NK_CONFIG_STACK!("style_item", "NK_STYLE_ITEM_STACK_SIZE"));
1604 mixin(NK_CONFIG_STACK!("float", "NK_FLOAT_STACK_SIZE"));
1605 mixin(NK_CONFIG_STACK!("vec2", "NK_VECTOR_STACK_SIZE"));
1606 mixin(NK_CONFIG_STACK!("flags", "NK_FLAGS_STACK_SIZE"));
1607 mixin(NK_CONFIG_STACK!("color", "NK_COLOR_STACK_SIZE"));
1608 mixin(NK_CONFIG_STACK!("user_font", "NK_FONT_STACK_SIZE"));
1609 mixin(NK_CONFIG_STACK!("button_behavior", "NK_BUTTON_BEHAVIOR_STACK_SIZE"));
1610 
1611 struct nk_configuration_stacks {
1612     nk_config_stack_style_item style_items;
1613     nk_config_stack_float floats;
1614     nk_config_stack_vec2 vectors;
1615     nk_config_stack_flags flags;
1616     nk_config_stack_color colors;
1617     nk_config_stack_user_font fonts;
1618     nk_config_stack_button_behavior button_behaviors;
1619 }
1620 
1621 // CONTEXT
1622 
1623 enum NK_VALUE_PAGE_CAPACITY = (NK_MAX(nk_window.sizeof,nk_panel.sizeof) / nk_uint.sizeof) / 2;
1624 
1625 struct nk_table {
1626     uint seq;
1627     uint size;
1628     nk_hash[NK_VALUE_PAGE_CAPACITY] keys;
1629     nk_uint[NK_VALUE_PAGE_CAPACITY] values;
1630     nk_table *next;
1631     nk_table *prev;
1632 }
1633 
1634 union nk_page_data {
1635     nk_table tbl;
1636     nk_panel pan;
1637     nk_window win;
1638 }
1639 
1640 struct nk_page_element {
1641     nk_page_data data;
1642     nk_page_element *next;
1643     nk_page_element *prev;
1644 }
1645 
1646 struct nk_page {
1647     uint size;
1648     nk_page *next;
1649     nk_page_element[1] win;
1650 }
1651 
1652 struct nk_pool {
1653     nk_allocator alloc;
1654     nk_allocation_type type;
1655     uint page_count;
1656     nk_page *pages;
1657     nk_page_element *freelist;
1658     uint capacity;
1659     nk_size size;
1660     nk_size cap;
1661 }
1662 
1663 struct nk_context {
1664     /* public: can be accessed freely */
1665     nk_input input;
1666     nk_style style;
1667     nk_buffer memory;
1668     nk_clipboard clip;
1669     nk_flags last_widget_state;
1670     nk_button_behavior button_behavior;
1671     nk_configuration_stacks stacks;
1672     float delta_time_seconds;
1673 
1674     /* private:
1675     should only be accessed if you
1676     know what you are doing */
1677     version(NK_INCLUDE_VERTEX_BUFFER_OUTPUT)
1678     {
1679         nk_draw_list draw_list;
1680     }
1681     version(NK_INCLUDE_COMMAND_USERDATA)
1682     {
1683         nk_handle userdata;
1684     }
1685     /* text editor objects are quite big because of an internal
1686     * undo/redo stack. Therefore it does not make sense to have one for
1687     * each window for temporary use cases, so I only provide *one* instance
1688     * for all windows. This works because the content is cleared anyway */
1689     nk_text_edit text_edit;
1690     /* draw buffer used for overlay drawing operation like cursor */
1691     nk_command_buffer overlay;
1692 
1693     /* windows */
1694     int build;
1695     int use_pool;
1696     nk_pool pool;
1697     nk_window *begin;
1698     nk_window *end;
1699     nk_window *active;
1700     nk_window *current;
1701     nk_page_element *freelist;
1702     uint count;
1703     uint seq;
1704 }
1705 
1706 enum {
1707     NK_UP = nk_heading.NK_UP,
1708     NK_RIGHT = nk_heading.NK_RIGHT,
1709     NK_DOWN = nk_heading.NK_DOWN,
1710     NK_LEFT = nk_heading.NK_LEFT,
1711     NK_BUTTON_DEFAULT = nk_button_behavior.NK_BUTTON_DEFAULT,
1712     NK_BUTTON_REPEATER = nk_button_behavior.NK_BUTTON_REPEATER,
1713     NK_FIXED = nk_modify.NK_FIXED,
1714     NK_MODIFIABLE = nk_modify.NK_MODIFIABLE,
1715     NK_VERTICAL = nk_orientation.NK_VERTICAL,
1716     NK_HORIZONTAL = nk_orientation.NK_HORIZONTAL,
1717     NK_MINIMIZED = nk_collapse_states.NK_MINIMIZED,
1718     NK_MAXIMIZED = nk_collapse_states.NK_MAXIMIZED,
1719     NK_HIDDEN = nk_show_states.NK_HIDDEN,
1720     NK_SHOWN = nk_show_states.NK_SHOWN,
1721     NK_CHART_LINES = nk_chart_type.NK_CHART_LINES,
1722     NK_CHART_COLUMN = nk_chart_type.NK_CHART_COLUMN,
1723     NK_CHART_MAX = nk_chart_type.NK_CHART_MAX,
1724     NK_CHART_HOVERING = nk_chart_event.NK_CHART_HOVERING,
1725     NK_CHART_CLICKED = nk_chart_event.NK_CHART_CLICKED,
1726     NK_RGB = nk_color_format.NK_RGB,
1727     NK_RGBA = nk_color_format.NK_RGBA,
1728     NK_POPUP_STATIC = nk_popup_type.NK_POPUP_STATIC,
1729     NK_POPUP_DYNAMIC = nk_popup_type.NK_POPUP_DYNAMIC,
1730     NK_DYNAMIC = nk_layout_format.NK_DYNAMIC,
1731     NK_STATIC = nk_layout_format.NK_STATIC,
1732     NK_TREE_NODE = nk_tree_type.NK_TREE_NODE,
1733     NK_TREE_TAB = nk_tree_type.NK_TREE_TAB,
1734     NK_ANTI_ALIASING_OFF = nk_anti_aliasing.NK_ANTI_ALIASING_OFF,
1735     NK_ANTI_ALIASING_ON = nk_anti_aliasing.NK_ANTI_ALIASING_ON,
1736     NK_SYMBOL_NONE = nk_symbol_type.NK_SYMBOL_NONE,
1737     NK_SYMBOL_X = nk_symbol_type.NK_SYMBOL_X,
1738     NK_SYMBOL_UNDERSCORE = nk_symbol_type.NK_SYMBOL_UNDERSCORE,
1739     NK_SYMBOL_CIRCLE_SOLID = nk_symbol_type.NK_SYMBOL_CIRCLE_SOLID,
1740     NK_SYMBOL_CIRCLE_OUTLINE = nk_symbol_type.NK_SYMBOL_CIRCLE_OUTLINE,
1741     NK_SYMBOL_RECT_SOLID = nk_symbol_type.NK_SYMBOL_RECT_SOLID,
1742     NK_SYMBOL_RECT_OUTLINE = nk_symbol_type.NK_SYMBOL_RECT_OUTLINE,
1743     NK_SYMBOL_TRIANGLE_UP = nk_symbol_type.NK_SYMBOL_TRIANGLE_UP,
1744     NK_SYMBOL_TRIANGLE_DOWN = nk_symbol_type.NK_SYMBOL_TRIANGLE_DOWN,
1745     NK_SYMBOL_TRIANGLE_LEFT = nk_symbol_type.NK_SYMBOL_TRIANGLE_LEFT,
1746     NK_SYMBOL_TRIANGLE_RIGHT = nk_symbol_type.NK_SYMBOL_TRIANGLE_RIGHT,
1747     NK_SYMBOL_PLUS = nk_symbol_type.NK_SYMBOL_PLUS,
1748     NK_SYMBOL_MINUS = nk_symbol_type.NK_SYMBOL_MINUS,
1749     NK_SYMBOL_MAX = nk_symbol_type.NK_SYMBOL_MAX,
1750     NK_KEY_NONE = nk_keys.NK_KEY_NONE,
1751     NK_KEY_SHIFT = nk_keys.NK_KEY_SHIFT,
1752     NK_KEY_CTRL = nk_keys.NK_KEY_CTRL,
1753     NK_KEY_DEL = nk_keys.NK_KEY_DEL,
1754     NK_KEY_ENTER = nk_keys.NK_KEY_ENTER,
1755     NK_KEY_TAB = nk_keys.NK_KEY_TAB,
1756     NK_KEY_BACKSPACE = nk_keys.NK_KEY_BACKSPACE,
1757     NK_KEY_COPY = nk_keys.NK_KEY_COPY,
1758     NK_KEY_CUT = nk_keys.NK_KEY_CUT,
1759     NK_KEY_PASTE = nk_keys.NK_KEY_PASTE,
1760     NK_KEY_UP = nk_keys.NK_KEY_UP,
1761     NK_KEY_DOWN = nk_keys.NK_KEY_DOWN,
1762     NK_KEY_LEFT = nk_keys.NK_KEY_LEFT,
1763     NK_KEY_RIGHT = nk_keys.NK_KEY_RIGHT,
1764     NK_KEY_TEXT_INSERT_MODE = nk_keys.NK_KEY_TEXT_INSERT_MODE,
1765     NK_KEY_TEXT_REPLACE_MODE = nk_keys.NK_KEY_TEXT_REPLACE_MODE,
1766     NK_KEY_TEXT_RESET_MODE = nk_keys.NK_KEY_TEXT_RESET_MODE,
1767     NK_KEY_TEXT_LINE_START = nk_keys.NK_KEY_TEXT_LINE_START,
1768     NK_KEY_TEXT_LINE_END = nk_keys.NK_KEY_TEXT_LINE_END,
1769     NK_KEY_TEXT_START = nk_keys.NK_KEY_TEXT_START,
1770     NK_KEY_TEXT_END = nk_keys.NK_KEY_TEXT_END,
1771     NK_KEY_TEXT_UNDO = nk_keys.NK_KEY_TEXT_UNDO,
1772     NK_KEY_TEXT_REDO = nk_keys.NK_KEY_TEXT_REDO,
1773     NK_KEY_TEXT_SELECT_ALL = nk_keys.NK_KEY_TEXT_SELECT_ALL,
1774     NK_KEY_TEXT_WORD_LEFT = nk_keys.NK_KEY_TEXT_WORD_LEFT,
1775     NK_KEY_TEXT_WORD_RIGHT = nk_keys.NK_KEY_TEXT_WORD_RIGHT,
1776     NK_KEY_SCROLL_START = nk_keys.NK_KEY_SCROLL_START,
1777     NK_KEY_SCROLL_END = nk_keys.NK_KEY_SCROLL_END,
1778     NK_KEY_SCROLL_DOWN = nk_keys.NK_KEY_SCROLL_DOWN,
1779     NK_KEY_SCROLL_UP = nk_keys.NK_KEY_SCROLL_UP,
1780     NK_KEY_MAX = nk_keys.NK_KEY_MAX,
1781     NK_BUTTON_LEFT = nk_buttons.NK_BUTTON_LEFT,
1782     NK_BUTTON_MIDDLE = nk_buttons.NK_BUTTON_MIDDLE,
1783     NK_BUTTON_RIGHT = nk_buttons.NK_BUTTON_RIGHT,
1784     NK_BUTTON_DOUBLE = nk_buttons.NK_BUTTON_DOUBLE,
1785     NK_BUTTON_MAX = nk_buttons.NK_BUTTON_MAX,
1786     NK_CONVERT_SUCCESS = nk_convert_result.NK_CONVERT_SUCCESS,
1787     NK_CONVERT_INVALID_PARAM = nk_convert_result.NK_CONVERT_INVALID_PARAM,
1788     NK_CONVERT_COMMAND_BUFFER_FULL = nk_convert_result.NK_CONVERT_COMMAND_BUFFER_FULL,
1789     NK_CONVERT_VERTEX_BUFFER_FULL = nk_convert_result.NK_CONVERT_VERTEX_BUFFER_FULL,
1790     NK_CONVERT_ELEMENT_BUFFER_FULL = nk_convert_result.NK_CONVERT_ELEMENT_BUFFER_FULL,
1791     NK_WINDOW_BORDER = nk_panel_flags.NK_WINDOW_BORDER,
1792     NK_WINDOW_MOVABLE = nk_panel_flags.NK_WINDOW_MOVABLE,
1793     NK_WINDOW_SCALABLE = nk_panel_flags.NK_WINDOW_SCALABLE,
1794     NK_WINDOW_CLOSABLE = nk_panel_flags.NK_WINDOW_CLOSABLE,
1795     NK_WINDOW_MINIMIZABLE = nk_panel_flags.NK_WINDOW_MINIMIZABLE,
1796     NK_WINDOW_NO_SCROLLBAR = nk_panel_flags.NK_WINDOW_NO_SCROLLBAR,
1797     NK_WINDOW_TITLE = nk_panel_flags.NK_WINDOW_TITLE,
1798     NK_WINDOW_SCROLL_AUTO_HIDE = nk_panel_flags.NK_WINDOW_SCROLL_AUTO_HIDE,
1799     NK_WINDOW_BACKGROUND = nk_panel_flags.NK_WINDOW_BACKGROUND,
1800     NK_WINDOW_SCALE_LEFT = nk_panel_flags.NK_WINDOW_SCALE_LEFT,
1801     NK_WINDOW_NO_INPUT = nk_panel_flags.NK_WINDOW_NO_INPUT,
1802     NK_WIDGET_INVALID = nk_widget_layout_states.NK_WIDGET_INVALID,
1803     NK_WIDGET_VALID = nk_widget_layout_states.NK_WIDGET_VALID,
1804     NK_WIDGET_ROM = nk_widget_layout_states.NK_WIDGET_ROM,
1805     NK_WIDGET_STATE_MODIFIED = nk_widget_states.NK_WIDGET_STATE_MODIFIED,
1806     NK_WIDGET_STATE_INACTIVE = nk_widget_states.NK_WIDGET_STATE_INACTIVE,
1807     NK_WIDGET_STATE_ENTERED = nk_widget_states.NK_WIDGET_STATE_ENTERED,
1808     NK_WIDGET_STATE_HOVER = nk_widget_states.NK_WIDGET_STATE_HOVER,
1809     NK_WIDGET_STATE_ACTIVED = nk_widget_states.NK_WIDGET_STATE_ACTIVED,
1810     NK_WIDGET_STATE_LEFT = nk_widget_states.NK_WIDGET_STATE_LEFT,
1811     NK_WIDGET_STATE_HOVERED = nk_widget_states.NK_WIDGET_STATE_HOVERED,
1812     NK_WIDGET_STATE_ACTIVE = nk_widget_states.NK_WIDGET_STATE_ACTIVE,
1813     NK_TEXT_ALIGN_LEFT = nk_text_align.NK_TEXT_ALIGN_LEFT,
1814     NK_TEXT_ALIGN_CENTERED = nk_text_align.NK_TEXT_ALIGN_CENTERED,
1815     NK_TEXT_ALIGN_RIGHT = nk_text_align.NK_TEXT_ALIGN_RIGHT,
1816     NK_TEXT_ALIGN_TOP = nk_text_align.NK_TEXT_ALIGN_TOP,
1817     NK_TEXT_ALIGN_MIDDLE = nk_text_align.NK_TEXT_ALIGN_MIDDLE,
1818     NK_TEXT_ALIGN_BOTTOM = nk_text_align.NK_TEXT_ALIGN_BOTTOM,
1819     NK_TEXT_LEFT = nk_text_alignment.NK_TEXT_LEFT,
1820     NK_TEXT_CENTERED = nk_text_alignment.NK_TEXT_CENTERED,
1821     NK_TEXT_RIGHT = nk_text_alignment.NK_TEXT_RIGHT,
1822     NK_EDIT_DEFAULT = nk_edit_flags.NK_EDIT_DEFAULT,
1823     NK_EDIT_READ_ONLY = nk_edit_flags.NK_EDIT_READ_ONLY,
1824     NK_EDIT_AUTO_SELECT = nk_edit_flags.NK_EDIT_AUTO_SELECT,
1825     NK_EDIT_SIG_ENTER = nk_edit_flags.NK_EDIT_SIG_ENTER,
1826     NK_EDIT_ALLOW_TAB = nk_edit_flags.NK_EDIT_ALLOW_TAB,
1827     NK_EDIT_NO_CURSOR = nk_edit_flags.NK_EDIT_NO_CURSOR,
1828     NK_EDIT_SELECTABLE = nk_edit_flags.NK_EDIT_SELECTABLE,
1829     NK_EDIT_CLIPBOARD = nk_edit_flags.NK_EDIT_CLIPBOARD,
1830     NK_EDIT_CTRL_ENTER_NEWLINE = nk_edit_flags.NK_EDIT_CTRL_ENTER_NEWLINE,
1831     NK_EDIT_NO_HORIZONTAL_SCROLL = nk_edit_flags.NK_EDIT_NO_HORIZONTAL_SCROLL,
1832     NK_EDIT_ALWAYS_INSERT_MODE = nk_edit_flags.NK_EDIT_ALWAYS_INSERT_MODE,
1833     NK_EDIT_MULTILINE = nk_edit_flags.NK_EDIT_MULTILINE,
1834     NK_EDIT_GOTO_END_ON_ACTIVATE = nk_edit_flags.NK_EDIT_GOTO_END_ON_ACTIVATE,
1835     NK_EDIT_SIMPLE = nk_edit_types.NK_EDIT_SIMPLE,
1836     NK_EDIT_FIELD = nk_edit_types.NK_EDIT_FIELD,
1837     NK_EDIT_BOX = nk_edit_types.NK_EDIT_BOX,
1838     NK_EDIT_EDITOR = nk_edit_types.NK_EDIT_EDITOR,
1839     NK_EDIT_ACTIVE = nk_edit_events.NK_EDIT_ACTIVE,
1840     NK_EDIT_INACTIVE = nk_edit_events.NK_EDIT_INACTIVE,
1841     NK_EDIT_ACTIVATED = nk_edit_events.NK_EDIT_ACTIVATED,
1842     NK_EDIT_DEACTIVATED = nk_edit_events.NK_EDIT_DEACTIVATED,
1843     NK_EDIT_COMMITED = nk_edit_events.NK_EDIT_COMMITED,
1844     NK_COLOR_TEXT = nk_style_colors.NK_COLOR_TEXT,
1845     NK_COLOR_WINDOW = nk_style_colors.NK_COLOR_WINDOW,
1846     NK_COLOR_HEADER = nk_style_colors.NK_COLOR_HEADER,
1847     NK_COLOR_BORDER = nk_style_colors.NK_COLOR_BORDER,
1848     NK_COLOR_BUTTON = nk_style_colors.NK_COLOR_BUTTON,
1849     NK_COLOR_BUTTON_HOVER = nk_style_colors.NK_COLOR_BUTTON_HOVER,
1850     NK_COLOR_BUTTON_ACTIVE = nk_style_colors.NK_COLOR_BUTTON_ACTIVE,
1851     NK_COLOR_TOGGLE = nk_style_colors.NK_COLOR_TOGGLE,
1852     NK_COLOR_TOGGLE_HOVER = nk_style_colors.NK_COLOR_TOGGLE_HOVER,
1853     NK_COLOR_TOGGLE_CURSOR = nk_style_colors.NK_COLOR_TOGGLE_CURSOR,
1854     NK_COLOR_SELECT = nk_style_colors.NK_COLOR_SELECT,
1855     NK_COLOR_SELECT_ACTIVE = nk_style_colors.NK_COLOR_SELECT_ACTIVE,
1856     NK_COLOR_SLIDER = nk_style_colors.NK_COLOR_SLIDER,
1857     NK_COLOR_SLIDER_CURSOR = nk_style_colors.NK_COLOR_SLIDER_CURSOR,
1858     NK_COLOR_SLIDER_CURSOR_HOVER = nk_style_colors.NK_COLOR_SLIDER_CURSOR_HOVER,
1859     NK_COLOR_SLIDER_CURSOR_ACTIVE = nk_style_colors.NK_COLOR_SLIDER_CURSOR_ACTIVE,
1860     NK_COLOR_PROPERTY = nk_style_colors.NK_COLOR_PROPERTY,
1861     NK_COLOR_EDIT = nk_style_colors.NK_COLOR_EDIT,
1862     NK_COLOR_EDIT_CURSOR = nk_style_colors.NK_COLOR_EDIT_CURSOR,
1863     NK_COLOR_COMBO = nk_style_colors.NK_COLOR_COMBO,
1864     NK_COLOR_CHART = nk_style_colors.NK_COLOR_CHART,
1865     NK_COLOR_CHART_COLOR = nk_style_colors.NK_COLOR_CHART_COLOR,
1866     NK_COLOR_CHART_COLOR_HIGHLIGHT = nk_style_colors.NK_COLOR_CHART_COLOR_HIGHLIGHT,
1867     NK_COLOR_SCROLLBAR = nk_style_colors.NK_COLOR_SCROLLBAR,
1868     NK_COLOR_SCROLLBAR_CURSOR = nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR,
1869     NK_COLOR_SCROLLBAR_CURSOR_HOVER = nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR_HOVER,
1870     NK_COLOR_SCROLLBAR_CURSOR_ACTIVE = nk_style_colors.NK_COLOR_SCROLLBAR_CURSOR_ACTIVE,
1871     NK_COLOR_TAB_HEADER = nk_style_colors.NK_COLOR_TAB_HEADER,
1872     NK_COLOR_COUNT = nk_style_colors.NK_COLOR_COUNT,
1873     NK_CURSOR_ARROW = nk_style_cursor.NK_CURSOR_ARROW,
1874     NK_CURSOR_TEXT = nk_style_cursor.NK_CURSOR_TEXT,
1875     NK_CURSOR_MOVE = nk_style_cursor.NK_CURSOR_MOVE,
1876     NK_CURSOR_RESIZE_VERTICAL = nk_style_cursor.NK_CURSOR_RESIZE_VERTICAL,
1877     NK_CURSOR_RESIZE_HORIZONTAL = nk_style_cursor.NK_CURSOR_RESIZE_HORIZONTAL,
1878     NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT = nk_style_cursor.NK_CURSOR_RESIZE_TOP_LEFT_DOWN_RIGHT,
1879     NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT = nk_style_cursor.NK_CURSOR_RESIZE_TOP_RIGHT_DOWN_LEFT,
1880     NK_CURSOR_COUNT = nk_style_cursor.NK_CURSOR_COUNT,
1881     NK_BUFFER_FIXED = nk_allocation_type.NK_BUFFER_FIXED,
1882     NK_BUFFER_DYNAMIC = nk_allocation_type.NK_BUFFER_DYNAMIC,
1883     NK_BUFFER_FRONT = nk_buffer_allocation_type.NK_BUFFER_FRONT,
1884     NK_BUFFER_BACK = nk_buffer_allocation_type.NK_BUFFER_BACK,
1885     NK_BUFFER_MAX = nk_buffer_allocation_type.NK_BUFFER_MAX,
1886     NK_TEXT_EDIT_SINGLE_LINE = nk_text_edit_type.NK_TEXT_EDIT_SINGLE_LINE,
1887     NK_TEXT_EDIT_MULTI_LINE = nk_text_edit_type.NK_TEXT_EDIT_MULTI_LINE,
1888     NK_TEXT_EDIT_MODE_VIEW = nk_text_edit_mode.NK_TEXT_EDIT_MODE_VIEW,
1889     NK_TEXT_EDIT_MODE_INSERT = nk_text_edit_mode.NK_TEXT_EDIT_MODE_INSERT,
1890     NK_TEXT_EDIT_MODE_REPLACE = nk_text_edit_mode.NK_TEXT_EDIT_MODE_REPLACE,
1891     NK_COMMAND_NOP = nk_command_type.NK_COMMAND_NOP,
1892     NK_COMMAND_SCISSOR = nk_command_type.NK_COMMAND_SCISSOR,
1893     NK_COMMAND_LINE = nk_command_type.NK_COMMAND_LINE,
1894     NK_COMMAND_CURVE = nk_command_type.NK_COMMAND_CURVE,
1895     NK_COMMAND_RECT = nk_command_type.NK_COMMAND_RECT,
1896     NK_COMMAND_RECT_FILLED = nk_command_type.NK_COMMAND_RECT_FILLED,
1897     NK_COMMAND_RECT_MULTI_COLOR = nk_command_type.NK_COMMAND_RECT_MULTI_COLOR,
1898     NK_COMMAND_CIRCLE = nk_command_type.NK_COMMAND_CIRCLE,
1899     NK_COMMAND_CIRCLE_FILLED = nk_command_type.NK_COMMAND_CIRCLE_FILLED,
1900     NK_COMMAND_ARC = nk_command_type.NK_COMMAND_ARC,
1901     NK_COMMAND_ARC_FILLED = nk_command_type.NK_COMMAND_ARC_FILLED,
1902     NK_COMMAND_TRIANGLE = nk_command_type.NK_COMMAND_TRIANGLE,
1903     NK_COMMAND_TRIANGLE_FILLED = nk_command_type.NK_COMMAND_TRIANGLE_FILLED,
1904     NK_COMMAND_POLYGON = nk_command_type.NK_COMMAND_POLYGON,
1905     NK_COMMAND_POLYGON_FILLED = nk_command_type.NK_COMMAND_POLYGON_FILLED,
1906     NK_COMMAND_POLYLINE = nk_command_type.NK_COMMAND_POLYLINE,
1907     NK_COMMAND_TEXT = nk_command_type.NK_COMMAND_TEXT,
1908     NK_COMMAND_IMAGE = nk_command_type.NK_COMMAND_IMAGE,
1909     NK_COMMAND_CUSTOM = nk_command_type.NK_COMMAND_CUSTOM,
1910     NK_CLIPPING_OFF = nk_command_clipping.NK_CLIPPING_OFF,
1911     NK_CLIPPING_ON = nk_command_clipping.NK_CLIPPING_ON,
1912     NK_STYLE_ITEM_COLOR = nk_style_item_type.NK_STYLE_ITEM_COLOR,
1913     NK_STYLE_ITEM_IMAGE = nk_style_item_type.NK_STYLE_ITEM_IMAGE,
1914     NK_HEADER_LEFT = nk_style_header_align.NK_HEADER_LEFT,
1915     NK_HEADER_RIGHT = nk_style_header_align.NK_HEADER_RIGHT,
1916     NK_PANEL_NONE = nk_panel_type.NK_PANEL_NONE,
1917     NK_PANEL_WINDOW = nk_panel_type.NK_PANEL_WINDOW,
1918     NK_PANEL_GROUP = nk_panel_type.NK_PANEL_GROUP,
1919     NK_PANEL_POPUP = nk_panel_type.NK_PANEL_POPUP,
1920     NK_PANEL_CONTEXTUAL = nk_panel_type.NK_PANEL_CONTEXTUAL,
1921     NK_PANEL_COMBO = nk_panel_type.NK_PANEL_COMBO,
1922     NK_PANEL_MENU = nk_panel_type.NK_PANEL_MENU,
1923     NK_PANEL_TOOLTIP = nk_panel_type.NK_PANEL_TOOLTIP,
1924     NK_PANEL_SET_NONBLOCK = nk_panel_set.NK_PANEL_SET_NONBLOCK,
1925     NK_PANEL_SET_POPUP = nk_panel_set.NK_PANEL_SET_POPUP,
1926     NK_PANEL_SET_SUB = nk_panel_set.NK_PANEL_SET_SUB,
1927     NK_LAYOUT_DYNAMIC_FIXED = nk_panel_row_layout_type.NK_LAYOUT_DYNAMIC_FIXED,
1928     NK_LAYOUT_DYNAMIC_ROW = nk_panel_row_layout_type.NK_LAYOUT_DYNAMIC_ROW,
1929     NK_LAYOUT_DYNAMIC_FREE = nk_panel_row_layout_type.NK_LAYOUT_DYNAMIC_FREE,
1930     NK_LAYOUT_DYNAMIC = nk_panel_row_layout_type.NK_LAYOUT_DYNAMIC,
1931     NK_LAYOUT_STATIC_FIXED = nk_panel_row_layout_type.NK_LAYOUT_STATIC_FIXED,
1932     NK_LAYOUT_STATIC_ROW = nk_panel_row_layout_type.NK_LAYOUT_STATIC_ROW,
1933     NK_LAYOUT_STATIC_FREE = nk_panel_row_layout_type.NK_LAYOUT_STATIC_FREE,
1934     NK_LAYOUT_STATIC = nk_panel_row_layout_type.NK_LAYOUT_STATIC,
1935     NK_LAYOUT_TEMPLATE = nk_panel_row_layout_type.NK_LAYOUT_TEMPLATE,
1936     NK_LAYOUT_COUNT = nk_panel_row_layout_type.NK_LAYOUT_COUNT,
1937     NK_WINDOW_PRIVATE = nk_window_flags.NK_WINDOW_PRIVATE,
1938     NK_WINDOW_DYNAMIC = nk_window_flags.NK_WINDOW_DYNAMIC,
1939     NK_WINDOW_ROM = nk_window_flags.NK_WINDOW_ROM,
1940     NK_WINDOW_NOT_INTERACTIVE = nk_window_flags.NK_WINDOW_NOT_INTERACTIVE,
1941     NK_WINDOW_HIDDEN = nk_window_flags.NK_WINDOW_HIDDEN,
1942     NK_WINDOW_CLOSED = nk_window_flags.NK_WINDOW_CLOSED,
1943     NK_WINDOW_MINIMIZED = nk_window_flags.NK_WINDOW_MINIMIZED,
1944     NK_WINDOW_REMOVE_ROM = nk_window_flags.NK_WINDOW_REMOVE_ROM
1945 }
1946 
1947 version(NK_INCLUDE_FONT_BAKING)
1948 {
1949     enum NK_COORD_UV = nk_font_coord_type.NK_COORD_UV;
1950     enum NK_COORD_PIXEL = nk_font_coord_type.NK_COORD_PIXEL;
1951     enum NK_FONT_ATLAS_ALPHA8 = nk_font_atlas_format.NK_FONT_ATLAS_ALPHA8;
1952     enum NK_FONT_ATLAS_RGBA32 = nk_font_atlas_format.NK_FONT_ATLAS_RGBA32;
1953 }
1954 
1955 version(NK_INCLUDE_VERTEX_BUFFER_OUTPUT)
1956 {
1957     enum NK_STROKE_OPEN = nk_draw_list_stroke.NK_STROKE_OPEN;
1958     enum NK_STROKE_CLOSED = nk_draw_list_stroke.NK_STROKE_CLOSED;
1959     enum NK_VERTEX_POSITION = nk_draw_vertex_layout_attribute.NK_VERTEX_POSITION;
1960     enum NK_VERTEX_COLOR = nk_draw_vertex_layout_attribute.NK_VERTEX_COLOR;
1961     enum NK_VERTEX_TEXCOORD = nk_draw_vertex_layout_attribute.NK_VERTEX_TEXCOORD;
1962     enum NK_VERTEX_ATTRIBUTE_COUNT = nk_draw_vertex_layout_attribute.NK_VERTEX_ATTRIBUTE_COUNT;
1963     enum NK_FORMAT_SCHAR = nk_draw_vertex_layout_format.NK_FORMAT_SCHAR;
1964     enum NK_FORMAT_SSHORT = nk_draw_vertex_layout_format.NK_FORMAT_SSHORT;
1965     enum NK_FORMAT_SINT = nk_draw_vertex_layout_format.NK_FORMAT_SINT;
1966     enum NK_FORMAT_UCHAR = nk_draw_vertex_layout_format.NK_FORMAT_UCHAR;
1967     enum NK_FORMAT_USHORT = nk_draw_vertex_layout_format.NK_FORMAT_USHORT;
1968     enum NK_FORMAT_UINT = nk_draw_vertex_layout_format.NK_FORMAT_UINT;
1969     enum NK_FORMAT_FLOAT = nk_draw_vertex_layout_format.NK_FORMAT_FLOAT;
1970     enum NK_FORMAT_DOUBLE = nk_draw_vertex_layout_format.NK_FORMAT_DOUBLE;
1971     enum NK_FORMAT_COLOR_BEGIN = nk_draw_vertex_layout_format.NK_FORMAT_COLOR_BEGIN;
1972     enum NK_FORMAT_R8G8B8 = nk_draw_vertex_layout_format.NK_FORMAT_R8G8B8;
1973     enum NK_FORMAT_R16G15B16 = nk_draw_vertex_layout_format.NK_FORMAT_R16G15B16;
1974     enum NK_FORMAT_R32G32B32 = nk_draw_vertex_layout_format.NK_FORMAT_R32G32B32;
1975     enum NK_FORMAT_R8G8B8A8 = nk_draw_vertex_layout_format.NK_FORMAT_R8G8B8A8;
1976     enum NK_FORMAT_B8G8R8A8 = nk_draw_vertex_layout_format.NK_FORMAT_B8G8R8A8;
1977     enum NK_FORMAT_R16G15B16A16 = nk_draw_vertex_layout_format.NK_FORMAT_R16G15B16A16;
1978     enum NK_FORMAT_R32G32B32A32 = nk_draw_vertex_layout_format.NK_FORMAT_R32G32B32A32;
1979     enum NK_FORMAT_R32G32B32A32_FLOAT = nk_draw_vertex_layout_format.NK_FORMAT_R32G32B32A32_FLOAT;
1980     enum NK_FORMAT_R32G32B32A32_DOUBLE = nk_draw_vertex_layout_format.NK_FORMAT_R32G32B32A32_DOUBLE;
1981     enum NK_FORMAT_RGB32 = nk_draw_vertex_layout_format.NK_FORMAT_RGB32;
1982     enum NK_FORMAT_RGBA32 = nk_draw_vertex_layout_format.NK_FORMAT_RGBA32;
1983     enum NK_FORMAT_COLOR_END = nk_draw_vertex_layout_format.NK_FORMAT_COLOR_END;
1984     enum NK_FORMAT_COUNT = nk_draw_vertex_layout_format.NK_FORMAT_COUNT;
1985 }