nuklear 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +29 -0
- data/LICENSE.txt +21 -0
- data/README.md +196 -0
- data/Rakefile +26 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/arial.ttf +0 -0
- data/examples/calculator.rb +102 -0
- data/examples/hello_nuklear.rb +182 -0
- data/examples/lib/opengl_font.rb +32 -0
- data/examples/lib/opengl_init.rb +4 -0
- data/examples/lib/sdl2_init.rb +6 -0
- data/examples/lib/sdl2_input.rb +81 -0
- data/examples/lib/window.rb +47 -0
- data/ext/freetype/extconf.rb +26 -0
- data/ext/nuklear/extconf.rb +14 -0
- data/ext/nuklear/nkrb.c +79 -0
- data/ext/nuklear/nkrb.h +89 -0
- data/ext/nuklear/nkrb_buffer.c +80 -0
- data/ext/nuklear/nkrb_context.c +241 -0
- data/ext/nuklear/nkrb_font.c +80 -0
- data/ext/nuklear/nkrb_renderer.c +114 -0
- data/ext/nuklear/nkrb_style.c +61 -0
- data/ext/nuklear/nkrb_style_color.c +126 -0
- data/ext/nuklear/nkrb_style_image.c +32 -0
- data/ext/nuklear/nkrb_ui.c +32 -0
- data/ext/nuklear/nkrb_ui_builder.c +29 -0
- data/ext/nuklear/nkrb_ui_button.c +55 -0
- data/ext/nuklear/nkrb_ui_color_picker.c +20 -0
- data/ext/nuklear/nkrb_ui_combo.c +73 -0
- data/ext/nuklear/nkrb_ui_container.c +7 -0
- data/ext/nuklear/nkrb_ui_edit_string.c +38 -0
- data/ext/nuklear/nkrb_ui_group.c +27 -0
- data/ext/nuklear/nkrb_ui_label.c +30 -0
- data/ext/nuklear/nkrb_ui_layout.c +125 -0
- data/ext/nuklear/nkrb_ui_menu.c +49 -0
- data/ext/nuklear/nkrb_ui_menu_item.c +30 -0
- data/ext/nuklear/nkrb_ui_menubar.c +18 -0
- data/ext/nuklear/nkrb_ui_popup.c +24 -0
- data/ext/nuklear/nkrb_ui_progress.c +19 -0
- data/ext/nuklear/nkrb_ui_property.c +20 -0
- data/ext/nuklear/nkrb_ui_selectables.c +53 -0
- data/ext/nuklear/nkrb_ui_slider.c +19 -0
- data/ext/nuklear/nkrb_ui_tree.c +29 -0
- data/ext/nuklear/nkrb_ui_widget.c +7 -0
- data/ext/nuklear/nkrb_ui_window.c +43 -0
- data/ext/nuklear/nuklear.h +23378 -0
- data/ext/nuklear_renderer_opengl2/KHR/khrplatform.h +285 -0
- data/ext/nuklear_renderer_opengl2/extconf.rb +13 -0
- data/ext/nuklear_renderer_opengl2/glad.c +1432 -0
- data/ext/nuklear_renderer_opengl2/glad.h +2747 -0
- data/ext/nuklear_renderer_opengl2/nuklear_renderer_opengl2.c +197 -0
- data/ext/nuklear_renderer_opengl4/KHR/khrplatform.h +285 -0
- data/ext/nuklear_renderer_opengl4/extconf.rb +13 -0
- data/ext/nuklear_renderer_opengl4/glad.c +1782 -0
- data/ext/nuklear_renderer_opengl4/glad.h +3687 -0
- data/ext/nuklear_renderer_opengl4/nuklear_renderer_opengl4.c +255 -0
- data/lib/nuklear/context.rb +49 -0
- data/lib/nuklear/dsl.rb +46 -0
- data/lib/nuklear/event_buffer.rb +23 -0
- data/lib/nuklear/renderer/opengl24.rb +13 -0
- data/lib/nuklear/renderer.rb +108 -0
- data/lib/nuklear/style/color.rb +24 -0
- data/lib/nuklear/style/image.rb +9 -0
- data/lib/nuklear/style.rb +8 -0
- data/lib/nuklear/test_case.rb +30 -0
- data/lib/nuklear/ui/base.rb +34 -0
- data/lib/nuklear/ui/button.rb +77 -0
- data/lib/nuklear/ui/checkbox.rb +39 -0
- data/lib/nuklear/ui/col.rb +21 -0
- data/lib/nuklear/ui/color_picker.rb +31 -0
- data/lib/nuklear/ui/combo_box.rb +42 -0
- data/lib/nuklear/ui/container.rb +80 -0
- data/lib/nuklear/ui/edit_string.rb +48 -0
- data/lib/nuklear/ui/enableable.rb +29 -0
- data/lib/nuklear/ui/events.rb +23 -0
- data/lib/nuklear/ui/group.rb +31 -0
- data/lib/nuklear/ui/label.rb +21 -0
- data/lib/nuklear/ui/menu.rb +43 -0
- data/lib/nuklear/ui/menu_bar.rb +19 -0
- data/lib/nuklear/ui/menu_item.rb +34 -0
- data/lib/nuklear/ui/option.rb +17 -0
- data/lib/nuklear/ui/option_group.rb +22 -0
- data/lib/nuklear/ui/popup.rb +37 -0
- data/lib/nuklear/ui/progress.rb +33 -0
- data/lib/nuklear/ui/property.rb +28 -0
- data/lib/nuklear/ui/row.rb +28 -0
- data/lib/nuklear/ui/select_list.rb +31 -0
- data/lib/nuklear/ui/selectable.rb +21 -0
- data/lib/nuklear/ui/slider.rb +26 -0
- data/lib/nuklear/ui/text_align.rb +14 -0
- data/lib/nuklear/ui/tree.rb +62 -0
- data/lib/nuklear/ui/window.rb +175 -0
- data/lib/nuklear/ui.rb +33 -0
- data/lib/nuklear/version.rb +3 -0
- data/lib/nuklear.rb +26 -0
- data/nuklear.gemspec +41 -0
- metadata +233 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
typedef struct {
|
4
|
+
struct { int width, height; const void *data; } img;
|
5
|
+
struct nk_font_atlas atlas;
|
6
|
+
struct nk_font *font;
|
7
|
+
struct nk_draw_null_texture null;
|
8
|
+
} NkRbFont;
|
9
|
+
|
10
|
+
#define VALUE_TO_NK(value, varname) \
|
11
|
+
NkRbFont *varname = NULL; \
|
12
|
+
Data_Get_Struct(value, NkRbFont, varname);
|
13
|
+
|
14
|
+
VALUE cNuklearFont = Qnil;
|
15
|
+
VALUE cNuklearNullTexture = Qnil;
|
16
|
+
|
17
|
+
struct nk_user_font *nkrb_font_to_nk(VALUE value) {
|
18
|
+
VALUE_TO_NK(value, nk);
|
19
|
+
return &(nk->font->handle);
|
20
|
+
}
|
21
|
+
|
22
|
+
void nkrb_null_texture_free(struct nk_draw_null_texture *tex) {
|
23
|
+
free(tex);
|
24
|
+
}
|
25
|
+
|
26
|
+
VALUE nkrb_font_get_null(VALUE value) {
|
27
|
+
VALUE_TO_NK(value, nk);
|
28
|
+
struct nk_draw_null_texture *tex = malloc(sizeof(struct nk_draw_null_texture));
|
29
|
+
memcpy(tex, &(nk->null), sizeof(struct nk_draw_null_texture));
|
30
|
+
return Data_Wrap_Struct(cNuklearNullTexture, NULL, nkrb_null_texture_free, tex);
|
31
|
+
}
|
32
|
+
|
33
|
+
void nkrb_font_free(NkRbFont *font) {
|
34
|
+
nk_font_atlas_clear(&(font->atlas));
|
35
|
+
}
|
36
|
+
|
37
|
+
VALUE nkrb_font_width(VALUE self, VALUE rtext) {
|
38
|
+
const char *text = StringValueCStr(rtext);
|
39
|
+
struct nk_user_font *handle = nkrb_font_to_nk(self);
|
40
|
+
float width = handle->width(handle->userdata, handle->height, text, (int) strlen(text));
|
41
|
+
return DBL2NUM(width);
|
42
|
+
}
|
43
|
+
|
44
|
+
VALUE nkrb_font_height(VALUE self) {
|
45
|
+
struct nk_user_font *handle = nkrb_font_to_nk(self);
|
46
|
+
return DBL2NUM(handle->height);
|
47
|
+
}
|
48
|
+
|
49
|
+
VALUE nkrb_font_new(int argc, VALUE *argv, VALUE self) {
|
50
|
+
if (argc < 2 || argc > 3)
|
51
|
+
rb_raise(rb_eArgError, "Invalid number of arguments (%d for 2 or 3): pass path, size, and an optional arguments hash", argc);
|
52
|
+
VALUE path = argv[0];
|
53
|
+
VALUE size = argv[1];
|
54
|
+
struct nk_font_config config;
|
55
|
+
config = nk_font_config((float) NUM2DBL(size));
|
56
|
+
if (argc == 3) {
|
57
|
+
// TODO support extra font config options
|
58
|
+
}
|
59
|
+
|
60
|
+
NkRbFont *font = malloc(sizeof(NkRbFont));
|
61
|
+
memset(font, 0, sizeof(NkRbFont));
|
62
|
+
nk_font_atlas_init_default(&(font->atlas));
|
63
|
+
nk_font_atlas_begin(&(font->atlas));
|
64
|
+
font->font = nk_font_atlas_add_from_file(&(font->atlas), StringValueCStr(path), (float) NUM2DBL(size), NULL);
|
65
|
+
if (font->font == NULL)
|
66
|
+
rb_raise(rb_eStandardError, "Failed to load font file %s", StringValueCStr(path));
|
67
|
+
font->img.data = nk_font_atlas_bake(&(font->atlas), &(font->img.width), &(font->img.height), NK_FONT_ATLAS_RGBA32);
|
68
|
+
VALUE bytes = rb_str_new((char *) font->img.data, font->img.width * font->img.height * 4);
|
69
|
+
VALUE tex = rb_yield_values(3, INT2FIX(font->img.width), INT2FIX(font->img.height), bytes);
|
70
|
+
nk_font_atlas_end(&(font->atlas), nk_handle_ptr((void *) NUM2ULL(tex)), &(font->null));
|
71
|
+
return Data_Wrap_Struct(cNuklearFont, NULL, nkrb_font_free, font);
|
72
|
+
}
|
73
|
+
|
74
|
+
void nkrb_font_init(void) {
|
75
|
+
cNuklearFont = rb_define_class_under(mNuklear, "Font", rb_cObject);
|
76
|
+
cNuklearNullTexture = rb_define_class_under(mNuklear, "NullTexture", rb_cObject);
|
77
|
+
rb_define_module_function(cNuklearFont, "new", nkrb_font_new, -1);
|
78
|
+
rb_define_method(cNuklearFont, "width", nkrb_font_width, 1);
|
79
|
+
rb_define_method(cNuklearFont, "height", nkrb_font_height, 0);
|
80
|
+
}
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
static enum nk_draw_vertex_layout_attribute rb2nk_attribute(VALUE v) {
|
4
|
+
ID id = SYM2ID(v);
|
5
|
+
if (id == rb_intern("position")) return NK_VERTEX_POSITION;
|
6
|
+
else if (id == rb_intern("color")) return NK_VERTEX_COLOR;
|
7
|
+
else if (id == rb_intern("texcoord")) return NK_VERTEX_TEXCOORD;
|
8
|
+
else if (id == rb_intern("attribute_count")) return NK_VERTEX_ATTRIBUTE_COUNT;
|
9
|
+
else rb_raise(rb_eArgError, "Invalid vertex layout attribute name");
|
10
|
+
}
|
11
|
+
|
12
|
+
static enum nk_draw_vertex_layout_format rb2nk_format(VALUE v) {
|
13
|
+
ID id = SYM2ID(v);
|
14
|
+
if (id == rb_intern("schar")) return NK_FORMAT_SCHAR;
|
15
|
+
else if (id == rb_intern("sshort")) return NK_FORMAT_SSHORT;
|
16
|
+
else if (id == rb_intern("sint")) return NK_FORMAT_SINT;
|
17
|
+
else if (id == rb_intern("uchar")) return NK_FORMAT_UCHAR;
|
18
|
+
else if (id == rb_intern("ushort")) return NK_FORMAT_USHORT;
|
19
|
+
else if (id == rb_intern("uint")) return NK_FORMAT_UINT;
|
20
|
+
else if (id == rb_intern("float")) return NK_FORMAT_FLOAT;
|
21
|
+
else if (id == rb_intern("double")) return NK_FORMAT_DOUBLE;
|
22
|
+
else if (id == rb_intern("r8g8b8")) return NK_FORMAT_R8G8B8;
|
23
|
+
else if (id == rb_intern("r16g15b16")) return NK_FORMAT_R16G15B16;
|
24
|
+
else if (id == rb_intern("r32g32b32")) return NK_FORMAT_R32G32B32;
|
25
|
+
else if (id == rb_intern("r8g8b8a8")) return NK_FORMAT_R8G8B8A8;
|
26
|
+
else if (id == rb_intern("b8g8r8a8")) return NK_FORMAT_B8G8R8A8;
|
27
|
+
else if (id == rb_intern("r16g15b16a16")) return NK_FORMAT_R16G15B16A16;
|
28
|
+
else if (id == rb_intern("r32g32b32a32")) return NK_FORMAT_R32G32B32A32;
|
29
|
+
else if (id == rb_intern("r32g32b32a32_float")) return NK_FORMAT_R32G32B32A32_FLOAT;
|
30
|
+
else if (id == rb_intern("r32g32b32a32_double")) return NK_FORMAT_R32G32B32A32_DOUBLE;
|
31
|
+
else if (id == rb_intern("rgb32")) return NK_FORMAT_RGB32;
|
32
|
+
else if (id == rb_intern("rgba32")) return NK_FORMAT_RGBA32;
|
33
|
+
else rb_raise(rb_eArgError, "Invalid vertex layout format name");
|
34
|
+
}
|
35
|
+
|
36
|
+
VALUE nkrb_renderer_convert(VALUE self) {
|
37
|
+
struct nk_context *context = NULL;
|
38
|
+
struct nk_buffer *commands = NULL;
|
39
|
+
struct nk_buffer *vertices = NULL;
|
40
|
+
struct nk_buffer *indices = NULL;
|
41
|
+
Data_Get_Struct(rb_funcall(self, rb_intern("context"), 0), struct nk_context, context);
|
42
|
+
Data_Get_Struct(rb_funcall(self, rb_intern("commands"), 0), struct nk_buffer, commands);
|
43
|
+
Data_Get_Struct(rb_funcall(self, rb_intern("vertices"), 0), struct nk_buffer, vertices);
|
44
|
+
Data_Get_Struct(rb_funcall(self, rb_intern("vertex_indices"), 0), struct nk_buffer, indices);
|
45
|
+
VALUE rconfig = rb_funcall(self, rb_intern("convert_config"), 0);
|
46
|
+
VALUE rvertex_layout = rb_hash_aref(rconfig, ID2SYM(rb_intern("vertex_layout")));
|
47
|
+
struct nk_convert_config config;
|
48
|
+
struct nk_draw_vertex_layout_element *vertex_layout = alloca((RARRAY_LEN(rvertex_layout) + 1) * sizeof(struct nk_draw_vertex_layout_element));
|
49
|
+
for (int i = 0; i < RARRAY_LEN(rvertex_layout); i++) {
|
50
|
+
VALUE rlayout = RARRAY_AREF(rvertex_layout, i);
|
51
|
+
vertex_layout[i].attribute = rb2nk_attribute(RARRAY_AREF(rlayout, 0));
|
52
|
+
vertex_layout[i].format = rb2nk_format(RARRAY_AREF(rlayout, 1));
|
53
|
+
vertex_layout[i].offset = FIX2INT(RARRAY_AREF(rlayout, 2));
|
54
|
+
}
|
55
|
+
vertex_layout[RARRAY_LEN(rvertex_layout)].attribute = NK_VERTEX_LAYOUT_END;
|
56
|
+
memset(&config, 0, sizeof(config));
|
57
|
+
config.vertex_layout = vertex_layout;
|
58
|
+
config.vertex_size = FIX2INT(rb_hash_aref(rconfig, ID2SYM(rb_intern("vertex_size"))));
|
59
|
+
config.vertex_alignment = FIX2INT(rb_hash_aref(rconfig, ID2SYM(rb_intern("vertex_alignment"))));
|
60
|
+
config.null.texture = (nk_handle) (void *) NUM2ULL(rb_hash_aref(rconfig, ID2SYM(rb_intern("null"))));
|
61
|
+
config.circle_segment_count = NUM2UINT(rb_hash_aref(rconfig, ID2SYM(rb_intern("circle_segment_count"))));
|
62
|
+
config.curve_segment_count = NUM2UINT(rb_hash_aref(rconfig, ID2SYM(rb_intern("curve_segment_count"))));
|
63
|
+
config.arc_segment_count = NUM2UINT(rb_hash_aref(rconfig, ID2SYM(rb_intern("arc_segment_count"))));
|
64
|
+
config.global_alpha = (float) NUM2DBL(rb_hash_aref(rconfig, ID2SYM(rb_intern("global_alpha"))));
|
65
|
+
config.shape_AA = RTEST(rb_hash_aref(rconfig, ID2SYM(rb_intern("shape_aa")))) ? NK_ANTI_ALIASING_ON : NK_ANTI_ALIASING_OFF;
|
66
|
+
config.line_AA = RTEST(rb_hash_aref(rconfig, ID2SYM(rb_intern("line_aa")))) ? NK_ANTI_ALIASING_ON : NK_ANTI_ALIASING_OFF;
|
67
|
+
// all that for this
|
68
|
+
nk_flags result = nk_convert(context, commands, vertices, indices, &config);
|
69
|
+
switch(result) {
|
70
|
+
case NK_CONVERT_SUCCESS: break; // OK
|
71
|
+
case NK_CONVERT_INVALID_PARAM: rb_raise(rb_eRuntimeError, "Nuklear error: INVALID_PARAM");
|
72
|
+
case NK_CONVERT_COMMAND_BUFFER_FULL: rb_raise(rb_eRuntimeError, "Nuklear error: COMMAND_BUFFER_FULL");
|
73
|
+
case NK_CONVERT_VERTEX_BUFFER_FULL: rb_raise(rb_eRuntimeError, "Nuklear error: VERTEX_BUFFER_FULL");
|
74
|
+
case NK_CONVERT_ELEMENT_BUFFER_FULL: rb_raise(rb_eRuntimeError, "Nuklear error: ELEMENT_BUFFER_FULL");
|
75
|
+
default: rb_raise(rb_eRuntimeError, "Nuklear error: %d (unknown)", result);
|
76
|
+
}
|
77
|
+
return self;
|
78
|
+
}
|
79
|
+
|
80
|
+
VALUE nkrb_renderer_draw_foreach(VALUE self) {
|
81
|
+
struct nk_context *context = NULL;
|
82
|
+
struct nk_buffer *commands = NULL;
|
83
|
+
Data_Get_Struct(rb_funcall(self, rb_intern("context"), 0), struct nk_context, context);
|
84
|
+
Data_Get_Struct(rb_funcall(self, rb_intern("commands"), 0), struct nk_buffer, commands);
|
85
|
+
|
86
|
+
/* convert from command queue into draw list and draw to screen */
|
87
|
+
const struct nk_draw_command *cmd;
|
88
|
+
// const nk_draw_index *offset = NULL;
|
89
|
+
/* iterate over and execute each draw command */
|
90
|
+
int offset = 0;
|
91
|
+
nk_draw_foreach(cmd, context, commands) {
|
92
|
+
if (!cmd->elem_count) continue;
|
93
|
+
VALUE rcmd = rb_hash_new();
|
94
|
+
VALUE rclip_rect = rb_ary_new2(4);
|
95
|
+
rb_ary_store(rclip_rect, 0, DBL2NUM(cmd->clip_rect.x));
|
96
|
+
rb_ary_store(rclip_rect, 1, DBL2NUM(cmd->clip_rect.y));
|
97
|
+
rb_ary_store(rclip_rect, 2, DBL2NUM(cmd->clip_rect.w));
|
98
|
+
rb_ary_store(rclip_rect, 3, DBL2NUM(cmd->clip_rect.h));
|
99
|
+
rb_hash_aset(rcmd, ID2SYM(rb_intern("element_count")), INT2NUM(cmd->elem_count));
|
100
|
+
rb_hash_aset(rcmd, ID2SYM(rb_intern("texture_handle")), ULL2NUM((unsigned long long) cmd->texture.ptr));
|
101
|
+
rb_hash_aset(rcmd, ID2SYM(rb_intern("clip_rect")), rclip_rect);
|
102
|
+
rb_hash_aset(rcmd, ID2SYM(rb_intern("offset")), INT2NUM(offset));
|
103
|
+
rb_yield(rcmd);
|
104
|
+
offset += cmd->elem_count;
|
105
|
+
}
|
106
|
+
|
107
|
+
return self;
|
108
|
+
}
|
109
|
+
|
110
|
+
void nkrb_renderer_init(void) {
|
111
|
+
VALUE cRenderer = rb_define_class_under(mNuklear, "Renderer", rb_cObject);
|
112
|
+
rb_define_method(cRenderer, "nk_convert", nkrb_renderer_convert, 0);
|
113
|
+
rb_define_method(cRenderer, "nk_draw_foreach", nkrb_renderer_draw_foreach, 0);
|
114
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
VALUE mNuklearStyle = Qnil;
|
4
|
+
|
5
|
+
struct nk_style_item *nkrb_style_item(VALUE value) {
|
6
|
+
struct nk_style_item *item;
|
7
|
+
Data_Get_Struct(value, struct nk_style_item, item);
|
8
|
+
return item;
|
9
|
+
}
|
10
|
+
|
11
|
+
void nkrb_style_item_free(struct nk_style_item *item) {
|
12
|
+
free(item);
|
13
|
+
}
|
14
|
+
|
15
|
+
void assign_button_style_from_ruby(struct nk_style_button *style, VALUE rstyle) {
|
16
|
+
if (!NIL_P(rstyle)) {
|
17
|
+
VALUE rnormal = rb_hash_aref(rstyle, ID2SYM(rb_intern("normal")));
|
18
|
+
VALUE rhover = rb_hash_aref(rstyle, ID2SYM(rb_intern("hover")));
|
19
|
+
VALUE ractive = rb_hash_aref(rstyle, ID2SYM(rb_intern("active")));
|
20
|
+
VALUE rborder_color = rb_hash_aref(rstyle, ID2SYM(rb_intern("border_color")));
|
21
|
+
VALUE rtext_background = rb_hash_aref(rstyle, ID2SYM(rb_intern("text_background")));
|
22
|
+
VALUE rtext_normal = rb_hash_aref(rstyle, ID2SYM(rb_intern("text_normal")));
|
23
|
+
VALUE rtext_hover = rb_hash_aref(rstyle, ID2SYM(rb_intern("text_hover")));
|
24
|
+
VALUE rtext_active = rb_hash_aref(rstyle, ID2SYM(rb_intern("text_active")));
|
25
|
+
VALUE rtext_alignment = rb_hash_aref(rstyle, ID2SYM(rb_intern("text_alignment")));
|
26
|
+
VALUE rborder = rb_hash_aref(rstyle, ID2SYM(rb_intern("border")));
|
27
|
+
VALUE rrounding = rb_hash_aref(rstyle, ID2SYM(rb_intern("rounding")));
|
28
|
+
VALUE rpadding = rb_hash_aref(rstyle, ID2SYM(rb_intern("padding")));
|
29
|
+
VALUE rimage_padding = rb_hash_aref(rstyle, ID2SYM(rb_intern("image_padding")));
|
30
|
+
VALUE rtouch_padding = rb_hash_aref(rstyle, ID2SYM(rb_intern("touch_padding")));
|
31
|
+
|
32
|
+
// TODO button style user callbacks
|
33
|
+
// nk_handle userdata;
|
34
|
+
// void(*draw_begin)(struct nk_command_buffer*, nk_handle userdata);
|
35
|
+
// void(*draw_end)(struct nk_command_buffer*, nk_handle userdata);
|
36
|
+
|
37
|
+
if (!NIL_P(rnormal)) style->normal = *nkrb_style_item(rnormal);
|
38
|
+
if (!NIL_P(rhover)) style->hover = *nkrb_style_item(rhover);
|
39
|
+
if (!NIL_P(ractive)) style->active = *nkrb_style_item(ractive);
|
40
|
+
if (!NIL_P(rborder_color)) { ASSIGN_STYLE_AS_COLOR(style->border_color, nkrb_style_item(rborder_color)); }
|
41
|
+
if (!NIL_P(rtext_background)) { ASSIGN_STYLE_AS_COLOR(style->text_background, nkrb_style_item(rtext_background)); }
|
42
|
+
if (!NIL_P(rtext_normal)) { ASSIGN_STYLE_AS_COLOR(style->text_normal, nkrb_style_item(rtext_normal)); }
|
43
|
+
if (!NIL_P(rtext_hover)) { ASSIGN_STYLE_AS_COLOR(style->text_hover, nkrb_style_item(rtext_hover)); }
|
44
|
+
if (!NIL_P(rtext_active)) { ASSIGN_STYLE_AS_COLOR(style->text_active, nkrb_style_item(rtext_active)); }
|
45
|
+
if (!NIL_P(rtext_alignment)) style->text_alignment = FIX2INT(rtext_alignment);
|
46
|
+
if (!NIL_P(rborder)) style->border = (float) RFLOAT_VALUE(rborder);
|
47
|
+
if (!NIL_P(rrounding)) style->rounding = (float) RFLOAT_VALUE(rrounding);
|
48
|
+
if (!NIL_P(rpadding)) style->padding = nk_vec2(RFLOAT_VALUE(rb_ary_entry(rpadding, 0)),
|
49
|
+
RFLOAT_VALUE(rb_ary_entry(rpadding, 1)));
|
50
|
+
if (!NIL_P(rimage_padding)) style->image_padding = nk_vec2(RFLOAT_VALUE(rb_ary_entry(rimage_padding, 0)),
|
51
|
+
RFLOAT_VALUE(rb_ary_entry(rimage_padding, 1)));
|
52
|
+
if (!NIL_P(rtouch_padding)) style->touch_padding = nk_vec2(RFLOAT_VALUE(rb_ary_entry(rtouch_padding, 0)),
|
53
|
+
RFLOAT_VALUE(rb_ary_entry(rtouch_padding, 1)));
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
void nkrb_style_init(void) {
|
58
|
+
mNuklearStyle = rb_define_module_under(mNuklear, "Style");
|
59
|
+
nkrb_style_color_init();
|
60
|
+
nkrb_style_image_init();
|
61
|
+
}
|
@@ -0,0 +1,126 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
#define NK_UNPACK(rvalue, varname) \
|
4
|
+
struct nk_style_item *varname; \
|
5
|
+
Data_Get_Struct(rvalue, struct nk_style_item, varname);
|
6
|
+
|
7
|
+
|
8
|
+
VALUE cNuklearStyleColor = Qnil;
|
9
|
+
|
10
|
+
VALUE nkrb_style_color_alloc(VALUE self) {
|
11
|
+
struct nk_style_item *style = malloc(sizeof(struct nk_style_item));
|
12
|
+
memset(style, 0, sizeof(struct nk_style_item));
|
13
|
+
style->type = NK_STYLE_ITEM_COLOR;
|
14
|
+
return Data_Wrap_Struct(self, NULL, nkrb_style_item_free, style);
|
15
|
+
}
|
16
|
+
|
17
|
+
VALUE nkrb_style_color_set_red(VALUE self, VALUE r) {
|
18
|
+
NK_UNPACK(self, style);
|
19
|
+
style->data.color.r = (nk_byte) (NK_SATURATE((float) NUM2DBL(r)) * 255.0f);
|
20
|
+
return r;
|
21
|
+
}
|
22
|
+
|
23
|
+
VALUE nkrb_style_color_get_red(VALUE self) {
|
24
|
+
NK_UNPACK(self, style);
|
25
|
+
return DBL2NUM(style->data.color.r / 255.0);
|
26
|
+
}
|
27
|
+
|
28
|
+
VALUE nkrb_style_color_set_green(VALUE self, VALUE g) {
|
29
|
+
NK_UNPACK(self, style);
|
30
|
+
style->data.color.g = (nk_byte) (NK_SATURATE((float) NUM2DBL(g)) * 255.0f);
|
31
|
+
return g;
|
32
|
+
}
|
33
|
+
|
34
|
+
VALUE nkrb_style_color_get_green(VALUE self) {
|
35
|
+
NK_UNPACK(self, style);
|
36
|
+
return DBL2NUM(style->data.color.g / 255.0);
|
37
|
+
}
|
38
|
+
|
39
|
+
VALUE nkrb_style_color_set_blue(VALUE self, VALUE b) {
|
40
|
+
NK_UNPACK(self, style);
|
41
|
+
style->data.color.b = (nk_byte) (NK_SATURATE((float) NUM2DBL(b)) * 255.0f);
|
42
|
+
return b;
|
43
|
+
}
|
44
|
+
|
45
|
+
VALUE nkrb_style_color_get_blue(VALUE self) {
|
46
|
+
NK_UNPACK(self, style);
|
47
|
+
return DBL2NUM(style->data.color.b / 255.0);
|
48
|
+
}
|
49
|
+
|
50
|
+
VALUE nkrb_style_color_set_alpha(VALUE self, VALUE a) {
|
51
|
+
NK_UNPACK(self, style);
|
52
|
+
style->data.color.a = (nk_byte) (NK_SATURATE((float) NUM2DBL(a)) * 255.0f);
|
53
|
+
return a;
|
54
|
+
}
|
55
|
+
|
56
|
+
VALUE nkrb_style_color_get_alpha(VALUE self) {
|
57
|
+
NK_UNPACK(self, style);
|
58
|
+
return DBL2NUM(style->data.color.a / 255.0);
|
59
|
+
}
|
60
|
+
|
61
|
+
VALUE nkrb_style_color_set_hue(VALUE self, VALUE a) {
|
62
|
+
NK_UNPACK(self, style);
|
63
|
+
nk_byte tmp[4];
|
64
|
+
nk_color_hsva_bv(tmp, style->data.color);
|
65
|
+
tmp[0] = (nk_byte) (NK_SATURATE((float) NUM2DBL(a)) * 255.0f);
|
66
|
+
style->data.color = nk_hsva_bv(tmp);
|
67
|
+
return a;
|
68
|
+
}
|
69
|
+
|
70
|
+
VALUE nkrb_style_color_get_hue(VALUE self) {
|
71
|
+
NK_UNPACK(self, style);
|
72
|
+
nk_byte tmp[4];
|
73
|
+
nk_color_hsva_bv(tmp, style->data.color);
|
74
|
+
return DBL2NUM(tmp[0] / 255.0);
|
75
|
+
}
|
76
|
+
|
77
|
+
VALUE nkrb_style_color_set_saturation(VALUE self, VALUE a) {
|
78
|
+
NK_UNPACK(self, style);
|
79
|
+
nk_byte tmp[4];
|
80
|
+
nk_color_hsva_bv(tmp, style->data.color);
|
81
|
+
tmp[1] = (nk_byte) (NK_SATURATE((float) NUM2DBL(a)) * 255.0f);
|
82
|
+
style->data.color = nk_hsva_bv(tmp);
|
83
|
+
return a;
|
84
|
+
}
|
85
|
+
|
86
|
+
VALUE nkrb_style_color_get_saturation(VALUE self) {
|
87
|
+
NK_UNPACK(self, style);
|
88
|
+
nk_byte tmp[4];
|
89
|
+
nk_color_hsva_bv(tmp, style->data.color);
|
90
|
+
return DBL2NUM(tmp[1] / 255.0);
|
91
|
+
}
|
92
|
+
|
93
|
+
VALUE nkrb_style_color_set_value(VALUE self, VALUE a) {
|
94
|
+
NK_UNPACK(self, style);
|
95
|
+
nk_byte tmp[4];
|
96
|
+
nk_color_hsva_bv(tmp, style->data.color);
|
97
|
+
tmp[3] = (nk_byte) (NK_SATURATE((float) NUM2DBL(a)) * 255.0f);
|
98
|
+
style->data.color = nk_hsva_bv(tmp);
|
99
|
+
return a;
|
100
|
+
}
|
101
|
+
|
102
|
+
VALUE nkrb_style_color_get_value(VALUE self) {
|
103
|
+
NK_UNPACK(self, style);
|
104
|
+
nk_byte tmp[4];
|
105
|
+
nk_color_hsva_bv(tmp, style->data.color);
|
106
|
+
return DBL2NUM(tmp[3] / 255.0);
|
107
|
+
}
|
108
|
+
|
109
|
+
void nkrb_style_color_init(void) {
|
110
|
+
cNuklearStyleColor = rb_define_class_under(mNuklearStyle, "Color", rb_cObject);
|
111
|
+
rb_define_alloc_func(cNuklearStyleColor, nkrb_style_color_alloc);
|
112
|
+
rb_define_method(cNuklearStyleColor, "red=", nkrb_style_color_set_red, 1);
|
113
|
+
rb_define_method(cNuklearStyleColor, "red", nkrb_style_color_get_red, 0);
|
114
|
+
rb_define_method(cNuklearStyleColor, "green=", nkrb_style_color_set_green, 1);
|
115
|
+
rb_define_method(cNuklearStyleColor, "green", nkrb_style_color_get_green, 0);
|
116
|
+
rb_define_method(cNuklearStyleColor, "blue=", nkrb_style_color_set_blue, 1);
|
117
|
+
rb_define_method(cNuklearStyleColor, "blue", nkrb_style_color_get_blue, 0);
|
118
|
+
rb_define_method(cNuklearStyleColor, "hue=", nkrb_style_color_set_hue, 1);
|
119
|
+
rb_define_method(cNuklearStyleColor, "hue", nkrb_style_color_get_hue, 0);
|
120
|
+
rb_define_method(cNuklearStyleColor, "saturation=", nkrb_style_color_set_saturation, 1);
|
121
|
+
rb_define_method(cNuklearStyleColor, "saturation", nkrb_style_color_get_saturation, 0);
|
122
|
+
rb_define_method(cNuklearStyleColor, "value=", nkrb_style_color_set_value, 1);
|
123
|
+
rb_define_method(cNuklearStyleColor, "value", nkrb_style_color_get_value, 0);
|
124
|
+
rb_define_method(cNuklearStyleColor, "alpha=", nkrb_style_color_set_alpha, 1);
|
125
|
+
rb_define_method(cNuklearStyleColor, "alpha", nkrb_style_color_get_alpha, 0);
|
126
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
#define NK_UNPACK(rvalue, varname) \
|
4
|
+
struct nk_style_item *varname; \
|
5
|
+
Data_Get_Struct(rvalue, struct nk_style_item, varname);
|
6
|
+
|
7
|
+
VALUE cNuklearStyleImage = Qnil;
|
8
|
+
|
9
|
+
VALUE nkrb_style_image_alloc(VALUE self) {
|
10
|
+
struct nk_style_item *style = malloc(sizeof(struct nk_style_item));
|
11
|
+
memset(style, 0, sizeof(struct nk_style_item));
|
12
|
+
style->type = NK_STYLE_ITEM_IMAGE;
|
13
|
+
return Data_Wrap_Struct(self, NULL, nkrb_style_item_free, style);
|
14
|
+
}
|
15
|
+
|
16
|
+
VALUE nkrb_style_image_set_id(VALUE self, VALUE id) {
|
17
|
+
NK_UNPACK(self, style);
|
18
|
+
style->data.image.handle.id = FIX2INT(id);
|
19
|
+
return id;
|
20
|
+
}
|
21
|
+
|
22
|
+
VALUE nkrb_style_image_get_id(VALUE self) {
|
23
|
+
NK_UNPACK(self, style);
|
24
|
+
return INT2FIX(style->data.image.handle.id);
|
25
|
+
}
|
26
|
+
|
27
|
+
void nkrb_style_image_init(void) {
|
28
|
+
cNuklearStyleImage = rb_define_class_under(mNuklearStyle, "Image", rb_cObject);
|
29
|
+
rb_define_alloc_func(cNuklearStyleImage, nkrb_style_image_alloc);
|
30
|
+
rb_define_method(cNuklearStyleImage, "id=", nkrb_style_image_set_id, 1);
|
31
|
+
rb_define_method(cNuklearStyleImage, "id", nkrb_style_image_get_id, 0);
|
32
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
VALUE mNuklearUI = Qnil;
|
4
|
+
|
5
|
+
void instance_eval_block(VALUE self) {
|
6
|
+
rb_need_block();
|
7
|
+
rb_funcall_with_block(self, rb_intern("instance_eval"), 0, NULL, rb_block_proc());
|
8
|
+
}
|
9
|
+
|
10
|
+
void nkrb_ui_init(void) {
|
11
|
+
mNuklearUI = rb_define_module_under(mNuklear, "UI");
|
12
|
+
nkrb_ui_container_init();
|
13
|
+
|
14
|
+
nkrb_ui_button_init();
|
15
|
+
nkrb_ui_checkbox_init();
|
16
|
+
nkrb_ui_color_picker_init();
|
17
|
+
nkrb_ui_combo_init();
|
18
|
+
nkrb_ui_edit_string_init();
|
19
|
+
nkrb_ui_group_init();
|
20
|
+
nkrb_ui_label_init();
|
21
|
+
nkrb_ui_layout_init();
|
22
|
+
nkrb_ui_menu_init();
|
23
|
+
nkrb_ui_menu_item_init();
|
24
|
+
nkrb_ui_menubar_init();
|
25
|
+
nkrb_ui_popup_init();
|
26
|
+
nkrb_ui_progress_init();
|
27
|
+
nkrb_ui_property_init();
|
28
|
+
nkrb_ui_slider_init();
|
29
|
+
nkrb_ui_tree_init();
|
30
|
+
nkrb_ui_widget_init();
|
31
|
+
nkrb_ui_window_init();
|
32
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
#define UNPACK_CONTEXT(varname) struct nk_context *varname = nkrb_context_get(rb_ivar_get(self, rb_intern("@context")));
|
4
|
+
|
5
|
+
VALUE cNuklearUIBuilder = Qnil;
|
6
|
+
|
7
|
+
VALUE nkrb_ui_initialize(VALUE self, VALUE context) {
|
8
|
+
rb_ivar_set(self, rb_intern("@context"), context);
|
9
|
+
return self;
|
10
|
+
}
|
11
|
+
|
12
|
+
|
13
|
+
VALUE nkrb_ui_list_view_begin(VALUE self, VALUE id, VALUE flags, VALUE row_height, VALUE row_count) {
|
14
|
+
UNPACK_CONTEXT(ctx);
|
15
|
+
struct nk_list_view view;
|
16
|
+
if (nk_list_view_begin(ctx, &view, StringValueCStr(id), FIX2INT(flags), FIX2INT(row_height), FIX2INT(row_count))) {
|
17
|
+
if (rb_block_given_p()) {
|
18
|
+
instance_eval_block(self);
|
19
|
+
}
|
20
|
+
nk_list_view_end(&view);
|
21
|
+
}
|
22
|
+
return self;
|
23
|
+
}
|
24
|
+
|
25
|
+
void nkrb_ui_builder_init(void) {
|
26
|
+
cNuklearUIBuilder = rb_define_class_under(mNuklear, "UIBuilder", rb_cObject);
|
27
|
+
rb_define_method(cNuklearUIBuilder, "initialize", nkrb_ui_initialize, 1);
|
28
|
+
rb_define_method(cNuklearUIBuilder, "list_view", nkrb_ui_list_view_begin, 4);
|
29
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
VALUE nkrb_ui_button(VALUE self, VALUE rcontext, VALUE roptions) {
|
4
|
+
struct nk_context *context = nkrb_context_get(rcontext);
|
5
|
+
VALUE rrepeat = rb_hash_aref(roptions, ID2SYM(rb_intern("repeat")));
|
6
|
+
VALUE rtitle = rb_hash_aref(roptions, ID2SYM(rb_intern("title")));
|
7
|
+
VALUE rcolor = rb_hash_aref(roptions, ID2SYM(rb_intern("color")));
|
8
|
+
VALUE rsymbol = rb_hash_aref(roptions, ID2SYM(rb_intern("symbol")));
|
9
|
+
VALUE rimage = rb_hash_aref(roptions, ID2SYM(rb_intern("image")));
|
10
|
+
VALUE rstyle = rb_hash_aref(roptions, ID2SYM(rb_intern("style")));
|
11
|
+
VALUE ralign = rb_hash_aref(roptions, ID2SYM(rb_intern("alignment")));
|
12
|
+
int alignment = 0;
|
13
|
+
if (!NIL_P(ralign)) alignment = FIX2INT(ralign);
|
14
|
+
|
15
|
+
struct nk_style_button style;
|
16
|
+
memcpy(&style, &context->style.button, sizeof(style));
|
17
|
+
assign_button_style_from_ruby(&style, rstyle);
|
18
|
+
|
19
|
+
enum nk_symbol_type symbol = NK_SYMBOL_NONE;
|
20
|
+
SET_RSYMBOL(symbol, rsymbol);
|
21
|
+
|
22
|
+
int repeat = RTEST(rrepeat);
|
23
|
+
int result = 0;
|
24
|
+
if (repeat) nk_button_set_behavior(context, NK_BUTTON_REPEATER);
|
25
|
+
if (NIL_P(rtitle) && symbol == NK_SYMBOL_NONE && NIL_P(rimage)) {
|
26
|
+
if (NIL_P(rcolor)) {
|
27
|
+
rb_raise(rb_eArgError, "need :title or :symbol, with optional :image, or :color");
|
28
|
+
} else {
|
29
|
+
struct nk_color color;
|
30
|
+
ASSIGN_STYLE_AS_COLOR(color, nkrb_style_item(rcolor));
|
31
|
+
result = nk_button_color(context, color);
|
32
|
+
}
|
33
|
+
} else {
|
34
|
+
if (NIL_P(rtitle) && NIL_P(rimage)) {
|
35
|
+
result = nk_button_symbol_styled(context, &style, symbol);
|
36
|
+
} else if (!NIL_P(rtitle) && NIL_P(rimage)) {
|
37
|
+
result = nk_button_symbol_text_styled(context, &style, symbol, RSTRING_PTR(rtitle), (int) RSTRING_LEN(rtitle), alignment);
|
38
|
+
} else if (NIL_P(rtitle) && !NIL_P(rimage)) {
|
39
|
+
struct nk_image img;
|
40
|
+
ASSIGN_STYLE_AS_IMAGE(img, nkrb_style_item(rimage));
|
41
|
+
result = nk_button_image_text_styled(context, &style, img, RSTRING_PTR(rtitle), (int) RSTRING_LEN(rtitle), alignment);
|
42
|
+
} else {
|
43
|
+
struct nk_image img;
|
44
|
+
ASSIGN_STYLE_AS_IMAGE(img, nkrb_style_item(rimage));
|
45
|
+
result = nk_button_image_styled(context, &style, img);
|
46
|
+
}
|
47
|
+
}
|
48
|
+
if (repeat) nk_button_set_behavior(context, NK_BUTTON_DEFAULT);
|
49
|
+
|
50
|
+
return INT2FIX(result);
|
51
|
+
}
|
52
|
+
|
53
|
+
void nkrb_ui_button_init(void) {
|
54
|
+
rb_define_method(mNuklearUIContainer, "ui_button", nkrb_ui_button, 2);
|
55
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
VALUE nkrb_ui_color_picker(VALUE self, VALUE rcontext, VALUE rcolor, VALUE rtype) {
|
4
|
+
struct nk_context *ctx = nkrb_context_get(rcontext);
|
5
|
+
enum nk_color_format type = (SYM2ID(rtype) == rb_intern("rgb")) ? NK_RGB : NK_RGBA;
|
6
|
+
struct nk_style_item *style = nkrb_style_item(rcolor);
|
7
|
+
struct nk_color color;
|
8
|
+
ASSIGN_STYLE_AS_COLOR(color, style);
|
9
|
+
|
10
|
+
if (nk_color_pick(ctx, &color, type)) {
|
11
|
+
style->data.color = color;
|
12
|
+
return rcolor;
|
13
|
+
}
|
14
|
+
|
15
|
+
return Qnil;
|
16
|
+
}
|
17
|
+
|
18
|
+
void nkrb_ui_color_picker_init(void) {
|
19
|
+
rb_define_method(mNuklearUIContainer, "ui_color_picker", nkrb_ui_color_picker, 3);
|
20
|
+
}
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
VALUE nkrb_ui_combo(VALUE self, VALUE rcontext, VALUE rselected_index,
|
4
|
+
VALUE rchoices, VALUE ritem_height, VALUE rwidth, VALUE rheight) {
|
5
|
+
struct nk_context *context = nkrb_context_get(rcontext);
|
6
|
+
float width = (float) NUM2DBL(rwidth);
|
7
|
+
float height = (float) NUM2DBL(rheight);
|
8
|
+
int item_height = FIX2INT(ritem_height);
|
9
|
+
int len = (int) RARRAY_LEN(rchoices);
|
10
|
+
int selected_index = FIX2INT(rselected_index);
|
11
|
+
int i;
|
12
|
+
const char **choices = malloc(len * sizeof(const char *));
|
13
|
+
for (i = 0; i < len; i++) {
|
14
|
+
VALUE str = rb_funcall(rb_ary_entry(rchoices, i), rb_intern("to_s"), 0);
|
15
|
+
choices[i] = StringValueCStr(str);
|
16
|
+
}
|
17
|
+
int result = nk_combo(context, choices, len, selected_index, item_height, nk_vec2(width, height));
|
18
|
+
free(choices);
|
19
|
+
return INT2FIX(result);
|
20
|
+
}
|
21
|
+
|
22
|
+
VALUE nkrb_ui_combobox(VALUE self, VALUE rcontext, VALUE rtext, VALUE rcolor,
|
23
|
+
VALUE rsymbol, VALUE rimage, VALUE rwidth, VALUE rheight) {
|
24
|
+
struct nk_context *context = nkrb_context_get(rcontext);
|
25
|
+
float width = (float) NUM2DBL(rwidth);
|
26
|
+
float height = (float) NUM2DBL(rheight);
|
27
|
+
int result = 0;
|
28
|
+
enum nk_symbol_type symbol = NK_SYMBOL_NONE;
|
29
|
+
SET_RSYMBOL(symbol, rsymbol);
|
30
|
+
struct nk_vec2 size = nk_vec2(width, height);
|
31
|
+
|
32
|
+
if (!NIL_P(rcolor)) {
|
33
|
+
struct nk_color color;
|
34
|
+
ASSIGN_STYLE_AS_COLOR(color, nkrb_style_item(rcolor));
|
35
|
+
result = nk_combo_begin_color(context, color, nk_vec2(width, height));
|
36
|
+
} else if (!NIL_P(rtext)) {
|
37
|
+
rtext = rb_funcall(rtext, rb_intern("to_s"), 0);
|
38
|
+
const char *text = StringValuePtr(rtext);
|
39
|
+
int len = (int) RSTRING_LEN(rtext);
|
40
|
+
if (!NIL_P(rsymbol)) {
|
41
|
+
result = nk_combo_begin_symbol_text(context, text, len, symbol, size);
|
42
|
+
} else if (!NIL_P(rimage)) {
|
43
|
+
struct nk_image img;
|
44
|
+
ASSIGN_STYLE_AS_IMAGE(img, nkrb_style_item(rimage));
|
45
|
+
result = nk_combo_begin_image_text(context, text, len, img, size);
|
46
|
+
} else {
|
47
|
+
result = nk_combo_begin_text(context, text, len, size);
|
48
|
+
}
|
49
|
+
} else {
|
50
|
+
if (!NIL_P(symbol)) {
|
51
|
+
result = nk_combo_begin_symbol(context, symbol, size);
|
52
|
+
} else if (!NIL_P(rimage)) {
|
53
|
+
struct nk_image img;
|
54
|
+
ASSIGN_STYLE_AS_IMAGE(img, nkrb_style_item(rimage));
|
55
|
+
result = nk_combo_begin_image(context, img, size);
|
56
|
+
} else {
|
57
|
+
return Qnil;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
if (rb_block_given_p())
|
62
|
+
rb_yield(result ? Qtrue : Qfalse);
|
63
|
+
|
64
|
+
if (result)
|
65
|
+
nk_combo_end(context);
|
66
|
+
|
67
|
+
return Qnil;
|
68
|
+
}
|
69
|
+
|
70
|
+
void nkrb_ui_combo_init(void) {
|
71
|
+
rb_define_method(mNuklearUIContainer, "ui_combobox", nkrb_ui_combobox, 7);
|
72
|
+
rb_define_method(mNuklearUIContainer, "ui_combo", nkrb_ui_combo, 6);
|
73
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#include "nkrb.h"
|
2
|
+
|
3
|
+
VALUE nkrb_ui_edit_string(VALUE self, VALUE context, VALUE rflags, VALUE rbuffer, VALUE max_length, VALUE rfilter) {
|
4
|
+
Check_Type(rbuffer, T_STRING);
|
5
|
+
rfilter = rb_funcall(rfilter, rb_intern("to_s"), 0);
|
6
|
+
int buffer_size = FIX2INT(max_length) + 1;
|
7
|
+
char *buffer = malloc(buffer_size);
|
8
|
+
memset(buffer, 0, buffer_size);
|
9
|
+
char *ptr = RSTRING_PTR(rbuffer);
|
10
|
+
int rbuffer_len = (int) RSTRING_LEN(rbuffer);
|
11
|
+
if (rbuffer_len > buffer_size - 1) rbuffer_len = buffer_size - 1;
|
12
|
+
memcpy(buffer, ptr, rbuffer_len);
|
13
|
+
nk_plugin_filter filter = nk_filter_default;
|
14
|
+
if (!strcmp(StringValueCStr(rfilter), "ascii")) filter = nk_filter_ascii;
|
15
|
+
if (!strcmp(StringValueCStr(rfilter), "float")) filter = nk_filter_float;
|
16
|
+
if (!strcmp(StringValueCStr(rfilter), "decimal")) filter = nk_filter_decimal;
|
17
|
+
if (!strcmp(StringValueCStr(rfilter), "hex")) filter = nk_filter_hex;
|
18
|
+
if (!strcmp(StringValueCStr(rfilter), "octal")) filter = nk_filter_oct;
|
19
|
+
if (!strcmp(StringValueCStr(rfilter), "binary")) filter = nk_filter_binary;
|
20
|
+
int start_len = rbuffer_len;
|
21
|
+
nk_flags result = nk_edit_string(nkrb_context_get(context), FIX2INT(rflags), buffer, &rbuffer_len, buffer_size - 1, filter);
|
22
|
+
if (rbuffer_len != start_len || memcmp(buffer, ptr, rbuffer_len)) {
|
23
|
+
rb_funcall(rbuffer, rb_intern("clear"), 0);
|
24
|
+
rb_str_cat(rbuffer, buffer, rbuffer_len);
|
25
|
+
}
|
26
|
+
free(buffer);
|
27
|
+
return INT2FIX(result);
|
28
|
+
}
|
29
|
+
|
30
|
+
VALUE nkrb_ui_edit_focus(VALUE self, VALUE context, VALUE rflags) {
|
31
|
+
nk_edit_focus(nkrb_context_get(context), FIX2INT(rflags));
|
32
|
+
return Qnil;
|
33
|
+
}
|
34
|
+
|
35
|
+
void nkrb_ui_edit_string_init(void) {
|
36
|
+
rb_define_method(mNuklearUIContainer, "ui_edit_string", nkrb_ui_edit_string, 5);
|
37
|
+
rb_define_method(mNuklearUIContainer, "ui_edit_focus", nkrb_ui_edit_focus, 2);
|
38
|
+
}
|