Be more careful with undo, and don't re-merge a bus over a bus entry.
Fixes https://gitlab.com/kicad/code/kicad/issues/9475
This commit is contained in:
parent
c5cdda26ae
commit
f345eacf13
|
@ -455,6 +455,16 @@ bool SCH_SCREEN::IsJunctionNeeded( const wxPoint& aPosition, bool aNew ) const
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SCH_BUS_WIRE_ENTRY_T:
|
case SCH_BUS_WIRE_ENTRY_T:
|
||||||
|
if( item->IsConnected( aPosition ) )
|
||||||
|
{
|
||||||
|
breakLines[ BUSES ] = true;
|
||||||
|
exitAngles[ BUSES ].insert( uniqueAngle++ );
|
||||||
|
breakLines[ WIRES ] = true;
|
||||||
|
exitAngles[ WIRES ].insert( uniqueAngle++ );
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case SCH_SYMBOL_T:
|
case SCH_SYMBOL_T:
|
||||||
case SCH_SHEET_T:
|
case SCH_SHEET_T:
|
||||||
if( item->IsConnected( aPosition ) )
|
if( item->IsConnected( aPosition ) )
|
||||||
|
|
|
@ -1319,18 +1319,24 @@ int SCH_EDITOR_CONTROL::Undo( const TOOL_EVENT& aEvent )
|
||||||
// Inform tools that undo command was issued
|
// Inform tools that undo command was issued
|
||||||
m_toolMgr->ProcessEvent( { TC_MESSAGE, TA_UNDO_REDO_PRE, AS_GLOBAL } );
|
m_toolMgr->ProcessEvent( { TC_MESSAGE, TA_UNDO_REDO_PRE, AS_GLOBAL } );
|
||||||
|
|
||||||
/* Get the old list */
|
// Get the old list
|
||||||
PICKED_ITEMS_LIST* List = m_frame->PopCommandFromUndoList();
|
PICKED_ITEMS_LIST* List = m_frame->PopCommandFromUndoList();
|
||||||
size_t num_undos = m_frame->m_undoList.m_CommandsList.size();
|
size_t num_undos = m_frame->m_undoList.m_CommandsList.size();
|
||||||
|
|
||||||
/* Undo the command */
|
// The cleanup routines normally run after an operation and so attempt to append their
|
||||||
|
// undo items onto the operation's list. However, in this case that's going be the list
|
||||||
|
// under us, which we don't want, so we push a dummy list onto the stack.
|
||||||
|
PICKED_ITEMS_LIST* dummy = new PICKED_ITEMS_LIST();
|
||||||
|
m_frame->PushCommandToUndoList( dummy );
|
||||||
|
|
||||||
m_frame->PutDataInPreviousState( List );
|
m_frame->PutDataInPreviousState( List );
|
||||||
|
|
||||||
m_frame->SetSheetNumberAndCount();
|
m_frame->SetSheetNumberAndCount();
|
||||||
m_frame->TestDanglingEnds();
|
m_frame->TestDanglingEnds();
|
||||||
m_frame->OnPageSettingsChange();
|
m_frame->OnPageSettingsChange();
|
||||||
|
|
||||||
// If we modified anything during cleanup we don't want it going on the undolist
|
// The cleanup routines *should* have appended to our dummy list, but just to be doubly
|
||||||
|
// sure pop any other new lists off the stack as well
|
||||||
while( m_frame->m_undoList.m_CommandsList.size() > num_undos )
|
while( m_frame->m_undoList.m_CommandsList.size() > num_undos )
|
||||||
delete m_frame->PopCommandFromUndoList();
|
delete m_frame->PopCommandFromUndoList();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue