r5772 - trunk/eda/fped
werner at docs.openmoko.org
werner at docs.openmoko.org
Sat Jan 2 23:04:25 CET 2010
Author: werner
Date: 2010-01-02 23:04:25 +0100 (Sat, 02 Jan 2010)
New Revision: 5772
Modified:
trunk/eda/fped/gui_canvas.c
Log:
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
Modified: trunk/eda/fped/gui_canvas.c
===================================================================
--- trunk/eda/fped/gui_canvas.c 2010-01-02 21:38:15 UTC (rev 5771)
+++ trunk/eda/fped/gui_canvas.c 2010-01-02 22:04:25 UTC (rev 5772)
@@ -40,8 +40,11 @@
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 @@
/* ----- 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 @@
break;
}
if (res) {
+ selected_before_drag = selected_inst;
inst_deselect();
redraw();
dragging = 1;
@@ -214,11 +229,7 @@
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 @@
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;
More information about the commitlog
mailing list