nuklear 0.1.0 → 0.1.3
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 +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +9 -2
- data/examples/calculator.png +0 -0
- data/examples/hello_nuklear.png +0 -0
- data/examples/hello_nuklear.rb +1 -1
- data/examples/lib/window.rb +1 -1
- data/ext/nuklear/nkrb_context.c +20 -0
- data/ext/nuklear/nkrb_renderer.c +6 -6
- data/ext/nuklear/nuklear.h +790 -447
- data/ext/nuklear_renderer_opengl2/nuklear_renderer_opengl2.c +9 -9
- data/ext/nuklear_renderer_opengl4/nuklear_renderer_opengl4.c +9 -11
- data/lib/nuklear/context.rb +1 -1
- data/lib/nuklear/renderer.rb +4 -5
- data/lib/nuklear/ui/edit_string.rb +10 -1
- data/lib/nuklear/version.rb +1 -1
- metadata +4 -2
data/ext/nuklear/nuklear.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
|
-
Nuklear -
|
3
|
-
no
|
2
|
+
Nuklear - 2.00.7 - public domain
|
3
|
+
no warranty implied; use at your own risk.
|
4
4
|
authored from 2015-2017 by Micha Mettke
|
5
5
|
|
6
6
|
ABOUT:
|
@@ -17,7 +17,7 @@ VALUES:
|
|
17
17
|
- Graphical user interface toolkit
|
18
18
|
- Single header library
|
19
19
|
- Written in C89 (a.k.a. ANSI C or ISO C90)
|
20
|
-
- Small codebase (~
|
20
|
+
- Small codebase (~18kLOC)
|
21
21
|
- Focus on portability, efficiency and simplicity
|
22
22
|
- No dependencies (not even the standard library if not wanted)
|
23
23
|
- Fully skinnable and customizable
|
@@ -47,7 +47,7 @@ USAGE:
|
|
47
47
|
or even worse stack corruptions.
|
48
48
|
|
49
49
|
FEATURES:
|
50
|
-
- Absolutely no platform
|
50
|
+
- Absolutely no platform dependent code
|
51
51
|
- Memory management control ranging from/to
|
52
52
|
- Ease of use by allocating everything from standard library
|
53
53
|
- Control every byte of memory inside the library
|
@@ -128,7 +128,7 @@ OPTIONAL DEFINES:
|
|
128
128
|
<!> If used needs to be defined for implementation and header <!>
|
129
129
|
|
130
130
|
NK_BUTTON_TRIGGER_ON_RELEASE
|
131
|
-
Different platforms require button clicks
|
131
|
+
Different platforms require button clicks occurring either on buttons being
|
132
132
|
pressed (up to down) or released (down to up).
|
133
133
|
By default this library will react on buttons being pressed, but if you
|
134
134
|
define this it will only trigger if a button is released.
|
@@ -516,7 +516,7 @@ enum nk_symbol_type {
|
|
516
516
|
* To use a context it first has to be initialized which can be achieved by calling
|
517
517
|
* one of either `nk_init_default`, `nk_init_fixed`, `nk_init`, `nk_init_custom`.
|
518
518
|
* Each takes in a font handle and a specific way of handling memory. Memory control
|
519
|
-
* hereby ranges from standard library to just
|
519
|
+
* hereby ranges from standard library to just specifying a fixed sized block of memory
|
520
520
|
* which nuklear has to manage itself from.
|
521
521
|
*
|
522
522
|
* struct nk_context ctx;
|
@@ -529,7 +529,7 @@ enum nk_symbol_type {
|
|
529
529
|
*
|
530
530
|
* Reference
|
531
531
|
* -------------------
|
532
|
-
* nk_init_default - Initializes context with standard library memory
|
532
|
+
* nk_init_default - Initializes context with standard library memory allocation (malloc,free)
|
533
533
|
* nk_init_fixed - Initializes context from single fixed size memory block
|
534
534
|
* nk_init - Initializes context with memory allocator callbacks for alloc and free
|
535
535
|
* nk_init_custom - Initializes context from two buffers. One for draw commands the other for window/panel/table allocations
|
@@ -549,10 +549,10 @@ enum nk_symbol_type {
|
|
549
549
|
NK_API int nk_init_default(struct nk_context*, const struct nk_user_font*);
|
550
550
|
#endif
|
551
551
|
/* nk_init_fixed - Initializes a `nk_context` struct from a single fixed size memory block
|
552
|
-
* Should be used if you want complete control over
|
552
|
+
* Should be used if you want complete control over nuklear's memory management.
|
553
553
|
* Especially recommended for system with little memory or systems with virtual memory.
|
554
554
|
* For the later case you can just allocate for example 16MB of virtual memory
|
555
|
-
* and only the required amount of memory will actually be
|
555
|
+
* and only the required amount of memory will actually be committed.
|
556
556
|
* IMPORTANT: make sure the passed memory block is aligned correctly for `nk_draw_commands`
|
557
557
|
* Parameters:
|
558
558
|
* @ctx must point to an either stack or heap allocated `nk_context` struct
|
@@ -700,37 +700,36 @@ enum nk_buttons {
|
|
700
700
|
NK_BUTTON_MAX
|
701
701
|
};
|
702
702
|
/* nk_input_begin - Begins the input mirroring process by resetting text, scroll
|
703
|
-
* mouse previous mouse position and movement as well as key state
|
703
|
+
* mouse previous mouse position and movement as well as key state transitions,
|
704
704
|
* Parameters:
|
705
705
|
* @ctx must point to an previously initialized `nk_context` struct */
|
706
706
|
NK_API void nk_input_begin(struct nk_context*);
|
707
|
-
/* nk_input_motion -
|
707
|
+
/* nk_input_motion - Mirrors current mouse position to nuklear
|
708
708
|
* Parameters:
|
709
709
|
* @ctx must point to an previously initialized `nk_context` struct
|
710
|
-
* @x must
|
711
|
-
* @y must
|
710
|
+
* @x must contain an integer describing the current mouse cursor x-position
|
711
|
+
* @y must contain an integer describing the current mouse cursor y-position */
|
712
712
|
NK_API void nk_input_motion(struct nk_context*, int x, int y);
|
713
|
-
/* nk_input_key -
|
713
|
+
/* nk_input_key - Mirrors state of a specific key to nuklear
|
714
714
|
* Parameters:
|
715
715
|
* @ctx must point to an previously initialized `nk_context` struct
|
716
716
|
* @key must be any value specified in enum `nk_keys` that needs to be mirrored
|
717
717
|
* @down must be 0 for key is up and 1 for key is down */
|
718
718
|
NK_API void nk_input_key(struct nk_context*, enum nk_keys, int down);
|
719
|
-
/* nk_input_button -
|
719
|
+
/* nk_input_button - Mirrors the state of a specific mouse button to nuklear
|
720
720
|
* Parameters:
|
721
721
|
* @ctx must point to an previously initialized `nk_context` struct
|
722
722
|
* @nk_buttons must be any value specified in enum `nk_buttons` that needs to be mirrored
|
723
|
-
* @x must
|
724
|
-
* @y must
|
723
|
+
* @x must contain an integer describing mouse cursor x-position on click up/down
|
724
|
+
* @y must contain an integer describing mouse cursor y-position on click up/down
|
725
725
|
* @down must be 0 for key is up and 1 for key is down */
|
726
726
|
NK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, int down);
|
727
|
-
/*
|
728
|
-
*
|
729
|
-
*
|
730
|
-
* struct `nk_input` between `nk_input_begin` and `nk_input_end`.
|
727
|
+
/* nk_input_scroll - Copies the last mouse scroll value to nuklear. Is generally
|
728
|
+
* a scroll value. So does not have to come from mouse and could also originate
|
729
|
+
* from touch for example.
|
731
730
|
* Parameters:
|
732
731
|
* @ctx must point to an previously initialized `nk_context` struct
|
733
|
-
* @
|
732
|
+
* @val vector with both X- as well as Y-scroll value */
|
734
733
|
NK_API void nk_input_scroll(struct nk_context*, struct nk_vec2 val);
|
735
734
|
/* nk_input_char - Copies a single ASCII character into an internal text buffer
|
736
735
|
* This is basically a helper function to quickly push ASCII characters into
|
@@ -746,7 +745,7 @@ NK_API void nk_input_char(struct nk_context*, char);
|
|
746
745
|
* struct `nk_input` between `nk_input_begin` and `nk_input_end`.
|
747
746
|
* Parameters:
|
748
747
|
* @ctx must point to an previously initialized `nk_context` struct
|
749
|
-
* @glyph UTF-32
|
748
|
+
* @glyph UTF-32 unicode codepoint */
|
750
749
|
NK_API void nk_input_glyph(struct nk_context*, const nk_glyph);
|
751
750
|
/* nk_input_unicode - Converts a unicode rune into UTF-8 and copies the result
|
752
751
|
* into an internal text buffer.
|
@@ -754,7 +753,7 @@ NK_API void nk_input_glyph(struct nk_context*, const nk_glyph);
|
|
754
753
|
* struct `nk_input` between `nk_input_begin` and `nk_input_end`.
|
755
754
|
* Parameters:
|
756
755
|
* @ctx must point to an previously initialized `nk_context` struct
|
757
|
-
* @glyph UTF-32
|
756
|
+
* @glyph UTF-32 unicode codepoint */
|
758
757
|
NK_API void nk_input_unicode(struct nk_context*, nk_rune);
|
759
758
|
/* nk_input_end - End the input mirroring process by resetting mouse grabbing
|
760
759
|
* state to ensure the mouse cursor is not grabbed indefinitely.
|
@@ -872,7 +871,7 @@ NK_API void nk_input_end(struct nk_context*);
|
|
872
871
|
* nk_free(&ctx);
|
873
872
|
*
|
874
873
|
* The second probably more applicable trick is to only draw if anything changed.
|
875
|
-
* It is not really useful for applications with
|
874
|
+
* It is not really useful for applications with continuous draw loop but
|
876
875
|
* quite useful for desktop applications. To actually get nuklear to only
|
877
876
|
* draw on changes you first have to define `NK_ZERO_COMMAND_MEMORY` and
|
878
877
|
* allocate a memory buffer that will store each unique drawing output.
|
@@ -920,7 +919,7 @@ NK_API void nk_input_end(struct nk_context*);
|
|
920
919
|
* hardware directly. Therefore it is possible to just define
|
921
920
|
* `NK_INCLUDE_VERTEX_BUFFER_OUTPUT` which includes optional vertex output.
|
922
921
|
* To access the vertex output you first have to convert all draw commands into
|
923
|
-
* vertexes by calling `nk_convert` which takes in your
|
922
|
+
* vertexes by calling `nk_convert` which takes in your preferred vertex format.
|
924
923
|
* After successfully converting all draw commands just iterate over and execute all
|
925
924
|
* vertex draw commands:
|
926
925
|
*
|
@@ -959,9 +958,9 @@ NK_API void nk_input_end(struct nk_context*);
|
|
959
958
|
* -------------------
|
960
959
|
* nk__begin - Returns the first draw command in the context draw command list to be drawn
|
961
960
|
* nk__next - Increments the draw command iterator to the next command inside the context draw command list
|
962
|
-
* nk_foreach -
|
961
|
+
* nk_foreach - Iterates over each draw command inside the context draw command list
|
963
962
|
*
|
964
|
-
* nk_convert - Converts from the abstract draw commands list into a hardware
|
963
|
+
* nk_convert - Converts from the abstract draw commands list into a hardware accessible vertex format
|
965
964
|
* nk__draw_begin - Returns the first vertex command in the context vertex draw list to be executed
|
966
965
|
* nk__draw_next - Increments the vertex command iterator to the next command inside the context vertex command list
|
967
966
|
* nk__draw_end - Returns the end of the vertex draw list
|
@@ -989,7 +988,7 @@ struct nk_convert_config {
|
|
989
988
|
struct nk_draw_null_texture null; /* handle to texture with a white pixel for shape drawing */
|
990
989
|
const struct nk_draw_vertex_layout_element *vertex_layout; /* describes the vertex output format and packing */
|
991
990
|
nk_size vertex_size; /* sizeof one vertex for vertex packing */
|
992
|
-
nk_size vertex_alignment; /* vertex alignment: Can be
|
991
|
+
nk_size vertex_alignment; /* vertex alignment: Can be obtained by NK_ALIGNOF */
|
993
992
|
};
|
994
993
|
/* nk__begin - Returns a draw command list iterator to iterate all draw
|
995
994
|
* commands accumulated over one frame.
|
@@ -1012,14 +1011,14 @@ NK_API const struct nk_command* nk__next(struct nk_context*, const struct nk_com
|
|
1012
1011
|
#define nk_foreach(c, ctx) for((c) = nk__begin(ctx); (c) != 0; (c) = nk__next(ctx,c))
|
1013
1012
|
#ifdef NK_INCLUDE_VERTEX_BUFFER_OUTPUT
|
1014
1013
|
/* nk_convert - converts all internal draw command into vertex draw commands and fills
|
1015
|
-
* three buffers with vertexes, vertex draw commands and vertex
|
1016
|
-
* as well as some other configuration values have to be
|
1014
|
+
* three buffers with vertexes, vertex draw commands and vertex indices. The vertex format
|
1015
|
+
* as well as some other configuration values have to be configured by filling out a
|
1017
1016
|
* `nk_convert_config` struct.
|
1018
1017
|
* Parameters:
|
1019
1018
|
* @ctx must point to an previously initialized `nk_context` struct at the end of a frame
|
1020
1019
|
* @cmds must point to a previously initialized buffer to hold converted vertex draw commands
|
1021
|
-
* @vertices must point to a previously initialized buffer to hold all produced
|
1022
|
-
* @elements must point to a previously initialized buffer to hold all
|
1020
|
+
* @vertices must point to a previously initialized buffer to hold all produced vertices
|
1021
|
+
* @elements must point to a previously initialized buffer to hold all produced vertex indices
|
1023
1022
|
* @config must point to a filled out `nk_config` struct to configure the conversion process
|
1024
1023
|
* Returns:
|
1025
1024
|
* returns NK_CONVERT_SUCCESS on success and a enum nk_convert_result error values if not */
|
@@ -1038,7 +1037,7 @@ NK_API const struct nk_draw_command* nk__draw_begin(const struct nk_context*, co
|
|
1038
1037
|
* Return values:
|
1039
1038
|
* vertex draw command pointer pointing to the end of the last vertex draw command inside the vertex draw command buffer */
|
1040
1039
|
NK_API const struct nk_draw_command* nk__draw_end(const struct nk_context*, const struct nk_buffer*);
|
1041
|
-
/* nk__draw_next - Increments the
|
1040
|
+
/* nk__draw_next - Increments the vertex draw command buffer iterator
|
1042
1041
|
* Parameters:
|
1043
1042
|
* @cmd must point to an previously either by `nk__draw_begin` or `nk__draw_next` returned vertex draw command
|
1044
1043
|
* @buf must point to an previously by `nk_convert` filled out vertex draw command buffer
|
@@ -1070,7 +1069,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|
1070
1069
|
* order. The topmost window thereby is the currently active window.
|
1071
1070
|
*
|
1072
1071
|
* To change window position inside the stack occurs either automatically by
|
1073
|
-
* user input by being clicked on or
|
1072
|
+
* user input by being clicked on or programmatically by calling `nk_window_focus`.
|
1074
1073
|
* Windows by default are visible unless explicitly being defined with flag
|
1075
1074
|
* `NK_WINDOW_HIDDEN`, the user clicked the close button on windows with flag
|
1076
1075
|
* `NK_WINDOW_CLOSABLE` or if a window was explicitly hidden by calling
|
@@ -1082,9 +1081,9 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|
1082
1081
|
* functions to start window declarations and `nk_end` at the end. Furthermore it
|
1083
1082
|
* is recommended to check the return value of `nk_begin_xxx` and only process
|
1084
1083
|
* widgets inside the window if the value is not 0. Either way you have to call
|
1085
|
-
* `nk_end` at the end of window declarations.
|
1084
|
+
* `nk_end` at the end of window declarations. Furthermore, do not attempt to
|
1086
1085
|
* nest `nk_begin_xxx` calls which will hopefully result in an assert or if not
|
1087
|
-
* in a
|
1086
|
+
* in a segmentation fault.
|
1088
1087
|
*
|
1089
1088
|
* if (nk_begin_xxx(...) {
|
1090
1089
|
* [... widgets ...]
|
@@ -1094,7 +1093,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|
1094
1093
|
* In the grand concept window and widget declarations need to occur after input
|
1095
1094
|
* handling and before drawing to screen. Not doing so can result in higher
|
1096
1095
|
* latency or at worst invalid behavior. Furthermore make sure that `nk_clear`
|
1097
|
-
* is called at the end of the frame. While
|
1096
|
+
* is called at the end of the frame. While nuklear's default platform backends
|
1098
1097
|
* already call `nk_clear` for you if you write your own backend not calling
|
1099
1098
|
* `nk_clear` can cause asserts or even worse undefined behavior.
|
1100
1099
|
*
|
@@ -1135,7 +1134,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|
1135
1134
|
* Reference
|
1136
1135
|
* -------------------
|
1137
1136
|
* nk_begin - starts a new window; needs to be called every frame for every window (unless hidden) or otherwise the window gets removed
|
1138
|
-
* nk_begin_titled - extended window start with
|
1137
|
+
* nk_begin_titled - extended window start with separated title and identifier to allow multiple windows with same name but not title
|
1139
1138
|
* nk_end - needs to be called at the end of the window building process to process scaling, scrollbars and general cleanup
|
1140
1139
|
*
|
1141
1140
|
* nk_window_find - finds and returns the window with give name
|
@@ -1144,7 +1143,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|
1144
1143
|
* nk_window_get_size - returns the size with width and height of the currently processed window
|
1145
1144
|
* nk_window_get_width - returns the width of the currently processed window
|
1146
1145
|
* nk_window_get_height - returns the height of the currently processed window
|
1147
|
-
* nk_window_get_panel - returns the underlying panel which contains all processing state of the
|
1146
|
+
* nk_window_get_panel - returns the underlying panel which contains all processing state of the current window
|
1148
1147
|
* nk_window_get_content_region - returns the position and size of the currently visible and non-clipped space inside the currently processed window
|
1149
1148
|
* nk_window_get_content_region_min - returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window
|
1150
1149
|
* nk_window_get_content_region_max - returns the upper rectangle position of the currently visible and non-clipped space inside the currently processed window
|
@@ -1157,7 +1156,7 @@ NK_API const struct nk_draw_command* nk__draw_next(const struct nk_draw_command*
|
|
1157
1156
|
* nk_window_is_hidden - returns if the currently processed window was hidden
|
1158
1157
|
* nk_window_is_active - same as nk_window_has_focus for some reason
|
1159
1158
|
* nk_window_is_hovered - returns if the currently processed window is currently being hovered by mouse
|
1160
|
-
* nk_window_is_any_hovered - return if any
|
1159
|
+
* nk_window_is_any_hovered - return if any window currently hovered
|
1161
1160
|
* nk_item_is_any_active - returns if any window or widgets is currently hovered or active
|
1162
1161
|
*
|
1163
1162
|
* nk_window_set_bounds - updates position and size of the currently processed window
|
@@ -1187,16 +1186,16 @@ enum nk_panel_flags {
|
|
1187
1186
|
/* nk_begin - starts a new window; needs to be called every frame for every window (unless hidden) or otherwise the window gets removed
|
1188
1187
|
* Parameters:
|
1189
1188
|
* @ctx must point to an previously initialized `nk_context` struct
|
1190
|
-
* @title window title and identifier. Needs to be
|
1189
|
+
* @title window title and identifier. Needs to be persistent over frames to identify the window
|
1191
1190
|
* @bounds initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame
|
1192
1191
|
* @flags window flags defined in `enum nk_panel_flags` with a number of different window behaviors
|
1193
1192
|
* Return values:
|
1194
1193
|
* returns 1 if the window can be filled up with widgets from this point until `nk_end or 0 otherwise for example if minimized `*/
|
1195
1194
|
NK_API int nk_begin(struct nk_context *ctx, const char *title, struct nk_rect bounds, nk_flags flags);
|
1196
|
-
/* nk_begin_titled - extended window start with
|
1195
|
+
/* nk_begin_titled - extended window start with separated title and identifier to allow multiple windows with same name but not title
|
1197
1196
|
* Parameters:
|
1198
1197
|
* @ctx must point to an previously initialized `nk_context` struct
|
1199
|
-
* @name window identifier. Needs to be
|
1198
|
+
* @name window identifier. Needs to be persistent over frames to identify the window
|
1200
1199
|
* @title window title displayed inside header if flag `NK_WINDOW_TITLE` or either `NK_WINDOW_CLOSABLE` or `NK_WINDOW_MINIMIZED` was set
|
1201
1200
|
* @bounds initial position and window size. However if you do not define `NK_WINDOW_SCALABLE` or `NK_WINDOW_MOVABLE` you can set window position and size every frame
|
1202
1201
|
* @flags window flags defined in `enum nk_panel_flags` with a number of different window behaviors
|
@@ -1213,7 +1212,7 @@ NK_API void nk_end(struct nk_context *ctx);
|
|
1213
1212
|
* @ctx must point to an previously initialized `nk_context` struct
|
1214
1213
|
* @name window identifier
|
1215
1214
|
* Return values:
|
1216
|
-
* returns a `nk_window` struct pointing to the
|
1215
|
+
* returns a `nk_window` struct pointing to the identified window or 0 if no window with given name was found */
|
1217
1216
|
NK_API struct nk_window *nk_window_find(struct nk_context *ctx, const char *name);
|
1218
1217
|
/* nk_window_get_bounds - returns a rectangle with screen position and size of the currently processed window.
|
1219
1218
|
* IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`
|
@@ -1250,7 +1249,7 @@ NK_API float nk_window_get_width(const struct nk_context*);
|
|
1250
1249
|
* Return values:
|
1251
1250
|
* returns the window height */
|
1252
1251
|
NK_API float nk_window_get_height(const struct nk_context*);
|
1253
|
-
/* nk_window_get_panel - returns the underlying panel which contains all processing state of the
|
1252
|
+
/* nk_window_get_panel - returns the underlying panel which contains all processing state of the current window.
|
1254
1253
|
* IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`
|
1255
1254
|
* Parameters:
|
1256
1255
|
* @ctx must point to an previously initialized `nk_context` struct
|
@@ -1352,20 +1351,23 @@ NK_API int nk_item_is_any_active(struct nk_context*);
|
|
1352
1351
|
* IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`
|
1353
1352
|
* Parameters:
|
1354
1353
|
* @ctx must point to an previously initialized `nk_context` struct
|
1354
|
+
* @name of the window to modify both position and size
|
1355
1355
|
* @bounds points to a `nk_rect` struct with the new position and size of currently active window */
|
1356
|
-
NK_API void nk_window_set_bounds(struct nk_context*, struct nk_rect bounds);
|
1356
|
+
NK_API void nk_window_set_bounds(struct nk_context*, const char *name, struct nk_rect bounds);
|
1357
1357
|
/* nk_window_set_position - updates position of the currently processed window
|
1358
1358
|
* IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`
|
1359
1359
|
* Parameters:
|
1360
1360
|
* @ctx must point to an previously initialized `nk_context` struct
|
1361
|
+
* @name of the window to modify position of
|
1361
1362
|
* @pos points to a `nk_vec2` struct with the new position of currently active window */
|
1362
|
-
NK_API void nk_window_set_position(struct nk_context*, struct nk_vec2 pos);
|
1363
|
+
NK_API void nk_window_set_position(struct nk_context*, const char *name, struct nk_vec2 pos);
|
1363
1364
|
/* nk_window_set_size - updates size of the currently processed window
|
1364
1365
|
* IMPORTANT: only call this function between calls `nk_begin_xxx` and `nk_end`
|
1365
1366
|
* Parameters:
|
1366
1367
|
* @ctx must point to an previously initialized `nk_context` struct
|
1367
|
-
* @
|
1368
|
-
|
1368
|
+
* @name of the window to modify size of
|
1369
|
+
* @size points to a `nk_vec2` struct with the new size of currently active window */
|
1370
|
+
NK_API void nk_window_set_size(struct nk_context*, const char *name, struct nk_vec2);
|
1369
1371
|
/* nk_window_set_focus - sets the window with given name as active
|
1370
1372
|
* Parameters:
|
1371
1373
|
* @ctx must point to an previously initialized `nk_context` struct
|
@@ -1386,7 +1388,7 @@ NK_API void nk_window_collapse(struct nk_context*, const char *name, enum nk_col
|
|
1386
1388
|
* @ctx must point to an previously initialized `nk_context` struct
|
1387
1389
|
* @name of the window to be either collapse or maximize
|
1388
1390
|
* @state the window should be put into
|
1389
|
-
* @condition that has to be true to actually commit the
|
1391
|
+
* @condition that has to be true to actually commit the collapse state change */
|
1390
1392
|
NK_API void nk_window_collapse_if(struct nk_context*, const char *name, enum nk_collapse_states, int cond);
|
1391
1393
|
/* nk_window_show - updates visibility state of a window with given name
|
1392
1394
|
* Parameters:
|
@@ -1410,30 +1412,39 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1410
1412
|
* While in this particular implementation there are five different APIs for layouting
|
1411
1413
|
* each with different trade offs between control and ease of use.
|
1412
1414
|
*
|
1413
|
-
* All layouting
|
1415
|
+
* All layouting methods in this library are based around the concept of a row.
|
1414
1416
|
* A row has a height the window content grows by and a number of columns and each
|
1415
1417
|
* layouting method specifies how each widget is placed inside the row.
|
1416
1418
|
* After a row has been allocated by calling a layouting functions and then
|
1417
1419
|
* filled with widgets will advance an internal pointer over the allocated row.
|
1418
1420
|
*
|
1419
|
-
* To
|
1420
|
-
* and each
|
1421
|
+
* To actually define a layout you just call the appropriate layouting function
|
1422
|
+
* and each subsequent widget call will place the widget as specified. Important
|
1421
1423
|
* here is that if you define more widgets then columns defined inside the layout
|
1422
1424
|
* functions it will allocate the next row without you having to make another layouting
|
1423
1425
|
* call.
|
1424
1426
|
*
|
1425
1427
|
* Biggest limitation with using all these APIs outside the `nk_layout_space_xxx` API
|
1426
1428
|
* is that you have to define the row height for each. However the row height
|
1427
|
-
* often depends on the height of the font.
|
1428
|
-
*
|
1429
|
-
*
|
1430
|
-
*
|
1429
|
+
* often depends on the height of the font.
|
1430
|
+
*
|
1431
|
+
* To fix that internally nuklear uses a minimum row height that is set to the
|
1432
|
+
* height plus padding of currently active font and overwrites the row height
|
1433
|
+
* value if zero.
|
1434
|
+
*
|
1435
|
+
* If you manually want to change the minimum row height then
|
1436
|
+
* use nk_layout_set_min_row_height, and use nk_layout_reset_min_row_height to
|
1437
|
+
* reset it back to be derived from font height.
|
1438
|
+
*
|
1439
|
+
* Also if you change the font in nuklear it will automatically change the minimum
|
1440
|
+
* row height for you and. This means if you change the font but still want
|
1441
|
+
* a minimum row height smaller than the font you have to repush your value.
|
1431
1442
|
*
|
1432
1443
|
* For actually more advanced UI I would even recommend using the `nk_layout_space_xxx`
|
1433
1444
|
* layouting method in combination with a cassowary constraint solver (there are
|
1434
1445
|
* some versions on github with permissive license model) to take over all control over widget
|
1435
1446
|
* layouting yourself. However for quick and dirty layouting using all the other layouting
|
1436
|
-
* functions
|
1447
|
+
* functions should be fine.
|
1437
1448
|
*
|
1438
1449
|
* Usage
|
1439
1450
|
* -------------------
|
@@ -1458,6 +1469,11 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1458
1469
|
* // second row with same parameter as defined above
|
1459
1470
|
* nk_widget(...);
|
1460
1471
|
* nk_widget(...);
|
1472
|
+
*
|
1473
|
+
* // third row uses 0 for height which will use auto layouting
|
1474
|
+
* nk_layout_row_dynamic(&ctx, 0, 2);
|
1475
|
+
* nk_widget(...);
|
1476
|
+
* nk_widget(...);
|
1461
1477
|
* }
|
1462
1478
|
* nk_end(...);
|
1463
1479
|
*
|
@@ -1475,13 +1491,18 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1475
1491
|
* // second row with same parameter as defined above
|
1476
1492
|
* nk_widget(...);
|
1477
1493
|
* nk_widget(...);
|
1494
|
+
*
|
1495
|
+
* // third row uses 0 for height which will use auto layouting
|
1496
|
+
* nk_layout_row_static(&ctx, 0, 80, 2);
|
1497
|
+
* nk_widget(...);
|
1498
|
+
* nk_widget(...);
|
1478
1499
|
* }
|
1479
1500
|
* nk_end(...);
|
1480
1501
|
*
|
1481
1502
|
* 3.) nk_layout_row_xxx
|
1482
1503
|
* A little bit more advanced layouting API are functions `nk_layout_row_begin`,
|
1483
1504
|
* `nk_layout_row_push` and `nk_layout_row_end`. They allow to directly
|
1484
|
-
* specify each column pixel or window ratio in a row. It
|
1505
|
+
* specify each column pixel or window ratio in a row. It supports either
|
1485
1506
|
* directly setting per column pixel width or widget window ratio but not
|
1486
1507
|
* both. Furthermore it is a immediate mode API so each value is directly
|
1487
1508
|
* pushed before calling a widget. Therefore the layout is not automatically
|
@@ -1503,11 +1524,19 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1503
1524
|
* nk_layout_row_push(ctx, 0.75f);
|
1504
1525
|
* nk_widget(...);
|
1505
1526
|
* nk_layout_row_end(ctx);
|
1527
|
+
*
|
1528
|
+
* // third row with auto generated height: composed of two widgets with window ratio 0.25 and 0.75
|
1529
|
+
* nk_layout_row_begin(ctx, NK_DYNAMIC, 0, 2);
|
1530
|
+
* nk_layout_row_push(ctx, 0.25f);
|
1531
|
+
* nk_widget(...);
|
1532
|
+
* nk_layout_row_push(ctx, 0.75f);
|
1533
|
+
* nk_widget(...);
|
1534
|
+
* nk_layout_row_end(ctx);
|
1506
1535
|
* }
|
1507
1536
|
* nk_end(...);
|
1508
1537
|
*
|
1509
1538
|
* 4.) nk_layout_row
|
1510
|
-
* The
|
1539
|
+
* The array counterpart to API nk_layout_row_xxx is the single nk_layout_row
|
1511
1540
|
* functions. Instead of pushing either pixel or window ratio for every widget
|
1512
1541
|
* it allows to define it by array. The trade of for less control is that
|
1513
1542
|
* `nk_layout_row` is automatically repeating. Otherwise the behavior is the
|
@@ -1529,6 +1558,14 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1529
1558
|
* nk_widget(...);
|
1530
1559
|
* nk_widget(...);
|
1531
1560
|
* nk_widget(...);
|
1561
|
+
*
|
1562
|
+
* // two rows with auto generated height composed of two widgets with window ratio 0.25 and 0.75
|
1563
|
+
* const float ratio[] = {0.25, 0.75};
|
1564
|
+
* nk_layout_row(ctx, NK_DYNAMIC, 30, 2, ratio);
|
1565
|
+
* nk_widget(...);
|
1566
|
+
* nk_widget(...);
|
1567
|
+
* nk_widget(...);
|
1568
|
+
* nk_widget(...);
|
1532
1569
|
* }
|
1533
1570
|
* nk_end(...);
|
1534
1571
|
*
|
@@ -1541,8 +1578,8 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1541
1578
|
* one is the static widget size specifier with fixed widget pixel width. They do
|
1542
1579
|
* not grow if the row grows and will always stay the same. The second size
|
1543
1580
|
* specifier is nk_layout_row_template_push_variable which defines a
|
1544
|
-
*
|
1545
|
-
* by other widgets. Finally there are dynamic widgets which are
|
1581
|
+
* minimum widget size but it also can grow if more space is available not taken
|
1582
|
+
* by other widgets. Finally there are dynamic widgets which are completely flexible
|
1546
1583
|
* and unlike variable widgets can even shrink to zero if not enough space
|
1547
1584
|
* is provided.
|
1548
1585
|
*
|
@@ -1554,9 +1591,14 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1554
1591
|
* nk_layout_row_template_push_static(ctx, 80);
|
1555
1592
|
* nk_layout_row_template_end(ctx);
|
1556
1593
|
*
|
1557
|
-
* nk_widget(...); // dynamic widget
|
1594
|
+
* nk_widget(...); // dynamic widget can go to zero if not enough space
|
1558
1595
|
* nk_widget(...); // variable widget with min 80 pixel but can grow bigger if enough space
|
1559
1596
|
* nk_widget(...); // static widget with fixed 80 pixel width
|
1597
|
+
*
|
1598
|
+
* // second row same layout
|
1599
|
+
* nk_widget(...);
|
1600
|
+
* nk_widget(...);
|
1601
|
+
* nk_widget(...);
|
1560
1602
|
* }
|
1561
1603
|
* nk_end(...);
|
1562
1604
|
*
|
@@ -1564,9 +1606,9 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1564
1606
|
* Finally the most flexible API directly allows you to place widgets inside the
|
1565
1607
|
* window. The space layout API is an immediate mode API which does not support
|
1566
1608
|
* row auto repeat and directly sets position and size of a widget. Position
|
1567
|
-
* and size hereby can be either specified as ratio of
|
1609
|
+
* and size hereby can be either specified as ratio of allocated space or
|
1568
1610
|
* allocated space local position and pixel size. Since this API is quite
|
1569
|
-
*
|
1611
|
+
* powerful there are a number of utility functions to get the available space
|
1570
1612
|
* and convert between local allocated space and screen space.
|
1571
1613
|
*
|
1572
1614
|
* if (nk_begin_xxx(...) {
|
@@ -1589,36 +1631,62 @@ NK_API void nk_window_show_if(struct nk_context*, const char *name, enum nk_show
|
|
1589
1631
|
*
|
1590
1632
|
* Reference
|
1591
1633
|
* -------------------
|
1592
|
-
*
|
1593
|
-
*
|
1594
|
-
*
|
1595
|
-
*
|
1596
|
-
*
|
1597
|
-
*
|
1598
|
-
*
|
1599
|
-
*
|
1600
|
-
*
|
1601
|
-
*
|
1602
|
-
*
|
1603
|
-
*
|
1604
|
-
*
|
1605
|
-
*
|
1606
|
-
*
|
1607
|
-
*
|
1608
|
-
*
|
1609
|
-
*
|
1610
|
-
*
|
1611
|
-
*
|
1612
|
-
*
|
1613
|
-
*
|
1614
|
-
*
|
1634
|
+
* nk_layout_set_min_row_height - set the currently used minimum row height to a specified value
|
1635
|
+
* nk_layout_reset_min_row_height - resets the currently used minimum row height to font height
|
1636
|
+
*
|
1637
|
+
* nk_layout_widget_bounds - calculates current width a static layout row can fit inside a window
|
1638
|
+
* nk_layout_ratio_from_pixel - utility functions to calculate window ratio from pixel size
|
1639
|
+
*
|
1640
|
+
* nk_layout_row_dynamic - current layout is divided into n same sized growing columns
|
1641
|
+
* nk_layout_row_static - current layout is divided into n same fixed sized columns
|
1642
|
+
* nk_layout_row_begin - starts a new row with given height and number of columns
|
1643
|
+
* nk_layout_row_push - pushes another column with given size or window ratio
|
1644
|
+
* nk_layout_row_end - finished previously started row
|
1645
|
+
* nk_layout_row - specifies row columns in array as either window ratio or size
|
1646
|
+
*
|
1647
|
+
* nk_layout_row_template_begin - begins the row template declaration
|
1648
|
+
* nk_layout_row_template_push_dynamic - adds a dynamic column that dynamically grows and can go to zero if not enough space
|
1649
|
+
* nk_layout_row_template_push_variable - adds a variable column that dynamically grows but does not shrink below specified pixel width
|
1650
|
+
* nk_layout_row_template_push_static - adds a static column that does not grow and will always have the same size
|
1651
|
+
* nk_layout_row_template_end - marks the end of the row template
|
1652
|
+
*
|
1653
|
+
* nk_layout_space_begin - begins a new layouting space that allows to specify each widgets position and size
|
1654
|
+
* nk_layout_space_push - pushes position and size of the next widget in own coordinate space either as pixel or ratio
|
1655
|
+
* nk_layout_space_end - marks the end of the layouting space
|
1656
|
+
*
|
1657
|
+
* nk_layout_space_bounds - callable after nk_layout_space_begin and returns total space allocated
|
1658
|
+
* nk_layout_space_to_screen - converts vector from nk_layout_space coordinate space into screen space
|
1659
|
+
* nk_layout_space_to_local - converts vector from screen space into nk_layout_space coordinates
|
1660
|
+
* nk_layout_space_rect_to_screen - converts rectangle from nk_layout_space coordinate space into screen space
|
1661
|
+
* nk_layout_space_rect_to_local - converts rectangle from screen space into nk_layout_space coordinates
|
1615
1662
|
*/
|
1663
|
+
/* nk_layout_set_min_row_height - sets the currently used minimum row height.
|
1664
|
+
* IMPORTANT: The passed height needs to include both your preferred row height
|
1665
|
+
* as well as padding. No internal padding is added.
|
1666
|
+
* Parameters:
|
1667
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`
|
1668
|
+
* @height new minimum row height to be used for auto generating the row height */
|
1669
|
+
NK_API void nk_layout_set_min_row_height(struct nk_context*, float height);
|
1670
|
+
/* nk_layout_reset_min_row_height - Reset the currently used minimum row height
|
1671
|
+
* back to font height + text padding + additional padding (style_window.min_row_height_padding)
|
1672
|
+
* Parameters:
|
1673
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx` */
|
1674
|
+
NK_API void nk_layout_reset_min_row_height(struct nk_context*);
|
1675
|
+
/* nk_layout_widget_bounds - returns the width of the next row allocate by one of the layouting functions
|
1676
|
+
* Parameters:
|
1677
|
+
* @ctx must point to an previously initialized `nk_context` */
|
1678
|
+
NK_API struct nk_rect nk_layout_widget_bounds(struct nk_context*);
|
1679
|
+
/* nk_layout_ratio_from_pixel - utility functions to calculate window ratio from pixel size
|
1680
|
+
* Parameters:
|
1681
|
+
* @ctx must point to an previously initialized `nk_context`
|
1682
|
+
* @pixel_width to convert to window ratio */
|
1683
|
+
NK_API float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width);
|
1616
1684
|
/* nk_layout_row_dynamic - Sets current row layout to share horizontal space
|
1617
1685
|
* between @cols number of widgets evenly. Once called all subsequent widget
|
1618
1686
|
* calls greater than @cols will allocate a new row with same layout.
|
1619
1687
|
* Parameters:
|
1620
1688
|
* @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`
|
1621
|
-
* @
|
1689
|
+
* @row_height holds height of each widget in row or zero for auto layouting
|
1622
1690
|
* @cols number of widget inside row */
|
1623
1691
|
NK_API void nk_layout_row_dynamic(struct nk_context *ctx, float height, int cols);
|
1624
1692
|
/* nk_layout_row_static - Sets current row layout to fill @cols number of widgets
|
@@ -1634,7 +1702,7 @@ NK_API void nk_layout_row_static(struct nk_context *ctx, float height, int item_
|
|
1634
1702
|
* Parameters:
|
1635
1703
|
* @ctx must point to an previously initialized `nk_context` struct after call `nk_begin_xxx`
|
1636
1704
|
* @fmt either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns
|
1637
|
-
* @row_height holds
|
1705
|
+
* @row_height holds height of each widget in row or zero for auto layouting
|
1638
1706
|
* @cols number of widget inside row */
|
1639
1707
|
NK_API void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fmt, float row_height, int cols);
|
1640
1708
|
/* nk_layout_row_push - Specifies either window ratio or width of a single column
|
@@ -1642,26 +1710,80 @@ NK_API void nk_layout_row_begin(struct nk_context *ctx, enum nk_layout_format fm
|
|
1642
1710
|
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_begin`
|
1643
1711
|
* @value either a window ratio or fixed width depending on @fmt in previous `nk_layout_row_begin` call */
|
1644
1712
|
NK_API void nk_layout_row_push(struct nk_context*, float value);
|
1713
|
+
/* nk_layout_row_end - finished previously started row
|
1714
|
+
* Parameters:
|
1715
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_begin` */
|
1645
1716
|
NK_API void nk_layout_row_end(struct nk_context*);
|
1717
|
+
/* nk_layout_row - specifies row columns in array as either window ratio or size
|
1718
|
+
* Parameters:
|
1719
|
+
* @ctx must point to an previously initialized `nk_context`
|
1720
|
+
* @fmt either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns
|
1721
|
+
* @row_height holds height of each widget in row or zero for auto layouting
|
1722
|
+
* @cols number of widget inside row */
|
1646
1723
|
NK_API void nk_layout_row(struct nk_context*, enum nk_layout_format, float height, int cols, const float *ratio);
|
1647
|
-
|
1648
|
-
|
1724
|
+
/* nk_layout_row_template_begin - Begins the row template declaration
|
1725
|
+
* Parameters:
|
1726
|
+
* @ctx must point to an previously initialized `nk_context` struct
|
1727
|
+
* @row_height holds height of each widget in row or zero for auto layouting */
|
1728
|
+
NK_API void nk_layout_row_template_begin(struct nk_context*, float row_height);
|
1729
|
+
/* nk_layout_row_template_push_dynamic - adds a dynamic column that dynamically grows and can go to zero if not enough space
|
1730
|
+
* Parameters:
|
1731
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin` */
|
1649
1732
|
NK_API void nk_layout_row_template_push_dynamic(struct nk_context*);
|
1733
|
+
/* nk_layout_row_template_push_variable - adds a variable column that dynamically grows but does not shrink below specified pixel width
|
1734
|
+
* Parameters:
|
1735
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin`
|
1736
|
+
* @min_width holds the minimum pixel width the next column must be */
|
1650
1737
|
NK_API void nk_layout_row_template_push_variable(struct nk_context*, float min_width);
|
1738
|
+
/* nk_layout_row_template_push_static - adds a static column that does not grow and will always have the same size
|
1739
|
+
* Parameters:
|
1740
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin`
|
1741
|
+
* @width holds the absolute pixel width value the next column must be */
|
1651
1742
|
NK_API void nk_layout_row_template_push_static(struct nk_context*, float width);
|
1743
|
+
/* nk_layout_row_template_end - marks the end of the row template
|
1744
|
+
* Parameters:
|
1745
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_row_template_begin` */
|
1652
1746
|
NK_API void nk_layout_row_template_end(struct nk_context*);
|
1653
|
-
|
1747
|
+
/* nk_layout_space_begin - begins a new layouting space that allows to specify each widgets position and size.
|
1748
|
+
* Parameters:
|
1749
|
+
* @ctx must point to an previously initialized `nk_context` struct
|
1750
|
+
* @fmt either `NK_DYNAMIC` for window ratio or `NK_STATIC` for fixed size columns
|
1751
|
+
* @row_height holds height of each widget in row or zero for auto layouting
|
1752
|
+
* @widget_count number of widgets inside row */
|
1654
1753
|
NK_API void nk_layout_space_begin(struct nk_context*, enum nk_layout_format, float height, int widget_count);
|
1754
|
+
/* nk_layout_space_push - pushes position and size of the next widget in own coordinate space either as pixel or ratio
|
1755
|
+
* Parameters:
|
1756
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`
|
1757
|
+
* @bounds position and size in laoyut space local coordinates */
|
1655
1758
|
NK_API void nk_layout_space_push(struct nk_context*, struct nk_rect);
|
1759
|
+
/* nk_layout_space_end - marks the end of the layout space
|
1760
|
+
* Parameters:
|
1761
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` */
|
1656
1762
|
NK_API void nk_layout_space_end(struct nk_context*);
|
1657
|
-
|
1658
|
-
|
1763
|
+
/* nk_layout_space_bounds - returns total space allocated for `nk_layout_space`
|
1764
|
+
* Parameters:
|
1765
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin` */
|
1659
1766
|
NK_API struct nk_rect nk_layout_space_bounds(struct nk_context*);
|
1767
|
+
/* nk_layout_space_to_screen - converts vector from nk_layout_space coordinate space into screen space
|
1768
|
+
* Parameters:
|
1769
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`
|
1770
|
+
* @vec position to convert from layout space into screen coordinate space */
|
1660
1771
|
NK_API struct nk_vec2 nk_layout_space_to_screen(struct nk_context*, struct nk_vec2);
|
1772
|
+
/* nk_layout_space_to_screen - converts vector from layout space into screen space
|
1773
|
+
* Parameters:
|
1774
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`
|
1775
|
+
* @vec position to convert from screen space into layout coordinate space */
|
1661
1776
|
NK_API struct nk_vec2 nk_layout_space_to_local(struct nk_context*, struct nk_vec2);
|
1777
|
+
/* nk_layout_space_rect_to_screen - converts rectangle from screen space into layout space
|
1778
|
+
* Parameters:
|
1779
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`
|
1780
|
+
* @bounds rectangle to convert from layout space into screen space */
|
1662
1781
|
NK_API struct nk_rect nk_layout_space_rect_to_screen(struct nk_context*, struct nk_rect);
|
1782
|
+
/* nk_layout_space_rect_to_local - converts rectangle from layout space into screen space
|
1783
|
+
* Parameters:
|
1784
|
+
* @ctx must point to an previously initialized `nk_context` struct after call `nk_layout_space_begin`
|
1785
|
+
* @bounds rectangle to convert from screen space into layout space */
|
1663
1786
|
NK_API struct nk_rect nk_layout_space_rect_to_local(struct nk_context*, struct nk_rect);
|
1664
|
-
NK_API float nk_layout_ratio_from_pixel(struct nk_context*, float pixel_width);
|
1665
1787
|
/* =============================================================================
|
1666
1788
|
*
|
1667
1789
|
* GROUP
|
@@ -1984,6 +2106,9 @@ NK_API void nk_contextual_end(struct nk_context*);
|
|
1984
2106
|
*
|
1985
2107
|
* ============================================================================= */
|
1986
2108
|
NK_API void nk_tooltip(struct nk_context*, const char*);
|
2109
|
+
#ifdef NK_INCLUDE_STANDARD_VARARGS
|
2110
|
+
NK_API void nk_tooltipf(struct nk_context*, const char*, ...);
|
2111
|
+
#endif
|
1987
2112
|
NK_API int nk_tooltip_begin(struct nk_context*, float width);
|
1988
2113
|
NK_API void nk_tooltip_end(struct nk_context*);
|
1989
2114
|
/* =============================================================================
|
@@ -2201,7 +2326,7 @@ NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune
|
|
2201
2326
|
different ways to use the font atlas. The first two will use your font
|
2202
2327
|
handling scheme and only requires essential data to run nuklear. The next
|
2203
2328
|
slightly more advanced features is font handling with vertex buffer output.
|
2204
|
-
Finally the most complex API wise is using
|
2329
|
+
Finally the most complex API wise is using nuklear's font baking API.
|
2205
2330
|
|
2206
2331
|
1.) Using your own implementation without vertex buffer output
|
2207
2332
|
--------------------------------------------------------------
|
@@ -2274,7 +2399,7 @@ NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune
|
|
2274
2399
|
------------------------------------
|
2275
2400
|
The final approach if you do not have a font handling functionality or don't
|
2276
2401
|
want to use it in this library is by using the optional font baker.
|
2277
|
-
The font baker
|
2402
|
+
The font baker APIs can be used to create a font plus font atlas texture
|
2278
2403
|
and can be used with or without the vertex buffer output.
|
2279
2404
|
|
2280
2405
|
It still uses the `nk_user_font` struct and the two different approaches
|
@@ -2289,7 +2414,7 @@ NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune
|
|
2289
2414
|
memory is temporary and therefore can be freed directly after the baking process
|
2290
2415
|
is over or permanent you can call `nk_font_atlas_init`.
|
2291
2416
|
|
2292
|
-
After
|
2417
|
+
After successfully initializing the font baker you can add Truetype(.ttf) fonts from
|
2293
2418
|
different sources like memory or from file by calling one of the `nk_font_atlas_add_xxx`.
|
2294
2419
|
functions. Adding font will permanently store each font, font config and ttf memory block(!)
|
2295
2420
|
inside the font atlas and allows to reuse the font atlas. If you don't want to reuse
|
@@ -2297,7 +2422,7 @@ NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune
|
|
2297
2422
|
`nk_font_atlas_cleanup` after the baking process is over (after calling nk_font_atlas_end).
|
2298
2423
|
|
2299
2424
|
As soon as you added all fonts you wanted you can now start the baking process
|
2300
|
-
for every selected
|
2425
|
+
for every selected glyph to image by calling `nk_font_atlas_bake`.
|
2301
2426
|
The baking process returns image memory, width and height which can be used to
|
2302
2427
|
either create your own image object or upload it to any graphics library.
|
2303
2428
|
No matter which case you finally have to call `nk_font_atlas_end` which
|
@@ -2331,7 +2456,7 @@ NK_API const char* nk_utf_at(const char *buffer, int length, int index, nk_rune
|
|
2331
2456
|
I would suggest reading some of my examples `example/` to get a grip on how
|
2332
2457
|
to use the font atlas. There are a number of details I left out. For example
|
2333
2458
|
how to merge fonts, configure a font with `nk_font_config` to use other languages,
|
2334
|
-
use another texture
|
2459
|
+
use another texture coordinate format and a lot more:
|
2335
2460
|
|
2336
2461
|
struct nk_font_config cfg = nk_font_config(font_pixel_height);
|
2337
2462
|
cfg.merge_mode = nk_false or nk_true;
|
@@ -2346,7 +2471,7 @@ typedef void(*nk_query_font_glyph_f)(nk_handle handle, float font_height,
|
|
2346
2471
|
struct nk_user_font_glyph *glyph,
|
2347
2472
|
nk_rune codepoint, nk_rune next_codepoint);
|
2348
2473
|
|
2349
|
-
#
|
2474
|
+
#if defined(NK_INCLUDE_VERTEX_BUFFER_OUTPUT) || defined(NK_INCLUDE_SOFTWARE_FONT)
|
2350
2475
|
struct nk_user_font_glyph {
|
2351
2476
|
struct nk_vec2 uv[2];
|
2352
2477
|
/* texture coordinates */
|
@@ -2380,6 +2505,7 @@ enum nk_font_coord_type {
|
|
2380
2505
|
NK_COORD_PIXEL /* texture coordinates inside font glyphs are in absolute pixel */
|
2381
2506
|
};
|
2382
2507
|
|
2508
|
+
struct nk_font;
|
2383
2509
|
struct nk_baked_font {
|
2384
2510
|
float height;
|
2385
2511
|
/* height of the font */
|
@@ -2425,6 +2551,8 @@ struct nk_font_config {
|
|
2425
2551
|
/* font to setup in the baking process: NOTE: not needed for font atlas */
|
2426
2552
|
nk_rune fallback_glyph;
|
2427
2553
|
/* fallback glyph to use if a given rune is not found */
|
2554
|
+
struct nk_font_config *n;
|
2555
|
+
struct nk_font_config *p;
|
2428
2556
|
};
|
2429
2557
|
|
2430
2558
|
struct nk_font_glyph {
|
@@ -2666,7 +2794,7 @@ NK_API int nk_str_len_char(struct nk_str*);
|
|
2666
2794
|
* First of is the most basic way of just providing a simple char array with
|
2667
2795
|
* string length. This method is probably the easiest way of handling simple
|
2668
2796
|
* user text input. Main upside is complete control over memory while the biggest
|
2669
|
-
* downside in
|
2797
|
+
* downside in comparison with the other two approaches is missing undo/redo.
|
2670
2798
|
*
|
2671
2799
|
* For UIs that require undo/redo the second way was created. It is based on
|
2672
2800
|
* a fixed size nk_text_edit struct, which has an internal undo/redo stack.
|
@@ -2813,8 +2941,8 @@ NK_API void nk_textedit_redo(struct nk_text_edit*);
|
|
2813
2941
|
but also returns the state of the widget space. If your widget is not seen and does
|
2814
2942
|
not have to be updated it is '0' and you can just return. If it only has
|
2815
2943
|
to be drawn the state will be `NK_WIDGET_ROM` otherwise you can do both
|
2816
|
-
update and draw your widget. The reason for
|
2817
|
-
update what is actually
|
2944
|
+
update and draw your widget. The reason for separating is to only draw and
|
2945
|
+
update what is actually necessary which is crucial for performance.
|
2818
2946
|
*/
|
2819
2947
|
enum nk_command_type {
|
2820
2948
|
NK_COMMAND_NOP,
|
@@ -3186,6 +3314,9 @@ struct nk_draw_list {
|
|
3186
3314
|
unsigned int path_count;
|
3187
3315
|
unsigned int path_offset;
|
3188
3316
|
|
3317
|
+
enum nk_anti_aliasing line_AA;
|
3318
|
+
enum nk_anti_aliasing shape_AA;
|
3319
|
+
|
3189
3320
|
#ifdef NK_INCLUDE_COMMAND_USERDATA
|
3190
3321
|
nk_handle userdata;
|
3191
3322
|
#endif
|
@@ -3193,7 +3324,7 @@ struct nk_draw_list {
|
|
3193
3324
|
|
3194
3325
|
/* draw list */
|
3195
3326
|
NK_API void nk_draw_list_init(struct nk_draw_list*);
|
3196
|
-
NK_API void nk_draw_list_setup(struct nk_draw_list*, const struct nk_convert_config*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements);
|
3327
|
+
NK_API void nk_draw_list_setup(struct nk_draw_list*, const struct nk_convert_config*, struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements, enum nk_anti_aliasing line_aa,enum nk_anti_aliasing shape_aa);
|
3197
3328
|
NK_API void nk_draw_list_clear(struct nk_draw_list*);
|
3198
3329
|
|
3199
3330
|
/* drawing */
|
@@ -3633,6 +3764,7 @@ struct nk_style_window {
|
|
3633
3764
|
float group_border;
|
3634
3765
|
float tooltip_border;
|
3635
3766
|
float popup_border;
|
3767
|
+
float min_row_height_padding;
|
3636
3768
|
|
3637
3769
|
float rounding;
|
3638
3770
|
struct nk_vec2 spacing;
|
@@ -3735,6 +3867,7 @@ struct nk_row_layout {
|
|
3735
3867
|
enum nk_panel_row_layout_type type;
|
3736
3868
|
int index;
|
3737
3869
|
float height;
|
3870
|
+
float min_height;
|
3738
3871
|
int columns;
|
3739
3872
|
const float *ratio;
|
3740
3873
|
float item_width;
|
@@ -3861,8 +3994,7 @@ struct nk_window {
|
|
3861
3994
|
unsigned int scrolled;
|
3862
3995
|
|
3863
3996
|
struct nk_table *tables;
|
3864
|
-
unsigned
|
3865
|
-
unsigned short table_size;
|
3997
|
+
unsigned int table_count;
|
3866
3998
|
|
3867
3999
|
/* window list hooks */
|
3868
4000
|
struct nk_window *next;
|
@@ -3965,10 +4097,11 @@ struct nk_configuration_stacks {
|
|
3965
4097
|
* CONTEXT
|
3966
4098
|
* =============================================================*/
|
3967
4099
|
#define NK_VALUE_PAGE_CAPACITY \
|
3968
|
-
((NK_MAX(sizeof(struct nk_window),sizeof(struct nk_panel)) / sizeof(nk_uint)) / 2)
|
4100
|
+
(((NK_MAX(sizeof(struct nk_window),sizeof(struct nk_panel)) / sizeof(nk_uint))) / 2)
|
3969
4101
|
|
3970
4102
|
struct nk_table {
|
3971
4103
|
unsigned int seq;
|
4104
|
+
unsigned int size;
|
3972
4105
|
nk_hash keys[NK_VALUE_PAGE_CAPACITY];
|
3973
4106
|
nk_uint values[NK_VALUE_PAGE_CAPACITY];
|
3974
4107
|
struct nk_table *next, *prev;
|
@@ -4109,14 +4242,14 @@ template<typename T, int size_diff> struct nk_helper{enum {value = size_diff};};
|
|
4109
4242
|
template<typename T> struct nk_helper<T,0>{enum {value = nk_alignof<T>::value};};
|
4110
4243
|
template<typename T> struct nk_alignof{struct Big {T x; char c;}; enum {
|
4111
4244
|
diff = sizeof(Big) - sizeof(T), value = nk_helper<Big, diff>::value};};
|
4112
|
-
#define NK_ALIGNOF(t) (nk_alignof<t>::value)
|
4245
|
+
#define NK_ALIGNOF(t) (nk_alignof<t>::value)
|
4113
4246
|
#elif defined(_MSC_VER)
|
4114
4247
|
#define NK_ALIGNOF(t) (__alignof(t))
|
4115
4248
|
#else
|
4116
4249
|
#define NK_ALIGNOF(t) ((char*)(&((struct {char c; t _h;}*)0)->_h) - (char*)0)
|
4117
4250
|
#endif
|
4118
4251
|
|
4119
|
-
#endif /*
|
4252
|
+
#endif /* NK_NUKLEAR_H_ */
|
4120
4253
|
/*
|
4121
4254
|
* ==============================================================
|
4122
4255
|
*
|
@@ -4246,7 +4379,7 @@ NK_GLOBAL const struct nk_color nk_yellow = {255,255,0,255};
|
|
4246
4379
|
----
|
4247
4380
|
For square root nuklear uses the famous fast inverse square root:
|
4248
4381
|
https://en.wikipedia.org/wiki/Fast_inverse_square_root with
|
4249
|
-
slightly tweaked magic constant. While on
|
4382
|
+
slightly tweaked magic constant. While on today's hardware it is
|
4250
4383
|
probably not faster it is still fast and accurate enough for
|
4251
4384
|
nuklear's use cases. IMPORTANT: this requires float format IEEE 754
|
4252
4385
|
|
@@ -4257,7 +4390,7 @@ NK_GLOBAL const struct nk_color nk_yellow = {255,255,0,255};
|
|
4257
4390
|
approximate exactly that range is that nuklear only needs sine and
|
4258
4391
|
cosine to generate circles which only requires that exact range.
|
4259
4392
|
In addition I used Remez instead of Taylor for additional precision:
|
4260
|
-
www.lolengine.net/blog/2011/12/21/better-function-
|
4393
|
+
www.lolengine.net/blog/2011/12/21/better-function-approximations.
|
4261
4394
|
|
4262
4395
|
The tool I used to generate constants for both sine and cosine
|
4263
4396
|
(it can actually approximate a lot more functions) can be
|
@@ -4764,7 +4897,7 @@ nk_strmatch_fuzzy_text(const char *str, int str_len,
|
|
4764
4897
|
const char *pattern, int *out_score)
|
4765
4898
|
{
|
4766
4899
|
/* Returns true if each character in pattern is found sequentially within str
|
4767
|
-
* if found then
|
4900
|
+
* if found then out_score is also set. Score value has no intrinsic meaning.
|
4768
4901
|
* Range varies with pattern. Can only compare scores with same search pattern. */
|
4769
4902
|
|
4770
4903
|
/* ------- scores --------- */
|
@@ -4942,7 +5075,7 @@ nk_iceilf(float x)
|
|
4942
5075
|
{
|
4943
5076
|
if (x >= 0) {
|
4944
5077
|
int i = (int)x;
|
4945
|
-
return i;
|
5078
|
+
return (x > i) ? i+1: i;
|
4946
5079
|
} else {
|
4947
5080
|
int t = (int)x;
|
4948
5081
|
float r = x - (float)t;
|
@@ -5513,7 +5646,7 @@ nk_file_load(const char* path, nk_size* siz, struct nk_allocator *alloc)
|
|
5513
5646
|
fclose(fd);
|
5514
5647
|
return 0;
|
5515
5648
|
}
|
5516
|
-
*siz = (nk_size)fread(buf,
|
5649
|
+
*siz = (nk_size)fread(buf, 1,*siz, fd);
|
5517
5650
|
fclose(fd);
|
5518
5651
|
return buf;
|
5519
5652
|
}
|
@@ -7216,7 +7349,7 @@ nk_stroke_line(struct nk_command_buffer *b, float x0, float y0,
|
|
7216
7349
|
{
|
7217
7350
|
struct nk_command_line *cmd;
|
7218
7351
|
NK_ASSERT(b);
|
7219
|
-
if (!b) return;
|
7352
|
+
if (!b || line_thickness <= 0) return;
|
7220
7353
|
cmd = (struct nk_command_line*)
|
7221
7354
|
nk_command_buffer_push(b, NK_COMMAND_LINE, sizeof(*cmd));
|
7222
7355
|
if (!cmd) return;
|
@@ -7235,7 +7368,7 @@ nk_stroke_curve(struct nk_command_buffer *b, float ax, float ay,
|
|
7235
7368
|
{
|
7236
7369
|
struct nk_command_curve *cmd;
|
7237
7370
|
NK_ASSERT(b);
|
7238
|
-
if (!b || col.a == 0) return;
|
7371
|
+
if (!b || col.a == 0 || line_thickness <= 0) return;
|
7239
7372
|
|
7240
7373
|
cmd = (struct nk_command_curve*)
|
7241
7374
|
nk_command_buffer_push(b, NK_COMMAND_CURVE, sizeof(*cmd));
|
@@ -7258,13 +7391,12 @@ nk_stroke_rect(struct nk_command_buffer *b, struct nk_rect rect,
|
|
7258
7391
|
{
|
7259
7392
|
struct nk_command_rect *cmd;
|
7260
7393
|
NK_ASSERT(b);
|
7261
|
-
if (!b || c.a == 0 || rect.w == 0 || rect.h == 0) return;
|
7394
|
+
if (!b || c.a == 0 || rect.w == 0 || rect.h == 0 || line_thickness <= 0) return;
|
7262
7395
|
if (b->use_clipping) {
|
7263
7396
|
const struct nk_rect *clip = &b->clip;
|
7264
7397
|
if (!NK_INTERSECT(rect.x, rect.y, rect.w, rect.h,
|
7265
7398
|
clip->x, clip->y, clip->w, clip->h)) return;
|
7266
7399
|
}
|
7267
|
-
|
7268
7400
|
cmd = (struct nk_command_rect*)
|
7269
7401
|
nk_command_buffer_push(b, NK_COMMAND_RECT, sizeof(*cmd));
|
7270
7402
|
if (!cmd) return;
|
@@ -7333,7 +7465,7 @@ nk_stroke_circle(struct nk_command_buffer *b, struct nk_rect r,
|
|
7333
7465
|
float line_thickness, struct nk_color c)
|
7334
7466
|
{
|
7335
7467
|
struct nk_command_circle *cmd;
|
7336
|
-
if (!b || r.w == 0 || r.h == 0) return;
|
7468
|
+
if (!b || r.w == 0 || r.h == 0 || line_thickness <= 0) return;
|
7337
7469
|
if (b->use_clipping) {
|
7338
7470
|
const struct nk_rect *clip = &b->clip;
|
7339
7471
|
if (!NK_INTERSECT(r.x, r.y, r.w, r.h, clip->x, clip->y, clip->w, clip->h))
|
@@ -7378,7 +7510,7 @@ nk_stroke_arc(struct nk_command_buffer *b, float cx, float cy, float radius,
|
|
7378
7510
|
float a_min, float a_max, float line_thickness, struct nk_color c)
|
7379
7511
|
{
|
7380
7512
|
struct nk_command_arc *cmd;
|
7381
|
-
if (!b || c.a == 0) return;
|
7513
|
+
if (!b || c.a == 0 || line_thickness <= 0) return;
|
7382
7514
|
cmd = (struct nk_command_arc*)
|
7383
7515
|
nk_command_buffer_push(b, NK_COMMAND_ARC, sizeof(*cmd));
|
7384
7516
|
if (!cmd) return;
|
@@ -7415,7 +7547,7 @@ nk_stroke_triangle(struct nk_command_buffer *b, float x0, float y0, float x1,
|
|
7415
7547
|
{
|
7416
7548
|
struct nk_command_triangle *cmd;
|
7417
7549
|
NK_ASSERT(b);
|
7418
|
-
if (!b || c.a == 0) return;
|
7550
|
+
if (!b || c.a == 0 || line_thickness <= 0) return;
|
7419
7551
|
if (b->use_clipping) {
|
7420
7552
|
const struct nk_rect *clip = &b->clip;
|
7421
7553
|
if (!NK_INBOX(x0, y0, clip->x, clip->y, clip->w, clip->h) &&
|
@@ -7474,7 +7606,7 @@ nk_stroke_polygon(struct nk_command_buffer *b, float *points, int point_count,
|
|
7474
7606
|
struct nk_command_polygon *cmd;
|
7475
7607
|
|
7476
7608
|
NK_ASSERT(b);
|
7477
|
-
if (!b || col.a == 0) return;
|
7609
|
+
if (!b || col.a == 0 || line_thickness <= 0) return;
|
7478
7610
|
size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;
|
7479
7611
|
cmd = (struct nk_command_polygon*) nk_command_buffer_push(b, NK_COMMAND_POLYGON, size);
|
7480
7612
|
if (!cmd) return;
|
@@ -7518,7 +7650,7 @@ nk_stroke_polyline(struct nk_command_buffer *b, float *points, int point_count,
|
|
7518
7650
|
struct nk_command_polyline *cmd;
|
7519
7651
|
|
7520
7652
|
NK_ASSERT(b);
|
7521
|
-
if (!b || col.a == 0) return;
|
7653
|
+
if (!b || col.a == 0 || line_thickness <= 0) return;
|
7522
7654
|
size = sizeof(*cmd) + sizeof(short) * 2 * (nk_size)point_count;
|
7523
7655
|
cmd = (struct nk_command_polyline*) nk_command_buffer_push(b, NK_COMMAND_POLYLINE, size);
|
7524
7656
|
if (!cmd) return;
|
@@ -7643,7 +7775,8 @@ nk_draw_list_init(struct nk_draw_list *list)
|
|
7643
7775
|
|
7644
7776
|
NK_API void
|
7645
7777
|
nk_draw_list_setup(struct nk_draw_list *canvas, const struct nk_convert_config *config,
|
7646
|
-
struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements
|
7778
|
+
struct nk_buffer *cmds, struct nk_buffer *vertices, struct nk_buffer *elements,
|
7779
|
+
enum nk_anti_aliasing line_aa, enum nk_anti_aliasing shape_aa)
|
7647
7780
|
{
|
7648
7781
|
NK_ASSERT(canvas);
|
7649
7782
|
NK_ASSERT(config);
|
@@ -7657,6 +7790,8 @@ nk_draw_list_setup(struct nk_draw_list *canvas, const struct nk_convert_config *
|
|
7657
7790
|
canvas->config = *config;
|
7658
7791
|
canvas->elements = elements;
|
7659
7792
|
canvas->vertices = vertices;
|
7793
|
+
canvas->line_AA = line_aa;
|
7794
|
+
canvas->shape_AA = shape_aa;
|
7660
7795
|
canvas->clip_rect = nk_null_rect;
|
7661
7796
|
}
|
7662
7797
|
|
@@ -7836,10 +7971,16 @@ nk_draw_list_push_image(struct nk_draw_list *list, nk_handle texture)
|
|
7836
7971
|
nk_draw_list_push_command(list, nk_null_rect, texture);
|
7837
7972
|
} else {
|
7838
7973
|
struct nk_draw_command *prev = nk_draw_list_command_last(list);
|
7839
|
-
if (prev->elem_count == 0)
|
7974
|
+
if (prev->elem_count == 0) {
|
7840
7975
|
prev->texture = texture;
|
7841
|
-
|
7842
|
-
|
7976
|
+
#ifdef NK_INCLUDE_COMMAND_USERDATA
|
7977
|
+
prev->userdata = list->userdata;
|
7978
|
+
#endif
|
7979
|
+
} else if (prev->texture.id != texture.id
|
7980
|
+
#ifdef NK_INCLUDE_COMMAND_USERDATA
|
7981
|
+
|| prev->userdata.id != list->userdata.id
|
7982
|
+
#endif
|
7983
|
+
) nk_draw_list_push_command(list, prev->clip_rect, texture);
|
7843
7984
|
}
|
7844
7985
|
}
|
7845
7986
|
|
@@ -8459,12 +8600,42 @@ nk_draw_list_path_arc_to(struct nk_draw_list *list, struct nk_vec2 center,
|
|
8459
8600
|
NK_ASSERT(list);
|
8460
8601
|
if (!list) return;
|
8461
8602
|
if (radius == 0.0f) return;
|
8462
|
-
|
8463
|
-
|
8464
|
-
|
8465
|
-
|
8603
|
+
|
8604
|
+
/* This algorithm for arc drawing relies on these two trigonometric identities[1]:
|
8605
|
+
sin(a + b) = sin(a) * cos(b) + cos(a) * sin(b)
|
8606
|
+
cos(a + b) = cos(a) * cos(b) - sin(a) * sin(b)
|
8607
|
+
|
8608
|
+
Two coordinates (x, y) of a point on a circle centered on
|
8609
|
+
the origin can be written in polar form as:
|
8610
|
+
x = r * cos(a)
|
8611
|
+
y = r * sin(a)
|
8612
|
+
where r is the radius of the circle,
|
8613
|
+
a is the angle between (x, y) and the origin.
|
8614
|
+
|
8615
|
+
This allows us to rotate the coordinates around the
|
8616
|
+
origin by an angle b using the following transformation:
|
8617
|
+
x' = r * cos(a + b) = x * cos(b) - y * sin(b)
|
8618
|
+
y' = r * sin(a + b) = y * cos(b) + x * sin(b)
|
8619
|
+
|
8620
|
+
[1] https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Angle_sum_and_difference_identities
|
8621
|
+
*/
|
8622
|
+
{const float d_angle = (a_max - a_min) / (float)segments;
|
8623
|
+
const float sin_d = (float)NK_SIN(d_angle);
|
8624
|
+
const float cos_d = (float)NK_COS(d_angle);
|
8625
|
+
|
8626
|
+
float cx = (float)NK_COS(a_min) * radius;
|
8627
|
+
float cy = (float)NK_SIN(a_min) * radius;
|
8628
|
+
for(i = 0; i <= segments; ++i) {
|
8629
|
+
float new_cx, new_cy;
|
8630
|
+
const float x = center.x + cx;
|
8631
|
+
const float y = center.y + cy;
|
8466
8632
|
nk_draw_list_path_line_to(list, nk_vec2(x, y));
|
8467
|
-
|
8633
|
+
|
8634
|
+
new_cx = cx * cos_d - cy * sin_d;
|
8635
|
+
new_cy = cy * cos_d + cx * sin_d;
|
8636
|
+
cx = new_cx;
|
8637
|
+
cy = new_cy;
|
8638
|
+
}}
|
8468
8639
|
}
|
8469
8640
|
|
8470
8641
|
NK_API void
|
@@ -8549,8 +8720,13 @@ nk_draw_list_stroke_line(struct nk_draw_list *list, struct nk_vec2 a,
|
|
8549
8720
|
{
|
8550
8721
|
NK_ASSERT(list);
|
8551
8722
|
if (!list || !col.a) return;
|
8552
|
-
|
8553
|
-
|
8723
|
+
if (list->line_AA == NK_ANTI_ALIASING_ON) {
|
8724
|
+
nk_draw_list_path_line_to(list, a);
|
8725
|
+
nk_draw_list_path_line_to(list, b);
|
8726
|
+
} else {
|
8727
|
+
nk_draw_list_path_line_to(list, nk_vec2_sub(a,nk_vec2(0.5f,0.5f)));
|
8728
|
+
nk_draw_list_path_line_to(list, nk_vec2_sub(b,nk_vec2(0.5f,0.5f)));
|
8729
|
+
}
|
8554
8730
|
nk_draw_list_path_stroke(list, col, NK_STROKE_OPEN, thickness);
|
8555
8731
|
}
|
8556
8732
|
|
@@ -8560,9 +8736,14 @@ nk_draw_list_fill_rect(struct nk_draw_list *list, struct nk_rect rect,
|
|
8560
8736
|
{
|
8561
8737
|
NK_ASSERT(list);
|
8562
8738
|
if (!list || !col.a) return;
|
8563
|
-
|
8564
|
-
|
8565
|
-
|
8739
|
+
|
8740
|
+
if (list->line_AA == NK_ANTI_ALIASING_ON) {
|
8741
|
+
nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y),
|
8742
|
+
nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);
|
8743
|
+
} else {
|
8744
|
+
nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f),
|
8745
|
+
nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);
|
8746
|
+
} nk_draw_list_path_fill(list, col);
|
8566
8747
|
}
|
8567
8748
|
|
8568
8749
|
NK_API void
|
@@ -8571,9 +8752,13 @@ nk_draw_list_stroke_rect(struct nk_draw_list *list, struct nk_rect rect,
|
|
8571
8752
|
{
|
8572
8753
|
NK_ASSERT(list);
|
8573
8754
|
if (!list || !col.a) return;
|
8574
|
-
|
8575
|
-
nk_vec2(rect.x
|
8576
|
-
|
8755
|
+
if (list->line_AA == NK_ANTI_ALIASING_ON) {
|
8756
|
+
nk_draw_list_path_rect_to(list, nk_vec2(rect.x, rect.y),
|
8757
|
+
nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);
|
8758
|
+
} else {
|
8759
|
+
nk_draw_list_path_rect_to(list, nk_vec2(rect.x-0.5f, rect.y-0.5f),
|
8760
|
+
nk_vec2(rect.x + rect.w, rect.y + rect.h), rounding);
|
8761
|
+
} nk_draw_list_path_stroke(list, col, NK_STROKE_CLOSED, thickness);
|
8577
8762
|
}
|
8578
8763
|
|
8579
8764
|
NK_API void
|
@@ -8799,7 +8984,8 @@ nk_convert(struct nk_context *ctx, struct nk_buffer *cmds,
|
|
8799
8984
|
if (!ctx || !cmds || !vertices || !elements || !config || !config->vertex_layout)
|
8800
8985
|
return NK_CONVERT_INVALID_PARAM;
|
8801
8986
|
|
8802
|
-
nk_draw_list_setup(&ctx->draw_list, config, cmds, vertices, elements
|
8987
|
+
nk_draw_list_setup(&ctx->draw_list, config, cmds, vertices, elements,
|
8988
|
+
config->line_AA, config->shape_AA);
|
8803
8989
|
nk_foreach(cmd, ctx)
|
8804
8990
|
{
|
8805
8991
|
#ifdef NK_INCLUDE_COMMAND_USERDATA
|
@@ -11128,7 +11314,7 @@ nk_font_baker_memory(nk_size *temp, int *glyph_count,
|
|
11128
11314
|
{
|
11129
11315
|
int range_count = 0;
|
11130
11316
|
int total_range_count = 0;
|
11131
|
-
struct nk_font_config *iter;
|
11317
|
+
struct nk_font_config *iter, *i;
|
11132
11318
|
|
11133
11319
|
NK_ASSERT(config_list);
|
11134
11320
|
NK_ASSERT(glyph_count);
|
@@ -11137,16 +11323,15 @@ nk_font_baker_memory(nk_size *temp, int *glyph_count,
|
|
11137
11323
|
*glyph_count = 0;
|
11138
11324
|
return;
|
11139
11325
|
}
|
11140
|
-
|
11141
11326
|
*glyph_count = 0;
|
11142
|
-
if (!config_list->range)
|
11143
|
-
config_list->range = nk_font_default_glyph_ranges();
|
11144
11327
|
for (iter = config_list; iter; iter = iter->next) {
|
11145
|
-
|
11146
|
-
|
11147
|
-
|
11328
|
+
i = iter;
|
11329
|
+
do {if (!i->range) iter->range = nk_font_default_glyph_ranges();
|
11330
|
+
range_count = nk_range_count(i->range);
|
11331
|
+
total_range_count += range_count;
|
11332
|
+
*glyph_count += nk_range_glyph_count(i->range, range_count);
|
11333
|
+
} while ((i = i->n) != iter);
|
11148
11334
|
}
|
11149
|
-
|
11150
11335
|
*temp = (nk_size)*glyph_count * sizeof(struct nk_rp_rect);
|
11151
11336
|
*temp += (nk_size)total_range_count * sizeof(struct nk_tt_pack_range);
|
11152
11337
|
*temp += (nk_size)*glyph_count * sizeof(struct nk_tt_packedchar);
|
@@ -11178,7 +11363,7 @@ nk_font_bake_pack(struct nk_font_baker *baker,
|
|
11178
11363
|
struct nk_allocator *alloc)
|
11179
11364
|
{
|
11180
11365
|
NK_STORAGE const nk_size max_height = 1024 * 32;
|
11181
|
-
const struct nk_font_config *config_iter;
|
11366
|
+
const struct nk_font_config *config_iter, *it;
|
11182
11367
|
int total_glyph_count = 0;
|
11183
11368
|
int total_range_count = 0;
|
11184
11369
|
int range_count = 0;
|
@@ -11193,18 +11378,19 @@ nk_font_bake_pack(struct nk_font_baker *baker,
|
|
11193
11378
|
|
11194
11379
|
if (!image_memory || !width || !height || !config_list || !count) return nk_false;
|
11195
11380
|
for (config_iter = config_list; config_iter; config_iter = config_iter->next) {
|
11196
|
-
|
11197
|
-
|
11198
|
-
|
11381
|
+
it = config_iter;
|
11382
|
+
do {range_count = nk_range_count(it->range);
|
11383
|
+
total_range_count += range_count;
|
11384
|
+
total_glyph_count += nk_range_glyph_count(it->range, range_count);
|
11385
|
+
} while ((it = it->n) != config_iter);
|
11199
11386
|
}
|
11200
|
-
|
11201
11387
|
/* setup font baker from temporary memory */
|
11202
11388
|
for (config_iter = config_list; config_iter; config_iter = config_iter->next) {
|
11203
|
-
|
11204
|
-
if (!nk_tt_InitFont(&baker->build[i++].info, (const unsigned char*)
|
11389
|
+
it = config_iter;
|
11390
|
+
do {if (!nk_tt_InitFont(&baker->build[i++].info, (const unsigned char*)it->ttf_blob, 0))
|
11205
11391
|
return nk_false;
|
11392
|
+
} while ((it = it->n) != config_iter);
|
11206
11393
|
}
|
11207
|
-
|
11208
11394
|
*height = 0;
|
11209
11395
|
*width = (total_glyph_count > 1000) ? 1024 : 512;
|
11210
11396
|
nk_tt_PackBegin(&baker->spc, 0, (int)*width, (int)max_height, 0, 1, alloc);
|
@@ -11233,47 +11419,48 @@ nk_font_bake_pack(struct nk_font_baker *baker,
|
|
11233
11419
|
|
11234
11420
|
/* first font pass: pack all glyphs */
|
11235
11421
|
for (input_i = 0, config_iter = config_list; input_i < count && config_iter;
|
11236
|
-
|
11237
|
-
|
11238
|
-
int n = 0;
|
11239
|
-
|
11240
|
-
|
11241
|
-
|
11242
|
-
|
11243
|
-
|
11244
|
-
|
11245
|
-
|
11246
|
-
|
11247
|
-
|
11248
|
-
|
11249
|
-
|
11422
|
+
config_iter = config_iter->next) {
|
11423
|
+
it = config_iter;
|
11424
|
+
do {int n = 0;
|
11425
|
+
int glyph_count;
|
11426
|
+
const nk_rune *in_range;
|
11427
|
+
const struct nk_font_config *cfg = it;
|
11428
|
+
struct nk_font_bake_data *tmp = &baker->build[input_i++];
|
11429
|
+
|
11430
|
+
/* count glyphs + ranges in current font */
|
11431
|
+
glyph_count = 0; range_count = 0;
|
11432
|
+
for (in_range = cfg->range; in_range[0] && in_range[1]; in_range += 2) {
|
11433
|
+
glyph_count += (int)(in_range[1] - in_range[0]) + 1;
|
11434
|
+
range_count++;
|
11435
|
+
}
|
11250
11436
|
|
11251
|
-
|
11252
|
-
|
11253
|
-
|
11254
|
-
|
11255
|
-
|
11256
|
-
|
11257
|
-
|
11258
|
-
|
11259
|
-
|
11260
|
-
|
11261
|
-
|
11262
|
-
|
11437
|
+
/* setup ranges */
|
11438
|
+
tmp->ranges = baker->ranges + range_n;
|
11439
|
+
tmp->range_count = (nk_rune)range_count;
|
11440
|
+
range_n += range_count;
|
11441
|
+
for (i = 0; i < range_count; ++i) {
|
11442
|
+
in_range = &cfg->range[i * 2];
|
11443
|
+
tmp->ranges[i].font_size = cfg->size;
|
11444
|
+
tmp->ranges[i].first_unicode_codepoint_in_range = (int)in_range[0];
|
11445
|
+
tmp->ranges[i].num_chars = (int)(in_range[1]- in_range[0]) + 1;
|
11446
|
+
tmp->ranges[i].chardata_for_range = baker->packed_chars + char_n;
|
11447
|
+
char_n += tmp->ranges[i].num_chars;
|
11448
|
+
}
|
11263
11449
|
|
11264
|
-
|
11265
|
-
|
11266
|
-
|
11267
|
-
|
11268
|
-
|
11269
|
-
|
11270
|
-
|
11271
|
-
|
11272
|
-
|
11273
|
-
|
11274
|
-
|
11275
|
-
|
11276
|
-
|
11450
|
+
/* pack */
|
11451
|
+
tmp->rects = baker->rects + rect_n;
|
11452
|
+
rect_n += glyph_count;
|
11453
|
+
nk_tt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v);
|
11454
|
+
n = nk_tt_PackFontRangesGatherRects(&baker->spc, &tmp->info,
|
11455
|
+
tmp->ranges, (int)tmp->range_count, tmp->rects);
|
11456
|
+
nk_rp_pack_rects((struct nk_rp_context*)baker->spc.pack_info, tmp->rects, (int)n);
|
11457
|
+
|
11458
|
+
/* texture height */
|
11459
|
+
for (i = 0; i < n; ++i) {
|
11460
|
+
if (tmp->rects[i].was_packed)
|
11461
|
+
*height = NK_MAX(*height, tmp->rects[i].y + tmp->rects[i].h);
|
11462
|
+
}
|
11463
|
+
} while ((it = it->n) != config_iter);
|
11277
11464
|
}
|
11278
11465
|
NK_ASSERT(rect_n == total_glyph_count);
|
11279
11466
|
NK_ASSERT(char_n == total_glyph_count);
|
@@ -11292,6 +11479,7 @@ nk_font_bake(struct nk_font_baker *baker, void *image_memory, int width, int hei
|
|
11292
11479
|
int input_i = 0;
|
11293
11480
|
nk_rune glyph_n = 0;
|
11294
11481
|
const struct nk_font_config *config_iter;
|
11482
|
+
const struct nk_font_config *it;
|
11295
11483
|
|
11296
11484
|
NK_ASSERT(image_memory);
|
11297
11485
|
NK_ASSERT(width);
|
@@ -11309,88 +11497,88 @@ nk_font_bake(struct nk_font_baker *baker, void *image_memory, int width, int hei
|
|
11309
11497
|
baker->spc.pixels = (unsigned char*)image_memory;
|
11310
11498
|
baker->spc.height = (int)height;
|
11311
11499
|
for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter;
|
11312
|
-
|
11313
|
-
|
11314
|
-
const struct nk_font_config *cfg =
|
11315
|
-
|
11316
|
-
|
11317
|
-
|
11318
|
-
|
11319
|
-
|
11320
|
-
nk_tt_PackEnd(&baker->spc, &baker->alloc);
|
11500
|
+
config_iter = config_iter->next) {
|
11501
|
+
it = config_iter;
|
11502
|
+
do {const struct nk_font_config *cfg = it;
|
11503
|
+
struct nk_font_bake_data *tmp = &baker->build[input_i++];
|
11504
|
+
nk_tt_PackSetOversampling(&baker->spc, cfg->oversample_h, cfg->oversample_v);
|
11505
|
+
nk_tt_PackFontRangesRenderIntoRects(&baker->spc, &tmp->info, tmp->ranges,
|
11506
|
+
(int)tmp->range_count, tmp->rects, &baker->alloc);
|
11507
|
+
} while ((it = it->n) != config_iter);
|
11508
|
+
} nk_tt_PackEnd(&baker->spc, &baker->alloc);
|
11321
11509
|
|
11322
11510
|
/* third pass: setup font and glyphs */
|
11323
11511
|
for (input_i = 0, config_iter = config_list; input_i < font_count && config_iter;
|
11324
|
-
|
11325
|
-
|
11326
|
-
nk_size i = 0;
|
11327
|
-
|
11328
|
-
|
11329
|
-
|
11330
|
-
|
11331
|
-
|
11332
|
-
|
11333
|
-
|
11334
|
-
|
11335
|
-
|
11336
|
-
|
11337
|
-
|
11338
|
-
|
11339
|
-
|
11340
|
-
|
11341
|
-
|
11342
|
-
|
11343
|
-
|
11344
|
-
|
11345
|
-
|
11512
|
+
config_iter = config_iter->next) {
|
11513
|
+
it = config_iter;
|
11514
|
+
do {nk_size i = 0;
|
11515
|
+
int char_idx = 0;
|
11516
|
+
nk_rune glyph_count = 0;
|
11517
|
+
const struct nk_font_config *cfg = it;
|
11518
|
+
struct nk_font_bake_data *tmp = &baker->build[input_i++];
|
11519
|
+
struct nk_baked_font *dst_font = cfg->font;
|
11520
|
+
|
11521
|
+
float font_scale = nk_tt_ScaleForPixelHeight(&tmp->info, cfg->size);
|
11522
|
+
int unscaled_ascent, unscaled_descent, unscaled_line_gap;
|
11523
|
+
nk_tt_GetFontVMetrics(&tmp->info, &unscaled_ascent, &unscaled_descent,
|
11524
|
+
&unscaled_line_gap);
|
11525
|
+
|
11526
|
+
/* fill baked font */
|
11527
|
+
if (!cfg->merge_mode) {
|
11528
|
+
dst_font->ranges = cfg->range;
|
11529
|
+
dst_font->height = cfg->size;
|
11530
|
+
dst_font->ascent = ((float)unscaled_ascent * font_scale);
|
11531
|
+
dst_font->descent = ((float)unscaled_descent * font_scale);
|
11532
|
+
dst_font->glyph_offset = glyph_n;
|
11533
|
+
}
|
11346
11534
|
|
11347
|
-
|
11348
|
-
|
11349
|
-
|
11350
|
-
|
11351
|
-
|
11352
|
-
|
11353
|
-
|
11354
|
-
|
11355
|
-
|
11356
|
-
|
11357
|
-
|
11358
|
-
|
11359
|
-
|
11360
|
-
|
11361
|
-
|
11362
|
-
|
11363
|
-
|
11364
|
-
|
11365
|
-
|
11366
|
-
|
11367
|
-
|
11368
|
-
|
11369
|
-
|
11370
|
-
|
11371
|
-
|
11372
|
-
|
11373
|
-
|
11374
|
-
|
11375
|
-
|
11376
|
-
|
11377
|
-
|
11378
|
-
|
11379
|
-
|
11380
|
-
|
11381
|
-
|
11382
|
-
|
11383
|
-
|
11384
|
-
|
11535
|
+
/* fill own baked font glyph array */
|
11536
|
+
for (i = 0; i < tmp->range_count; ++i) {
|
11537
|
+
struct nk_tt_pack_range *range = &tmp->ranges[i];
|
11538
|
+
for (char_idx = 0; char_idx < range->num_chars; char_idx++)
|
11539
|
+
{
|
11540
|
+
nk_rune codepoint = 0;
|
11541
|
+
float dummy_x = 0, dummy_y = 0;
|
11542
|
+
struct nk_tt_aligned_quad q;
|
11543
|
+
struct nk_font_glyph *glyph;
|
11544
|
+
|
11545
|
+
/* query glyph bounds from stb_truetype */
|
11546
|
+
const struct nk_tt_packedchar *pc = &range->chardata_for_range[char_idx];
|
11547
|
+
if (!pc->x0 && !pc->x1 && !pc->y0 && !pc->y1) continue;
|
11548
|
+
codepoint = (nk_rune)(range->first_unicode_codepoint_in_range + char_idx);
|
11549
|
+
nk_tt_GetPackedQuad(range->chardata_for_range, (int)width,
|
11550
|
+
(int)height, char_idx, &dummy_x, &dummy_y, &q, 0);
|
11551
|
+
|
11552
|
+
/* fill own glyph type with data */
|
11553
|
+
glyph = &glyphs[dst_font->glyph_offset + dst_font->glyph_count + (unsigned int)glyph_count];
|
11554
|
+
glyph->codepoint = codepoint;
|
11555
|
+
glyph->x0 = q.x0; glyph->y0 = q.y0;
|
11556
|
+
glyph->x1 = q.x1; glyph->y1 = q.y1;
|
11557
|
+
glyph->y0 += (dst_font->ascent + 0.5f);
|
11558
|
+
glyph->y1 += (dst_font->ascent + 0.5f);
|
11559
|
+
glyph->w = glyph->x1 - glyph->x0 + 0.5f;
|
11560
|
+
glyph->h = glyph->y1 - glyph->y0;
|
11561
|
+
|
11562
|
+
if (cfg->coord_type == NK_COORD_PIXEL) {
|
11563
|
+
glyph->u0 = q.s0 * (float)width;
|
11564
|
+
glyph->v0 = q.t0 * (float)height;
|
11565
|
+
glyph->u1 = q.s1 * (float)width;
|
11566
|
+
glyph->v1 = q.t1 * (float)height;
|
11567
|
+
} else {
|
11568
|
+
glyph->u0 = q.s0;
|
11569
|
+
glyph->v0 = q.t0;
|
11570
|
+
glyph->u1 = q.s1;
|
11571
|
+
glyph->v1 = q.t1;
|
11572
|
+
}
|
11573
|
+
glyph->xadvance = (pc->xadvance + cfg->spacing.x);
|
11574
|
+
if (cfg->pixel_snap)
|
11575
|
+
glyph->xadvance = (float)(int)(glyph->xadvance + 0.5f);
|
11576
|
+
glyph_count++;
|
11385
11577
|
}
|
11386
|
-
glyph->xadvance = (pc->xadvance + cfg->spacing.x);
|
11387
|
-
if (cfg->pixel_snap)
|
11388
|
-
glyph->xadvance = (float)(int)(glyph->xadvance + 0.5f);
|
11389
|
-
glyph_count++;
|
11390
11578
|
}
|
11391
|
-
|
11392
|
-
|
11393
|
-
|
11579
|
+
dst_font->glyph_count += glyph_count;
|
11580
|
+
glyph_n += glyph_count;
|
11581
|
+
} while ((it = it->n) != config_iter);
|
11394
11582
|
}
|
11395
11583
|
}
|
11396
11584
|
|
@@ -11517,6 +11705,7 @@ nk_font_find_glyph(struct nk_font *font, nk_rune unicode)
|
|
11517
11705
|
int count;
|
11518
11706
|
int total_glyphs = 0;
|
11519
11707
|
const struct nk_font_glyph *glyph = 0;
|
11708
|
+
const struct nk_font_config *iter = 0;
|
11520
11709
|
|
11521
11710
|
NK_ASSERT(font);
|
11522
11711
|
NK_ASSERT(font->glyphs);
|
@@ -11524,15 +11713,17 @@ nk_font_find_glyph(struct nk_font *font, nk_rune unicode)
|
|
11524
11713
|
if (!font || !font->glyphs) return 0;
|
11525
11714
|
|
11526
11715
|
glyph = font->fallback;
|
11527
|
-
|
11528
|
-
|
11529
|
-
|
11530
|
-
|
11531
|
-
|
11532
|
-
|
11533
|
-
|
11534
|
-
|
11535
|
-
|
11716
|
+
iter = font->config;
|
11717
|
+
do {count = nk_range_count(iter->range);
|
11718
|
+
for (i = 0; i < count; ++i) {
|
11719
|
+
nk_rune f = iter->range[(i*2)+0];
|
11720
|
+
nk_rune t = iter->range[(i*2)+1];
|
11721
|
+
int diff = (int)((t - f) + 1);
|
11722
|
+
if (unicode >= f && unicode <= t)
|
11723
|
+
return &font->glyphs[((nk_rune)total_glyphs + (unicode - f))];
|
11724
|
+
total_glyphs += diff;
|
11725
|
+
}
|
11726
|
+
} while ((iter = iter->n) != font->config);
|
11536
11727
|
return glyph;
|
11537
11728
|
}
|
11538
11729
|
|
@@ -11884,6 +12075,7 @@ nk_font_config(float pixel_height)
|
|
11884
12075
|
cfg.merge_mode = 0;
|
11885
12076
|
cfg.fallback_glyph = '?';
|
11886
12077
|
cfg.font = 0;
|
12078
|
+
cfg.n = 0;
|
11887
12079
|
return cfg;
|
11888
12080
|
}
|
11889
12081
|
|
@@ -11967,43 +12159,57 @@ nk_font_atlas_add(struct nk_font_atlas *atlas, const struct nk_font_config *conf
|
|
11967
12159
|
!atlas->temporary.alloc || !atlas->temporary.free)
|
11968
12160
|
return 0;
|
11969
12161
|
|
11970
|
-
/* allocate
|
12162
|
+
/* allocate font config */
|
11971
12163
|
cfg = (struct nk_font_config*)
|
11972
12164
|
atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font_config));
|
11973
12165
|
NK_MEMCPY(cfg, config, sizeof(*config));
|
11974
|
-
|
11975
|
-
|
11976
|
-
cfg->next = 0;
|
11977
|
-
} else {
|
11978
|
-
cfg->next = atlas->config;
|
11979
|
-
atlas->config = cfg;
|
11980
|
-
}
|
12166
|
+
cfg->n = cfg;
|
12167
|
+
cfg->p = cfg;
|
11981
12168
|
|
11982
|
-
/* allocate new font */
|
11983
12169
|
if (!config->merge_mode) {
|
12170
|
+
/* insert font config into list */
|
12171
|
+
if (!atlas->config) {
|
12172
|
+
atlas->config = cfg;
|
12173
|
+
cfg->next = 0;
|
12174
|
+
} else {
|
12175
|
+
struct nk_font_config *i = atlas->config;
|
12176
|
+
while (i->next) i = i->next;
|
12177
|
+
i->next = cfg;
|
12178
|
+
cfg->next = 0;
|
12179
|
+
}
|
12180
|
+
/* allocate new font */
|
11984
12181
|
font = (struct nk_font*)
|
11985
12182
|
atlas->permanent.alloc(atlas->permanent.userdata,0, sizeof(struct nk_font));
|
11986
12183
|
NK_ASSERT(font);
|
12184
|
+
nk_zero(font, sizeof(*font));
|
11987
12185
|
if (!font) return 0;
|
11988
12186
|
font->config = cfg;
|
11989
|
-
} else {
|
11990
|
-
NK_ASSERT(atlas->font_num);
|
11991
|
-
font = atlas->fonts;
|
11992
|
-
font->config = cfg;
|
11993
|
-
}
|
11994
12187
|
|
11995
|
-
|
11996
|
-
if (!config->merge_mode) {
|
12188
|
+
/* insert font into list */
|
11997
12189
|
if (!atlas->fonts) {
|
11998
12190
|
atlas->fonts = font;
|
11999
12191
|
font->next = 0;
|
12000
12192
|
} else {
|
12001
|
-
|
12002
|
-
|
12193
|
+
struct nk_font *i = atlas->fonts;
|
12194
|
+
while (i->next) i = i->next;
|
12195
|
+
i->next = font;
|
12196
|
+
font->next = 0;
|
12003
12197
|
}
|
12004
12198
|
cfg->font = &font->info;
|
12005
|
-
}
|
12199
|
+
} else {
|
12200
|
+
/* extend previously added font */
|
12201
|
+
struct nk_font *f = 0;
|
12202
|
+
struct nk_font_config *c = 0;
|
12203
|
+
NK_ASSERT(atlas->font_num);
|
12204
|
+
f = atlas->fonts;
|
12205
|
+
c = f->config;
|
12206
|
+
cfg->font = &f->info;
|
12006
12207
|
|
12208
|
+
cfg->n = c;
|
12209
|
+
cfg->p = c->p;
|
12210
|
+
c->p->n = cfg;
|
12211
|
+
c->p = cfg;
|
12212
|
+
}
|
12007
12213
|
/* create own copy of .TTF font blob */
|
12008
12214
|
if (!config->ttf_data_owned_by_atlas) {
|
12009
12215
|
cfg->ttf_blob = atlas->permanent.alloc(atlas->permanent.userdata,0, cfg->ttf_size);
|
@@ -12322,16 +12528,18 @@ nk_font_atlas_cleanup(struct nk_font_atlas *atlas)
|
|
12322
12528
|
NK_ASSERT(atlas->temporary.free);
|
12323
12529
|
NK_ASSERT(atlas->permanent.alloc);
|
12324
12530
|
NK_ASSERT(atlas->permanent.free);
|
12325
|
-
|
12326
12531
|
if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return;
|
12327
12532
|
if (atlas->config) {
|
12328
|
-
struct nk_font_config *iter
|
12329
|
-
for (iter = atlas->config; iter; iter = next) {
|
12330
|
-
|
12533
|
+
struct nk_font_config *iter;
|
12534
|
+
for (iter = atlas->config; iter; iter = iter->next) {
|
12535
|
+
struct nk_font_config *i;
|
12536
|
+
for (i = iter->n; i != iter; i = i->n) {
|
12537
|
+
atlas->permanent.free(atlas->permanent.userdata, i->ttf_blob);
|
12538
|
+
i->ttf_blob = 0;
|
12539
|
+
}
|
12331
12540
|
atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob);
|
12332
|
-
|
12541
|
+
iter->ttf_blob = 0;
|
12333
12542
|
}
|
12334
|
-
atlas->config = 0;
|
12335
12543
|
}
|
12336
12544
|
}
|
12337
12545
|
|
@@ -12345,7 +12553,23 @@ nk_font_atlas_clear(struct nk_font_atlas *atlas)
|
|
12345
12553
|
NK_ASSERT(atlas->permanent.free);
|
12346
12554
|
if (!atlas || !atlas->permanent.alloc || !atlas->permanent.free) return;
|
12347
12555
|
|
12348
|
-
|
12556
|
+
if (atlas->config) {
|
12557
|
+
struct nk_font_config *iter, *next;
|
12558
|
+
for (iter = atlas->config; iter; iter = next) {
|
12559
|
+
struct nk_font_config *i, *n;
|
12560
|
+
for (i = iter->n; i != iter; i = n) {
|
12561
|
+
n = i->n;
|
12562
|
+
if (i->ttf_blob)
|
12563
|
+
atlas->permanent.free(atlas->permanent.userdata, i->ttf_blob);
|
12564
|
+
atlas->permanent.free(atlas->permanent.userdata, i);
|
12565
|
+
}
|
12566
|
+
next = iter->next;
|
12567
|
+
if (i->ttf_blob)
|
12568
|
+
atlas->permanent.free(atlas->permanent.userdata, iter->ttf_blob);
|
12569
|
+
atlas->permanent.free(atlas->permanent.userdata, iter);
|
12570
|
+
}
|
12571
|
+
atlas->config = 0;
|
12572
|
+
}
|
12349
12573
|
if (atlas->fonts) {
|
12350
12574
|
struct nk_font *iter, *next;
|
12351
12575
|
for (iter = atlas->fonts; iter; iter = next) {
|
@@ -14528,8 +14752,7 @@ nk_slider_behavior(nk_flags *state, struct nk_rect *logical_cursor,
|
|
14528
14752
|
left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in,
|
14529
14753
|
NK_BUTTON_LEFT, *visual_cursor, nk_true);
|
14530
14754
|
|
14531
|
-
if (left_mouse_down && left_mouse_click_in_cursor)
|
14532
|
-
{
|
14755
|
+
if (left_mouse_down && left_mouse_click_in_cursor) {
|
14533
14756
|
float ratio = 0;
|
14534
14757
|
const float d = in->mouse.pos.x - (visual_cursor->x+visual_cursor->w*0.5f);
|
14535
14758
|
const float pxstep = bounds.w / slider_steps;
|
@@ -14714,30 +14937,37 @@ nk_do_slider(nk_flags *state,
|
|
14714
14937
|
*
|
14715
14938
|
* ===============================================================*/
|
14716
14939
|
NK_INTERN nk_size
|
14717
|
-
nk_progress_behavior(nk_flags *state,
|
14718
|
-
struct nk_rect r, nk_size max, nk_size value, int modifiable)
|
14940
|
+
nk_progress_behavior(nk_flags *state, struct nk_input *in,
|
14941
|
+
struct nk_rect r, struct nk_rect cursor, nk_size max, nk_size value, int modifiable)
|
14719
14942
|
{
|
14943
|
+
int left_mouse_down = 0;
|
14944
|
+
int left_mouse_click_in_cursor = 0;
|
14945
|
+
|
14720
14946
|
nk_widget_state_reset(state);
|
14721
|
-
if (in
|
14947
|
+
if (!in) return value;
|
14948
|
+
left_mouse_down = in && in->mouse.buttons[NK_BUTTON_LEFT].down;
|
14949
|
+
left_mouse_click_in_cursor = in && nk_input_has_mouse_click_down_in_rect(in,
|
14950
|
+
NK_BUTTON_LEFT, cursor, nk_true);
|
14951
|
+
if (nk_input_is_mouse_hovering_rect(in, r))
|
14952
|
+
*state = NK_WIDGET_STATE_HOVERED;
|
14953
|
+
|
14954
|
+
if (in && left_mouse_down && left_mouse_click_in_cursor) {
|
14722
14955
|
int left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
|
14723
14956
|
int left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
|
14724
14957
|
NK_BUTTON_LEFT, r, nk_true);
|
14725
14958
|
|
14726
14959
|
if (left_mouse_down && left_mouse_click_in_cursor) {
|
14727
|
-
float ratio = NK_MAX(0, (float)(in->mouse.pos.x -
|
14728
|
-
value = (nk_size)
|
14729
|
-
|
14730
|
-
|
14960
|
+
float ratio = NK_MAX(0, (float)(in->mouse.pos.x - cursor.x)) / (float)cursor.w;
|
14961
|
+
value = (nk_size)NK_CLAMP(0, (float)max * ratio, max);
|
14962
|
+
in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor.x + cursor.w/2.0f;
|
14963
|
+
*state |= NK_WIDGET_STATE_ACTIVE;
|
14964
|
+
}
|
14731
14965
|
}
|
14732
|
-
|
14733
14966
|
/* set progressbar widget state */
|
14734
14967
|
if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, r))
|
14735
14968
|
*state |= NK_WIDGET_STATE_ENTERED;
|
14736
14969
|
else if (nk_input_is_mouse_prev_hovering_rect(in, r))
|
14737
14970
|
*state |= NK_WIDGET_STATE_LEFT;
|
14738
|
-
|
14739
|
-
if (!max) return value;
|
14740
|
-
value = NK_MIN(value, max);
|
14741
14971
|
return value;
|
14742
14972
|
}
|
14743
14973
|
|
@@ -14771,7 +15001,7 @@ nk_draw_progress(struct nk_command_buffer *out, nk_flags state,
|
|
14771
15001
|
} else nk_draw_image(out, *bounds, &background->data.image, nk_white);
|
14772
15002
|
|
14773
15003
|
/* draw cursor */
|
14774
|
-
if (
|
15004
|
+
if (cursor->type == NK_STYLE_ITEM_COLOR) {
|
14775
15005
|
nk_fill_rect(out, *scursor, style->rounding, cursor->data.color);
|
14776
15006
|
nk_stroke_rect(out, *scursor, style->rounding, style->border, style->border_color);
|
14777
15007
|
} else nk_draw_image(out, *scursor, &cursor->data.image, nk_white);
|
@@ -14781,7 +15011,7 @@ NK_INTERN nk_size
|
|
14781
15011
|
nk_do_progress(nk_flags *state,
|
14782
15012
|
struct nk_command_buffer *out, struct nk_rect bounds,
|
14783
15013
|
nk_size value, nk_size max, int modifiable,
|
14784
|
-
const struct nk_style_progress *style,
|
15014
|
+
const struct nk_style_progress *style, struct nk_input *in)
|
14785
15015
|
{
|
14786
15016
|
float prog_scale;
|
14787
15017
|
nk_size prog_value;
|
@@ -14796,11 +15026,11 @@ nk_do_progress(nk_flags *state,
|
|
14796
15026
|
cursor.h = NK_MAX(bounds.h, 2 * style->padding.y + 2 * style->border);
|
14797
15027
|
cursor = nk_pad_rect(bounds, nk_vec2(style->padding.x + style->border, style->padding.y + style->border));
|
14798
15028
|
prog_scale = (float)value / (float)max;
|
14799
|
-
cursor.w = (bounds.w - 2) * prog_scale;
|
14800
15029
|
|
14801
15030
|
/* update progressbar */
|
14802
15031
|
prog_value = NK_MIN(value, max);
|
14803
|
-
prog_value = nk_progress_behavior(state, in, bounds, max, prog_value, modifiable);
|
15032
|
+
prog_value = nk_progress_behavior(state, in, bounds, cursor,max, prog_value, modifiable);
|
15033
|
+
cursor.w = cursor.w * prog_scale;
|
14804
15034
|
|
14805
15035
|
/* draw progressbar */
|
14806
15036
|
if (style->draw_begin) style->draw_begin(out, style->userdata);
|
@@ -15202,7 +15432,7 @@ nk_edit_draw_text(struct nk_command_buffer *out,
|
|
15202
15432
|
while ((text_len < byte_len) && glyph_len)
|
15203
15433
|
{
|
15204
15434
|
if (unicode == '\n') {
|
15205
|
-
/* new line
|
15435
|
+
/* new line separator so draw previous line */
|
15206
15436
|
struct nk_rect label;
|
15207
15437
|
label.y = pos_y + line_offset;
|
15208
15438
|
label.h = row_height;
|
@@ -15300,8 +15530,6 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
|
|
15300
15530
|
const enum nk_text_edit_type type = (flags & NK_EDIT_MULTILINE) ?
|
15301
15531
|
NK_TEXT_EDIT_MULTI_LINE: NK_TEXT_EDIT_SINGLE_LINE;
|
15302
15532
|
nk_textedit_clear_state(edit, type, filter);
|
15303
|
-
if (flags & NK_EDIT_ALWAYS_INSERT_MODE)
|
15304
|
-
edit->mode = NK_TEXT_EDIT_MODE_INSERT;
|
15305
15533
|
if (flags & NK_EDIT_AUTO_SELECT)
|
15306
15534
|
select_all = nk_true;
|
15307
15535
|
if (flags & NK_EDIT_GOTO_END_ON_ACTIVATE) {
|
@@ -15311,6 +15539,8 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
|
|
15311
15539
|
} else if (!edit->active) edit->mode = NK_TEXT_EDIT_MODE_VIEW;
|
15312
15540
|
if (flags & NK_EDIT_READ_ONLY)
|
15313
15541
|
edit->mode = NK_TEXT_EDIT_MODE_VIEW;
|
15542
|
+
else if (flags & NK_EDIT_ALWAYS_INSERT_MODE)
|
15543
|
+
edit->mode = NK_TEXT_EDIT_MODE_INSERT;
|
15314
15544
|
|
15315
15545
|
ret = (edit->active) ? NK_EDIT_ACTIVE: NK_EDIT_INACTIVE;
|
15316
15546
|
if (prev_state != edit->active)
|
@@ -15942,11 +16172,11 @@ nk_do_property(nk_flags *ws,
|
|
15942
16172
|
num_len = nk_strlen(string);
|
15943
16173
|
break;
|
15944
16174
|
case NK_PROPERTY_FLOAT:
|
15945
|
-
|
16175
|
+
NK_DTOA(string, (double)variant->value.f);
|
15946
16176
|
num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION);
|
15947
16177
|
break;
|
15948
16178
|
case NK_PROPERTY_DOUBLE:
|
15949
|
-
|
16179
|
+
NK_DTOA(string, variant->value.d);
|
15950
16180
|
num_len = nk_string_float_limit(string, NK_MAX_FLOAT_PRECISION);
|
15951
16181
|
break;
|
15952
16182
|
}
|
@@ -16822,6 +17052,7 @@ nk_style_from_table(struct nk_context *ctx, const struct nk_color *table)
|
|
16822
17052
|
win->tooltip_border = 1.0f;
|
16823
17053
|
win->popup_border = 1.0f;
|
16824
17054
|
win->border = 2.0f;
|
17055
|
+
win->min_row_height_padding = 8;
|
16825
17056
|
|
16826
17057
|
win->padding = nk_vec2(4,4);
|
16827
17058
|
win->group_padding = nk_vec2(4,4);
|
@@ -16837,10 +17068,13 @@ nk_style_set_font(struct nk_context *ctx, const struct nk_user_font *font)
|
|
16837
17068
|
{
|
16838
17069
|
struct nk_style *style;
|
16839
17070
|
NK_ASSERT(ctx);
|
17071
|
+
|
16840
17072
|
if (!ctx) return;
|
16841
17073
|
style = &ctx->style;
|
16842
17074
|
style->font = font;
|
16843
17075
|
ctx->stacks.fonts.head = 0;
|
17076
|
+
if (ctx->current)
|
17077
|
+
nk_layout_reset_min_row_height(ctx);
|
16844
17078
|
}
|
16845
17079
|
|
16846
17080
|
NK_API int
|
@@ -17189,25 +17423,27 @@ nk_clear(struct nk_context *ctx)
|
|
17189
17423
|
/* garbage collector */
|
17190
17424
|
iter = ctx->begin;
|
17191
17425
|
while (iter) {
|
17192
|
-
/* make sure minimized windows do not get removed */
|
17426
|
+
/* make sure valid minimized windows do not get removed */
|
17193
17427
|
if ((iter->flags & NK_WINDOW_MINIMIZED) &&
|
17194
|
-
!(iter->flags & NK_WINDOW_CLOSED)
|
17428
|
+
!(iter->flags & NK_WINDOW_CLOSED) &&
|
17429
|
+
iter->seq == ctx->seq) {
|
17195
17430
|
iter = iter->next;
|
17196
17431
|
continue;
|
17197
17432
|
}
|
17198
|
-
|
17199
17433
|
/* remove hotness from hidden or closed windows*/
|
17200
17434
|
if (((iter->flags & NK_WINDOW_HIDDEN) ||
|
17201
17435
|
(iter->flags & NK_WINDOW_CLOSED)) &&
|
17202
|
-
iter == ctx->active)
|
17203
|
-
ctx->active = iter->
|
17204
|
-
|
17436
|
+
iter == ctx->active) {
|
17437
|
+
ctx->active = iter->prev;
|
17438
|
+
ctx->end = iter->prev;
|
17439
|
+
if (ctx->active)
|
17440
|
+
ctx->active->flags &= ~(unsigned)NK_WINDOW_ROM;
|
17441
|
+
}
|
17205
17442
|
/* free unused popup windows */
|
17206
17443
|
if (iter->popup.win && iter->popup.win->seq != ctx->seq) {
|
17207
17444
|
nk_free_window(ctx, iter->popup.win);
|
17208
17445
|
iter->popup.win = 0;
|
17209
17446
|
}
|
17210
|
-
|
17211
17447
|
/* remove unused window state tables */
|
17212
17448
|
{struct nk_table *n, *it = iter->tables;
|
17213
17449
|
while (it) {
|
@@ -17218,10 +17454,8 @@ nk_clear(struct nk_context *ctx)
|
|
17218
17454
|
nk_free_table(ctx, it);
|
17219
17455
|
if (it == iter->tables)
|
17220
17456
|
iter->tables = n;
|
17221
|
-
}
|
17222
|
-
it = n;
|
17457
|
+
} it = n;
|
17223
17458
|
}}
|
17224
|
-
|
17225
17459
|
/* window itself is not used anymore so free */
|
17226
17460
|
if (iter->seq != ctx->seq || iter->flags & NK_WINDOW_CLOSED) {
|
17227
17461
|
next = iter->next;
|
@@ -17319,7 +17553,7 @@ nk_finish(struct nk_context *ctx, struct nk_window *win)
|
|
17319
17553
|
NK_INTERN void
|
17320
17554
|
nk_build(struct nk_context *ctx)
|
17321
17555
|
{
|
17322
|
-
struct nk_window *
|
17556
|
+
struct nk_window *it = 0;
|
17323
17557
|
struct nk_command *cmd = 0;
|
17324
17558
|
nk_byte *buffer = 0;
|
17325
17559
|
|
@@ -17341,37 +17575,38 @@ nk_build(struct nk_context *ctx)
|
|
17341
17575
|
nk_finish_buffer(ctx, &ctx->overlay);
|
17342
17576
|
}
|
17343
17577
|
/* build one big draw command list out of all window buffers */
|
17344
|
-
|
17578
|
+
it = ctx->begin;
|
17345
17579
|
buffer = (nk_byte*)ctx->memory.memory.ptr;
|
17346
|
-
while (
|
17347
|
-
struct nk_window *next =
|
17348
|
-
if (
|
17580
|
+
while (it != 0) {
|
17581
|
+
struct nk_window *next = it->next;
|
17582
|
+
if (it->buffer.last == it->buffer.begin || (it->flags & NK_WINDOW_HIDDEN)||
|
17583
|
+
it->seq != ctx->seq)
|
17349
17584
|
goto cont;
|
17350
17585
|
|
17351
|
-
cmd = nk_ptr_add(struct nk_command, buffer,
|
17586
|
+
cmd = nk_ptr_add(struct nk_command, buffer, it->buffer.last);
|
17352
17587
|
while (next && ((next->buffer.last == next->buffer.begin) ||
|
17353
17588
|
(next->flags & NK_WINDOW_HIDDEN)))
|
17354
17589
|
next = next->next; /* skip empty command buffers */
|
17355
17590
|
|
17356
17591
|
if (next) cmd->next = next->buffer.begin;
|
17357
|
-
cont:
|
17592
|
+
cont: it = next;
|
17358
17593
|
}
|
17359
17594
|
/* append all popup draw commands into lists */
|
17360
|
-
|
17361
|
-
while (
|
17362
|
-
struct nk_window *next =
|
17595
|
+
it = ctx->begin;
|
17596
|
+
while (it != 0) {
|
17597
|
+
struct nk_window *next = it->next;
|
17363
17598
|
struct nk_popup_buffer *buf;
|
17364
|
-
if (!
|
17599
|
+
if (!it->popup.buf.active)
|
17365
17600
|
goto skip;
|
17366
17601
|
|
17367
|
-
buf = &
|
17602
|
+
buf = &it->popup.buf;
|
17368
17603
|
cmd->next = buf->begin;
|
17369
17604
|
cmd = nk_ptr_add(struct nk_command, buffer, buf->last);
|
17370
17605
|
buf->active = nk_false;
|
17371
|
-
skip:
|
17606
|
+
skip: it = next;
|
17372
17607
|
}
|
17373
|
-
/* append overlay commands */
|
17374
17608
|
if (cmd) {
|
17609
|
+
/* append overlay commands */
|
17375
17610
|
if (ctx->overlay.end != ctx->overlay.begin)
|
17376
17611
|
cmd->next = ctx->overlay.begin;
|
17377
17612
|
else cmd->next = ctx->memory.allocated;
|
@@ -17392,9 +17627,9 @@ nk__begin(struct nk_context *ctx)
|
|
17392
17627
|
nk_build(ctx);
|
17393
17628
|
ctx->build = nk_true;
|
17394
17629
|
}
|
17395
|
-
|
17396
17630
|
iter = ctx->begin;
|
17397
|
-
while (iter && ((iter->buffer.begin == iter->buffer.end) ||
|
17631
|
+
while (iter && ((iter->buffer.begin == iter->buffer.end) ||
|
17632
|
+
(iter->flags & NK_WINDOW_HIDDEN) || iter->seq != ctx->seq))
|
17398
17633
|
iter = iter->next;
|
17399
17634
|
if (!iter) return 0;
|
17400
17635
|
return nk_ptr_add_const(struct nk_command, buffer, iter->buffer.begin);
|
@@ -17567,6 +17802,7 @@ nk_panel_begin(struct nk_context *ctx, const char *title, enum nk_panel_type pan
|
|
17567
17802
|
layout->max_x = 0;
|
17568
17803
|
layout->header_height = 0;
|
17569
17804
|
layout->footer_height = 0;
|
17805
|
+
nk_layout_reset_min_row_height(ctx);
|
17570
17806
|
layout->row.index = 0;
|
17571
17807
|
layout->row.columns = 0;
|
17572
17808
|
layout->row.ratio = 0;
|
@@ -18134,16 +18370,16 @@ nk_push_table(struct nk_window *win, struct nk_table *tbl)
|
|
18134
18370
|
win->tables = tbl;
|
18135
18371
|
tbl->next = 0;
|
18136
18372
|
tbl->prev = 0;
|
18373
|
+
tbl->size = 0;
|
18137
18374
|
win->table_count = 1;
|
18138
|
-
win->table_size = 0;
|
18139
18375
|
return;
|
18140
18376
|
}
|
18141
18377
|
win->tables->prev = tbl;
|
18142
18378
|
tbl->next = win->tables;
|
18143
18379
|
tbl->prev = 0;
|
18380
|
+
tbl->size = 0;
|
18144
18381
|
win->tables = tbl;
|
18145
18382
|
win->table_count++;
|
18146
|
-
win->table_size = 0;
|
18147
18383
|
}
|
18148
18384
|
|
18149
18385
|
NK_INTERN void
|
@@ -18166,32 +18402,31 @@ nk_add_value(struct nk_context *ctx, struct nk_window *win,
|
|
18166
18402
|
NK_ASSERT(ctx);
|
18167
18403
|
NK_ASSERT(win);
|
18168
18404
|
if (!win || !ctx) return 0;
|
18169
|
-
if (!win->tables || win->
|
18405
|
+
if (!win->tables || win->tables->size >= NK_VALUE_PAGE_CAPACITY) {
|
18170
18406
|
struct nk_table *tbl = nk_create_table(ctx);
|
18171
18407
|
NK_ASSERT(tbl);
|
18172
18408
|
if (!tbl) return 0;
|
18173
18409
|
nk_push_table(win, tbl);
|
18174
18410
|
}
|
18175
18411
|
win->tables->seq = win->seq;
|
18176
|
-
win->tables->keys[win->
|
18177
|
-
win->tables->values[win->
|
18178
|
-
return &win->tables->values[win->
|
18412
|
+
win->tables->keys[win->tables->size] = name;
|
18413
|
+
win->tables->values[win->tables->size] = value;
|
18414
|
+
return &win->tables->values[win->tables->size++];
|
18179
18415
|
}
|
18180
18416
|
|
18181
18417
|
NK_INTERN nk_uint*
|
18182
18418
|
nk_find_value(struct nk_window *win, nk_hash name)
|
18183
18419
|
{
|
18184
|
-
nk_ushort size = win->table_size;
|
18185
18420
|
struct nk_table *iter = win->tables;
|
18186
18421
|
while (iter) {
|
18187
|
-
|
18422
|
+
unsigned int i = 0;
|
18423
|
+
unsigned int size = iter->size;
|
18188
18424
|
for (i = 0; i < size; ++i) {
|
18189
18425
|
if (iter->keys[i] == name) {
|
18190
18426
|
iter->seq = win->seq;
|
18191
18427
|
return &iter->values[i];
|
18192
18428
|
}
|
18193
|
-
}
|
18194
|
-
size = NK_VALUE_PAGE_CAPACITY;
|
18429
|
+
} size = NK_VALUE_PAGE_CAPACITY;
|
18195
18430
|
iter = iter->next;
|
18196
18431
|
}
|
18197
18432
|
return 0;
|
@@ -18297,7 +18532,7 @@ nk_insert_window(struct nk_context *ctx, struct nk_window *win,
|
|
18297
18532
|
ctx->active = ctx->end;
|
18298
18533
|
ctx->end->flags &= ~(nk_flags)NK_WINDOW_ROM;
|
18299
18534
|
} else {
|
18300
|
-
ctx->end->flags |= NK_WINDOW_ROM
|
18535
|
+
/*ctx->end->flags |= NK_WINDOW_ROM;*/
|
18301
18536
|
ctx->begin->prev = win;
|
18302
18537
|
win->next = ctx->begin;
|
18303
18538
|
win->prev = 0;
|
@@ -18403,27 +18638,28 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|
18403
18638
|
* provided demo backends). */
|
18404
18639
|
NK_ASSERT(win->seq != ctx->seq);
|
18405
18640
|
win->seq = ctx->seq;
|
18406
|
-
if (!ctx->active && !(win->flags & NK_WINDOW_HIDDEN))
|
18641
|
+
if (!ctx->active && !(win->flags & NK_WINDOW_HIDDEN)) {
|
18407
18642
|
ctx->active = win;
|
18643
|
+
ctx->end = win;
|
18644
|
+
}
|
18408
18645
|
}
|
18409
18646
|
if (win->flags & NK_WINDOW_HIDDEN) {
|
18410
18647
|
ctx->current = win;
|
18411
18648
|
win->layout = 0;
|
18412
18649
|
return 0;
|
18413
|
-
}
|
18650
|
+
} else nk_start(ctx, win);
|
18414
18651
|
|
18415
18652
|
/* window overlapping */
|
18416
18653
|
if (!(win->flags & NK_WINDOW_HIDDEN) && !(win->flags & NK_WINDOW_NO_INPUT))
|
18417
18654
|
{
|
18418
18655
|
int inpanel, ishovered;
|
18419
|
-
|
18656
|
+
struct nk_window *iter = win;
|
18420
18657
|
float h = ctx->style.font->height + 2.0f * style->window.header.padding.y +
|
18421
18658
|
(2.0f * style->window.header.label_padding.y);
|
18422
18659
|
struct nk_rect win_bounds = (!(win->flags & NK_WINDOW_MINIMIZED))?
|
18423
18660
|
win->bounds: nk_rect(win->bounds.x, win->bounds.y, win->bounds.w, h);
|
18424
18661
|
|
18425
18662
|
/* activate window if hovered and no other window is overlapping this window */
|
18426
|
-
nk_start(ctx, win);
|
18427
18663
|
inpanel = nk_input_has_mouse_click_down_in_rect(&ctx->input, NK_BUTTON_LEFT, win_bounds, nk_true);
|
18428
18664
|
inpanel = inpanel && ctx->input.mouse.buttons[NK_BUTTON_LEFT].clicked;
|
18429
18665
|
ishovered = nk_input_is_mouse_hovering_rect(&ctx->input, win_bounds);
|
@@ -18434,7 +18670,7 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|
18434
18670
|
iter->bounds: nk_rect(iter->bounds.x, iter->bounds.y, iter->bounds.w, h);
|
18435
18671
|
if (NK_INTERSECT(win_bounds.x, win_bounds.y, win_bounds.w, win_bounds.h,
|
18436
18672
|
iter_bounds.x, iter_bounds.y, iter_bounds.w, iter_bounds.h) &&
|
18437
|
-
(!(iter->flags & NK_WINDOW_HIDDEN)
|
18673
|
+
(!(iter->flags & NK_WINDOW_HIDDEN)))
|
18438
18674
|
break;
|
18439
18675
|
|
18440
18676
|
if (iter->popup.win && iter->popup.active && !(iter->flags & NK_WINDOW_HIDDEN) &&
|
@@ -18447,7 +18683,7 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|
18447
18683
|
}
|
18448
18684
|
|
18449
18685
|
/* activate window if clicked */
|
18450
|
-
if (iter && inpanel && (win != ctx->end)
|
18686
|
+
if (iter && inpanel && (win != ctx->end)) {
|
18451
18687
|
iter = win->next;
|
18452
18688
|
while (iter) {
|
18453
18689
|
/* try to find a panel with higher priority in the same position */
|
@@ -18465,21 +18701,31 @@ nk_begin_titled(struct nk_context *ctx, const char *name, const char *title,
|
|
18465
18701
|
iter = iter->next;
|
18466
18702
|
}
|
18467
18703
|
}
|
18468
|
-
|
18469
|
-
|
18470
|
-
|
18704
|
+
if (iter && !(win->flags & NK_WINDOW_ROM) && (win->flags & NK_WINDOW_BACKGROUND)) {
|
18705
|
+
win->flags |= (nk_flags)NK_WINDOW_ROM;
|
18706
|
+
iter->flags &= ~(nk_flags)NK_WINDOW_ROM;
|
18707
|
+
ctx->active = iter;
|
18708
|
+
if (!(iter->flags & NK_WINDOW_BACKGROUND)) {
|
18471
18709
|
/* current window is active in that position so transfer to top
|
18472
18710
|
* at the highest priority in stack */
|
18473
|
-
nk_remove_window(ctx,
|
18474
|
-
nk_insert_window(ctx,
|
18711
|
+
nk_remove_window(ctx, iter);
|
18712
|
+
nk_insert_window(ctx, iter, NK_INSERT_BACK);
|
18475
18713
|
}
|
18476
|
-
|
18477
|
-
ctx->
|
18714
|
+
} else {
|
18715
|
+
if (!iter && ctx->end != win) {
|
18716
|
+
if (!(win->flags & NK_WINDOW_BACKGROUND)) {
|
18717
|
+
/* current window is active in that position so transfer to top
|
18718
|
+
* at the highest priority in stack */
|
18719
|
+
nk_remove_window(ctx, win);
|
18720
|
+
nk_insert_window(ctx, win, NK_INSERT_BACK);
|
18721
|
+
}
|
18722
|
+
win->flags &= ~(nk_flags)NK_WINDOW_ROM;
|
18723
|
+
ctx->active = win;
|
18724
|
+
}
|
18725
|
+
if (ctx->end != win && !(win->flags & NK_WINDOW_BACKGROUND))
|
18726
|
+
win->flags |= NK_WINDOW_ROM;
|
18478
18727
|
}
|
18479
|
-
if (ctx->end != win && !(win->flags & NK_WINDOW_BACKGROUND))
|
18480
|
-
win->flags |= NK_WINDOW_ROM;
|
18481
18728
|
}
|
18482
|
-
|
18483
18729
|
win->layout = (struct nk_panel*)nk_create_panel(ctx);
|
18484
18730
|
ctx->current = win;
|
18485
18731
|
ret = nk_panel_begin(ctx, title, NK_PANEL_WINDOW);
|
@@ -18627,6 +18873,8 @@ nk_window_is_hovered(struct nk_context *ctx)
|
|
18627
18873
|
NK_ASSERT(ctx);
|
18628
18874
|
NK_ASSERT(ctx->current);
|
18629
18875
|
if (!ctx || !ctx->current) return 0;
|
18876
|
+
if(ctx->current->flags & NK_WINDOW_HIDDEN)
|
18877
|
+
return 0;
|
18630
18878
|
return nk_input_is_mouse_hovering_rect(&ctx->input, ctx->current->bounds);
|
18631
18879
|
}
|
18632
18880
|
|
@@ -18639,17 +18887,20 @@ nk_window_is_any_hovered(struct nk_context *ctx)
|
|
18639
18887
|
iter = ctx->begin;
|
18640
18888
|
while (iter) {
|
18641
18889
|
/* check if window is being hovered */
|
18642
|
-
if
|
18643
|
-
|
18644
|
-
|
18645
|
-
if (nk_input_is_mouse_hovering_rect(&ctx->input, header))
|
18890
|
+
if(!(iter->flags & NK_WINDOW_HIDDEN)) {
|
18891
|
+
/* check if window popup is being hovered */
|
18892
|
+
if (iter->popup.active && iter->popup.win && nk_input_is_mouse_hovering_rect(&ctx->input, iter->popup.win->bounds))
|
18646
18893
|
return 1;
|
18647
|
-
|
18648
|
-
|
18894
|
+
|
18895
|
+
if (iter->flags & NK_WINDOW_MINIMIZED) {
|
18896
|
+
struct nk_rect header = iter->bounds;
|
18897
|
+
header.h = ctx->style.font->height + 2 * ctx->style.window.header.padding.y;
|
18898
|
+
if (nk_input_is_mouse_hovering_rect(&ctx->input, header))
|
18899
|
+
return 1;
|
18900
|
+
} else if (nk_input_is_mouse_hovering_rect(&ctx->input, iter->bounds)) {
|
18901
|
+
return 1;
|
18902
|
+
}
|
18649
18903
|
}
|
18650
|
-
/* check if window popup is being hovered */
|
18651
|
-
if (iter->popup.active && iter->popup.win && nk_input_is_mouse_hovering_rect(&ctx->input, iter->popup.win->bounds))
|
18652
|
-
return 1;
|
18653
18904
|
iter = iter->next;
|
18654
18905
|
}
|
18655
18906
|
return 0;
|
@@ -18752,29 +19003,36 @@ nk_window_close(struct nk_context *ctx, const char *name)
|
|
18752
19003
|
}
|
18753
19004
|
|
18754
19005
|
NK_API void
|
18755
|
-
nk_window_set_bounds(struct nk_context *ctx,
|
19006
|
+
nk_window_set_bounds(struct nk_context *ctx,
|
19007
|
+
const char *name, struct nk_rect bounds)
|
18756
19008
|
{
|
18757
|
-
|
18758
|
-
|
18759
|
-
ctx
|
19009
|
+
struct nk_window *win;
|
19010
|
+
NK_ASSERT(ctx);
|
19011
|
+
if (!ctx) return;
|
19012
|
+
win = nk_window_find(ctx, name);
|
19013
|
+
if (!win) return;
|
19014
|
+
NK_ASSERT(ctx->current != win && "You cannot update a currently in procecss window");
|
19015
|
+
win->bounds = bounds;
|
18760
19016
|
}
|
18761
19017
|
|
18762
19018
|
NK_API void
|
18763
|
-
nk_window_set_position(struct nk_context *ctx,
|
19019
|
+
nk_window_set_position(struct nk_context *ctx,
|
19020
|
+
const char *name, struct nk_vec2 pos)
|
18764
19021
|
{
|
18765
|
-
|
18766
|
-
if (!
|
18767
|
-
|
18768
|
-
|
19022
|
+
struct nk_window *win = nk_window_find(ctx, name);
|
19023
|
+
if (!win) return;
|
19024
|
+
win->bounds.x = pos.x;
|
19025
|
+
win->bounds.y = pos.y;
|
18769
19026
|
}
|
18770
19027
|
|
18771
19028
|
NK_API void
|
18772
|
-
nk_window_set_size(struct nk_context *ctx,
|
19029
|
+
nk_window_set_size(struct nk_context *ctx,
|
19030
|
+
const char *name, struct nk_vec2 size)
|
18773
19031
|
{
|
18774
|
-
|
18775
|
-
if (!
|
18776
|
-
|
18777
|
-
|
19032
|
+
struct nk_window *win = nk_window_find(ctx, name);
|
19033
|
+
if (!win) return;
|
19034
|
+
win->bounds.w = size.x;
|
19035
|
+
win->bounds.h = size.y;
|
18778
19036
|
}
|
18779
19037
|
|
18780
19038
|
NK_API void
|
@@ -18930,6 +19188,42 @@ nk_menubar_end(struct nk_context *ctx)
|
|
18930
19188
|
* LAYOUT
|
18931
19189
|
*
|
18932
19190
|
* --------------------------------------------------------------*/
|
19191
|
+
NK_API void
|
19192
|
+
nk_layout_set_min_row_height(struct nk_context *ctx, float height)
|
19193
|
+
{
|
19194
|
+
struct nk_window *win;
|
19195
|
+
struct nk_panel *layout;
|
19196
|
+
|
19197
|
+
NK_ASSERT(ctx);
|
19198
|
+
NK_ASSERT(ctx->current);
|
19199
|
+
NK_ASSERT(ctx->current->layout);
|
19200
|
+
if (!ctx || !ctx->current || !ctx->current->layout)
|
19201
|
+
return;
|
19202
|
+
|
19203
|
+
win = ctx->current;
|
19204
|
+
layout = win->layout;
|
19205
|
+
layout->row.min_height = height;
|
19206
|
+
}
|
19207
|
+
|
19208
|
+
NK_API void
|
19209
|
+
nk_layout_reset_min_row_height(struct nk_context *ctx)
|
19210
|
+
{
|
19211
|
+
struct nk_window *win;
|
19212
|
+
struct nk_panel *layout;
|
19213
|
+
|
19214
|
+
NK_ASSERT(ctx);
|
19215
|
+
NK_ASSERT(ctx->current);
|
19216
|
+
NK_ASSERT(ctx->current->layout);
|
19217
|
+
if (!ctx || !ctx->current || !ctx->current->layout)
|
19218
|
+
return;
|
19219
|
+
|
19220
|
+
win = ctx->current;
|
19221
|
+
layout = win->layout;
|
19222
|
+
layout->row.min_height = ctx->style.font->height;
|
19223
|
+
layout->row.min_height += ctx->style.text.padding.y*2;
|
19224
|
+
layout->row.min_height += ctx->style.window.min_row_height_padding*2;
|
19225
|
+
}
|
19226
|
+
|
18933
19227
|
NK_INTERN float
|
18934
19228
|
nk_layout_row_calculate_usable_space(const struct nk_style *style, enum nk_panel_type type,
|
18935
19229
|
float total_space, int columns)
|
@@ -18988,7 +19282,10 @@ nk_panel_layout(const struct nk_context *ctx, struct nk_window *win,
|
|
18988
19282
|
layout->row.index = 0;
|
18989
19283
|
layout->at_y += layout->row.height;
|
18990
19284
|
layout->row.columns = cols;
|
18991
|
-
|
19285
|
+
if (height == 0.0f)
|
19286
|
+
layout->row.height = NK_MAX(height, layout->row.min_height) + item_spacing.y;
|
19287
|
+
else layout->row.height = height + item_spacing.y;
|
19288
|
+
|
18992
19289
|
layout->row.item_offset = 0;
|
18993
19290
|
if (layout->flags & NK_WINDOW_DYNAMIC) {
|
18994
19291
|
/* draw background for dynamic panels */
|
@@ -19403,7 +19700,7 @@ nk_layout_widget_bounds(struct nk_context *ctx)
|
|
19403
19700
|
layout = win->layout;
|
19404
19701
|
|
19405
19702
|
ret.x = layout->at_x;
|
19406
|
-
ret.y = layout->
|
19703
|
+
ret.y = layout->at_y;
|
19407
19704
|
ret.w = layout->bounds.w - NK_MAX(layout->at_x - layout->bounds.x,0);
|
19408
19705
|
ret.h = layout->row.height;
|
19409
19706
|
return ret;
|
@@ -19663,6 +19960,9 @@ nk_layout_peek(struct nk_rect *bounds, struct nk_context *ctx)
|
|
19663
19960
|
layout->row.index = 0;
|
19664
19961
|
}
|
19665
19962
|
nk_layout_widget_space(bounds, ctx, win, nk_false);
|
19963
|
+
if (!layout->row.index) {
|
19964
|
+
bounds->x -= layout->row.item_offset;
|
19965
|
+
}
|
19666
19966
|
layout->at_y = y;
|
19667
19967
|
layout->row.index = index;
|
19668
19968
|
}
|
@@ -19678,6 +19978,7 @@ nk_tree_state_base(struct nk_context *ctx, enum nk_tree_type type,
|
|
19678
19978
|
const struct nk_input *in;
|
19679
19979
|
const struct nk_style_button *button;
|
19680
19980
|
enum nk_symbol_type symbol;
|
19981
|
+
float row_height;
|
19681
19982
|
|
19682
19983
|
struct nk_vec2 item_spacing;
|
19683
19984
|
struct nk_rect header = {0,0,0,0};
|
@@ -19701,7 +20002,11 @@ nk_tree_state_base(struct nk_context *ctx, enum nk_tree_type type,
|
|
19701
20002
|
item_spacing = style->window.spacing;
|
19702
20003
|
|
19703
20004
|
/* calculate header bounds and draw background */
|
19704
|
-
|
20005
|
+
row_height = style->font->height + 2 * style->tab.padding.y;
|
20006
|
+
nk_layout_set_min_row_height(ctx, row_height);
|
20007
|
+
nk_layout_row_dynamic(ctx, row_height, 1);
|
20008
|
+
nk_layout_reset_min_row_height(ctx);
|
20009
|
+
|
19705
20010
|
widget_state = nk_widget(&header, ctx);
|
19706
20011
|
if (type == NK_TREE_TAB) {
|
19707
20012
|
const struct nk_style_item *background = &style->tab.background;
|
@@ -19912,49 +20217,70 @@ nk_widget_height(struct nk_context *ctx)
|
|
19912
20217
|
NK_API int
|
19913
20218
|
nk_widget_is_hovered(struct nk_context *ctx)
|
19914
20219
|
{
|
19915
|
-
|
20220
|
+
struct nk_rect c, v;
|
19916
20221
|
struct nk_rect bounds;
|
19917
20222
|
NK_ASSERT(ctx);
|
19918
20223
|
NK_ASSERT(ctx->current);
|
19919
|
-
if (!ctx || !ctx->current)
|
20224
|
+
if (!ctx || !ctx->current || ctx->active != ctx->current)
|
19920
20225
|
return 0;
|
19921
20226
|
|
20227
|
+
c = ctx->current->layout->clip;
|
20228
|
+
c.x = (float)((int)c.x);
|
20229
|
+
c.y = (float)((int)c.y);
|
20230
|
+
c.w = (float)((int)c.w);
|
20231
|
+
c.h = (float)((int)c.h);
|
20232
|
+
|
19922
20233
|
nk_layout_peek(&bounds, ctx);
|
19923
|
-
|
19924
|
-
|
19925
|
-
|
20234
|
+
nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h);
|
20235
|
+
if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h))
|
20236
|
+
return 0;
|
20237
|
+
return nk_input_is_mouse_hovering_rect(&ctx->input, bounds);
|
19926
20238
|
}
|
19927
20239
|
|
19928
20240
|
NK_API int
|
19929
20241
|
nk_widget_is_mouse_clicked(struct nk_context *ctx, enum nk_buttons btn)
|
19930
20242
|
{
|
19931
|
-
|
20243
|
+
struct nk_rect c, v;
|
19932
20244
|
struct nk_rect bounds;
|
19933
20245
|
NK_ASSERT(ctx);
|
19934
20246
|
NK_ASSERT(ctx->current);
|
19935
|
-
if (!ctx || !ctx->current)
|
20247
|
+
if (!ctx || !ctx->current || ctx->active != ctx->current)
|
19936
20248
|
return 0;
|
19937
20249
|
|
20250
|
+
c = ctx->current->layout->clip;
|
20251
|
+
c.x = (float)((int)c.x);
|
20252
|
+
c.y = (float)((int)c.y);
|
20253
|
+
c.w = (float)((int)c.w);
|
20254
|
+
c.h = (float)((int)c.h);
|
20255
|
+
|
19938
20256
|
nk_layout_peek(&bounds, ctx);
|
19939
|
-
|
19940
|
-
|
19941
|
-
|
20257
|
+
nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h);
|
20258
|
+
if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h))
|
20259
|
+
return 0;
|
20260
|
+
return nk_input_mouse_clicked(&ctx->input, btn, bounds);
|
19942
20261
|
}
|
19943
20262
|
|
19944
20263
|
NK_API int
|
19945
20264
|
nk_widget_has_mouse_click_down(struct nk_context *ctx, enum nk_buttons btn, int down)
|
19946
20265
|
{
|
19947
|
-
|
20266
|
+
struct nk_rect c, v;
|
19948
20267
|
struct nk_rect bounds;
|
19949
20268
|
NK_ASSERT(ctx);
|
19950
20269
|
NK_ASSERT(ctx->current);
|
19951
|
-
if (!ctx || !ctx->current)
|
20270
|
+
if (!ctx || !ctx->current || ctx->active != ctx->current)
|
19952
20271
|
return 0;
|
19953
20272
|
|
20273
|
+
c = ctx->current->layout->clip;
|
20274
|
+
c.x = (float)((int)c.x);
|
20275
|
+
c.y = (float)((int)c.y);
|
20276
|
+
c.w = (float)((int)c.w);
|
20277
|
+
c.h = (float)((int)c.h);
|
20278
|
+
|
19954
20279
|
nk_layout_peek(&bounds, ctx);
|
19955
|
-
|
19956
|
-
|
19957
|
-
|
20280
|
+
nk_unify(&v, &c, bounds.x, bounds.y, bounds.x + bounds.w, bounds.y + bounds.h);
|
20281
|
+
if (!NK_INTERSECT(c.x, c.y, c.w, c.h, bounds.x, bounds.y, bounds.w, bounds.h))
|
20282
|
+
return 0;
|
20283
|
+
return nk_input_has_mouse_click_down_in_rect(&ctx->input, btn, bounds, down);
|
19958
20284
|
}
|
19959
20285
|
|
19960
20286
|
NK_API enum nk_widget_layout_states
|
@@ -20879,7 +21205,7 @@ nk_progress(struct nk_context *ctx, nk_size *cur, nk_size max, int is_modifyable
|
|
20879
21205
|
struct nk_window *win;
|
20880
21206
|
struct nk_panel *layout;
|
20881
21207
|
const struct nk_style *style;
|
20882
|
-
|
21208
|
+
struct nk_input *in;
|
20883
21209
|
|
20884
21210
|
struct nk_rect bounds;
|
20885
21211
|
enum nk_widget_layout_states state;
|
@@ -20996,10 +21322,9 @@ nk_edit_string(struct nk_context *ctx, nk_flags flags,
|
|
20996
21322
|
win->edit.sel_start = edit->select_start;
|
20997
21323
|
win->edit.sel_end = edit->select_end;
|
20998
21324
|
win->edit.mode = edit->mode;
|
20999
|
-
win->edit.scrollbar.x = (
|
21000
|
-
win->edit.scrollbar.y = (
|
21001
|
-
}
|
21002
|
-
return state;
|
21325
|
+
win->edit.scrollbar.x = (nk_uint)edit->scrollbar.x;
|
21326
|
+
win->edit.scrollbar.y = (nk_uint)edit->scrollbar.y;
|
21327
|
+
} return state;
|
21003
21328
|
}
|
21004
21329
|
|
21005
21330
|
NK_API nk_flags
|
@@ -21042,7 +21367,9 @@ nk_edit_buffer(struct nk_context *ctx, nk_flags flags,
|
|
21042
21367
|
}
|
21043
21368
|
if (flags & NK_EDIT_CLIPBOARD)
|
21044
21369
|
edit->clip = ctx->clip;
|
21045
|
-
|
21370
|
+
edit->active = (unsigned char)win->edit.active;
|
21371
|
+
} else edit->active = nk_false;
|
21372
|
+
edit->mode = win->edit.mode;
|
21046
21373
|
|
21047
21374
|
filter = (!filter) ? nk_filter_default: filter;
|
21048
21375
|
prev_state = (unsigned char)edit->active;
|
@@ -21059,8 +21386,7 @@ nk_edit_buffer(struct nk_context *ctx, nk_flags flags,
|
|
21059
21386
|
} else if (prev_state && !edit->active) {
|
21060
21387
|
/* current edit is now cold */
|
21061
21388
|
win->edit.active = nk_false;
|
21062
|
-
}
|
21063
|
-
return ret_flags;
|
21389
|
+
} return ret_flags;
|
21064
21390
|
}
|
21065
21391
|
|
21066
21392
|
NK_API nk_flags
|
@@ -21632,10 +21958,12 @@ nk_plot(struct nk_context *ctx, enum nk_chart_type type, const float *values,
|
|
21632
21958
|
min_value = NK_MIN(values[i + offset], min_value);
|
21633
21959
|
max_value = NK_MAX(values[i + offset], max_value);
|
21634
21960
|
}
|
21635
|
-
|
21636
|
-
|
21637
|
-
|
21638
|
-
|
21961
|
+
|
21962
|
+
if (nk_chart_begin(ctx, type, count, min_value, max_value)) {
|
21963
|
+
for (i = 0; i < count; ++i)
|
21964
|
+
nk_chart_push(ctx, values[i + offset]);
|
21965
|
+
nk_chart_end(ctx);
|
21966
|
+
}
|
21639
21967
|
}
|
21640
21968
|
|
21641
21969
|
NK_API void
|
@@ -21656,10 +21984,12 @@ nk_plot_function(struct nk_context *ctx, enum nk_chart_type type, void *userdata
|
|
21656
21984
|
min_value = NK_MIN(value, min_value);
|
21657
21985
|
max_value = NK_MAX(value, max_value);
|
21658
21986
|
}
|
21659
|
-
|
21660
|
-
|
21661
|
-
|
21662
|
-
|
21987
|
+
|
21988
|
+
if (nk_chart_begin(ctx, type, count, min_value, max_value)) {
|
21989
|
+
for (i = 0; i < count; ++i)
|
21990
|
+
nk_chart_push(ctx, value_getter(userdata, i + offset));
|
21991
|
+
nk_chart_end(ctx);
|
21992
|
+
}
|
21663
21993
|
}
|
21664
21994
|
|
21665
21995
|
/* -------------------------------------------------------------
|
@@ -22149,10 +22479,10 @@ nk_tooltip_begin(struct nk_context *ctx, float width)
|
|
22149
22479
|
if (win->popup.win && (win->popup.type & NK_PANEL_SET_NONBLOCK))
|
22150
22480
|
return 0;
|
22151
22481
|
|
22152
|
-
bounds.w = width;
|
22153
|
-
bounds.h = nk_null_rect.h;
|
22154
|
-
bounds.x = (in->mouse.pos.x + 1) - win->layout->clip.x;
|
22155
|
-
bounds.y = (in->mouse.pos.y + 1) - win->layout->clip.y;
|
22482
|
+
bounds.w = nk_iceilf(width);
|
22483
|
+
bounds.h = nk_iceilf(nk_null_rect.h);
|
22484
|
+
bounds.x = nk_ifloorf(in->mouse.pos.x + 1) - win->layout->clip.x;
|
22485
|
+
bounds.y = nk_ifloorf(in->mouse.pos.y + 1) - win->layout->clip.y;
|
22156
22486
|
|
22157
22487
|
ret = nk_popup_begin(ctx, NK_POPUP_DYNAMIC,
|
22158
22488
|
"__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_BORDER, bounds);
|
@@ -22208,6 +22538,19 @@ nk_tooltip(struct nk_context *ctx, const char *text)
|
|
22208
22538
|
nk_tooltip_end(ctx);
|
22209
22539
|
}
|
22210
22540
|
}
|
22541
|
+
#ifdef NK_INCLUDE_STANDARD_VARARGS
|
22542
|
+
NK_API void
|
22543
|
+
nk_tooltipf(struct nk_context *ctx, const char *fmt, ...)
|
22544
|
+
{
|
22545
|
+
char buf[256];
|
22546
|
+
va_list args;
|
22547
|
+
va_start(args, fmt);
|
22548
|
+
nk_strfmt(buf, NK_LEN(buf), fmt, args);
|
22549
|
+
va_end(args);
|
22550
|
+
nk_tooltip(ctx, buf);
|
22551
|
+
}
|
22552
|
+
#endif
|
22553
|
+
|
22211
22554
|
/* -------------------------------------------------------------
|
22212
22555
|
*
|
22213
22556
|
* CONTEXTUAL
|
@@ -23375,4 +23718,4 @@ NK_API void
|
|
23375
23718
|
nk_menu_end(struct nk_context *ctx)
|
23376
23719
|
{nk_contextual_end(ctx);}
|
23377
23720
|
|
23378
|
-
#endif
|
23721
|
+
#endif /* NK_IMPLEMENTATION */
|