Drop selection after hiding items.
Fixes https://gitlab.com/kicad/code/kicad/issues/8605
This commit is contained in:
parent
490cc42cb5
commit
2ec1c215cd
|
@ -1149,11 +1149,12 @@ int SCH_EDIT_TOOL::EditField( const TOOL_EVENT& aEvent )
|
||||||
if( selection.Size() != 1 )
|
if( selection.Size() != 1 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
SCH_ITEM* item = (SCH_ITEM*) selection.Front();
|
bool clearSelection = selection.IsHover();
|
||||||
|
EDA_ITEM* item = selection.Front();
|
||||||
|
|
||||||
if( item->Type() == SCH_SYMBOL_T )
|
if( item->Type() == SCH_SYMBOL_T )
|
||||||
{
|
{
|
||||||
SCH_SYMBOL* symbol = (SCH_SYMBOL*) item;
|
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
|
||||||
|
|
||||||
if( aEvent.IsAction( &EE_ACTIONS::editReference ) )
|
if( aEvent.IsAction( &EE_ACTIONS::editReference ) )
|
||||||
editFieldText( symbol->GetField( REFERENCE_FIELD ) );
|
editFieldText( symbol->GetField( REFERENCE_FIELD ) );
|
||||||
|
@ -1164,10 +1165,15 @@ int SCH_EDIT_TOOL::EditField( const TOOL_EVENT& aEvent )
|
||||||
}
|
}
|
||||||
else if( item->Type() == SCH_FIELD_T )
|
else if( item->Type() == SCH_FIELD_T )
|
||||||
{
|
{
|
||||||
editFieldText( (SCH_FIELD*) item );
|
SCH_FIELD* field = static_cast<SCH_FIELD*>( item );
|
||||||
|
|
||||||
|
editFieldText( field );
|
||||||
|
|
||||||
|
if( !field->IsVisible() )
|
||||||
|
clearSelection = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( selection.IsHover() )
|
if( clearSelection )
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1264,6 +1270,7 @@ int SCH_EDIT_TOOL::ConvertDeMorgan( const TOOL_EVENT& aEvent )
|
||||||
int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
EE_SELECTION& selection = m_selectionTool->RequestSelection( EE_COLLECTOR::EditableItems );
|
EE_SELECTION& selection = m_selectionTool->RequestSelection( EE_COLLECTOR::EditableItems );
|
||||||
|
bool clearSelection = selection.IsHover();
|
||||||
|
|
||||||
if( selection.Empty() )
|
if( selection.Empty() )
|
||||||
{
|
{
|
||||||
|
@ -1279,7 +1286,7 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ITEM* item = (SCH_ITEM*) selection.Front();
|
EDA_ITEM* item = selection.Front();
|
||||||
|
|
||||||
switch( item->Type() )
|
switch( item->Type() )
|
||||||
{
|
{
|
||||||
|
@ -1307,7 +1314,7 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
case SCH_SYMBOL_T:
|
case SCH_SYMBOL_T:
|
||||||
{
|
{
|
||||||
SCH_SYMBOL* symbol = (SCH_SYMBOL*) item;
|
SCH_SYMBOL* symbol = static_cast<SCH_SYMBOL*>( item );
|
||||||
DIALOG_SYMBOL_PROPERTIES symbolPropsDialog( m_frame, symbol );
|
DIALOG_SYMBOL_PROPERTIES symbolPropsDialog( m_frame, symbol );
|
||||||
|
|
||||||
// This dialog itself subsequently can invoke a KIWAY_PLAYER as a quasimodal
|
// This dialog itself subsequently can invoke a KIWAY_PLAYER as a quasimodal
|
||||||
|
@ -1397,7 +1404,7 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
case SCH_SHEET_PIN_T:
|
case SCH_SHEET_PIN_T:
|
||||||
{
|
{
|
||||||
SCH_SHEET_PIN* pin = (SCH_SHEET_PIN*) item;
|
SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( item );
|
||||||
DIALOG_SHEET_PIN_PROPERTIES dlg( m_frame, pin );
|
DIALOG_SHEET_PIN_PROPERTIES dlg( m_frame, pin );
|
||||||
|
|
||||||
// QuasiModal required for help dialog
|
// QuasiModal required for help dialog
|
||||||
|
@ -1414,7 +1421,8 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
case SCH_GLOBAL_LABEL_T:
|
case SCH_GLOBAL_LABEL_T:
|
||||||
case SCH_HIER_LABEL_T:
|
case SCH_HIER_LABEL_T:
|
||||||
{
|
{
|
||||||
DIALOG_TEXT_AND_LABEL_PROPERTIES dlg( m_frame, (SCH_TEXT*) item );
|
SCH_TEXT* text = static_cast<SCH_TEXT*>( item );
|
||||||
|
DIALOG_TEXT_AND_LABEL_PROPERTIES dlg( m_frame, text );
|
||||||
|
|
||||||
// Must be quasi modal for syntax help
|
// Must be quasi modal for syntax help
|
||||||
if( dlg.ShowQuasiModal() == wxID_OK )
|
if( dlg.ShowQuasiModal() == wxID_OK )
|
||||||
|
@ -1426,12 +1434,19 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCH_FIELD_T:
|
case SCH_FIELD_T:
|
||||||
editFieldText( (SCH_FIELD*) item );
|
{
|
||||||
|
SCH_FIELD* field = static_cast<SCH_FIELD*>( item );
|
||||||
|
|
||||||
|
editFieldText( field );
|
||||||
|
|
||||||
|
if( !field->IsVisible() )
|
||||||
|
clearSelection = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCH_BITMAP_T:
|
case SCH_BITMAP_T:
|
||||||
{
|
{
|
||||||
SCH_BITMAP* bitmap = (SCH_BITMAP*) item;
|
SCH_BITMAP* bitmap = static_cast<SCH_BITMAP*>( item );
|
||||||
DIALOG_IMAGE_EDITOR dlg( m_frame, bitmap->GetImage() );
|
DIALOG_IMAGE_EDITOR dlg( m_frame, bitmap->GetImage() );
|
||||||
|
|
||||||
if( dlg.ShowModal() == wxID_OK )
|
if( dlg.ShowModal() == wxID_OK )
|
||||||
|
@ -1455,7 +1470,7 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
std::deque<SCH_ITEM*> strokeItems;
|
std::deque<SCH_ITEM*> strokeItems;
|
||||||
|
|
||||||
for( auto selItem : selection.Items() )
|
for( EDA_ITEM* selItem : selection.Items() )
|
||||||
{
|
{
|
||||||
SCH_ITEM* schItem = dynamic_cast<SCH_ITEM*>( selItem );
|
SCH_ITEM* schItem = dynamic_cast<SCH_ITEM*>( selItem );
|
||||||
|
|
||||||
|
@ -1479,7 +1494,7 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
std::deque<SCH_JUNCTION*> junctions;
|
std::deque<SCH_JUNCTION*> junctions;
|
||||||
|
|
||||||
for( auto selItem : selection.Items() )
|
for( EDA_ITEM* selItem : selection.Items() )
|
||||||
{
|
{
|
||||||
SCH_JUNCTION* junction = dynamic_cast<SCH_JUNCTION*>( selItem );
|
SCH_JUNCTION* junction = dynamic_cast<SCH_JUNCTION*>( selItem );
|
||||||
|
|
||||||
|
@ -1508,7 +1523,7 @@ int SCH_EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
|
|
||||||
updateItem( item, true );
|
updateItem( item, true );
|
||||||
|
|
||||||
if( selection.IsHover() )
|
if( clearSelection )
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1603,7 +1618,9 @@ int SCH_EDIT_TOOL::ChangeTextType( const TOOL_EVENT& aEvent )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
m_frame->TestDanglingEnds();
|
m_frame->TestDanglingEnds();
|
||||||
|
}
|
||||||
|
|
||||||
m_frame->OnModify();
|
m_frame->OnModify();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1446,9 +1446,20 @@ int EDIT_TOOL::Properties( const TOOL_EVENT& aEvent )
|
||||||
if( selection.IsHover() )
|
if( selection.IsHover() )
|
||||||
{
|
{
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Check for items becoming invisible and drop them from the selection.
|
||||||
|
|
||||||
// Notify other tools of the changes -- This updates the visual ratsnest
|
LSET visible = editFrame->GetBoard()->GetVisibleLayers();
|
||||||
m_toolMgr->ProcessEvent( EVENTS::SelectedItemsModified );
|
|
||||||
|
for( EDA_ITEM* eda_item : selection )
|
||||||
|
{
|
||||||
|
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( eda_item );
|
||||||
|
|
||||||
|
if( !( item->GetLayerSet() & visible ).any() )
|
||||||
|
m_selectionTool->RemoveItemFromSel( item );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue