router: fix corruption of board data when the inline drag is activated while the router tool is running

Fixes: lp:1712838
* https://bugs.launchpad.net/kicad/+bug/1712838
This commit is contained in:
Tomasz Włostowski 2017-08-30 01:15:23 +02:00
parent 3bcc3dc4f9
commit 2e4c22f718
5 changed files with 32 additions and 5 deletions

View File

@ -27,6 +27,11 @@
#include <wxPcbStruct.h> // LAME! #include <wxPcbStruct.h> // LAME!
bool TOOL_BASE::IsToolActive() const
{
return m_toolMgr->IsToolActive( m_toolId );
}
KIGFX::VIEW* TOOL_BASE::getView() const KIGFX::VIEW* TOOL_BASE::getView() const
{ {
return m_toolMgr->GetView(); return m_toolMgr->GetView();

View File

@ -580,6 +580,7 @@ void TOOL_MANAGER::dispatchInternal( const TOOL_EVENT& aEvent )
// got match? Run the handler. // got match? Run the handler.
pushViewControls(); pushViewControls();
applyViewControls( st ); applyViewControls( st );
st->idle = false;
st->cofunc->Call( aEvent ); st->cofunc->Call( aEvent );
saveViewControls( st ); saveViewControls( st );
popViewControls(); popViewControls();
@ -721,6 +722,7 @@ TOOL_MANAGER::ID_LIST::iterator TOOL_MANAGER::finishTool( TOOL_STATE* aState )
if( tool->GetType() == INTERACTIVE ) if( tool->GetType() == INTERACTIVE )
static_cast<TOOL_INTERACTIVE*>( tool )->resetTransitions(); static_cast<TOOL_INTERACTIVE*>( tool )->resetTransitions();
aState->idle = true;
return it; return it;
} }
@ -875,3 +877,9 @@ void TOOL_MANAGER::processEvent( const TOOL_EVENT& aEvent )
processEvent( event ); processEvent( event );
} }
} }
bool TOOL_MANAGER::IsToolActive( TOOL_ID aId ) const
{
auto it = m_toolIdIndex.find( aId );
return !it->second->idle;
}

View File

@ -148,6 +148,8 @@ public:
TOOL_SETTINGS& GetSettings(); TOOL_SETTINGS& GetSettings();
bool IsToolActive() const;
protected: protected:
friend class TOOL_MANAGER; friend class TOOL_MANAGER;
friend class TOOL_SETTINGS; friend class TOOL_SETTINGS;

View File

@ -202,6 +202,14 @@ public:
*/ */
void DeactivateTool(); void DeactivateTool();
/**
* Function IsToolActive()
* Returns true if a tool with given id is active (executing)
*/
bool IsToolActive( TOOL_ID aId ) const;
/** /**
* Function ResetTools() * Function ResetTools()
* Resets all tools (i.e. calls their Reset() method). * Resets all tools (i.e. calls their Reset() method).

View File

@ -307,16 +307,20 @@ bool EDIT_TOOL::Init()
bool EDIT_TOOL::invokeInlineRouter( int aDragMode ) bool EDIT_TOOL::invokeInlineRouter( int aDragMode )
{ {
TRACK* track = uniqueSelected<TRACK>();
VIA* via = uniqueSelected<VIA>();
if( track || via )
{
auto theRouter = static_cast<ROUTER_TOOL*>( m_toolMgr->FindTool( "pcbnew.InteractiveRouter" ) ); auto theRouter = static_cast<ROUTER_TOOL*>( m_toolMgr->FindTool( "pcbnew.InteractiveRouter" ) );
if( !theRouter ) if( !theRouter )
return false; return false;
// make sure we don't accidentally invoke inline routing mode while the router is already active!
if ( theRouter->IsToolActive() )
return false;
TRACK* track = uniqueSelected<TRACK>();
VIA* via = uniqueSelected<VIA>();
if( track || via )
{
m_toolMgr->RunAction( PCB_ACTIONS::routerInlineDrag, true, aDragMode ); m_toolMgr->RunAction( PCB_ACTIONS::routerInlineDrag, true, aDragMode );
return true; return true;
} }