From f9eefa4e692085e5f99fa566ea734dc05cccb6b1 Mon Sep 17 00:00:00 2001 From: werner Date: Sat, 2 Jan 2010 22:04:25 +0000 Subject: [PATCH] When repeatedly clicking on a stack of items to cycle through the stack, a click on an anchor point of the selected object would be treated as a drag, even if the click was very short. This created a very confusing user experience. - gui_canvas.c (button_release_event): if we didn't "escape" the drag radius, don't treat the click as a drag but run the click-to-select process instead (note: the drag visualization still flickers briefly) - gui_canvas.c (button_release_event): to find out if we've escaped the drag radius, just call drag_left instead of duplicating some of its code git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5772 99fdad57-331a-0410-800a-d7fa5415bdb3 --- gui_canvas.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/gui_canvas.c b/gui_canvas.c index a6019d0..8a52397 100644 --- a/gui_canvas.c +++ b/gui_canvas.c @@ -40,8 +40,11 @@ static struct coord curr_pos; /* canvas coordinates ! */ static struct coord user_origin = { 0, 0 }; static int dragging = 0; -static int drag_escaped = 0; /* 1 once we've made is out of the drag radius */ +static int drag_escaped = 0; /* 1 once we've made it out of the drag radius */ static struct coord drag_start; +static struct inst *selected_before_drag; + /* instance selected before dragging. we use it to do the click-to-select + routine in case we later find out the drag was really just a click. */ /* ----- status display ---------------------------------------------------- */ @@ -183,11 +186,22 @@ static gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event, /* ----- button press and release ------------------------------------------ */ +static void click_to_select(struct coord pos) +{ + const struct inst *prev; + + tool_reset(); + prev = selected_inst; + inst_select(pos); + if (prev != selected_inst) + redraw(); +} + + static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) { struct coord pos = canvas_to_coord(event->x, event->y); - const struct inst *prev; int res; DPRINTF("--- button press ---"); @@ -207,6 +221,7 @@ static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, break; } if (res) { + selected_before_drag = selected_inst; inst_deselect(); redraw(); dragging = 1; @@ -214,11 +229,7 @@ static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, drag_start = pos; break; } - tool_reset(); - prev = selected_inst; - inst_select(pos); - if (prev != selected_inst) - redraw(); + click_to_select(pos); break; case 2: tool_dehover(); @@ -241,14 +252,16 @@ static gboolean button_release_event(GtkWidget *widget, GdkEventButton *event, case 1: if (!dragging) break; + drag_left(pos); dragging = 0; - if (hypot(pos.x-drag_start.x, - pos.y-drag_start.y)/draw_ctx.scale < DRAG_MIN_R) + if (!drag_escaped) { tool_cancel_drag(); - else { - if (tool_end_drag(pos)) - change_world(); + selected_inst = selected_before_drag; + click_to_select(pos); + break; } + if (tool_end_drag(pos)) + change_world(); break; } return TRUE;