Fixed grapped dragging behavior #116

Fixed mouse grapping emulation for progressbars and window position
dragging which previously still got triggered if other widgets were
being dragged.
This commit is contained in:
vurtun 2016-04-29 17:09:19 +02:00
parent 95beac8cc2
commit fa01e2a0db
1 changed files with 18 additions and 15 deletions

View File

@ -11741,9 +11741,7 @@ nk_toggle_behavior(const struct nk_input *in, struct nk_rect select,
nk_flags *state, int active)
{
*state = NK_WIDGET_STATE_INACTIVE;
if (in && nk_input_is_mouse_hovering_rect(in, select))
*state = NK_WIDGET_STATE_HOVERED;
if (nk_input_mouse_clicked(in, NK_BUTTON_LEFT, select)) {
if (nk_button_behavior(state, select, in, NK_BUTTON_DEFAULT)) {
*state = NK_WIDGET_STATE_ACTIVE;
active = !active;
}
@ -12229,7 +12227,11 @@ nk_progress_behavior(nk_flags *state, const struct nk_input *in,
{
*state = NK_WIDGET_STATE_INACTIVE;
if (in && modifiable && nk_input_is_mouse_hovering_rect(in, r)) {
if (nk_input_is_mouse_down(in, NK_BUTTON_LEFT)) {
int left_mouse_down = in->mouse.buttons[NK_BUTTON_LEFT].down;
int left_mouse_click_in_cursor = nk_input_has_mouse_click_down_in_rect(in,
NK_BUTTON_LEFT, r, nk_true);
if (left_mouse_down && left_mouse_click_in_cursor) {
float ratio = NK_MAX(0, (float)(in->mouse.pos.x - r.x)) / (float)r.w;
value = (nk_size)NK_MAX(0,((float)max * ratio));
*state = NK_WIDGET_STATE_ACTIVE;
@ -14776,7 +14778,6 @@ nk_free_window(struct nk_context *ctx, struct nk_window *win)
nk_free_window(ctx, win->popup.win);
win->popup.win = 0;
}
win->next = 0;
win->prev = 0;
@ -14904,6 +14905,7 @@ nk_begin(struct nk_context *ctx, struct nk_panel *layout, const char *title,
title_hash = nk_murmur_hash(title, (int)title_len, NK_WINDOW_TITLE);
win = nk_find_window(ctx, title_hash);
if (!win) {
/* create new window */
win = (struct nk_window*)nk_create_window(ctx);
nk_insert_window(ctx, win);
nk_command_buffer_init(&win->buffer, &ctx->memory, NK_CLIPPING_ON);
@ -14929,17 +14931,11 @@ nk_begin(struct nk_context *ctx, struct nk_panel *layout, const char *title,
return 0;
}
/* overlapping window */
/* window overlapping */
if (!(win->flags & NK_WINDOW_SUB) && !(win->flags & NK_WINDOW_HIDDEN))
{
int inpanel, ishovered;
const struct nk_window *iter = win;
/* This is so terrible but necessary for minimized windows. The difference
* lies in the size of the window. But it is not possible to get the size
* without cheating because you do not have the information at this point.
* Even worse this is wrong since windows could have different window heights.
* I leave it in for now since I otherwise loose my mind. */
float h = ctx->style.font.height + 2 * style->window.header.padding.y;
/* activate window if hovered and no other window is overlapping this window */
@ -15395,7 +15391,8 @@ nk_panel_begin(struct nk_context *ctx, const char *title)
/* window dragging */
if ((win->flags & NK_WINDOW_MOVABLE) && !(win->flags & NK_WINDOW_ROM)) {
int incursor;
int left_mouse_down;
int left_mouse_click_in_cursor;
struct nk_rect move;
move.x = win->bounds.x;
move.y = win->bounds.y;
@ -15407,10 +15404,16 @@ nk_panel_begin(struct nk_context *ctx, const char *title)
move.h += 2.0f * style->window.header.label_padding.y;
} else move.h = window_padding.y + item_spacing.y;
incursor = nk_input_is_mouse_prev_hovering_rect(in, move);
if (nk_input_is_mouse_down(in, NK_BUTTON_LEFT) && incursor) {
/*incursor = nk_input_is_mouse_prev_hovering_rect(in, move);*/
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, move, nk_true);
if (left_mouse_down && left_mouse_click_in_cursor) {
win->bounds.x = win->bounds.x + in->mouse.delta.x;
win->bounds.y = win->bounds.y + in->mouse.delta.y;
in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.x += in->mouse.delta.x;
in->mouse.buttons[NK_BUTTON_LEFT].clicked_pos.y += in->mouse.delta.y;
}
}