Cancel or commit pad edit mode when switching footprints.

Fixes https://gitlab.com/kicad/code/kicad/issues/10209

(cherry picked from commit 85805b95ba)
This commit is contained in:
Jeff Young 2022-02-19 19:29:27 +00:00
parent da82ba00e4
commit 02ec87b036
4 changed files with 24 additions and 7 deletions

View File

@ -48,6 +48,7 @@
#include <settings/settings_manager.h>
#include <footprint_editor_settings.h>
#include "footprint_viewer_frame.h"
#include "tools/pad_tool.h"
#include <wx/choicdlg.h>
#include <wx/filedlg.h>
@ -784,6 +785,11 @@ bool FOOTPRINT_EDIT_FRAME::SaveFootprint( FOOTPRINT* aFootprint )
if( !aFootprint ) // Happen if no footprint loaded
return false;
PAD_TOOL* padTool = m_toolManager->GetTool<PAD_TOOL>();
if( padTool->InPadEditMode() )
m_toolManager->RunAction( PCB_ACTIONS::recombinePad, true );
wxString libraryName = aFootprint->GetFPID().GetLibNickname();
wxString footprintName = aFootprint->GetFPID().GetLibItemName();
bool nameChanged = m_footprintNameWhenLoaded != footprintName;
@ -879,7 +885,6 @@ bool FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard( bool aAddNew )
return false;
}
TOOL_MANAGER* toolMgr = pcbframe->GetToolManager();
BOARD* mainpcb = pcbframe->GetBoard();
FOOTPRINT* sourceFootprint = nullptr;
FOOTPRINT* editorFootprint = GetBoard()->GetFirstFootprint();
@ -906,14 +911,13 @@ bool FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard( bool aAddNew )
return false;
}
if( aAddNew && toolMgr->GetTool<BOARD_EDITOR_CONTROL>()->PlacingFootprint() )
if( aAddNew && m_toolManager->GetTool<BOARD_EDITOR_CONTROL>()->PlacingFootprint() )
{
DisplayError( this, _( "Previous footprint placement still in progress." ) );
return false;
}
m_toolManager->RunAction( PCB_ACTIONS::selectionClear, true );
toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
BOARD_COMMIT commit( pcbframe );
// Create a copy for the board, first using Clone() to keep existing Uuids, and then either
@ -960,7 +964,7 @@ bool FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard( bool aAddNew )
commit.Push( wxT( "Insert footprint" ) );
pcbframe->Raise();
toolMgr->RunAction( PCB_ACTIONS::placeFootprint, true, newFootprint );
m_toolManager->RunAction( PCB_ACTIONS::placeFootprint, true, newFootprint );
}
newFootprint->ClearFlags();

View File

@ -59,6 +59,17 @@ void PAD_TOOL::Reset( RESET_REASON aReason )
if( aReason == MODEL_RELOAD )
m_lastPadNumber = wxT( "1" );
if( m_editPad != niluuid )
{
PCB_DISPLAY_OPTIONS opts = frame()->GetDisplayOptions();
bool highContrast = ( opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL );
if( m_wasHighContrast != highContrast )
m_toolMgr->RunAction( ACTIONS::highContrastMode, true );
frame()->GetInfoBar()->Dismiss();
}
m_editPad = niluuid;
}
@ -576,7 +587,7 @@ int PAD_TOOL::EditPad( const TOOL_EVENT& aEvent )
frame()->SetActiveLayer( layer );
if( !m_wasHighContrast )
m_toolMgr->RunAction( ACTIONS::highContrastMode, false );
m_toolMgr->RunAction( ACTIONS::highContrastMode, true );
if( PCB_ACTIONS::explodePad.GetHotKey() == PCB_ACTIONS::recombinePad.GetHotKey() )
{
@ -600,7 +611,7 @@ int PAD_TOOL::EditPad( const TOOL_EVENT& aEvent )
bool highContrast = ( opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL );
if( m_wasHighContrast != highContrast )
m_toolMgr->RunAction( ACTIONS::highContrastMode, false );
m_toolMgr->RunAction( ACTIONS::highContrastMode, true );
infoBar->Dismiss();
}

View File

@ -59,6 +59,8 @@ public:
*/
int EditPad( const TOOL_EVENT& aEvent );
bool InPadEditMode() { return m_editPad != niluuid; }
wxString GetLastPadNumber() const { return m_lastPadNumber; }
void SetLastPadNumber( const wxString& aPadNumber ) { m_lastPadNumber = aPadNumber; }

View File

@ -400,7 +400,7 @@ void PCB_GRID_HELPER::computeAnchors( BOARD_ITEM* aItem, const VECTOR2I& aRefPos
if( aFrom )
return;
const std::shared_ptr<SHAPE> eshape = aPad->GetEffectiveShape( aPad->GetLayer() );
const std::shared_ptr<SHAPE> eshape = aPad->GetEffectiveShape();
wxASSERT( eshape->Type() == SH_COMPOUND );
const std::vector<SHAPE*> shapes =