Commit 96d162c9 authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Added possibility to cancel a tool that is not on the top of the tool stack.

parent 171857a7
Loading
Loading
Loading
Loading
+23 −5
Original line number Original line Diff line number Diff line
@@ -78,6 +78,16 @@ struct TOOL_MANAGER::TOOL_STATE
	/// List of possible transitions (ie. association of events and functions that are executed
	/// List of possible transitions (ie. association of events and functions that are executed
	/// upon the event reception
	/// upon the event reception
	std::vector<TRANSITION> transitions;
	std::vector<TRANSITION> transitions;

	bool operator==( const TOOL_MANAGER::TOOL_STATE& aRhs ) const
    {
	    return ( aRhs.theTool == this->theTool );
    }

	bool operator!=( const TOOL_MANAGER::TOOL_STATE& aRhs ) const
    {
	    return ( aRhs.theTool != this->theTool );
    }
};
};




@@ -262,7 +272,7 @@ void TOOL_MANAGER::dispatchInternal( TOOL_EVENT& aEvent )
				st->wakeupEvent = aEvent;
				st->wakeupEvent = aEvent;
				st->pendingWait = false;
				st->pendingWait = false;
				st->waitEvents.clear();
				st->waitEvents.clear();
				if( !st->cofunc->Resume() )
				if( st->cofunc && !st->cofunc->Resume() )
				{
				{
				    // The couroutine has finished
				    // The couroutine has finished
				    finishTool( st );
				    finishTool( st );
@@ -327,12 +337,20 @@ bool TOOL_MANAGER::dispatchActivation( TOOL_EVENT& aEvent )


void TOOL_MANAGER::finishTool( TOOL_STATE* aState )
void TOOL_MANAGER::finishTool( TOOL_STATE* aState )
{
{
    wxASSERT( m_activeTools.front() == aState->theTool->GetId() );
    // Find the tool to be deactivated
    std::deque<TOOL_ID>::iterator it, it_end;
    for( it = m_activeTools.begin(), it_end = m_activeTools.end(); it != it_end; ++it )
    {
        if( aState == m_toolIdIndex[*it] )
            break;
    }


    // Deactivate the most recent tool and remove it from the active tools queue
    if( it != m_activeTools.end() )
    aState->idle = true;
        m_activeTools.erase( it );
    m_activeTools.erase( m_activeTools.begin() );
    else
        wxLogWarning( wxT( "Tried to finish not active tool" ) );


    aState->idle = true;
    delete aState->cofunc;
    delete aState->cofunc;
    aState->cofunc = NULL;
    aState->cofunc = NULL;
}
}