Working internal and tree-to-browser drags

tree-to-tree drags don't work unless the source supports internal drag moves (so global history to hotlist won't work as it did before)
This commit is contained in:
Chris Young 2017-01-08 00:29:49 +00:00
parent 0f58d92ab6
commit 22e25971ed

View File

@ -152,11 +152,10 @@ ami_cw_mouse_pos(struct ami_corewindow *ami_cw, int *restrict x, int *restrict y
xm -= bbox->Left; xm -= bbox->Left;
ym -= bbox->Top; ym -= bbox->Top;
ami_gui_free_space_box(bbox);
if((xm < 0) || (ym < 0) || (xm > bbox->Width) || (ym > bbox->Height)) if((xm < 0) || (ym < 0) || (xm > bbox->Width) || (ym > bbox->Height))
return false; return false;
ami_gui_free_space_box(bbox);
ami_cw_scroller_top(ami_cw, &xs, &ys); ami_cw_scroller_top(ami_cw, &xs, &ys);
xm += xs; xm += xs;
@ -472,10 +471,14 @@ HOOKF(void, ami_cw_idcmp_hook, Object *, object, struct IntuiMessage *)
static void static void
ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y) ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y)
{ {
if(ami_cw->dragging == true) return;
ami_cw->dragging = true; ami_cw->dragging = true;
ami_cw->drag_x_start = x; ami_cw->drag_x_start = x;
ami_cw->drag_y_start = y; ami_cw->drag_y_start = y;
printf("%ld\n", ami_cw->drag_status);
switch(ami_cw->drag_status) { switch(ami_cw->drag_status) {
case CORE_WINDOW_DRAG_SELECTION: case CORE_WINDOW_DRAG_SELECTION:
break; break;
@ -495,6 +498,8 @@ ami_cw_drag_start(struct ami_corewindow *ami_cw, int x, int y)
static void static void
ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y) ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y)
{ {
if(ami_cw->dragging == false) return;
switch(ami_cw->drag_status) { switch(ami_cw->drag_status) {
case CORE_WINDOW_DRAG_SELECTION: case CORE_WINDOW_DRAG_SELECTION:
break; break;
@ -514,8 +519,8 @@ ami_cw_drag_progress(struct ami_corewindow *ami_cw, int x, int y)
static void static void
ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y) ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y)
{ {
ami_cw->dragging = false; if(ami_cw->dragging == false) return;
switch(ami_cw->drag_status) { switch(ami_cw->drag_status) {
case CORE_WINDOW_DRAG_SELECTION: case CORE_WINDOW_DRAG_SELECTION:
break; break;
@ -530,6 +535,9 @@ ami_cw_drag_end(struct ami_corewindow *ami_cw, int x, int y)
default: default:
break; break;
} }
ami_cw->drag_status = CORE_WINDOW_DRAG_NONE;
ami_cw->dragging = false;
} }
/** /**
@ -574,7 +582,7 @@ ami_cw_event(void *w)
} }
key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
if(ami_cw->dragging == false) { if(ami_cw->mouse_state & BROWSER_MOUSE_DRAG_ON) {
ami_cw_drag_start(ami_cw, x, y); ami_cw_drag_start(ami_cw, x, y);
} }
} else { } else {
@ -582,15 +590,12 @@ ami_cw_event(void *w)
ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
} }
} }
if(ami_cw->dragging == true) { ami_cw_drag_progress(ami_cw, x, y);
ami_cw_drag_progress(ami_cw, x, y);
}
break; break;
case WMHI_MOUSEBUTTONS: case WMHI_MOUSEBUTTONS:
if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) { if(ami_cw_mouse_pos(ami_cw, &x, &y) == true) {
key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]); key_state = ami_gui_get_quals(ami_cw->objects[GID_CW_WIN]);
switch(code) { switch(code) {
case SELECTDOWN: case SELECTDOWN:
ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1; ami_cw->mouse_state = BROWSER_MOUSE_PRESS_1;
@ -643,12 +648,28 @@ ami_cw_event(void *w)
break; break;
} }
if((ami_cw->dragging == true) && (ami_cw->mouse_state & BROWSER_MOUSE_HOVER)) { if(ami_cw->mouse_state == BROWSER_MOUSE_HOVER) {
ami_cw_drag_end(ami_cw, x, y); ami_cw_drag_end(ami_cw, x, y);
ami_cw->drag_status = CORE_WINDOW_DRAG_NONE;
} }
ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y); ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state, x, y);
} else {
/* event is happening away from our corewindow area */
switch(code) {
case SELECTUP:
case MIDDLEUP:
ami_cw->mouse_state = BROWSER_MOUSE_HOVER;
break;
default:
break;
}
if(ami_cw->mouse_state == BROWSER_MOUSE_HOVER) {
ami_cw_drag_end(ami_cw, x, y);
ami_cw->mouse(ami_cw, ami_cw->mouse_state | key_state,
ami_cw->drag_x_start, ami_cw->drag_y_start); // placate core
}
} }
break; break;
@ -833,9 +854,10 @@ nserror ami_corewindow_init(struct ami_corewindow *ami_cw)
ami_cw->scroll_x_visible = true; ami_cw->scroll_x_visible = true;
ami_cw->scroll_y_visible = true; ami_cw->scroll_y_visible = true;
ami_cw->in_border_scroll = false; ami_cw->in_border_scroll = false;
ami_cw->dragging = false;
/* allocate drawing area etc */ /* allocate drawing area etc */
ami_init_layers(&ami_cw->gg, 0, 0, false); ami_init_layers(&ami_cw->gg, 100, 100, false); // force tiles to save memory
ami_cw->gg.shared_pens = ami_AllocMinList(); ami_cw->gg.shared_pens = ami_AllocMinList();
ami_cw->deferred_rects = NewObjList(); ami_cw->deferred_rects = NewObjList();