Commit 625dcddb authored by Maciej Suminski's avatar Maciej Suminski

Added 2 tool actions:

- pcbnew.InteractiveSelection.Single for selecting a single item
- pcbnew.InteractiveSelection.Clear for clearing the selection
Made SELECTION_TOOL::clearSelection private.
parent 106fa9bb
...@@ -30,6 +30,12 @@ ...@@ -30,6 +30,12 @@
TOOL_ACTION COMMON_ACTIONS::selectionActivate( "pcbnew.InteractiveSelection", TOOL_ACTION COMMON_ACTIONS::selectionActivate( "pcbnew.InteractiveSelection",
AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere
TOOL_ACTION COMMON_ACTIONS::selectionSingle( "pcbnew.InteractiveSelection.Single",
AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere
TOOL_ACTION COMMON_ACTIONS::selectionClear( "pcbnew.InteractiveSelection.Clear",
AS_GLOBAL, 0, "", "" ); // No description, it is not supposed to be shown anywhere
// Edit tool actions // Edit tool actions
TOOL_ACTION COMMON_ACTIONS::editActivate( "pcbnew.InteractiveEdit", TOOL_ACTION COMMON_ACTIONS::editActivate( "pcbnew.InteractiveEdit",
AS_GLOBAL, 'M', AS_GLOBAL, 'M',
......
...@@ -24,13 +24,11 @@ ...@@ -24,13 +24,11 @@
#include <tool/tool_action.h> #include <tool/tool_action.h>
//class ACTION_MANAGER;
/** /**
* Class COMMON_ACTIONS * Class COMMON_ACTIONS
* *
* Gathers all the actions that are shared by tools. The instance of COMMON_ACTIOSN is created * Gathers all the actions that are shared by tools. The instance of COMMON_ACTION is created
* inside of ACTION_MANAGER object and registers them. * inside of ACTION_MANAGER object that registers the actions.
*/ */
class COMMON_ACTIONS class COMMON_ACTIONS
{ {
...@@ -38,6 +36,12 @@ public: ...@@ -38,6 +36,12 @@ public:
/// Activation of the selection tool /// Activation of the selection tool
static TOOL_ACTION selectionActivate; static TOOL_ACTION selectionActivate;
/// Select a single item under the cursor position
static TOOL_ACTION selectionSingle;
/// Clears the current selection
static TOOL_ACTION selectionClear;
/// Activation of the edit tool /// Activation of the edit tool
static TOOL_ACTION editActivate; static TOOL_ACTION editActivate;
......
...@@ -74,10 +74,6 @@ bool EDIT_TOOL::Init() ...@@ -74,10 +74,6 @@ bool EDIT_TOOL::Init()
int EDIT_TOOL::Main( TOOL_EVENT& aEvent ) int EDIT_TOOL::Main( TOOL_EVENT& aEvent )
{ {
const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection(); const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection();
PCB_EDIT_FRAME* editFrame = static_cast<PCB_EDIT_FRAME*>( m_toolMgr->GetEditFrame() );
// By default, modified items need to update their geometry
m_updateFlag = KIGFX::VIEW_ITEM::GEOMETRY;
if( selection.Empty() ) if( selection.Empty() )
{ {
...@@ -90,7 +86,11 @@ int EDIT_TOOL::Main( TOOL_EVENT& aEvent ) ...@@ -90,7 +86,11 @@ int EDIT_TOOL::Main( TOOL_EVENT& aEvent )
m_dragging = false; m_dragging = false;
bool restore = false; // Should items' state be restored when finishing the tool? bool restore = false; // Should items' state be restored when finishing the tool?
// By default, modified items need to update their geometry
m_updateFlag = KIGFX::VIEW_ITEM::GEOMETRY;
VIEW_CONTROLS* controls = getViewControls(); VIEW_CONTROLS* controls = getViewControls();
PCB_EDIT_FRAME* editFrame = static_cast<PCB_EDIT_FRAME*>( m_toolMgr->GetEditFrame() );
controls->ShowCursor( true ); controls->ShowCursor( true );
controls->SetSnapping( true ); controls->SetSnapping( true );
controls->SetAutoPan( true ); controls->SetAutoPan( true );
...@@ -163,7 +163,7 @@ int EDIT_TOOL::Main( TOOL_EVENT& aEvent ) ...@@ -163,7 +163,7 @@ int EDIT_TOOL::Main( TOOL_EVENT& aEvent )
if( restore ) if( restore )
{ {
// Modifications has to be rollbacked, so restore the previous state of items // Modifications have to be rollbacked, so restore the previous state of items
wxCommandEvent dummy; wxCommandEvent dummy;
editFrame->GetBoardFromUndoList( dummy ); editFrame->GetBoardFromUndoList( dummy );
} }
...@@ -290,7 +290,7 @@ int EDIT_TOOL::Remove( TOOL_EVENT& aEvent ) ...@@ -290,7 +290,7 @@ int EDIT_TOOL::Remove( TOOL_EVENT& aEvent )
PCB_EDIT_FRAME* editFrame = static_cast<PCB_EDIT_FRAME*>( m_toolMgr->GetEditFrame() ); PCB_EDIT_FRAME* editFrame = static_cast<PCB_EDIT_FRAME*>( m_toolMgr->GetEditFrame() );
// As we are about to remove items, they have to be removed from the selection first // As we are about to remove items, they have to be removed from the selection first
m_selectionTool->ClearSelection(); m_toolMgr->RunAction( "pcbnew.InteractiveSelection.Clear" );
// Save them // Save them
for( unsigned int i = 0; i < selectedItems.GetCount(); ++i ) for( unsigned int i = 0; i < selectedItems.GetCount(); ++i )
......
...@@ -47,6 +47,8 @@ void PCB_EDIT_FRAME::setupTools() ...@@ -47,6 +47,8 @@ void PCB_EDIT_FRAME::setupTools()
GetGalCanvas()->SetEventDispatcher( m_toolDispatcher ); GetGalCanvas()->SetEventDispatcher( m_toolDispatcher );
// Register tool actions // Register tool actions
m_toolManager->RegisterAction( &COMMON_ACTIONS::selectionSingle );
m_toolManager->RegisterAction( &COMMON_ACTIONS::selectionClear );
m_toolManager->RegisterAction( &COMMON_ACTIONS::editActivate ); m_toolManager->RegisterAction( &COMMON_ACTIONS::editActivate );
m_toolManager->RegisterAction( &COMMON_ACTIONS::rotate ); m_toolManager->RegisterAction( &COMMON_ACTIONS::rotate );
m_toolManager->RegisterAction( &COMMON_ACTIONS::flip ); m_toolManager->RegisterAction( &COMMON_ACTIONS::flip );
......
...@@ -72,7 +72,7 @@ void SELECTION_TOOL::Reset( RESET_REASON aReason ) ...@@ -72,7 +72,7 @@ void SELECTION_TOOL::Reset( RESET_REASON aReason )
m_selection.clear(); m_selection.clear();
else else
// Restore previous properties of selected items and remove them from containers // Restore previous properties of selected items and remove them from containers
ClearSelection(); clearSelection();
// Reinsert the VIEW_GROUP, in case it was removed from the VIEW // Reinsert the VIEW_GROUP, in case it was removed from the VIEW
getView()->Remove( m_selection.group ); getView()->Remove( m_selection.group );
...@@ -92,25 +92,22 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) ...@@ -92,25 +92,22 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
// become the new selection (discarding previously selected items) // become the new selection (discarding previously selected items)
m_additive = evt->Modifier( MD_SHIFT ); m_additive = evt->Modifier( MD_SHIFT );
if( evt->IsCancel() ) if( evt->IsAction( &COMMON_ACTIONS::selectionSingle ) )
{ {
// Cancel event deselects items... selectSingle( getView()->ToWorld( getViewControls()->GetMousePosition() ) );
ClearSelection();
// This tool never exits
} }
else if( evt->Action() == TA_UNDO_REDO ) else if( evt->IsCancel() || evt->Action() == TA_UNDO_REDO ||
evt->IsAction( &COMMON_ACTIONS::selectionClear ) )
{ {
// Clear the selection, as it may be altered with undone items clearSelection();
ClearSelection();
} }
// single click? Select single object // single click? Select single object
else if( evt->IsClick( BUT_LEFT ) ) else if( evt->IsClick( BUT_LEFT ) )
{ {
if( !m_additive ) if( !m_additive )
ClearSelection(); clearSelection();
selectSingle( evt->Position() ); selectSingle( evt->Position() );
} }
...@@ -144,7 +141,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) ...@@ -144,7 +141,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
else else
{ {
// No -> clear the selection list // No -> clear the selection list
ClearSelection(); clearSelection();
} }
} }
} }
...@@ -157,30 +154,6 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) ...@@ -157,30 +154,6 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
} }
void SELECTION_TOOL::ClearSelection()
{
if( m_selection.Empty() )
return;
KIGFX::VIEW_GROUP::const_iter it, it_end;
// Restore the initial properties
for( it = m_selection.group->Begin(), it_end = m_selection.group->End(); it != it_end; ++it )
{
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it );
item->ViewSetVisible( true );
item->ClearSelected();
}
m_selection.clear();
getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL );
// Do not show the context menu when there is nothing selected
SetContextMenu( &m_menu, CMENU_OFF );
}
void SELECTION_TOOL::AddMenuItem( const TOOL_ACTION& aAction ) void SELECTION_TOOL::AddMenuItem( const TOOL_ACTION& aAction )
{ {
assert( aAction.GetId() > 0 ); // Check if the action was registered before in ACTION_MANAGER assert( aAction.GetId() > 0 ); // Check if the action was registered before in ACTION_MANAGER
...@@ -198,7 +171,7 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem ) ...@@ -198,7 +171,7 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem )
else else
{ {
if( !m_additive ) if( !m_additive )
ClearSelection(); clearSelection();
// Prevent selection of invisible or inactive items // Prevent selection of invisible or inactive items
if( selectable( aItem ) ) if( selectable( aItem ) )
...@@ -221,7 +194,7 @@ void SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere ) ...@@ -221,7 +194,7 @@ void SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere )
{ {
case 0: case 0:
if( !m_additive ) if( !m_additive )
ClearSelection(); clearSelection();
break; break;
case 1: case 1:
...@@ -254,43 +227,6 @@ void SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere ) ...@@ -254,43 +227,6 @@ void SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere )
} }
BOARD_ITEM* SELECTION_TOOL::pickSmallestComponent( GENERAL_COLLECTOR* aCollector )
{
int count = aCollector->GetPrimaryCount(); // try to use preferred layer
if( 0 == count )
count = aCollector->GetCount();
for( int i = 0; i < count; ++i )
{
if( ( *aCollector )[i]->Type() != PCB_MODULE_T )
return NULL;
}
// All are modules, now find smallest MODULE
int minDim = 0x7FFFFFFF;
int minNdx = 0;
for( int i = 0; i < count; ++i )
{
MODULE* module = (MODULE*) ( *aCollector )[i];
int lx = module->GetBoundingBox().GetWidth();
int ly = module->GetBoundingBox().GetHeight();
int lmin = std::min( lx, ly );
if( lmin < minDim )
{
minDim = lmin;
minNdx = i;
}
}
return (*aCollector)[minNdx];
}
bool SELECTION_TOOL::selectMultiple() bool SELECTION_TOOL::selectMultiple()
{ {
bool cancelled = false; // Was the tool cancelled while it was running? bool cancelled = false; // Was the tool cancelled while it was running?
...@@ -311,7 +247,7 @@ bool SELECTION_TOOL::selectMultiple() ...@@ -311,7 +247,7 @@ bool SELECTION_TOOL::selectMultiple()
if( evt->IsDrag( BUT_LEFT ) ) if( evt->IsDrag( BUT_LEFT ) )
{ {
if( !m_additive ) if( !m_additive )
ClearSelection(); clearSelection();
// Start drawing a selection box // Start drawing a selection box
m_selArea->SetOrigin( evt->DragOrigin() ); m_selArea->SetOrigin( evt->DragOrigin() );
...@@ -356,6 +292,30 @@ bool SELECTION_TOOL::selectMultiple() ...@@ -356,6 +292,30 @@ bool SELECTION_TOOL::selectMultiple()
} }
void SELECTION_TOOL::clearSelection()
{
if( m_selection.Empty() )
return;
KIGFX::VIEW_GROUP::const_iter it, it_end;
// Restore the initial properties
for( it = m_selection.group->Begin(), it_end = m_selection.group->End(); it != it_end; ++it )
{
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it );
item->ViewSetVisible( true );
item->ClearSelected();
}
m_selection.clear();
getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL );
// Do not show the context menu when there is nothing selected
SetContextMenu( &m_menu, CMENU_OFF );
}
BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector ) BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector )
{ {
BOARD_ITEM* current = NULL; BOARD_ITEM* current = NULL;
...@@ -419,6 +379,43 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector ) ...@@ -419,6 +379,43 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector )
} }
BOARD_ITEM* SELECTION_TOOL::pickSmallestComponent( GENERAL_COLLECTOR* aCollector )
{
int count = aCollector->GetPrimaryCount(); // try to use preferred layer
if( 0 == count )
count = aCollector->GetCount();
for( int i = 0; i < count; ++i )
{
if( ( *aCollector )[i]->Type() != PCB_MODULE_T )
return NULL;
}
// All are modules, now find smallest MODULE
int minDim = 0x7FFFFFFF;
int minNdx = 0;
for( int i = 0; i < count; ++i )
{
MODULE* module = (MODULE*) ( *aCollector )[i];
int lx = module->GetBoundingBox().GetWidth();
int ly = module->GetBoundingBox().GetHeight();
int lmin = std::min( lx, ly );
if( lmin < minDim )
{
minDim = lmin;
minNdx = i;
}
}
return (*aCollector)[minNdx];
}
bool SELECTION_TOOL::selectable( const BOARD_ITEM* aItem ) const bool SELECTION_TOOL::selectable( const BOARD_ITEM* aItem ) const
{ {
// Is high contrast mode enabled? // Is high contrast mode enabled?
......
...@@ -106,12 +106,6 @@ public: ...@@ -106,12 +106,6 @@ public:
return m_selection; return m_selection;
} }
/**
* Function ClearSelection()
* Clears the current selection.
*/
void ClearSelection();
/** /**
* Function AddMenuItem() * Function AddMenuItem()
* *
...@@ -138,6 +132,12 @@ private: ...@@ -138,6 +132,12 @@ private:
*/ */
bool selectMultiple(); bool selectMultiple();
/**
* Function ClearSelection()
* Clears the current selection.
*/
void clearSelection();
/** /**
* Function disambiguationMenu() * Function disambiguationMenu()
* Handles the menu that allows to select one of many items in case there is more than one * Handles the menu that allows to select one of many items in case there is more than one
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment