← Back to team overview

kicad-developers team mailing list archive

Re: [PATCH] Fix drag when single item is selected

 

On Sat, 2012-11-10 at 17:24 -0500, Younes Manton wrote:
> Because dragging is implemented as a simulated 1x1 block selection,
> there's no way to pick out and drag a single item when multiple items
> overlap.
> 
> Currently the drag hotkey handler checks to see how many items are
> under the mouse, let's the user select one via a popup menu if there
> are more than one, and then throws that info away because it sets up a
> 1x1 block selection. The block selection finds all all items under the
> cursor, and you end up dragging them all instead of the item you
> wanted.
> 
> 
> This patch fixes that in the block selection code by checking if this
> is currently a simulated drag (block command == drag and current
> item != null) and returning the currently selected item, rather than
> testing everything under the cursor and returning multiple items. This
> seemed like the most straight-forward way to fix the issue and still
> keep dragging as a simulated block selection.

Hi, any comment on this?

Here's the patch inline if it makes it easier to discuss/review.

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: younes.m@xxxxxxxxx-20121104215505-4qwfnabd4l7op2pn
# target_branch: http://bazaar.launchpad.net/~kicad-testing-\
#   committers/kicad/testing/
# testament_sha1: c2edb073e933f0f73b12632957291457bbe726cc
# timestamp: 2012-11-04 17:01:21 -0500
# message: Fix drag when single item is selected
# base_revision_id: marcom99@xxxxxxxxx-20121028205147-r58rvfpq5ezluhc9
# 
# Begin patch
=== modified file 'eeschema/sch_screen.cpp'
--- eeschema/sch_screen.cpp	2012-09-28 17:47:41 +0000
+++ eeschema/sch_screen.cpp	2012-11-04 21:55:05 +0000
@@ -862,13 +862,23 @@
     area.SetSize( m_BlockLocate.GetSize() );
     area.Normalize();
 
-    for( SCH_ITEM* item = m_drawList.begin(); item != NULL; item = item->Next() )
-    {
-        // An item is picked if its bounding box intersects the reference area.
-        if( item->HitTest( area ) )
+    // If it's a drag and we have a current item, this is a simulated drag
+    // and we already know which item the user intended.
+    if ( m_BlockLocate.GetCommand() == BLOCK_DRAG && GetCurItem() != NULL )
+    {
+        picker.SetItem( GetCurItem() );
+        m_BlockLocate.PushItem( picker );
+    }
+    else
+    {
+        for( SCH_ITEM* item = m_drawList.begin(); item != NULL; item = item->Next() )
         {
-            picker.SetItem( item );
-            m_BlockLocate.PushItem( picker );
+	    // An item is picked if its bounding box intersects the reference area.
+	    if( item->HitTest( area ) )
+	    {
+	        picker.SetItem( item );
+	        m_BlockLocate.PushItem( picker );
+            }
         }
     }
 

# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWUcuE4YAAgHfgERwc/f//3/v
3iC////6UASDwAJCgAA0TJTIYoegnlPQT0aQZDINAAbUYmNQBwDCMJpiGAQDIAYRpkyYRgIaHAMI
wmmIYBAMgBhGmTJhGAhocAwjCaYhgEAyAGEaZMmEYCGgkkCaNATQTBJmhJPU9J/qnpiAieiMQD1P
U9qjQAGkItyC3+xShf7RoGm3VtZnH/apBAZndEqzQkAoO8x+ZUsAAFGgBgyBmZu6ck7ijL60tSnL
PEYMxJnEOxrymzfCIhVmOPB7kyY+PEuxoS6gNbyoqWNB/jdf6xoja7tDf2Wt7M7P97paJ3vfxva6
BW8flR4+/xlkZ/btOH3lrrcsUOZQK1sW2vThm51kHJ7VWQDjpcyYG/rKC9Fj0HWvUKKeZLrpdv96
4acp02q8r2f9EWrv4pcl4KHQ2FNEEvS4HasfYIhzGWhfBOE4TQU2P47lFRTRJvsI9DrGVHwf3OXq
tUxfhrN3TETn2XCIL6YJ+PLTd/PH0J0loXG+u4Wev8k2vy28cOvcZNshntsN8bBD1pmIuWCTlsG3
sq3q94fIComNrFtruN2i8wWuy67a1FB2JvumqD1bC7JTBzlvYWuhLSUJhUxO7i+jPNLt8uItIqYJ
VK8XFSyirdZwk4uE7Rq2KJ/D6rbOooxKENcWvuz2TywkszOicKTqnp7P47IbMaVUorXxm1pIVz7b
lJOtfpGVAuLDIItURal1qvt2Kt6vlQy+2eROZKDfcriKrfBcM9MyTsnzvtaOV0lOI5yabSKwnW1i
j4I8faa+f5BgxRiCMcSNv8NoRxFWJhFh1O7bxGZsn+y2a4SRyjBaIUzL4woM+amlQZRyilcH0MXf
jKvUJ5x8aVYNcFArSFRQxsUxg6dbDKA+1SToB3biHevPnQXeO+EQsi3p9/oWLBQR8sZ5cZQJfPwc
nl6NMvcRMU50Idfry+9U1WQTxOHrpuOHrR5banLeNw3gx5FpwbNOW8PmqeBZ8Tp88pvbqWlgufRM
j6m2SDemrZTWZsZUKJnbI6BW/GSioHQI0t4Mdpi6EZVLG5Cr/hfevMOQTEyzLIU9lXlrkvBgs1bg
ZbQOBe21WRzr/DPqf2O7NLOoutdrruky1NjzcY/0wAM0QVj2XBMsypjDolsi7rwAsXf1b/Jv8L3m
Ad9F81Kfg3Szdl3VuOZpIVH19fr9Qtf0ec+lc3YEmFR37CMTiMDA1fethXALh94WONvWHJ13Ujn3
pqu7Bu4zEbVEzlzvDGcYn77tUohHQxtD4O9zJHLnV7LN/QmQRT9gT6hG8KwrHeQmVZ0y1sQ2xzl7
VCNf8k4S9qBhl9zdqWHcNELxGrNditdkQsIQIdg0PxrgQg9PcuQqqRcEgdolU4CC7XLlJQKnJzJl
XPitKw2IX4t2zDZ2y9QmpIGWTlb4/b90ux8l57qhdG5mTx71wPeKrNbsFXBchbVupJ6OCma1EMdT
5o3XLGyUUX8oke2i6HZTvkSkvknJ/24xZM9Kp3pVh+sQcmyxvuxYY01QLQdQza4oRaaH74X/R7oS
RGESMU5tUUvETKVbWmLKrPK4laDA5V0jBPvsXDbYgqVnIsu8zjheprMLIeMz/ImMoyCrJjf/Y3ja
vC6wrDyXm3/xdyRThQkEcuE4YA==



Follow ups

References