Browse Source

Added additional `nk_tree` version

Added another version of `nk_tree` that does not store internal state
to hold the tree state (minimized/maximized). Main advantages is
possibily less memory consumptions and more user control.
In addition a new set of button overloads were added to directly pass
in a button style struct which allows an easier way to have custom
button visuals for specific buttons.
vurtun 9 years ago
parent
commit
1acb7ba283
2 changed files with 163 additions and 56 deletions
  1. 6 0
      CHANGELOG.md
  2. 157 56
      nuklear.h

+ 6 - 0
CHANGELOG.md

@@ -1,4 +1,10 @@
 # Changelog
 # Changelog
+- 2016/11/10 (1.180)- Added additional `nk_button` versions which allows to directly
+                        pass in a style struct to change buttons visual.
+- 2016/11/10 (1.180)- Added additional 'nk_tree' versions to support external state
+                        storage. Just like last the `nk_group` commit the main
+                        advantage is that you optionally can minimize nuklears runtime
+                        memory consumption or handle hash collisions.
 - 2016/11/09 (1.180)- Added additional `nk_group` version to support external scrollbar
 - 2016/11/09 (1.180)- Added additional `nk_group` version to support external scrollbar
                         offset storage. Main advantage is that you can externalize
                         offset storage. Main advantage is that you can externalize
                         the memory management for the offset. It could also be helpful
                         the memory management for the offset. It could also be helpful

+ 157 - 56
nuklear.h

@@ -1,5 +1,5 @@
 /*
 /*
- Nuklear - v1.17 - public domain
+ Nuklear - v1.18 - public domain
  no warrenty implied; use at your own risk.
  no warrenty implied; use at your own risk.
  authored from 2015-2016 by Micha Mettke
  authored from 2015-2016 by Micha Mettke
 
 
@@ -429,6 +429,19 @@ struct nk_user_font;
 struct nk_panel;
 struct nk_panel;
 struct nk_context;
 struct nk_context;
 struct nk_draw_vertex_layout_element;
 struct nk_draw_vertex_layout_element;
+struct nk_style_button;
+struct nk_style_toggle;
+struct nk_style_selectable;
+struct nk_style_slide;
+struct nk_style_progress;
+struct nk_style_scrollbar;
+struct nk_style_edit;
+struct nk_style_property;
+struct nk_style_chart;
+struct nk_style_combo;
+struct nk_style_tab;
+struct nk_style_window_header;
+struct nk_style_window;
 
 
 enum {nk_false, nk_true};
 enum {nk_false, nk_true};
 struct nk_color {nk_byte r,g,b,a;};
 struct nk_color {nk_byte r,g,b,a;};
@@ -766,6 +779,13 @@ NK_API int                      nk_tree_push_hashed(struct nk_context*, enum nk_
 NK_API int                      nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed);
 NK_API int                      nk_tree_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states initial_state, const char *hash, int len,int seed);
 NK_API void                     nk_tree_pop(struct nk_context*);
 NK_API void                     nk_tree_pop(struct nk_context*);
 
 
+#define                         nk_tree_state_push(ctx, type, title, state) nk_tree_state_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),__LINE__)
+#define                         nk_tree_state_push_id(ctx, type, title, state, id) nk_tree_state_push_hashed(ctx, type, title, state, NK_FILE_LINE,nk_strlen(NK_FILE_LINE),id)
+NK_API int                      nk_tree_state_push_hashed(struct nk_context*, enum nk_tree_type, const char *title, enum nk_collapse_states *state, const char *hash, int len,int seed);
+NK_API int                      nk_tree_state_image_push_hashed(struct nk_context*, enum nk_tree_type, struct nk_image, const char *title, enum nk_collapse_states *state, const char *hash, int len,int seed);
+NK_API void                     nk_tree_state_pop(struct nk_context*);
+
+
 /* Widgets */
 /* Widgets */
 NK_API void                     nk_text(struct nk_context*, const char*, int, nk_flags);
 NK_API void                     nk_text(struct nk_context*, const char*, int, nk_flags);
 NK_API void                     nk_text_colored(struct nk_context*, const char*, int, nk_flags, struct nk_color);
 NK_API void                     nk_text_colored(struct nk_context*, const char*, int, nk_flags, struct nk_color);
@@ -793,6 +813,10 @@ NK_API void                     nk_value_color_hex(struct nk_context*, const cha
 #endif
 #endif
 
 
 /* Widgets: Buttons */
 /* Widgets: Buttons */
+NK_API void                     nk_button_set_behavior(struct nk_context*, enum nk_button_behavior);
+NK_API int                      nk_button_push_behavior(struct nk_context*, enum nk_button_behavior);
+NK_API int                      nk_button_pop_behavior(struct nk_context*);
+
 NK_API int                      nk_button_text(struct nk_context*, const char *title, int len);
 NK_API int                      nk_button_text(struct nk_context*, const char *title, int len);
 NK_API int                      nk_button_label(struct nk_context*, const char *title);
 NK_API int                      nk_button_label(struct nk_context*, const char *title);
 NK_API int                      nk_button_color(struct nk_context*, struct nk_color);
 NK_API int                      nk_button_color(struct nk_context*, struct nk_color);
@@ -803,9 +827,14 @@ NK_API int                      nk_button_symbol_text(struct nk_context*, enum n
 NK_API int                      nk_button_image_label(struct nk_context*, struct nk_image img, const char*, nk_flags text_alignment);
 NK_API int                      nk_button_image_label(struct nk_context*, struct nk_image img, const char*, nk_flags text_alignment);
 NK_API int                      nk_button_image_text(struct nk_context*, struct nk_image img, const char*, int, nk_flags alignment);
 NK_API int                      nk_button_image_text(struct nk_context*, struct nk_image img, const char*, int, nk_flags alignment);
 
 
-NK_API void                     nk_button_set_behavior(struct nk_context*, enum nk_button_behavior);
-NK_API int                      nk_button_push_behavior(struct nk_context*, enum nk_button_behavior);
-NK_API int                      nk_button_pop_behavior(struct nk_context*);
+NK_API int                      nk_button_text_styled(struct nk_context*, const struct nk_style_button*, const char *title, int len);
+NK_API int                      nk_button_label_styled(struct nk_context*, const struct nk_style_button*, const char *title);
+NK_API int                      nk_button_symbol_styled(struct nk_context*, const struct nk_style_button*, enum nk_symbol_type);
+NK_API int                      nk_button_image_styled(struct nk_context*, const struct nk_style_button*, struct nk_image img);
+NK_API int                      nk_button_symbol_label_styled(struct nk_context*,const struct nk_style_button*, enum nk_symbol_type, const char*, nk_flags text_alignment);
+NK_API int                      nk_button_symbol_text_styled(struct nk_context*,const struct nk_style_button*, enum nk_symbol_type, const char*, int, nk_flags alignment);
+NK_API int                      nk_button_image_label_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, nk_flags text_alignment);
+NK_API int                      nk_button_image_text_styled(struct nk_context*,const struct nk_style_button*, struct nk_image img, const char*, int, nk_flags alignment);
 
 
 /* Widgets: Checkbox */
 /* Widgets: Checkbox */
 NK_API int                      nk_check_label(struct nk_context*, const char*, int active);
 NK_API int                      nk_check_label(struct nk_context*, const char*, int active);
@@ -18277,8 +18306,8 @@ nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx)
 }
 }
 
 
 NK_INTERN int
 NK_INTERN int
-nk_tree_base(struct nk_context *ctx, enum nk_tree_type type,
-    struct nk_image *img, const char *title, enum nk_collapse_states initial_state,
+nk_tree_state_base(struct nk_context *ctx, enum nk_tree_type type,
+    struct nk_image *img, const char *title, enum nk_collapse_states *state,
     const char *hash, int len, int line)
     const char *hash, int len, int line)
 {
 {
     struct nk_window *win;
     struct nk_window *win;
@@ -18295,9 +18324,6 @@ nk_tree_base(struct nk_context *ctx, enum nk_tree_type type,
     struct nk_text text;
     struct nk_text text;
 
 
     nk_flags ws = 0;
     nk_flags ws = 0;
-    int title_len = 0;
-    nk_hash tree_hash = 0;
-    nk_uint *state = 0;
     enum nk_widget_layout_states widget_state;
     enum nk_widget_layout_states widget_state;
 
 
     NK_ASSERT(ctx);
     NK_ASSERT(ctx);
@@ -18329,19 +18355,6 @@ nk_tree_base(struct nk_context *ctx, enum nk_tree_type type,
         }
         }
     } else text.background = style->window.background;
     } else text.background = style->window.background;
 
 
-    /* find, create or set tab persistent state (open/closed) */
-    if (hash) {
-        tree_hash = nk_murmur_hash(hash, len, (nk_hash)line);
-    } else {
-        title_len = (int)nk_strlen(title);
-        tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line);
-    }
-    state = nk_find_value(win, tree_hash);
-    if (!state) {
-        state = nk_add_value(ctx, win, tree_hash, 0);
-        *state = initial_state;
-    }
-
     /* update node state */
     /* update node state */
     in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0;
     in = (!(layout->flags & NK_WINDOW_ROM)) ? &ctx->input: 0;
     in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0;
     in = (in && widget_state == NK_WIDGET_VALID) ? &ctx->input : 0;
@@ -18397,20 +18410,43 @@ nk_tree_base(struct nk_context *ctx, enum nk_tree_type type,
     } else return nk_false;
     } else return nk_false;
 }
 }
 
 
-NK_API int
-nk_tree_push_hashed(struct nk_context *ctx, enum nk_tree_type type,
-    const char *title, enum nk_collapse_states initial_state,
+NK_INTERN int
+nk_tree_base(struct nk_context *ctx, enum nk_tree_type type,
+    struct nk_image *img, const char *title, enum nk_collapse_states initial_state,
     const char *hash, int len, int line)
     const char *hash, int len, int line)
-{return nk_tree_base(ctx, type, 0, title, initial_state, hash, len, line);}
+{
+    struct nk_window *win = ctx->current;
+    int title_len = 0;
+    nk_hash tree_hash = 0;
+    nk_uint *state = 0;
+
+    /* retrieve tree state from internal widget state tables */
+    if (!hash) {
+        title_len = (int)nk_strlen(title);
+        tree_hash = nk_murmur_hash(title, (int)title_len, (nk_hash)line);
+    } else tree_hash = nk_murmur_hash(hash, len, (nk_hash)line);
+    state = nk_find_value(win, tree_hash);
+    if (!state) {
+        state = nk_add_value(ctx, win, tree_hash, 0);
+        *state = initial_state;
+    }
+    return nk_tree_state_base(ctx, type, img, title, state, hash, len, line);
+}
 
 
 NK_API int
 NK_API int
-nk_tree_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type,
-    struct nk_image img, const char *title, enum nk_collapse_states initial_state,
-    const char *hash, int len,int seed)
-{return nk_tree_base(ctx, type, &img, title, initial_state, hash, len, seed);}
+nk_tree_state_push_hashed(struct nk_context *ctx, enum nk_tree_type type,
+    const char *title, enum nk_collapse_states *state, const char *hash,
+    int len, int seed)
+{return nk_tree_state_base(ctx, type, 0, title, state, hash, len, seed);}
+
+NK_API int
+nk_tree_state_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type,
+    struct nk_image img, const char *title, enum nk_collapse_states *state,
+    const char *hash, int len, int seed)
+{return nk_tree_state_base(ctx, type, &img, title, state, hash, len, seed);}
 
 
 NK_API void
 NK_API void
-nk_tree_pop(struct nk_context *ctx)
+nk_tree_state_pop(struct nk_context *ctx)
 {
 {
     struct nk_window *win = 0;
     struct nk_window *win = 0;
     struct nk_panel *layout = 0;
     struct nk_panel *layout = 0;
@@ -18428,6 +18464,23 @@ nk_tree_pop(struct nk_context *ctx)
     NK_ASSERT(layout->row.tree_depth);
     NK_ASSERT(layout->row.tree_depth);
     layout->row.tree_depth--;
     layout->row.tree_depth--;
 }
 }
+
+NK_API int
+nk_tree_push_hashed(struct nk_context *ctx, enum nk_tree_type type,
+    const char *title, enum nk_collapse_states initial_state,
+    const char *hash, int len, int line)
+{return nk_tree_base(ctx, type, 0, title, initial_state, hash, len, line);}
+
+NK_API int
+nk_tree_image_push_hashed(struct nk_context *ctx, enum nk_tree_type type,
+    struct nk_image img, const char *title, enum nk_collapse_states initial_state,
+    const char *hash, int len,int seed)
+{return nk_tree_base(ctx, type, &img, title, initial_state, hash, len, seed);}
+
+NK_API void
+nk_tree_pop(struct nk_context *ctx)
+{nk_tree_state_pop(ctx);}
+
 /*----------------------------------------------------------------
 /*----------------------------------------------------------------
  *
  *
  *                          WIDGETS
  *                          WIDGETS
@@ -18910,33 +18963,45 @@ nk_button_pop_behavior(struct nk_context *ctx)
 }
 }
 
 
 NK_API int
 NK_API int
-nk_button_text(struct nk_context *ctx, const char *title, int len)
+nk_button_text_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, const char *title, int len)
 {
 {
     struct nk_window *win;
     struct nk_window *win;
     struct nk_panel *layout;
     struct nk_panel *layout;
     const struct nk_input *in;
     const struct nk_input *in;
-    const struct nk_style *style;
 
 
     struct nk_rect bounds;
     struct nk_rect bounds;
     enum nk_widget_layout_states state;
     enum nk_widget_layout_states state;
 
 
     NK_ASSERT(ctx);
     NK_ASSERT(ctx);
+    NK_ASSERT(style);
     NK_ASSERT(ctx->current);
     NK_ASSERT(ctx->current);
     NK_ASSERT(ctx->current->layout);
     NK_ASSERT(ctx->current->layout);
-    if (!ctx || !ctx->current || !ctx->current->layout) return 0;
+    if (!style || !ctx || !ctx->current || !ctx->current->layout) return 0;
 
 
     win = ctx->current;
     win = ctx->current;
-    style = &ctx->style;
     layout = win->layout;
     layout = win->layout;
     state = nk_widget(&bounds, ctx);
     state = nk_widget(&bounds, ctx);
 
 
     if (!state) return 0;
     if (!state) return 0;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     return nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds,
     return nk_do_button_text(&ctx->last_widget_state, &win->buffer, bounds,
-                    title, len, style->button.text_alignment, ctx->button_behavior,
-                    &style->button, in, style->font);
+                    title, len, style->text_alignment, ctx->button_behavior,
+                    style, in, ctx->style.font);
+}
+
+NK_API int
+nk_button_text(struct nk_context *ctx, const char *title, int len)
+{
+    NK_ASSERT(ctx);
+    if (!ctx) return 0;
+    return nk_button_text_styled(ctx, &ctx->style.button, title, len);
 }
 }
 
 
+NK_API int nk_button_label_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, const char *title)
+{return nk_button_text_styled(ctx, style, title, nk_strlen(title));}
+
 NK_API int nk_button_label(struct nk_context *ctx, const char *title)
 NK_API int nk_button_label(struct nk_context *ctx, const char *title)
 {return nk_button_text(ctx, title, nk_strlen(title));}
 {return nk_button_text(ctx, title, nk_strlen(title));}
 
 
@@ -18977,12 +19042,12 @@ nk_button_color(struct nk_context *ctx, struct nk_color color)
 }
 }
 
 
 NK_API int
 NK_API int
-nk_button_symbol(struct nk_context *ctx, enum nk_symbol_type symbol)
+nk_button_symbol_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, enum nk_symbol_type symbol)
 {
 {
     struct nk_window *win;
     struct nk_window *win;
     struct nk_panel *layout;
     struct nk_panel *layout;
     const struct nk_input *in;
     const struct nk_input *in;
-    const struct nk_style *style;
 
 
     struct nk_rect bounds;
     struct nk_rect bounds;
     enum nk_widget_layout_states state;
     enum nk_widget_layout_states state;
@@ -18994,23 +19059,29 @@ nk_button_symbol(struct nk_context *ctx, enum nk_symbol_type symbol)
         return 0;
         return 0;
 
 
     win = ctx->current;
     win = ctx->current;
-    style = &ctx->style;
     layout = win->layout;
     layout = win->layout;
-
     state = nk_widget(&bounds, ctx);
     state = nk_widget(&bounds, ctx);
     if (!state) return 0;
     if (!state) return 0;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     return nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, bounds,
     return nk_do_button_symbol(&ctx->last_widget_state, &win->buffer, bounds,
-            symbol, ctx->button_behavior, &style->button, in, style->font);
+            symbol, ctx->button_behavior, style, in, ctx->style.font);
 }
 }
 
 
 NK_API int
 NK_API int
-nk_button_image(struct nk_context *ctx, struct nk_image img)
+nk_button_symbol(struct nk_context *ctx, enum nk_symbol_type symbol)
+{
+    NK_ASSERT(ctx);
+    if (!ctx) return 0;
+    return nk_button_symbol_styled(ctx, &ctx->style.button, symbol);
+}
+
+NK_API int
+nk_button_image_styled(struct nk_context *ctx, const struct nk_style_button *style,
+    struct nk_image img)
 {
 {
     struct nk_window *win;
     struct nk_window *win;
     struct nk_panel *layout;
     struct nk_panel *layout;
     const struct nk_input *in;
     const struct nk_input *in;
-    const struct nk_style *style;
 
 
     struct nk_rect bounds;
     struct nk_rect bounds;
     enum nk_widget_layout_states state;
     enum nk_widget_layout_states state;
@@ -19022,24 +19093,31 @@ nk_button_image(struct nk_context *ctx, struct nk_image img)
         return 0;
         return 0;
 
 
     win = ctx->current;
     win = ctx->current;
-    style = &ctx->style;
     layout = win->layout;
     layout = win->layout;
 
 
     state = nk_widget(&bounds, ctx);
     state = nk_widget(&bounds, ctx);
     if (!state) return 0;
     if (!state) return 0;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     return nk_do_button_image(&ctx->last_widget_state, &win->buffer, bounds,
     return nk_do_button_image(&ctx->last_widget_state, &win->buffer, bounds,
-                img, ctx->button_behavior, &style->button, in);
+                img, ctx->button_behavior, style, in);
 }
 }
 
 
 NK_API int
 NK_API int
-nk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol,
-    const char* text, int len, nk_flags align)
+nk_button_image(struct nk_context *ctx, struct nk_image img)
+{
+    NK_ASSERT(ctx);
+    if (!ctx) return 0;
+    return nk_button_image_styled(ctx, &ctx->style.button, img);
+}
+
+NK_API int
+nk_button_symbol_text_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, enum nk_symbol_type symbol,
+    const char *text, int len, nk_flags align)
 {
 {
     struct nk_window *win;
     struct nk_window *win;
     struct nk_panel *layout;
     struct nk_panel *layout;
     const struct nk_input *in;
     const struct nk_input *in;
-    const struct nk_style *style;
 
 
     struct nk_rect bounds;
     struct nk_rect bounds;
     enum nk_widget_layout_states state;
     enum nk_widget_layout_states state;
@@ -19051,7 +19129,6 @@ nk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol,
         return 0;
         return 0;
 
 
     win = ctx->current;
     win = ctx->current;
-    style = &ctx->style;
     layout = win->layout;
     layout = win->layout;
 
 
     state = nk_widget(&bounds, ctx);
     state = nk_widget(&bounds, ctx);
@@ -19059,21 +19136,35 @@ nk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol,
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     return nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds,
     return nk_do_button_text_symbol(&ctx->last_widget_state, &win->buffer, bounds,
                 symbol, text, len, align, ctx->button_behavior,
                 symbol, text, len, align, ctx->button_behavior,
-                &style->button, style->font, in);
+                style, ctx->style.font, in);
+}
+
+NK_API int
+nk_button_symbol_text(struct nk_context *ctx, enum nk_symbol_type symbol,
+    const char* text, int len, nk_flags align)
+{
+    NK_ASSERT(ctx);
+    if (!ctx) return 0;
+    return nk_button_symbol_text_styled(ctx, &ctx->style.button, symbol, text, len, align);
 }
 }
 
 
 NK_API int nk_button_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol,
 NK_API int nk_button_symbol_label(struct nk_context *ctx, enum nk_symbol_type symbol,
     const char *label, nk_flags align)
     const char *label, nk_flags align)
 {return nk_button_symbol_text(ctx, symbol, label, nk_strlen(label), align);}
 {return nk_button_symbol_text(ctx, symbol, label, nk_strlen(label), align);}
 
 
+NK_API int nk_button_symbol_label_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, enum nk_symbol_type symbol,
+    const char *title, nk_flags align)
+{return nk_button_symbol_text_styled(ctx, style, symbol, title, nk_strlen(title), align);}
+
 NK_API int
 NK_API int
-nk_button_image_text(struct nk_context *ctx, struct nk_image img,
-    const char *text, int len, nk_flags align)
+nk_button_image_text_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, struct nk_image img, const char *text,
+    int len, nk_flags align)
 {
 {
     struct nk_window *win;
     struct nk_window *win;
     struct nk_panel *layout;
     struct nk_panel *layout;
     const struct nk_input *in;
     const struct nk_input *in;
-    const struct nk_style *style;
 
 
     struct nk_rect bounds;
     struct nk_rect bounds;
     enum nk_widget_layout_states state;
     enum nk_widget_layout_states state;
@@ -19085,7 +19176,6 @@ nk_button_image_text(struct nk_context *ctx, struct nk_image img,
         return 0;
         return 0;
 
 
     win = ctx->current;
     win = ctx->current;
-    style = &ctx->style;
     layout = win->layout;
     layout = win->layout;
 
 
     state = nk_widget(&bounds, ctx);
     state = nk_widget(&bounds, ctx);
@@ -19093,13 +19183,24 @@ nk_button_image_text(struct nk_context *ctx, struct nk_image img,
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     in = (state == NK_WIDGET_ROM || layout->flags & NK_WINDOW_ROM) ? 0 : &ctx->input;
     return nk_do_button_text_image(&ctx->last_widget_state, &win->buffer,
     return nk_do_button_text_image(&ctx->last_widget_state, &win->buffer,
             bounds, img, text, len, align, ctx->button_behavior,
             bounds, img, text, len, align, ctx->button_behavior,
-            &style->button, style->font, in);
+            style, ctx->style.font, in);
 }
 }
 
 
+NK_API int
+nk_button_image_text(struct nk_context *ctx, struct nk_image img,
+    const char *text, int len, nk_flags align)
+{return nk_button_image_text_styled(ctx, &ctx->style.button,img, text, len, align);}
+
+
 NK_API int nk_button_image_label(struct nk_context *ctx, struct nk_image img,
 NK_API int nk_button_image_label(struct nk_context *ctx, struct nk_image img,
     const char *label, nk_flags align)
     const char *label, nk_flags align)
 {return nk_button_image_text(ctx, img, label, nk_strlen(label), align);}
 {return nk_button_image_text(ctx, img, label, nk_strlen(label), align);}
 
 
+NK_API int nk_button_image_label_styled(struct nk_context *ctx,
+    const struct nk_style_button *style, struct nk_image img,
+    const char *label, nk_flags text_alignment)
+{return nk_button_image_text_styled(ctx, style, img, label, nk_strlen(label), text_alignment);}
+
 /*----------------------------------------------------------------
 /*----------------------------------------------------------------
  *
  *
  *                          SELECTABLE
  *                          SELECTABLE