eeschema: Add select all to schematic and library editor

Fixes https://gitlab.com/kicad/code/kicad/issues/2497
This commit is contained in:
Seth Hillbrand 2020-08-20 16:05:21 -07:00
parent 1e315bc3fe
commit 7565a08396
9 changed files with 92 additions and 2 deletions

View File

@ -167,8 +167,7 @@ TOOL_ACTION ACTIONS::paste( "common.Interactive.paste",
TOOL_ACTION ACTIONS::selectAll( "common.Interactive.selectAll", TOOL_ACTION ACTIONS::selectAll( "common.Interactive.selectAll",
AS_GLOBAL, AS_GLOBAL,
MD_CTRL + 'A', "", MD_CTRL + 'A', "",
_( "Select All" ), _( "Paste clipboard into schematic" ), _( "Select All" ), _( "Paste clipboard into schematic" ) );
paste_xpm );
TOOL_ACTION ACTIONS::pasteSpecial( "common.Interactive.pasteSpecial", TOOL_ACTION ACTIONS::pasteSpecial( "common.Interactive.pasteSpecial",
AS_GLOBAL, 0, "", AS_GLOBAL, 0, "",

View File

@ -335,6 +335,7 @@ void LIB_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::paste, ENABLE( haveSymbolCond && SELECTION_CONDITIONS::Idle ) ); mgr->SetConditions( ACTIONS::paste, ENABLE( haveSymbolCond && SELECTION_CONDITIONS::Idle ) );
mgr->SetConditions( ACTIONS::doDelete, ENABLE( haveSymbolCond && SELECTION_CONDITIONS::NotEmpty ) ); mgr->SetConditions( ACTIONS::doDelete, ENABLE( haveSymbolCond && SELECTION_CONDITIONS::NotEmpty ) );
mgr->SetConditions( ACTIONS::duplicate, ENABLE( haveSymbolCond && SELECTION_CONDITIONS::NotEmpty ) ); mgr->SetConditions( ACTIONS::duplicate, ENABLE( haveSymbolCond && SELECTION_CONDITIONS::NotEmpty ) );
mgr->SetConditions( ACTIONS::selectAll, ENABLE( haveSymbolCond ) );
mgr->SetConditions( ACTIONS::zoomTool, CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) ); mgr->SetConditions( ACTIONS::zoomTool, CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) );
mgr->SetConditions( ACTIONS::selectionTool, CHECK( cond.CurrentTool( ACTIONS::selectionTool ) ) ); mgr->SetConditions( ACTIONS::selectionTool, CHECK( cond.CurrentTool( ACTIONS::selectionTool ) ) );

View File

@ -87,6 +87,9 @@ void LIB_EDIT_FRAME::ReCreateMenuBar()
editMenu->Add( ACTIONS::doDelete ); editMenu->Add( ACTIONS::doDelete );
editMenu->Add( ACTIONS::duplicate ); editMenu->Add( ACTIONS::duplicate );
editMenu->AppendSeparator();
editMenu->Add( ACTIONS::selectAll );
editMenu->AppendSeparator(); editMenu->AppendSeparator();
editMenu->Add( EE_ACTIONS::symbolProperties ); editMenu->Add( EE_ACTIONS::symbolProperties );
editMenu->Add( EE_ACTIONS::pinTable ); editMenu->Add( EE_ACTIONS::pinTable );

View File

@ -142,6 +142,9 @@ void SCH_EDIT_FRAME::ReCreateMenuBar()
editMenu->Add( ACTIONS::doDelete ); editMenu->Add( ACTIONS::doDelete );
editMenu->Add( ACTIONS::duplicate ); editMenu->Add( ACTIONS::duplicate );
editMenu->AppendSeparator();
editMenu->Add( ACTIONS::selectAll );
editMenu->AppendSeparator(); editMenu->AppendSeparator();
editMenu->Add( ACTIONS::find ); editMenu->Add( ACTIONS::find );
editMenu->Add( ACTIONS::findAndReplace ); editMenu->Add( ACTIONS::findAndReplace );

View File

@ -361,6 +361,12 @@ void SCH_EDIT_FRAME::setupUIConditions()
wxASSERT( mgr ); wxASSERT( mgr );
auto hasElements =
[ this ] ( const SELECTION& aSel )
{
return !GetScreen()->Items().empty();
};
#define ENABLE( x ) ACTION_CONDITIONS().Enable( x ) #define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
#define CHECK( x ) ACTION_CONDITIONS().Check( x ) #define CHECK( x ) ACTION_CONDITIONS().Check( x )
@ -381,6 +387,7 @@ void SCH_EDIT_FRAME::setupUIConditions()
mgr->SetConditions( ACTIONS::pasteSpecial, ENABLE( SELECTION_CONDITIONS::Idle ) ); mgr->SetConditions( ACTIONS::pasteSpecial, ENABLE( SELECTION_CONDITIONS::Idle ) );
mgr->SetConditions( ACTIONS::doDelete, ENABLE( SELECTION_CONDITIONS::NotEmpty ) ); mgr->SetConditions( ACTIONS::doDelete, ENABLE( SELECTION_CONDITIONS::NotEmpty ) );
mgr->SetConditions( ACTIONS::duplicate, ENABLE( SELECTION_CONDITIONS::NotEmpty ) ); mgr->SetConditions( ACTIONS::duplicate, ENABLE( SELECTION_CONDITIONS::NotEmpty ) );
mgr->SetConditions( ACTIONS::selectAll, ENABLE( hasElements ) );
mgr->SetConditions( ACTIONS::zoomTool, CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) ); mgr->SetConditions( ACTIONS::zoomTool, CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) );
mgr->SetConditions( ACTIONS::selectionTool, CHECK( cond.CurrentTool( ACTIONS::selectionTool ) ) ); mgr->SetConditions( ACTIONS::selectionTool, CHECK( cond.CurrentTool( ACTIONS::selectionTool ) ) );

View File

@ -110,6 +110,7 @@ EE_SELECTION_TOOL::EE_SELECTION_TOOL() :
m_unit( 0 ), m_unit( 0 ),
m_convert( 0 ) m_convert( 0 )
{ {
m_selection.Clear();
} }
@ -562,6 +563,52 @@ bool EE_SELECTION_TOOL::SelectPoint( const VECTOR2I& aWhere, const KICAD_T* aFil
} }
int EE_SELECTION_TOOL::SelectAll( const TOOL_EVENT& aEvent )
{
m_multiple = true; // Multiple selection mode is active
KIGFX::VIEW* view = getView();
// hold all visible items
std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> selectedItems;
std::vector<KIGFX::VIEW::LAYER_ITEM_PAIR> sheetPins;
// Filter the view items based on the selection box
BOX2I selectionBox;
selectionBox.SetMaximum();
view->Query( selectionBox, selectedItems ); // Get the list of selected items
// Sheet pins aren't in the view; add them by hand
for( KIGFX::VIEW::LAYER_ITEM_PAIR& pair : selectedItems )
{
SCH_SHEET* sheet = dynamic_cast<SCH_SHEET*>( pair.first );
if( sheet )
{
int layer = pair.second;
for( SCH_SHEET_PIN* pin : sheet->GetPins() )
sheetPins.emplace_back( KIGFX::VIEW::LAYER_ITEM_PAIR( pin, layer ) );
}
}
selectedItems.insert( selectedItems.end(), sheetPins.begin(), sheetPins.end() );
for( auto& item_pair : selectedItems )
{
if( EDA_ITEM* item = dynamic_cast<EDA_ITEM*>( item_pair.first ) )
{
if( Selectable( item ) )
select( item );
}
}
m_multiple = false;
return 0;
}
void EE_SELECTION_TOOL::GuessSelectionCandidates( EE_COLLECTOR& collector, const VECTOR2I& aPos ) void EE_SELECTION_TOOL::GuessSelectionCandidates( EE_COLLECTOR& collector, const VECTOR2I& aPos )
{ {
// There are certain parent/child and enclosure combinations that can be handled // There are certain parent/child and enclosure combinations that can be handled
@ -1466,6 +1513,8 @@ void EE_SELECTION_TOOL::setTransitions()
Go( &EE_SELECTION_TOOL::RemoveItemFromSel, EE_ACTIONS::removeItemFromSel.MakeEvent() ); Go( &EE_SELECTION_TOOL::RemoveItemFromSel, EE_ACTIONS::removeItemFromSel.MakeEvent() );
Go( &EE_SELECTION_TOOL::RemoveItemsFromSel, EE_ACTIONS::removeItemsFromSel.MakeEvent() ); Go( &EE_SELECTION_TOOL::RemoveItemsFromSel, EE_ACTIONS::removeItemsFromSel.MakeEvent() );
Go( &EE_SELECTION_TOOL::SelectionMenu, EE_ACTIONS::selectionMenu.MakeEvent() ); Go( &EE_SELECTION_TOOL::SelectionMenu, EE_ACTIONS::selectionMenu.MakeEvent() );
Go( &EE_SELECTION_TOOL::SelectAll, EE_ACTIONS::selectAll.MakeEvent() );
} }

View File

@ -130,6 +130,9 @@ public:
///> Clear current selection event handler. ///> Clear current selection event handler.
int ClearSelection( const TOOL_EVENT& aEvent ); int ClearSelection( const TOOL_EVENT& aEvent );
///> Select all visible items in sheet
int SelectAll( const TOOL_EVENT& aEvent );
void ClearSelection(); void ClearSelection();
/** /**

View File

@ -60,6 +60,12 @@ bool LIB_EDIT_TOOL::Init()
wxASSERT_MSG( drawingTools, "eeschema.SymbolDrawing tool is not available" ); wxASSERT_MSG( drawingTools, "eeschema.SymbolDrawing tool is not available" );
auto havePartCondition =
[&]( const SELECTION& sel )
{
return m_isLibEdit && static_cast<LIB_EDIT_FRAME*>( m_frame )->GetCurPart();
};
// Add edit actions to the move tool menu // Add edit actions to the move tool menu
// //
if( moveTool ) if( moveTool )
@ -79,6 +85,9 @@ bool LIB_EDIT_TOOL::Init()
moveMenu.AddItem( ACTIONS::cut, EE_CONDITIONS::IdleSelection, 300 ); moveMenu.AddItem( ACTIONS::cut, EE_CONDITIONS::IdleSelection, 300 );
moveMenu.AddItem( ACTIONS::copy, EE_CONDITIONS::IdleSelection, 300 ); moveMenu.AddItem( ACTIONS::copy, EE_CONDITIONS::IdleSelection, 300 );
moveMenu.AddItem( ACTIONS::duplicate, EE_CONDITIONS::NotEmpty, 300 ); moveMenu.AddItem( ACTIONS::duplicate, EE_CONDITIONS::NotEmpty, 300 );
moveMenu.AddSeparator( 400 );
moveMenu.AddItem( ACTIONS::selectAll, havePartCondition, 400 );
} }
// Add editing actions to the drawing tool menu // Add editing actions to the drawing tool menu
@ -111,6 +120,9 @@ bool LIB_EDIT_TOOL::Init()
selToolMenu.AddItem( ACTIONS::paste, EE_CONDITIONS::Idle, 300 ); selToolMenu.AddItem( ACTIONS::paste, EE_CONDITIONS::Idle, 300 );
selToolMenu.AddItem( ACTIONS::duplicate, EE_CONDITIONS::NotEmpty, 300 ); selToolMenu.AddItem( ACTIONS::duplicate, EE_CONDITIONS::NotEmpty, 300 );
selToolMenu.AddSeparator( 400 );
selToolMenu.AddItem( ACTIONS::selectAll, havePartCondition, 400 );
return true; return true;
} }

View File

@ -141,6 +141,12 @@ bool SCH_EDIT_TOOL::Init()
wxASSERT_MSG( drawingTools, "eeshema.InteractiveDrawing tool is not available" ); wxASSERT_MSG( drawingTools, "eeshema.InteractiveDrawing tool is not available" );
auto hasElements =
[ this ] ( const SELECTION& aSel )
{
return !m_frame->GetScreen()->Items().empty();
};
auto sheetTool = auto sheetTool =
[ this ] ( const SELECTION& aSel ) [ this ] ( const SELECTION& aSel )
{ {
@ -301,6 +307,9 @@ bool SCH_EDIT_TOOL::Init()
moveMenu.AddItem( ACTIONS::cut, E_C::IdleSelection ); moveMenu.AddItem( ACTIONS::cut, E_C::IdleSelection );
moveMenu.AddItem( ACTIONS::copy, E_C::IdleSelection ); moveMenu.AddItem( ACTIONS::copy, E_C::IdleSelection );
moveMenu.AddItem( ACTIONS::duplicate, duplicateCondition ); moveMenu.AddItem( ACTIONS::duplicate, duplicateCondition );
moveMenu.AddSeparator();
moveMenu.AddItem( ACTIONS::selectAll, hasElements );
} }
// //
@ -374,6 +383,10 @@ bool SCH_EDIT_TOOL::Init()
selToolMenu.AddItem( ACTIONS::pasteSpecial, E_C::Idle, 300 ); selToolMenu.AddItem( ACTIONS::pasteSpecial, E_C::Idle, 300 );
selToolMenu.AddItem( ACTIONS::duplicate, duplicateCondition, 300 ); selToolMenu.AddItem( ACTIONS::duplicate, duplicateCondition, 300 );
selToolMenu.AddSeparator( 400 );
selToolMenu.AddItem( ACTIONS::selectAll, hasElements, 400 );
return true; return true;
} }