Added horizontal scrolling
This commit is contained in:
parent
a979372909
commit
23eea231d8
@ -95,11 +95,9 @@ static float
|
|||||||
nk_allegro5_font_get_text_width(nk_handle handle, float height, const char *text, int len)
|
nk_allegro5_font_get_text_width(nk_handle handle, float height, const char *text, int len)
|
||||||
{
|
{
|
||||||
NkAllegro5Font *font = (NkAllegro5Font*)handle.ptr;
|
NkAllegro5Font *font = (NkAllegro5Font*)handle.ptr;
|
||||||
|
|
||||||
if (!font || !text) {
|
if (!font || !text) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We must copy into a new buffer with exact length null-terminated
|
/* We must copy into a new buffer with exact length null-terminated
|
||||||
as nuklear uses variable size buffers and al_get_text_width doesn't
|
as nuklear uses variable size buffers and al_get_text_width doesn't
|
||||||
accept a length, it infers length from null-termination
|
accept a length, it infers length from null-termination
|
||||||
@ -107,7 +105,6 @@ nk_allegro5_font_get_text_width(nk_handle handle, float height, const char *text
|
|||||||
char strcpy[len+1];
|
char strcpy[len+1];
|
||||||
strncpy((char*)&strcpy, text, len);
|
strncpy((char*)&strcpy, text, len);
|
||||||
strcpy[len] = '\0';
|
strcpy[len] = '\0';
|
||||||
|
|
||||||
return al_get_text_width(font->font, strcpy);
|
return al_get_text_width(font->font, strcpy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +286,7 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
|
|||||||
case ALLEGRO_EVENT_MOUSE_AXES: {
|
case ALLEGRO_EVENT_MOUSE_AXES: {
|
||||||
nk_input_motion(ctx, ev->mouse.x, ev->mouse.y);
|
nk_input_motion(ctx, ev->mouse.x, ev->mouse.y);
|
||||||
if (ev->mouse.dz != 0) {
|
if (ev->mouse.dz != 0) {
|
||||||
nk_input_scroll(ctx, (float)ev->mouse.dz / al_get_mouse_wheel_precision());
|
nk_input_scroll(ctx, nk_vec2(0,(float)ev->mouse.dz / al_get_mouse_wheel_precision()));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
|
case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
|
||||||
@ -342,7 +339,7 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
|
|||||||
case ALLEGRO_EVENT_KEY_UP: {
|
case ALLEGRO_EVENT_KEY_UP: {
|
||||||
int kc = ev->keyboard.keycode;
|
int kc = ev->keyboard.keycode;
|
||||||
int down = ev->type == ALLEGRO_EVENT_KEY_DOWN;
|
int down = ev->type == ALLEGRO_EVENT_KEY_DOWN;
|
||||||
|
|
||||||
if (kc == ALLEGRO_KEY_LSHIFT || kc == ALLEGRO_KEY_RSHIFT) nk_input_key(ctx, NK_KEY_SHIFT, down);
|
if (kc == ALLEGRO_KEY_LSHIFT || kc == ALLEGRO_KEY_RSHIFT) nk_input_key(ctx, NK_KEY_SHIFT, down);
|
||||||
else if (kc == ALLEGRO_KEY_DELETE) nk_input_key(ctx, NK_KEY_DEL, down);
|
else if (kc == ALLEGRO_KEY_DELETE) nk_input_key(ctx, NK_KEY_DEL, down);
|
||||||
else if (kc == ALLEGRO_KEY_ENTER) nk_input_key(ctx, NK_KEY_ENTER, down);
|
else if (kc == ALLEGRO_KEY_ENTER) nk_input_key(ctx, NK_KEY_ENTER, down);
|
||||||
@ -367,7 +364,7 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
|
|||||||
int kc = ev->keyboard.keycode;
|
int kc = ev->keyboard.keycode;
|
||||||
int control_mask = (ev->keyboard.modifiers & ALLEGRO_KEYMOD_CTRL) ||
|
int control_mask = (ev->keyboard.modifiers & ALLEGRO_KEYMOD_CTRL) ||
|
||||||
(ev->keyboard.modifiers & ALLEGRO_KEYMOD_COMMAND);
|
(ev->keyboard.modifiers & ALLEGRO_KEYMOD_COMMAND);
|
||||||
|
|
||||||
if (kc == ALLEGRO_KEY_C && control_mask) {
|
if (kc == ALLEGRO_KEY_C && control_mask) {
|
||||||
nk_input_key(ctx, NK_KEY_COPY, 1);
|
nk_input_key(ctx, NK_KEY_COPY, 1);
|
||||||
} else if (kc == ALLEGRO_KEY_V && control_mask) {
|
} else if (kc == ALLEGRO_KEY_V && control_mask) {
|
||||||
@ -380,9 +377,7 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
|
|||||||
nk_input_key(ctx, NK_KEY_TEXT_REDO, 1);
|
nk_input_key(ctx, NK_KEY_TEXT_REDO, 1);
|
||||||
} else if (kc == ALLEGRO_KEY_A && control_mask) {
|
} else if (kc == ALLEGRO_KEY_A && control_mask) {
|
||||||
nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, 1);
|
nk_input_key(ctx, NK_KEY_TEXT_SELECT_ALL, 1);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
|
|
||||||
if (kc != ALLEGRO_KEY_BACKSPACE &&
|
if (kc != ALLEGRO_KEY_BACKSPACE &&
|
||||||
kc != ALLEGRO_KEY_LEFT &&
|
kc != ALLEGRO_KEY_LEFT &&
|
||||||
kc != ALLEGRO_KEY_RIGHT &&
|
kc != ALLEGRO_KEY_RIGHT &&
|
||||||
@ -398,7 +393,6 @@ nk_allegro5_handle_event(ALLEGRO_EVENT *ev)
|
|||||||
nk_input_unicode(ctx, ev->keyboard.unichar);
|
nk_input_unicode(ctx, ev->keyboard.unichar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
@ -462,3 +456,4 @@ void nk_allegro5_shutdown(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* NK_ALLEGRO5_IMPLEMENTATION */
|
#endif /* NK_ALLEGRO5_IMPLEMENTATION */
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ nk_d3d11_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
nk_input_scroll(&d3d11.ctx, (float)(short)HIWORD(wparam) / WHEEL_DELTA);
|
nk_input_scroll(&d3d11.ctx, nk_vec2(0,(float)(short)HIWORD(wparam) / WHEEL_DELTA));
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
|
@ -652,7 +652,7 @@ nk_gdi_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
nk_input_scroll(&gdi.ctx, (float)(short)HIWORD(wparam) / WHEEL_DELTA);
|
nk_input_scroll(&gdi.ctx, nk_vec2(0,(float)(short)HIWORD(wparam) / WHEEL_DELTA));
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
|
@ -1024,7 +1024,7 @@ nk_gdip_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
nk_input_scroll(&gdip.ctx, (float)(short)HIWORD(wparam) / WHEEL_DELTA);
|
nk_input_scroll(&gdip.ctx, nk_vec2(0,(float)(short)HIWORD(wparam) / WHEEL_DELTA));
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
|
@ -67,7 +67,7 @@ static struct nk_glfw {
|
|||||||
struct nk_vec2 fb_scale;
|
struct nk_vec2 fb_scale;
|
||||||
unsigned int text[NK_GLFW_TEXT_MAX];
|
unsigned int text[NK_GLFW_TEXT_MAX];
|
||||||
int text_len;
|
int text_len;
|
||||||
float scroll;
|
struct nk_vec2 scroll;
|
||||||
} glfw;
|
} glfw;
|
||||||
|
|
||||||
NK_INTERN void
|
NK_INTERN void
|
||||||
@ -200,7 +200,8 @@ NK_API void
|
|||||||
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
||||||
{
|
{
|
||||||
(void)win; (void)xoff;
|
(void)win; (void)xoff;
|
||||||
glfw.scroll += (float)yoff;
|
glfw.scroll.x += (float)xoff;
|
||||||
|
glfw.scroll.y += (float)yoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
NK_INTERN void
|
NK_INTERN void
|
||||||
@ -333,7 +334,7 @@ nk_glfw3_new_frame(void)
|
|||||||
nk_input_scroll(ctx, glfw.scroll);
|
nk_input_scroll(ctx, glfw.scroll);
|
||||||
nk_input_end(&glfw.ctx);
|
nk_input_end(&glfw.ctx);
|
||||||
glfw.text_len = 0;
|
glfw.text_len = 0;
|
||||||
glfw.scroll = 0;
|
glfw.scroll = nk_vec2(0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
NK_API
|
NK_API
|
||||||
|
@ -78,7 +78,7 @@ static struct nk_glfw {
|
|||||||
struct nk_vec2 fb_scale;
|
struct nk_vec2 fb_scale;
|
||||||
unsigned int text[NK_GLFW_TEXT_MAX];
|
unsigned int text[NK_GLFW_TEXT_MAX];
|
||||||
int text_len;
|
int text_len;
|
||||||
float scroll;
|
struct nk_vec2 scroll;
|
||||||
} glfw;
|
} glfw;
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
@ -308,7 +308,8 @@ NK_API void
|
|||||||
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff)
|
||||||
{
|
{
|
||||||
(void)win; (void)xoff;
|
(void)win; (void)xoff;
|
||||||
glfw.scroll += (float)yoff;
|
glfw.scroll.x += (float)xoff;
|
||||||
|
glfw.scroll.y += (float)yoff;
|
||||||
}
|
}
|
||||||
|
|
||||||
NK_INTERN void
|
NK_INTERN void
|
||||||
@ -441,7 +442,7 @@ nk_glfw3_new_frame(void)
|
|||||||
nk_input_scroll(ctx, glfw.scroll);
|
nk_input_scroll(ctx, glfw.scroll);
|
||||||
nk_input_end(&glfw.ctx);
|
nk_input_end(&glfw.ctx);
|
||||||
glfw.text_len = 0;
|
glfw.text_len = 0;
|
||||||
glfw.scroll = 0;
|
glfw.scroll = nk_vec2(0,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
NK_API
|
NK_API
|
||||||
|
@ -322,7 +322,7 @@ nk_sdl_handle_event(SDL_Event *evt)
|
|||||||
nk_input_glyph(ctx, glyph);
|
nk_input_glyph(ctx, glyph);
|
||||||
return 1;
|
return 1;
|
||||||
} else if (evt->type == SDL_MOUSEWHEEL) {
|
} else if (evt->type == SDL_MOUSEWHEEL) {
|
||||||
nk_input_scroll(ctx,(float)evt->wheel.y);
|
nk_input_scroll(ctx,nk_vec2((float)evt->wheel.x,(float)evt->wheel.y));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -419,7 +419,7 @@ nk_sdl_handle_event(SDL_Event *evt)
|
|||||||
nk_input_glyph(ctx, glyph);
|
nk_input_glyph(ctx, glyph);
|
||||||
return 1;
|
return 1;
|
||||||
} else if (evt->type == SDL_MOUSEWHEEL) {
|
} else if (evt->type == SDL_MOUSEWHEEL) {
|
||||||
nk_input_scroll(ctx,(float)evt->wheel.y);
|
nk_input_scroll(ctx,nk_vec2((float)evt->wheel.x,(float)evt->wheel.y));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -332,7 +332,7 @@ nk_sfml_handle_event(sf::Event* evt)
|
|||||||
nk_input_unicode(ctx, evt->text.unicode);
|
nk_input_unicode(ctx, evt->text.unicode);
|
||||||
return 1;
|
return 1;
|
||||||
} else if(evt->type == sf::Event::MouseWheelScrolled) {
|
} else if(evt->type == sf::Event::MouseWheelScrolled) {
|
||||||
nk_input_scroll(ctx, evt->mouseWheelScroll.delta);
|
nk_input_scroll(ctx, nk_vec2(0,evt->mouseWheelScroll.delta));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -445,7 +445,7 @@ nk_sfml_handle_event(sf::Event* evt)
|
|||||||
nk_input_unicode(ctx, evt->text.unicode);
|
nk_input_unicode(ctx, evt->text.unicode);
|
||||||
return 1;
|
return 1;
|
||||||
} else if(evt->type == sf::Event::MouseWheelScrolled) {
|
} else if(evt->type == sf::Event::MouseWheelScrolled) {
|
||||||
nk_input_scroll(ctx, evt->mouseWheelScroll.delta);
|
nk_input_scroll(ctx, nk_vec2(0,evt->mouseWheelScroll.delta));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -616,9 +616,9 @@ nk_xlib_handle_event(Display *dpy, int screen, Window win, XEvent *evt)
|
|||||||
else if (evt->xbutton.button == Button3)
|
else if (evt->xbutton.button == Button3)
|
||||||
nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down);
|
nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down);
|
||||||
else if (evt->xbutton.button == Button4)
|
else if (evt->xbutton.button == Button4)
|
||||||
nk_input_scroll(ctx, 1.0f);
|
nk_input_scroll(ctx, nk_vec2(0, 1.0f));
|
||||||
else if (evt->xbutton.button == Button5)
|
else if (evt->xbutton.button == Button5)
|
||||||
nk_input_scroll(ctx, -1.0f);
|
nk_input_scroll(ctx, nk_vec2(0, -1.0f));
|
||||||
else return 0;
|
else return 0;
|
||||||
return 1;
|
return 1;
|
||||||
} else if (evt->type == MotionNotify) {
|
} else if (evt->type == MotionNotify) {
|
||||||
|
@ -298,9 +298,9 @@ nk_x11_handle_event(XEvent *evt)
|
|||||||
else if (evt->xbutton.button == Button3)
|
else if (evt->xbutton.button == Button3)
|
||||||
nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down);
|
nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down);
|
||||||
else if (evt->xbutton.button == Button4)
|
else if (evt->xbutton.button == Button4)
|
||||||
nk_input_scroll(ctx, 1.0f);
|
nk_input_scroll(ctx, nk_vec2(0,1.0f));
|
||||||
else if (evt->xbutton.button == Button5)
|
else if (evt->xbutton.button == Button5)
|
||||||
nk_input_scroll(ctx, -1.0f);
|
nk_input_scroll(ctx, nk_vec2(0,-1.0f));
|
||||||
else return 0;
|
else return 0;
|
||||||
return 1;
|
return 1;
|
||||||
} else if (evt->type == MotionNotify) {
|
} else if (evt->type == MotionNotify) {
|
||||||
|
@ -668,9 +668,9 @@ nk_x11_handle_event(XEvent *evt)
|
|||||||
else if (evt->xbutton.button == Button3)
|
else if (evt->xbutton.button == Button3)
|
||||||
nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down);
|
nk_input_button(ctx, NK_BUTTON_RIGHT, x, y, down);
|
||||||
else if (evt->xbutton.button == Button4)
|
else if (evt->xbutton.button == Button4)
|
||||||
nk_input_scroll(ctx, 1.0f);
|
nk_input_scroll(ctx, nk_vec2(0,1.0f));
|
||||||
else if (evt->xbutton.button == Button5)
|
else if (evt->xbutton.button == Button5)
|
||||||
nk_input_scroll(ctx, -1.0f);
|
nk_input_scroll(ctx, nk_vec2(0,-1.0f));
|
||||||
else return 0;
|
else return 0;
|
||||||
return 1;
|
return 1;
|
||||||
} else if (evt->type == MotionNotify) {
|
} else if (evt->type == MotionNotify) {
|
||||||
|
120
nuklear.h
120
nuklear.h
@ -1003,7 +1003,7 @@ NK_API void nk_input_begin(struct nk_context*);
|
|||||||
NK_API void nk_input_motion(struct nk_context*, int x, int y);
|
NK_API void nk_input_motion(struct nk_context*, int x, int y);
|
||||||
NK_API void nk_input_key(struct nk_context*, enum nk_keys, int down);
|
NK_API void nk_input_key(struct nk_context*, enum nk_keys, int down);
|
||||||
NK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, int down);
|
NK_API void nk_input_button(struct nk_context*, enum nk_buttons, int x, int y, int down);
|
||||||
NK_API void nk_input_scroll(struct nk_context*, float y);
|
NK_API void nk_input_scroll(struct nk_context*, struct nk_vec2 val);
|
||||||
NK_API void nk_input_char(struct nk_context*, char);
|
NK_API void nk_input_char(struct nk_context*, char);
|
||||||
NK_API void nk_input_glyph(struct nk_context*, const nk_glyph);
|
NK_API void nk_input_glyph(struct nk_context*, const nk_glyph);
|
||||||
NK_API void nk_input_unicode(struct nk_context*, nk_rune);
|
NK_API void nk_input_unicode(struct nk_context*, nk_rune);
|
||||||
@ -2010,7 +2010,7 @@ struct nk_mouse {
|
|||||||
struct nk_vec2 pos;
|
struct nk_vec2 pos;
|
||||||
struct nk_vec2 prev;
|
struct nk_vec2 prev;
|
||||||
struct nk_vec2 delta;
|
struct nk_vec2 delta;
|
||||||
float scroll_delta;
|
struct nk_vec2 scroll_delta;
|
||||||
unsigned char grab;
|
unsigned char grab;
|
||||||
unsigned char grabbed;
|
unsigned char grabbed;
|
||||||
unsigned char ungrab;
|
unsigned char ungrab;
|
||||||
@ -11319,7 +11319,7 @@ nk_input_begin(struct nk_context *ctx)
|
|||||||
in->mouse.buttons[i].clicked = 0;
|
in->mouse.buttons[i].clicked = 0;
|
||||||
|
|
||||||
in->keyboard.text_len = 0;
|
in->keyboard.text_len = 0;
|
||||||
in->mouse.scroll_delta = 0;
|
in->mouse.scroll_delta = nk_vec2(0,0);
|
||||||
in->mouse.prev.x = in->mouse.pos.x;
|
in->mouse.prev.x = in->mouse.pos.x;
|
||||||
in->mouse.prev.y = in->mouse.pos.y;
|
in->mouse.prev.y = in->mouse.pos.y;
|
||||||
in->mouse.delta.x = 0;
|
in->mouse.delta.x = 0;
|
||||||
@ -11386,11 +11386,12 @@ nk_input_button(struct nk_context *ctx, enum nk_buttons id, int x, int y, int do
|
|||||||
}
|
}
|
||||||
|
|
||||||
NK_API void
|
NK_API void
|
||||||
nk_input_scroll(struct nk_context *ctx, float y)
|
nk_input_scroll(struct nk_context *ctx, struct nk_vec2 val)
|
||||||
{
|
{
|
||||||
NK_ASSERT(ctx);
|
NK_ASSERT(ctx);
|
||||||
if (!ctx) return;
|
if (!ctx) return;
|
||||||
ctx->input.mouse.scroll_delta += y;
|
ctx->input.mouse.scroll_delta.x += val.x;
|
||||||
|
ctx->input.mouse.scroll_delta.y += val.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
NK_API void
|
NK_API void
|
||||||
@ -13762,6 +13763,7 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
|
|||||||
nk_flags ws;
|
nk_flags ws;
|
||||||
int left_mouse_down;
|
int left_mouse_down;
|
||||||
int left_mouse_click_in_cursor;
|
int left_mouse_click_in_cursor;
|
||||||
|
float scroll_delta;
|
||||||
|
|
||||||
nk_widget_state_reset(state);
|
nk_widget_state_reset(state);
|
||||||
if (!in) return scroll_offset;
|
if (!in) return scroll_offset;
|
||||||
@ -13772,6 +13774,7 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
|
|||||||
if (nk_input_is_mouse_hovering_rect(in, *scroll))
|
if (nk_input_is_mouse_hovering_rect(in, *scroll))
|
||||||
*state = NK_WIDGET_STATE_HOVERED;
|
*state = NK_WIDGET_STATE_HOVERED;
|
||||||
|
|
||||||
|
scroll_delta = (o == NK_VERTICAL) ? in->mouse.scroll_delta.y: in->mouse.scroll_delta.x;
|
||||||
if (left_mouse_down && left_mouse_click_in_cursor) {
|
if (left_mouse_down && left_mouse_click_in_cursor) {
|
||||||
/* update cursor by mouse dragging */
|
/* update cursor by mouse dragging */
|
||||||
float pixel, delta;
|
float pixel, delta;
|
||||||
@ -13804,9 +13807,9 @@ nk_scrollbar_behavior(nk_flags *state, struct nk_input *in,
|
|||||||
scroll_offset = NK_MIN(scroll_offset + scroll->h, target - scroll->h);
|
scroll_offset = NK_MIN(scroll_offset + scroll->h, target - scroll->h);
|
||||||
else scroll_offset = NK_MIN(scroll_offset + scroll->w, target - scroll->w);
|
else scroll_offset = NK_MIN(scroll_offset + scroll->w, target - scroll->w);
|
||||||
} else if (has_scrolling) {
|
} else if (has_scrolling) {
|
||||||
if ((in->mouse.scroll_delta<0 || (in->mouse.scroll_delta>0))) {
|
if ((scroll_delta < 0 || (scroll_delta > 0))) {
|
||||||
/* update cursor by mouse scrolling */
|
/* update cursor by mouse scrolling */
|
||||||
scroll_offset = scroll_offset + scroll_step * (-in->mouse.scroll_delta);
|
scroll_offset = scroll_offset + scroll_step * (-scroll_delta);
|
||||||
if (o == NK_VERTICAL)
|
if (o == NK_VERTICAL)
|
||||||
scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->h);
|
scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->h);
|
||||||
else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->w);
|
else scroll_offset = NK_CLAMP(0, scroll_offset, target - scroll->w);
|
||||||
@ -16744,6 +16747,44 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
float scroll_offset;
|
float scroll_offset;
|
||||||
float scroll_step;
|
float scroll_step;
|
||||||
float scroll_inc;
|
float scroll_inc;
|
||||||
|
|
||||||
|
/* mouse wheel scrolling */
|
||||||
|
if (nk_panel_is_sub(layout->type))
|
||||||
|
{
|
||||||
|
/* sub-window mouse wheel scrolling */
|
||||||
|
struct nk_window *root_window = window;
|
||||||
|
struct nk_panel *root_panel = window->layout;
|
||||||
|
while (root_panel->parent)
|
||||||
|
root_panel = root_panel->parent;
|
||||||
|
while (root_window->parent)
|
||||||
|
root_window = root_window->parent;
|
||||||
|
|
||||||
|
/* only allow scrolling if parent window is active */
|
||||||
|
scroll_has_scrolling = 0;
|
||||||
|
if ((root_window == ctx->active) && layout->has_scrolling) {
|
||||||
|
/* and panel is being hovered and inside clip rect*/
|
||||||
|
if (nk_input_is_mouse_hovering_rect(in, layout->bounds) &&
|
||||||
|
NK_INTERSECT(layout->bounds.x, layout->bounds.y, layout->bounds.w, layout->bounds.h,
|
||||||
|
root_panel->clip.x, root_panel->clip.y, root_panel->clip.w, root_panel->clip.h))
|
||||||
|
{
|
||||||
|
/* deactivate all parent scrolling */
|
||||||
|
root_panel = window->layout;
|
||||||
|
while (root_panel->parent) {
|
||||||
|
root_panel->has_scrolling = nk_false;
|
||||||
|
root_panel = root_panel->parent;
|
||||||
|
}
|
||||||
|
root_panel->has_scrolling = nk_false;
|
||||||
|
scroll_has_scrolling = nk_true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (!nk_panel_is_sub(layout->type)) {
|
||||||
|
/* window mouse wheel scrolling */
|
||||||
|
scroll_has_scrolling = (window == ctx->active) && layout->has_scrolling;
|
||||||
|
if (in && (in->mouse.scroll_delta.y > 0 || in->mouse.scroll_delta.x > 0) && scroll_has_scrolling)
|
||||||
|
window->scrolled = nk_true;
|
||||||
|
else window->scrolled = nk_false;
|
||||||
|
} else scroll_has_scrolling = nk_false;
|
||||||
|
|
||||||
{
|
{
|
||||||
/* vertical scrollbar */
|
/* vertical scrollbar */
|
||||||
nk_flags state = 0;
|
nk_flags state = 0;
|
||||||
@ -16756,51 +16797,12 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
scroll_step = scroll.h * 0.10f;
|
scroll_step = scroll.h * 0.10f;
|
||||||
scroll_inc = scroll.h * 0.01f;
|
scroll_inc = scroll.h * 0.01f;
|
||||||
scroll_target = (float)(int)(layout->at_y - scroll.y);
|
scroll_target = (float)(int)(layout->at_y - scroll.y);
|
||||||
|
|
||||||
/* scrolling by mouse wheel */
|
|
||||||
if (nk_panel_is_sub(layout->type))
|
|
||||||
{
|
|
||||||
/* sub-window scrollbar wheel scrolling */
|
|
||||||
struct nk_window *root_window = window;
|
|
||||||
struct nk_panel *root_panel = window->layout;
|
|
||||||
while (root_panel->parent)
|
|
||||||
root_panel = root_panel->parent;
|
|
||||||
while (root_window->parent)
|
|
||||||
root_window = root_window->parent;
|
|
||||||
|
|
||||||
/* only allow scrolling if parent window is active */
|
|
||||||
scroll_has_scrolling = 0;
|
|
||||||
if ((root_window == ctx->active) && layout->has_scrolling) {
|
|
||||||
/* and panel is being hovered and inside clip rect*/
|
|
||||||
if (nk_input_is_mouse_hovering_rect(in, layout->bounds) &&
|
|
||||||
NK_INTERSECT(layout->bounds.x, layout->bounds.y, layout->bounds.w, layout->bounds.h,
|
|
||||||
root_panel->clip.x, root_panel->clip.y, root_panel->clip.w, root_panel->clip.h))
|
|
||||||
{
|
|
||||||
/* deactivate all parent scrolling */
|
|
||||||
root_panel = window->layout;
|
|
||||||
while (root_panel->parent) {
|
|
||||||
root_panel->has_scrolling = nk_false;
|
|
||||||
root_panel = root_panel->parent;
|
|
||||||
}
|
|
||||||
root_panel->has_scrolling = nk_false;
|
|
||||||
scroll_has_scrolling = nk_true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (!nk_panel_is_sub(layout->type)) {
|
|
||||||
/* window scrollbar wheel scrolling */
|
|
||||||
scroll_has_scrolling = (window == ctx->active) && layout->has_scrolling;
|
|
||||||
if (in && in->mouse.scroll_delta > 0 && scroll_has_scrolling)
|
|
||||||
window->scrolled = nk_true;
|
|
||||||
else window->scrolled = nk_false;
|
|
||||||
} else scroll_has_scrolling = nk_false;
|
|
||||||
|
|
||||||
/* execute scrollbar */
|
|
||||||
scroll_offset = nk_do_scrollbarv(&state, out, scroll, scroll_has_scrolling,
|
scroll_offset = nk_do_scrollbarv(&state, out, scroll, scroll_has_scrolling,
|
||||||
scroll_offset, scroll_target, scroll_step, scroll_inc,
|
scroll_offset, scroll_target, scroll_step, scroll_inc,
|
||||||
&ctx->style.scrollv, in, style->font);
|
&ctx->style.scrollv, in, style->font);
|
||||||
*layout->offset_y = (nk_uint)scroll_offset;
|
*layout->offset_y = (nk_uint)scroll_offset;
|
||||||
if (in && scroll_has_scrolling)
|
if (in && scroll_has_scrolling)
|
||||||
in->mouse.scroll_delta = 0;
|
in->mouse.scroll_delta.y = 0;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
/* horizontal scrollbar */
|
/* horizontal scrollbar */
|
||||||
@ -16814,17 +16816,17 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
scroll_target = (float)(int)(layout->max_x - scroll.x);
|
scroll_target = (float)(int)(layout->max_x - scroll.x);
|
||||||
scroll_step = layout->max_x * 0.05f;
|
scroll_step = layout->max_x * 0.05f;
|
||||||
scroll_inc = layout->max_x * 0.005f;
|
scroll_inc = layout->max_x * 0.005f;
|
||||||
scroll_has_scrolling = nk_false;
|
scroll_has_scrolling = scroll_has_scrolling;
|
||||||
scroll_offset = nk_do_scrollbarh(&state, out, scroll, scroll_has_scrolling,
|
scroll_offset = nk_do_scrollbarh(&state, out, scroll, scroll_has_scrolling,
|
||||||
scroll_offset, scroll_target, scroll_step, scroll_inc,
|
scroll_offset, scroll_target, scroll_step, scroll_inc,
|
||||||
&ctx->style.scrollh, in, style->font);
|
&ctx->style.scrollh, in, style->font);
|
||||||
*layout->offset_x = (nk_uint)scroll_offset;
|
*layout->offset_x = (nk_uint)scroll_offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hide scroll if no user input */
|
/* hide scroll if no user input */
|
||||||
if (window->flags & NK_WINDOW_SCROLL_AUTO_HIDE) {
|
if (window->flags & NK_WINDOW_SCROLL_AUTO_HIDE) {
|
||||||
int has_input = ctx->input.mouse.delta.x != 0 || ctx->input.mouse.delta.y != 0 || ctx->input.mouse.scroll_delta != 0;
|
int has_input = ctx->input.mouse.delta.x != 0 || ctx->input.mouse.delta.y != 0 || ctx->input.mouse.scroll_delta.y != 0;
|
||||||
int is_window_hovered = nk_window_is_hovered(ctx);
|
int is_window_hovered = nk_window_is_hovered(ctx);
|
||||||
int any_item_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED);
|
int any_item_active = (ctx->last_widget_state & NK_WIDGET_STATE_MODIFIED);
|
||||||
if ((!has_input && is_window_hovered) || (!is_window_hovered && !any_item_active))
|
if ((!has_input && is_window_hovered) || (!is_window_hovered && !any_item_active))
|
||||||
@ -16915,7 +16917,6 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!nk_panel_is_sub(layout->type)) {
|
if (!nk_panel_is_sub(layout->type)) {
|
||||||
/* window is hidden so clear command buffer */
|
/* window is hidden so clear command buffer */
|
||||||
if (layout->flags & NK_WINDOW_HIDDEN)
|
if (layout->flags & NK_WINDOW_HIDDEN)
|
||||||
@ -16940,7 +16941,6 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
window->property.prev = window->property.active;
|
window->property.prev = window->property.active;
|
||||||
window->property.seq = 0;
|
window->property.seq = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* edit garbage collector */
|
/* edit garbage collector */
|
||||||
if (window->edit.active && window->edit.old != window->edit.seq &&
|
if (window->edit.active && window->edit.old != window->edit.seq &&
|
||||||
window->edit.active == window->edit.prev) {
|
window->edit.active == window->edit.prev) {
|
||||||
@ -16950,7 +16950,6 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
window->edit.prev = window->edit.active;
|
window->edit.prev = window->edit.active;
|
||||||
window->edit.seq = 0;
|
window->edit.seq = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* contextual garbage collector */
|
/* contextual garbage collector */
|
||||||
if (window->popup.active_con && window->popup.con_old != window->popup.con_count) {
|
if (window->popup.active_con && window->popup.con_old != window->popup.con_count) {
|
||||||
window->popup.con_count = 0;
|
window->popup.con_count = 0;
|
||||||
@ -16962,7 +16961,7 @@ nk_panel_end(struct nk_context *ctx)
|
|||||||
}
|
}
|
||||||
window->popup.combo_count = 0;
|
window->popup.combo_count = 0;
|
||||||
|
|
||||||
/* helper to make sure you have a 'nk_tree_push' * for every 'nk_tree_pop' */
|
/* helper to make sure you have a 'nk_tree_push' for every 'nk_tree_pop' */
|
||||||
NK_ASSERT(!layout->row.tree_depth);
|
NK_ASSERT(!layout->row.tree_depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -16985,7 +16984,7 @@ nk_create_page_element(struct nk_context *ctx)
|
|||||||
NK_ASSERT(elem);
|
NK_ASSERT(elem);
|
||||||
if (!elem) return 0;
|
if (!elem) return 0;
|
||||||
} else {
|
} else {
|
||||||
/* allocate new page element from the back of the fixed size memory buffer */
|
/* allocate new page element from back of fixed size memory buffer */
|
||||||
NK_STORAGE const nk_size size = sizeof(struct nk_page_element);
|
NK_STORAGE const nk_size size = sizeof(struct nk_page_element);
|
||||||
NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_page_element);
|
NK_STORAGE const nk_size align = NK_ALIGNOF(struct nk_page_element);
|
||||||
elem = (struct nk_page_element*)nk_buffer_alloc(&ctx->memory, NK_BUFFER_BACK, size, align);
|
elem = (struct nk_page_element*)nk_buffer_alloc(&ctx->memory, NK_BUFFER_BACK, size, align);
|
||||||
@ -17019,7 +17018,6 @@ nk_free_page_element(struct nk_context *ctx, struct nk_page_element *elem)
|
|||||||
nk_link_page_element_into_freelist(ctx, elem);
|
nk_link_page_element_into_freelist(ctx, elem);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if possible remove last element from back of fixed memory buffer */
|
/* if possible remove last element from back of fixed memory buffer */
|
||||||
{void *elem_end = (void*)(elem + 1);
|
{void *elem_end = (void*)(elem + 1);
|
||||||
void *buffer_end = (nk_byte*)ctx->memory.memory.ptr + ctx->memory.size;
|
void *buffer_end = (nk_byte*)ctx->memory.memory.ptr + ctx->memory.size;
|
||||||
@ -17163,7 +17161,7 @@ NK_INTERN void
|
|||||||
nk_free_window(struct nk_context *ctx, struct nk_window *win)
|
nk_free_window(struct nk_context *ctx, struct nk_window *win)
|
||||||
{
|
{
|
||||||
/* unlink windows from list */
|
/* unlink windows from list */
|
||||||
struct nk_table *n, *it = win->tables;
|
struct nk_table *it = win->tables;
|
||||||
if (win->popup.win) {
|
if (win->popup.win) {
|
||||||
nk_free_window(ctx, win->popup.win);
|
nk_free_window(ctx, win->popup.win);
|
||||||
win->popup.win = 0;
|
win->popup.win = 0;
|
||||||
@ -17173,7 +17171,7 @@ nk_free_window(struct nk_context *ctx, struct nk_window *win)
|
|||||||
|
|
||||||
while (it) {
|
while (it) {
|
||||||
/*free window state tables */
|
/*free window state tables */
|
||||||
n = it->next;
|
struct nk_table *n = it->next;
|
||||||
nk_remove_table(win, it);
|
nk_remove_table(win, it);
|
||||||
nk_free_table(ctx, it);
|
nk_free_table(ctx, it);
|
||||||
if (it == win->tables)
|
if (it == win->tables)
|
||||||
|
Loading…
Reference in New Issue
Block a user