Remove newly dangling lines when dragging

These lines are remnants from drag operations that should be cleaned
after commiting the new line positions

Fixes https://gitlab.com/kicad/code/kicad/issues/12870
This commit is contained in:
Seth Hillbrand 2022-11-30 13:45:31 -08:00
parent e517cad12b
commit 01cf6d76d8
2 changed files with 38 additions and 2 deletions

View File

@ -904,9 +904,11 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
m_toolMgr->RunAction( EE_ACTIONS::trimOverlappingWires, true, &selectionCopy );
m_toolMgr->RunAction( EE_ACTIONS::addNeededJunctions, true, &selectionCopy );
m_frame->RecalculateConnections( LOCAL_CLEANUP );
m_frame->TestDanglingEnds();
// This needs to run prior to `RecalculateConnections` because we need to identify
// the lines that are newly dangling
trimDanglingLines();
m_frame->RecalculateConnections( LOCAL_CLEANUP );
m_frame->OnModify();
}
@ -923,6 +925,37 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
}
void SCH_MOVE_TOOL::trimDanglingLines()
{
// Need a local cleanup first to ensure we remove unneeded junctions
m_frame->SchematicCleanUp( m_frame->GetScreen() );
std::set<SCH_ITEM*> danglers;
std::function<void( SCH_ITEM* )> changeHandler =
[&]( SCH_ITEM* aChangedItem ) -> void
{
m_toolMgr->GetView()->Update( aChangedItem, KIGFX::REPAINT );
// Delete newly dangling lines
if( aChangedItem->IsDangling() && aChangedItem->IsType( {SCH_LINE_T } ) )
danglers.insert( aChangedItem );
};
m_frame->GetScreen()->TestDanglingEnds( nullptr, &changeHandler );
for( SCH_ITEM* line : danglers )
{
line->SetFlags( STRUCT_DELETED );
saveCopyInUndoList( line, UNDO_REDO::DELETED, true );
updateItem( line, false );
m_frame->RemoveFromScreen( line, m_frame->GetScreen() );
}
}
void SCH_MOVE_TOOL::getConnectedItems( SCH_ITEM* aOriginalItem, const VECTOR2I& aPoint,
EDA_ITEMS& aList )
{

View File

@ -84,6 +84,9 @@ private:
///< Set up handlers for various events.
void setTransitions() override;
///< Cleanup dangling lines left after a drag
void trimDanglingLines();
private:
///< Re-entrancy guard
bool m_inMoveTool;