Moved Init() & Reset() from TOOL_INTERACTIVE to TOOL_BASE.
Added REASON enum for Reset() function, so tools will know why a reset occured. Fixed SELECTION_TOOL (it was bailing out, when a new board was loaded and some items were still selected). Added removal of VIEW_ITEM groups after changing layers and removing items.
This commit is contained in:
parent
aebb8b3ff9
commit
d8acd1c718
|
@ -140,11 +140,10 @@ void TOOL_MANAGER::RegisterTool( TOOL_BASE* aTool )
|
|||
|
||||
aTool->m_toolMgr = this;
|
||||
|
||||
if( aTool->GetType() == INTERACTIVE )
|
||||
if( !aTool->Init() )
|
||||
{
|
||||
if( !static_cast<TOOL_INTERACTIVE*>( aTool )->Init() )
|
||||
{
|
||||
std::string msg = StrPrintf( "Initialization of the %s tool failed", aTool->GetName().c_str() );
|
||||
std::string msg = StrPrintf( "Initialization of the %s tool failed",
|
||||
aTool->GetName().c_str() );
|
||||
|
||||
DisplayError( NULL, wxString::FromUTF8( msg.c_str() ) );
|
||||
|
||||
|
@ -157,7 +156,6 @@ void TOOL_MANAGER::RegisterTool( TOOL_BASE* aTool )
|
|||
delete aTool;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool TOOL_MANAGER::InvokeTool( TOOL_ID aToolId )
|
||||
|
@ -251,7 +249,7 @@ bool TOOL_MANAGER::runTool( TOOL_BASE* aTool )
|
|||
|
||||
state->idle = false;
|
||||
|
||||
static_cast<TOOL_INTERACTIVE*>( aTool )->Reset();
|
||||
aTool->Reset( TOOL_INTERACTIVE::RUN );
|
||||
|
||||
// Add the tool on the front of the processing queue (it gets events first)
|
||||
m_activeTools.push_front( aTool->GetId() );
|
||||
|
@ -282,6 +280,13 @@ TOOL_BASE* TOOL_MANAGER::FindTool( const std::string& aName ) const
|
|||
}
|
||||
|
||||
|
||||
void TOOL_MANAGER::ResetTools( TOOL_BASE::RESET_REASON aReason )
|
||||
{
|
||||
BOOST_FOREACH( TOOL_BASE* tool, m_toolState | boost::adaptors::map_keys )
|
||||
tool->Reset( aReason );
|
||||
}
|
||||
|
||||
|
||||
void TOOL_MANAGER::ScheduleNextState( TOOL_BASE* aTool, TOOL_STATE_FUNC& aHandler,
|
||||
const TOOL_EVENT_LIST& aConditions )
|
||||
{
|
||||
|
@ -513,15 +518,6 @@ void TOOL_MANAGER::SetEnvironment( EDA_ITEM* aModel, KIGFX::VIEW* aView,
|
|||
m_view = aView;
|
||||
m_viewControls = aViewControls;
|
||||
m_editFrame = aFrame;
|
||||
|
||||
// Reset state of the registered tools
|
||||
BOOST_FOREACH( TOOL_ID toolId, m_activeTools )
|
||||
{
|
||||
TOOL_BASE* tool = m_toolIdIndex[toolId]->theTool;
|
||||
|
||||
if( tool->GetType() == INTERACTIVE )
|
||||
static_cast<TOOL_INTERACTIVE*>( tool )->Reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -122,6 +122,12 @@ void VIEW::Remove( VIEW_ITEM* aItem )
|
|||
{
|
||||
VIEW_LAYER& l = m_layers[layers[i]];
|
||||
l.items->Remove( aItem );
|
||||
MarkTargetDirty( l.target );
|
||||
|
||||
// Clear the GAL cache
|
||||
int prevGroup = aItem->getGroup( layers[i] );
|
||||
if( prevGroup >= 0 )
|
||||
m_gal->DeleteGroup( prevGroup );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -930,6 +936,12 @@ void VIEW::updateLayers( VIEW_ITEM* aItem )
|
|||
VIEW_LAYER& l = m_layers[layers[i]];
|
||||
l.items->Remove( aItem );
|
||||
MarkTargetDirty( l.target );
|
||||
|
||||
// Redraw the item from scratch
|
||||
int prevGroup = aItem->getGroup( layers[i] );
|
||||
|
||||
if( prevGroup >= 0 )
|
||||
m_gal->DeleteGroup( prevGroup );
|
||||
}
|
||||
|
||||
// Add the item to new layer set
|
||||
|
|
|
@ -34,18 +34,14 @@ void VIEW_ITEM::ViewSetVisible( bool aIsVisible )
|
|||
bool update = false;
|
||||
|
||||
if( m_visible != aIsVisible )
|
||||
{
|
||||
update = true;
|
||||
}
|
||||
|
||||
m_visible = aIsVisible;
|
||||
|
||||
// update only if the visibility has really changed
|
||||
if( update )
|
||||
{
|
||||
ViewUpdate( APPEARANCE );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void VIEW_ITEM::ViewUpdate( int aUpdateFlags )
|
||||
|
@ -60,10 +56,8 @@ void VIEW_ITEM::ViewUpdate( int aUpdateFlags )
|
|||
void VIEW_ITEM::ViewRelease()
|
||||
{
|
||||
if( m_view && m_view->IsDynamic() )
|
||||
{
|
||||
m_view->Remove( this );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void VIEW_ITEM::getLayers( int* aLayers, int& aCount ) const
|
||||
|
|
|
@ -70,6 +70,33 @@ public:
|
|||
|
||||
virtual ~TOOL_BASE() {};
|
||||
|
||||
///> Determines the reason of reset for a tool
|
||||
enum RESET_REASON
|
||||
{
|
||||
RUN, ///< Tool is invoked after being inactive
|
||||
MODEL_RELOAD, ///< Model changes
|
||||
GAL_SWITCH ///< Rendering engine changes
|
||||
};
|
||||
|
||||
/**
|
||||
* Function Init()
|
||||
* Init() is called once upon a registration of the tool.
|
||||
*
|
||||
* @return True if the initialization went fine, false - otherwise.
|
||||
*/
|
||||
virtual bool Init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function Reset()
|
||||
* Brings the tool to a known, initial state. If the tool claimed anything from
|
||||
* the model or the view, it must release it when its reset.
|
||||
* @param aReason contains information about the reason of tool reset.
|
||||
*/
|
||||
virtual void Reset( RESET_REASON aReason ) = 0;
|
||||
|
||||
/**
|
||||
* Function GetType()
|
||||
* Returns the type of the tool.
|
||||
|
|
|
@ -48,24 +48,6 @@ public:
|
|||
TOOL_INTERACTIVE( const std::string& aName );
|
||||
virtual ~TOOL_INTERACTIVE();
|
||||
|
||||
/**
|
||||
* Function Reset()
|
||||
* Brings the tool to a known, initial state. If the tool claimed anything from
|
||||
* the model or the view, it must release it when its reset.
|
||||
*/
|
||||
virtual void Reset() = 0;
|
||||
|
||||
/**
|
||||
* Function Init()
|
||||
* Init() is called once upon a registration of the tool.
|
||||
*
|
||||
* @return True if the initialization went fine, false - otherwise.
|
||||
*/
|
||||
virtual bool Init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function SetContextMenu()
|
||||
*
|
||||
|
|
|
@ -127,10 +127,10 @@ public:
|
|||
TOOL_BASE* FindTool( const std::string& aName ) const;
|
||||
|
||||
/**
|
||||
* Resets the state of a given tool by clearing its wait and
|
||||
* transition lists and calling tool's internal Reset() method.
|
||||
* Function ResetTools()
|
||||
* Resets all tools (i.e. calls their Reset() method).
|
||||
*/
|
||||
void ResetTool( TOOL_BASE* aTool );
|
||||
void ResetTools( TOOL_BASE::RESET_REASON aReason );
|
||||
|
||||
/**
|
||||
* Takes an event from the TOOL_DISPATCHER and propagates it to
|
||||
|
|
|
@ -187,7 +187,10 @@ void PCB_BASE_FRAME::SetBoard( BOARD* aBoard )
|
|||
|
||||
// update the tool manager with the new board and its view.
|
||||
if( m_toolManager )
|
||||
{
|
||||
m_toolManager->SetEnvironment( m_Pcb, view, m_galCanvas->GetViewControls(), this );
|
||||
m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -610,8 +613,12 @@ void PCB_BASE_FRAME::UseGalCanvas( bool aEnable )
|
|||
|
||||
ViewReloadBoard( m_Pcb );
|
||||
|
||||
if( aEnable )
|
||||
{
|
||||
m_toolManager->SetEnvironment( m_Pcb, m_galCanvas->GetView(),
|
||||
m_galCanvas->GetViewControls(), this );
|
||||
m_toolManager->ResetTools( TOOL_BASE::GAL_SWITCH );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ ROUTER_TOOL::~ROUTER_TOOL()
|
|||
}
|
||||
|
||||
|
||||
void ROUTER_TOOL::Reset()
|
||||
void ROUTER_TOOL::Reset( RESET_REASON aReason )
|
||||
{
|
||||
if( m_router )
|
||||
delete m_router;
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
ROUTER_TOOL();
|
||||
~ROUTER_TOOL();
|
||||
|
||||
void Reset();
|
||||
void Reset( RESET_REASON aReason );
|
||||
int Main( TOOL_EVENT& aEvent );
|
||||
|
||||
private:
|
||||
|
|
|
@ -64,8 +64,14 @@ SELECTION_TOOL::~SELECTION_TOOL()
|
|||
}
|
||||
|
||||
|
||||
void SELECTION_TOOL::Reset()
|
||||
void SELECTION_TOOL::Reset( RESET_REASON aReason )
|
||||
{
|
||||
if( aReason == TOOL_BASE::MODEL_RELOAD )
|
||||
// Remove pointers to the selected items from containers
|
||||
// without changing their properties (as they are already deleted)
|
||||
m_selection.Clear();
|
||||
else
|
||||
// Restore previous properties of selected items and remove them from containers
|
||||
ClearSelection();
|
||||
|
||||
// Reinsert the VIEW_GROUP, in case it was removed from the VIEW
|
||||
|
@ -157,7 +163,6 @@ void SELECTION_TOOL::ClearSelection()
|
|||
item->ViewSetVisible( true );
|
||||
item->ClearSelected();
|
||||
}
|
||||
|
||||
m_selection.Clear();
|
||||
|
||||
getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL );
|
||||
|
|
|
@ -85,7 +85,7 @@ public:
|
|||
};
|
||||
|
||||
/// @copydoc TOOL_INTERACTIVE::Reset()
|
||||
void Reset();
|
||||
void Reset( RESET_REASON aReason );
|
||||
|
||||
/**
|
||||
* Function Main()
|
||||
|
|
Loading…
Reference in New Issue