From 081ee0e9a41536a7f9775ad2ff2315fe942a5149 Mon Sep 17 00:00:00 2001 From: CHARRAS Date: Fri, 18 Jan 2008 20:27:14 +0000 Subject: [PATCH] small mouse moves filtering before starting a block command --- change_log.txt | 4 +++ share/drawpanel.cpp | 76 ++++++++++++++++++++++++++++++++------------- 2 files changed, 59 insertions(+), 21 deletions(-) diff --git a/change_log.txt b/change_log.txt index 4e242a3063..73b014defb 100644 --- a/change_log.txt +++ b/change_log.txt @@ -7,6 +7,10 @@ email address. 2007-Dec-18 UPDATE Jean-Pierre Charras ================================================================================ ++all: + filtering small mouse moves ( < 5 pixels) when clicking. + Starting a wire or a track is now more easily because now these small moves do not start a block commnad. + +pcbnew: rework of drill filles creation (excellon and reports) needed to have a clean implantation of buried vias and mainly microvia diff --git a/share/drawpanel.cpp b/share/drawpanel.cpp index 6c6b445719..7308b8382e 100644 --- a/share/drawpanel.cpp +++ b/share/drawpanel.cpp @@ -795,6 +795,17 @@ void WinEDA_DrawPanel::OnMouseEvent( wxMouseEvent& event ) static WinEDA_DrawPanel* LastPanel; static bool IgnoreNextLeftButtonRelease = false; + #define MIN_DRAG_COUNT_FOR_START_BLOCK_COMMAND 5 /* Adjust value to filter mouse deplacement before + * consider the drag mouse is really a drag command, not just a movement while click + * static int MinDragEventCount; /* in order to avoid unwanted start block command + * this variable counts drag events and a block command will be started + * if MinDragEventCount > MIN_DRAG_COUNT_FOR_START_BLOCK_COMMAND + */ + static int MinDragEventCount; /* counts the drag events. + * used to filter mouse moves before starting a block command + * a block comman can be started only if MinDragEventCount > MIN_DRAG_COUNT_FOR_START_BLOCK_COMMAND + * in order to avoid spurious block commands + */ if( event.Leaving() || event.Entering() ) { m_CanStartBlock = -1; @@ -924,14 +935,28 @@ void WinEDA_DrawPanel::OnMouseEvent( wxMouseEvent& event ) // Command block can't start if mouse is dragging a new panel if( LastPanel != this ) - m_CanStartBlock = -1; + { + MinDragEventCount = 0; + m_CanStartBlock = -1; + } - // A new command block can start after a release buttons - // Avoid a false start block when a dialog box is demiss, - // or when changing panels in hierachy navigation + /* A new command block can start after a release buttons + * and if the drag is enougth + * This is to avoid a false start block when a dialog box is demiss, + * or when changing panels in hierachy navigation + * or when clicking while and moving mouse + */ if( !event.LeftIsDown() && !event.MiddleIsDown() ) { - m_CanStartBlock = 0; + MinDragEventCount = 0; + m_CanStartBlock = 0; + + /* rembember the last cursor position when a drag mouse starts + * this is the last postion ** before ** clicking a button + * this is usefull to start a block command from the point where the mouse was clicked first + * (a filter creates a delay for the real block command start, and we must remember this point) + */ + m_CursorStartPos = screen->m_Curseur; } if( m_Block_Enable && !(localbutt & GR_M_DCLICK) ) @@ -939,12 +964,10 @@ void WinEDA_DrawPanel::OnMouseEvent( wxMouseEvent& event ) if( (screen->BlockLocate.m_Command == BLOCK_IDLE) || (screen->BlockLocate.m_State == STATE_NO_BLOCK) ) { - m_CursorStartPos = screen->m_Curseur; screen->BlockLocate.SetOrigin( m_CursorStartPos ); } if( event.LeftDown() || event.MiddleDown() ) { - m_CursorStartPos = screen->m_Curseur; if( screen->BlockLocate.m_State == STATE_BLOCK_MOVE ) { m_AutoPAN_Request = FALSE; @@ -956,24 +979,33 @@ void WinEDA_DrawPanel::OnMouseEvent( wxMouseEvent& event ) && ( event.LeftIsDown() || event.MiddleIsDown() ) && ManageCurseur == NULL && ForceCloseManageCurseur == NULL ) - { + { // Mouse is dragging: if no block in progress: start a block command if( screen->BlockLocate.m_State == STATE_NO_BLOCK ) - { + { // Start a block command int cmd_type = kbstat; if( event.MiddleIsDown() ) cmd_type |= MOUSE_MIDDLE; - if( !m_Parent->HandleBlockBegin( &DC, cmd_type, m_CursorStartPos ) ) - { - // error - m_Parent->DisplayToolMsg( - wxT( "WinEDA_DrawPanel::OnMouseEvent() Block Error" ) ); - } + /* A block command is started if the drag is enought. + * A small drag is ignored (it is certainly a little mouse move when clicking) + * not really a drag mouse + */ + if( MinDragEventCount < MIN_DRAG_COUNT_FOR_START_BLOCK_COMMAND ) + MinDragEventCount++; else { - m_AutoPAN_Request = TRUE; - SetCursor( m_PanelCursor = wxCURSOR_SIZING ); + if( !m_Parent->HandleBlockBegin( &DC, cmd_type, m_CursorStartPos ) ) + { + // should not occurs: error + m_Parent->DisplayToolMsg( + wxT( "WinEDA_DrawPanel::OnMouseEvent() Block Error" ) ); + } + else + { + m_AutoPAN_Request = TRUE; + SetCursor( m_PanelCursor = wxCURSOR_SIZING ); + } } } } @@ -981,13 +1013,15 @@ void WinEDA_DrawPanel::OnMouseEvent( wxMouseEvent& event ) if( event.ButtonUp( 1 ) || event.ButtonUp( 2 ) ) { /* Release the mouse button: end of block. - * The command can finish (DELETE) or have a next command - * (MOVE, COPY). + * The command can finish (DELETE) or have a next command (MOVE, COPY). * However the block command is cancelled if the block size is small + * Because a block command filtering is already made, this case happens, + * but only when the on grid cursor has not moved. */ + #define BLOCK_MINSIZE_LIMIT 1 bool BlockIsSmall = - ( ABS( screen->BlockLocate.GetWidth() / GetZoom() ) < 3) - && ( ABS( screen->BlockLocate.GetHeight() / GetZoom() ) < 3); + ( ABS( screen->BlockLocate.GetWidth() / GetZoom() ) < BLOCK_MINSIZE_LIMIT) + && ( ABS( screen->BlockLocate.GetHeight() / GetZoom() ) < BLOCK_MINSIZE_LIMIT); if( (screen->BlockLocate.m_State != STATE_NO_BLOCK) && BlockIsSmall ) {