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