Bläddra i källkod

Added general scrollbar shortcuts

This commit extends nuklears scrollbar with some basic shortcuts.
Included are page up/down as well as jump to beginning and
end of window. The last scrollbar change is page down/up by mouse
click in empty scrollbar space.
vurtun 9 år sedan
förälder
incheckning
b020c332d0
1 ändrade filer med 81 tillägg och 21 borttagningar
  1. 81 21
      nuklear.h

+ 81 - 21
nuklear.h

@@ -377,6 +377,8 @@ enum nk_keys {
     NK_KEY_DOWN,
     NK_KEY_LEFT,
     NK_KEY_RIGHT,
+
+    /* Shortcuts: text field */
     NK_KEY_TEXT_INSERT_MODE,
     NK_KEY_TEXT_REPLACE_MODE,
     NK_KEY_TEXT_RESET_MODE,
@@ -388,6 +390,13 @@ enum nk_keys {
     NK_KEY_TEXT_REDO,
     NK_KEY_TEXT_WORD_LEFT,
     NK_KEY_TEXT_WORD_RIGHT,
+
+    /* Shortcuts: scrollbar */
+    NK_KEY_SCROLL_START,
+    NK_KEY_SCROLL_END,
+    NK_KEY_SCROLL_DOWN,
+    NK_KEY_SCROLL_UP,
+
     NK_KEY_MAX
 };
 
@@ -12374,10 +12383,12 @@ nk_do_progress(nk_flags *state,
  * ===============================================================*/
 NK_INTERN float
 nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
-    int has_scrolling, struct nk_rect scroll,
-    struct nk_rect cursor, float scroll_offset,
+    int has_scrolling, const struct nk_rect *scroll,
+    const struct nk_rect *cursor, const struct nk_rect *empty0,
+    const struct nk_rect *empty1, float scroll_offset,
     float target, float scroll_step, enum nk_orientation o)
 {
+    nk_flags ws;
     int left_mouse_down;
     int left_mouse_click_in_cursor;
 
@@ -12386,8 +12397,8 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
 
     left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
     left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
-        NK_BUTTON_LEFT, cursor, nk_true);
-    if (nk_input_is_mouse_hovering_rect(in, scroll))
+        NK_BUTTON_LEFT, *cursor, nk_true);
+    if (nk_input_is_mouse_hovering_rect(in, *scroll))
         *state = NK_WIDGET_STATE_HOVERED;
 
     if (left_mouse_down && left_mouse_click_in_cursor) {
@@ -12397,29 +12408,48 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
         if (o == NK_VERTICAL) {
             float cursor_y;
             pixel = in->mouse.delta.y;
-            delta = (pixel / scroll.h) * target;
-            scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll.h);
-            cursor_y = scroll.y + ((scroll_offset/target) * scroll.h);
-            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = cursor_y + cursor.h/2.0f;
+            delta = (pixel / scroll->h) * target;
+            scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->h);
+            cursor_y = scroll->y + ((scroll_offset/target) * scroll->h);
+            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y = cursor_y + cursor->h/2.0f;
         } else {
             float cursor_x;
             pixel = in->mouse.delta.x;
-            delta = (pixel / scroll.w) * target;
-            scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll.w);
-            cursor_x = scroll.x + ((scroll_offset/target) * scroll.w);
-            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor_x + cursor.w/2.0f;
+            delta = (pixel / scroll->w) * target;
+            scroll_offset = NK_CLAMP(0, scroll_offset + delta, target - scroll->w);
+            cursor_x = scroll->x + ((scroll_offset/target) * scroll->w);
+            in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x = cursor_x + cursor->w/2.0f;
         }
     } else if (has_scrolling && ((in->mouse.scroll_delta<0) ||
             (in->mouse.scroll_delta>0))) {
         /* update cursor by mouse scrolling */
         scroll_offset = scroll_offset + scroll_step * (-in->mouse.scroll_delta);
         if (o == NK_VERTICAL)
-            scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll.h);
-        else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll.w);
+            scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->h);
+        else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->w);
+    } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_UP) && o == NK_VERTICAL)||
+            nk_button_behavior(&ws, *empty0, in, NK_BUTTON_DEFAULT)) {
+        /* scroll page up by click on empty space or shortcut */
+        if (o == NK_VERTICAL)
+            scroll_offset = NK_MAX(0, scroll_offset - scroll->h);
+        else scroll_offset = NK_MAX(0, scroll_offset - scroll->w);
+    } else if ((nk_input_is_key_pressed(in, NK_KEY_SCROLL_DOWN) && o == NK_VERTICAL)||
+            nk_button_behavior(&ws, *empty1, in, NK_BUTTON_DEFAULT)){
+        /* scroll page down by click on empty space or shortcut */
+        if (o == NK_VERTICAL)
+            scroll_offset = NK_MIN(scroll_offset + scroll->h, target - scroll->h);
+        else scroll_offset = NK_MIN(scroll_offset + scroll->w, target - scroll->w);
+    } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_START)) {
+        /* update cursor to the beginning  */
+        if (o == NK_VERTICAL) scroll_offset = 0;
+    } else if (nk_input_is_key_pressed(in, NK_KEY_SCROLL_END)) {
+        /* update cursor to the end */
+        if (o == NK_VERTICAL) scroll_offset = target - scroll->h;
     }
-    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, scroll))
+
+    if (*state & NK_WIDGET_STATE_HOVER && !nk_input_is_mouse_prev_hovering_rect(in, *scroll))
         *state |= NK_WIDGET_STATE_ENTERED;
-    else if (nk_input_is_mouse_prev_hovering_rect(in, scroll))
+    else if (nk_input_is_mouse_prev_hovering_rect(in, *scroll))
         *state |= NK_WIDGET_STATE_LEFT;
     return scroll_offset;
 }
@@ -12470,6 +12500,9 @@ nk_do_scrollbarv(nk_flags *state,
     const struct nk_user_font *font)
 {
     struct nk_rect cursor;
+    struct nk_rect empty_north;
+    struct nk_rect empty_south;
+
     float scroll_step;
     float scroll_offset;
     float scroll_off;
@@ -12524,9 +12557,20 @@ nk_do_scrollbarv(nk_flags *state,
     cursor.w = scroll.w - (2 * style->border + 2 * style->padding.x);
     cursor.x = scroll.x + style->border + style->padding.x;
 
+    /* calculate empty space around cursor */
+    empty_north.x = scroll.x;
+    empty_north.y = scroll.y;
+    empty_north.w = scroll.w;
+    empty_north.h = cursor.x - scroll.w;
+
+    empty_south.x = scroll.x;
+    empty_south.y = cursor.y + cursor.h;
+    empty_south.w = scroll.w;
+    empty_south.h = (scroll.y + scroll.h) - (cursor.y + cursor.h);
+
     /* update scrollbar */
-    scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, scroll, cursor,
-        scroll_offset, target, scroll_step, NK_VERTICAL);
+    scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor,
+        &empty_north, &empty_south, scroll_offset, target, scroll_step, NK_VERTICAL);
     scroll_off = scroll_offset / target;
     cursor.y = scroll.y + (scroll_off * scroll.h) + style->border_cursor + style->padding.y;
 
@@ -12545,6 +12589,9 @@ nk_do_scrollbarh(nk_flags *state,
     const struct nk_user_font *font)
 {
     struct nk_rect cursor;
+    struct nk_rect empty_west;
+    struct nk_rect empty_east;
+
     float scroll_step;
     float scroll_offset;
     float scroll_off;
@@ -12599,9 +12646,20 @@ nk_do_scrollbarh(nk_flags *state,
     cursor.h = scroll.h - (2 * style->border + 2 * style->padding.y);
     cursor.y = scroll.y + style->border + style->padding.y;
 
+    /* calculate empty space around cursor */
+    empty_west.x = scroll.x;
+    empty_west.y = scroll.y;
+    empty_west.w = cursor.y - scroll.y;
+    empty_west.h = scroll.h;
+
+    empty_east.x = cursor.x + cursor.w;
+    empty_east.y = scroll.y;
+    empty_east.w = (scroll.x + scroll.w) - (cursor.x + cursor.w);
+    empty_east.h = scroll.h;
+
     /* update scrollbar */
-    scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, scroll, cursor,
-        scroll_offset, target, scroll_step, NK_HORIZONTAL);
+    scroll_offset = nk_scrollbar_behavior(state, in, has_scrolling, &scroll, &cursor,
+        &empty_west, &empty_east, scroll_offset, target, scroll_step, NK_HORIZONTAL);
     scroll_off = scroll_offset / target;
     cursor.x = scroll.x + (scroll_off * scroll.w);
 
@@ -15853,7 +15911,9 @@ nk_panel_end(struct nk_context *ctx)
             scroll_step = bounds.h * 0.10f;
             scroll_inc = bounds.h * 0.01f;
             scroll_target = (float)(int)(layout->at_y - bounds.y);
-            scroll_has_scrolling = (window == ctx->active);
+            if (!(window->flags & NK_WINDOW_SUB)) {
+                scroll_has_scrolling = (window == ctx->active);
+            } else scroll_has_scrolling = 0;
             scroll_offset = nk_do_scrollbarv(&state, out, bounds, scroll_has_scrolling,
                     scroll_offset, scroll_target, scroll_step, scroll_inc,
                     &ctx->style.scrollv, in, &style->font);