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:
parent
3bcc3dc4f9
commit
2e4c22f718
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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).
|
||||||
|
|
|
@ -307,16 +307,20 @@ bool EDIT_TOOL::Init()
|
||||||
|
|
||||||
bool EDIT_TOOL::invokeInlineRouter( int aDragMode )
|
bool EDIT_TOOL::invokeInlineRouter( int aDragMode )
|
||||||
{
|
{
|
||||||
|
auto theRouter = static_cast<ROUTER_TOOL*>( m_toolMgr->FindTool( "pcbnew.InteractiveRouter" ) );
|
||||||
|
|
||||||
|
if( !theRouter )
|
||||||
|
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>();
|
TRACK* track = uniqueSelected<TRACK>();
|
||||||
VIA* via = uniqueSelected<VIA>();
|
VIA* via = uniqueSelected<VIA>();
|
||||||
|
|
||||||
if( track || via )
|
if( track || via )
|
||||||
{
|
{
|
||||||
auto theRouter = static_cast<ROUTER_TOOL*>( m_toolMgr->FindTool( "pcbnew.InteractiveRouter" ) );
|
|
||||||
|
|
||||||
if( !theRouter )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::routerInlineDrag, true, aDragMode );
|
m_toolMgr->RunAction( PCB_ACTIONS::routerInlineDrag, true, aDragMode );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue