@@ -69,6 +69,8 @@ typedef enum {
6969 NK_CONSOLE_COLOR ,
7070 NK_CONSOLE_INPUT ,
7171 NK_CONSOLE_INPUT_ACTIVE ,
72+ NK_CONSOLE_KEY ,
73+ NK_CONSOLE_KEY_ACTIVE ,
7274 NK_CONSOLE_RADIO ,
7375 NK_CONSOLE_KNOB_INT ,
7476 NK_CONSOLE_KNOB_FLOAT ,
@@ -284,6 +286,7 @@ NK_API nk_bool nk_console_navigate_to_path(nk_console* console, const char* path
284286#include "nuklear_console_file_system.h"
285287#include "nuklear_console_image.h"
286288#include "nuklear_console_input.h"
289+ #include "nuklear_console_key.h"
287290#include "nuklear_console_knob.h"
288291#include "nuklear_console_label.h"
289292#include "nuklear_console_list_view.h"
@@ -309,6 +312,28 @@ NK_API nk_bool nk_console_navigate_to_path(nk_console* console, const char* path
309312#ifndef NK_CONSOLE_IMPLEMENTATION_ONCE
310313#define NK_CONSOLE_IMPLEMENTATION_ONCE
311314
315+ #ifndef NK_BUTTON_TRIGGER_ON_RELEASE
316+ /**
317+ * Define NK_BUTTON_TRIGGER_ON_RELEASE prior to nuklear.h.
318+ *
319+ * This is required because the input events are triggered incorrectly otherwise, resulting in undesirable behavior.
320+ *
321+ * @code
322+ * #define NK_BUTTON_TRIGGER_ON_RELEASE
323+ * #define NK_IMPLEMENTATION
324+ * #include "nuklear.h"
325+ *
326+ * #define NK_CONSOLE_IMPLEMENTATION
327+ * #include "nuklear_console.h"
328+ * @endcode
329+ *
330+ * You are able to ignore this warning by using #define NK_CONSOLE_IGNORE_BUTTON_TRIGGER_ON_RELEASE
331+ */
332+ #ifndef NK_CONSOLE_IGNORE_BUTTON_TRIGGER_ON_RELEASE
333+ #warning "nuklear_console requires NK_BUTTON_TRIGGER_ON_RELEASE. Add #define NK_BUTTON_TRIGGER_ON_RELEASE prior to #define NK_IMPLEMENTATION ."
334+ #endif
335+ #endif
336+
312337#ifndef NK_CONSOLE_AXIS_DEADZONE
313338#define NK_CONSOLE_AXIS_DEADZONE 0.22f
314339#endif
@@ -319,6 +344,15 @@ NK_API nk_bool nk_console_navigate_to_path(nk_console* console, const char* path
319344#define NK_CONSOLE_DRAG_THRESHOLD 8.0f
320345#endif
321346
347+ #ifndef NK_CONSOLE_KEY_BACK
348+ /**
349+ * The Nuklear `enum nk_keys` used to go back in the menu heirarchy.
350+ *
351+ * @see nk_console_button_pushed()
352+ */
353+ #define NK_CONSOLE_KEY_BACK NK_KEY_TEXT_RESET_MODE
354+ #endif // NK_CONSOLE_KEY_BACK
355+
322356// NK_CONSOLE_MALLOC
323357#ifndef NK_CONSOLE_MALLOC
324358#ifdef NK_INCLUDE_DEFAULT_ALLOCATOR
@@ -378,6 +412,7 @@ extern "C" {
378412#include "nuklear_console_file_system.h"
379413#include "nuklear_console_image.h"
380414#include "nuklear_console_input.h"
415+ #include "nuklear_console_key.h"
381416#include "nuklear_console_knob.h"
382417#include "nuklear_console_label.h"
383418#include "nuklear_console_list_view.h"
@@ -876,10 +911,6 @@ static void nk_console_axis_update(nk_console* console) {
876911 * Handles the Touch and Drag Scrolling.
877912 */
878913static void nk_console_window_touch_drag (nk_console * console , nk_console_top_data * top_data ) {
879- #ifndef NK_BUTTON_TRIGGER_ON_RELEASE
880- NK_UNUSED (console );
881- NK_UNUSED (top_data );
882- #else
883914 struct nk_input * in = & console -> ctx -> input ;
884915 if (nk_window_is_hovered (console -> ctx ) && nk_input_is_mouse_pressed (in , NK_BUTTON_LEFT )) {
885916 top_data -> drag_scroll_origin = in -> mouse .pos ;
@@ -890,7 +921,7 @@ static void nk_console_window_touch_drag(nk_console* console, nk_console_top_dat
890921 float dy = top_data -> drag_scroll_origin .y - in -> mouse .pos .y ;
891922 float dx = top_data -> drag_scroll_origin .x - in -> mouse .pos .x ;
892923 if (!top_data -> drag_scroll_active &&
893- (dy * dy + dx * dx ) > NK_CONSOLE_DRAG_THRESHOLD * NK_CONSOLE_DRAG_THRESHOLD ) {
924+ (dy * dy + dx * dx ) > NK_CONSOLE_DRAG_THRESHOLD * NK_CONSOLE_DRAG_THRESHOLD ) {
894925 top_data -> drag_scroll_active = nk_true ;
895926 }
896927 if (top_data -> drag_scroll_active ) {
@@ -899,10 +930,10 @@ static void nk_console_window_touch_drag(nk_console* console, nk_console_top_dat
899930 nk_window_set_scroll (console -> ctx , sx , sy );
900931 top_data -> input_processed = nk_true ;
901932 }
902- } else {
933+ }
934+ else {
903935 top_data -> drag_scroll_active = nk_false ;
904936 }
905- #endif
906937}
907938
908939NK_API void nk_console_render (nk_console * console ) {
@@ -973,6 +1004,15 @@ NK_API void nk_console_render(nk_console* console) {
9731004 cvector_clear (console -> events );
9741005 }
9751006 }
1007+
1008+ // Update drag scroll bounds so they're valid when nk_console_render is called directly (e.g. SDL/GLFW demos) rather than via nk_console_render_window.
1009+ if (console -> ctx -> current != NULL ) {
1010+ struct nk_rect content = nk_window_get_content_region (console -> ctx );
1011+ float rendered_h = console -> ctx -> current -> layout -> at_y - console -> ctx -> current -> layout -> bounds .y + console -> ctx -> current -> layout -> row .height ;
1012+ data -> drag_scroll_max_y = (nk_uint )NK_MAX (0.0f , rendered_h - content .h );
1013+ data -> drag_scroll_max_x = (nk_uint )NK_MAX (0.0f , console -> ctx -> current -> layout -> max_x - console -> ctx -> current -> layout -> bounds .x - content .w );
1014+ }
1015+
9761016 return ;
9771017 }
9781018
@@ -1109,10 +1149,8 @@ NK_API struct nk_rect nk_console_render_window(nk_console* console, const char*
11091149 float rendered_h = console -> ctx -> current -> layout -> at_y - console -> ctx -> current -> layout -> bounds .y + console -> ctx -> current -> layout -> row .height ;
11101150 window_bounds = nk_window_get_bounds (console -> ctx );
11111151 window_bounds .h = window_bounds .h - content .h + rendered_h ;
1112- #ifdef NK_BUTTON_TRIGGER_ON_RELEASE
11131152 top_data -> drag_scroll_max_y = (nk_uint )NK_MAX (0.0f , rendered_h - content .h );
11141153 top_data -> drag_scroll_max_x = (nk_uint )NK_MAX (0.0f , console -> ctx -> current -> layout -> max_x - console -> ctx -> current -> layout -> bounds .x - content .w );
1115- #endif
11161154 }
11171155
11181156 // Finish the window processing.
@@ -1333,8 +1371,8 @@ NK_API nk_console* nk_console_find_by_path(nk_console* console, const char* path
13331371 continue ;
13341372 }
13351373 int label_len = child -> label_length > 0
1336- ? child -> label_length
1337- : (int )nk_strlen (child -> label );
1374+ ? child -> label_length
1375+ : (int )nk_strlen (child -> label );
13381376 if (label_len == copy_len &&
13391377 strncmp (child -> label , segment , (size_t )copy_len ) == 0 ) {
13401378 found = child ;
@@ -1397,9 +1435,9 @@ NK_API nk_bool nk_console_button_pushed(nk_console* console, int button) {
13971435 case NK_GAMEPAD_BUTTON_A : return nk_input_is_key_released (& console -> ctx -> input , NK_KEY_ENTER );
13981436 case NK_GAMEPAD_BUTTON_B :
13991437 // Escape Key
1400- return nk_input_is_key_released (& console -> ctx -> input , NK_KEY_TEXT_RESET_MODE ) ||
1401- // Mouse Back Button
1402- (nk_input_is_mouse_pressed (& console -> ctx -> input , NK_BUTTON_X1 ) && nk_window_is_hovered (console -> ctx ));
1438+ return nk_input_is_key_released (& console -> ctx -> input , NK_CONSOLE_KEY_BACK ) ||
1439+ // Mouse Back Button
1440+ (nk_input_is_mouse_pressed (& console -> ctx -> input , NK_BUTTON_X1 ) && nk_window_is_hovered (console -> ctx ));
14031441 // case NK_GAMEPAD_BUTTON_X: return nk_input_is_key_pressed(&console->ctx->input, NK_KEY_A);
14041442 // case NK_GAMEPAD_BUTTON_Y: return nk_input_is_key_pressed(&console->ctx->input, NK_KEY_S);
14051443 case NK_GAMEPAD_BUTTON_LB : return nk_input_is_key_released (& console -> ctx -> input , NK_KEY_UP ) && nk_input_is_key_down (& console -> ctx -> input , NK_KEY_SHIFT );
0 commit comments