diff --git a/eeschema/dialogs/dialog_edit_component_in_lib.cpp b/eeschema/dialogs/dialog_edit_component_in_lib.cpp index ccc0e512ad..ed70a4c398 100644 --- a/eeschema/dialogs/dialog_edit_component_in_lib.cpp +++ b/eeschema/dialogs/dialog_edit_component_in_lib.cpp @@ -59,7 +59,8 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY::DIALOG_EDIT_COMPONENT_IN_LIBRARY( LIB_EDIT_FRA m_currentAlias( wxNOT_FOUND ), m_pinNameOffset( aParent, m_nameOffsetLabel, m_nameOffsetCtrl, m_nameOffsetUnits, true ), m_delayedFocusCtrl( nullptr ), - m_delayedFocusGrid( nullptr ) + m_delayedFocusGrid( nullptr ), + m_delayedFocusPage( -1 ) { m_config = Kiface().KifaceSettings(); @@ -95,6 +96,8 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY::DIALOG_EDIT_COMPONENT_IN_LIBRARY( LIB_EDIT_FRA attr->SetEditor( new GRID_CELL_URL_EDITOR( this ) ); m_aliasGrid->SetAttr( DATASHEET, FDC_VALUE, attr ); + m_SymbolNameCtrl->SetValidator( SCH_FIELD_VALIDATOR( true, VALUE ) ); + // Configure button logos m_bpAdd->SetBitmap( KiBitmap( small_plus_xpm ) ); m_bpDelete->SetBitmap( KiBitmap( trash_xpm ) ); @@ -224,6 +227,7 @@ bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::Validate() m_delayedFocusGrid = m_grid; m_delayedFocusColumn = FDC_VALUE; m_delayedFocusRow = REFERENCE; + m_delayedFocusPage = 0; return false; } @@ -243,6 +247,7 @@ bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::Validate() m_delayedFocusGrid = m_grid; m_delayedFocusColumn = FDC_NAME; m_delayedFocusRow = i; + m_delayedFocusPage = 0; return false; } @@ -346,18 +351,36 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnGridCellChanging( wxGridEvent& event ) { event.Veto(); - if( m_NoteBook->GetSelection() != 0 ) - m_NoteBook->SetSelection( 0 ); - m_delayedFocusGrid = m_grid; m_delayedFocusRow = event.GetRow(); m_delayedFocusColumn = event.GetCol(); + m_delayedFocusPage = 0; } + else if( event.GetRow() == VALUE && event.GetCol() == FDC_VALUE ) + m_SymbolNameCtrl->ChangeValue( event.GetString() ); editor->DecRef(); } +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnSymbolNameText( wxCommandEvent& event ) +{ + m_grid->SetCellValue( VALUE, FDC_VALUE, m_SymbolNameCtrl->GetValue() ); +} + + +void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnSymbolNameKillFocus( wxFocusEvent& event ) +{ + if( !m_delayedFocusCtrl && !m_SymbolNameCtrl->GetValidator()->Validate( m_SymbolNameCtrl ) ) + { + m_delayedFocusCtrl = m_SymbolNameCtrl; + m_delayedFocusPage = 0; + } + + event.Skip(); +} + + void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnAddField( wxCommandEvent& event ) { if( !m_grid->CommitPendingChanges() ) @@ -481,13 +504,13 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnAliasGridCellChanging( wxGridEvent& eve { event.Veto(); - if( m_NoteBook->GetSelection() != 1 ) - m_NoteBook->SetSelection( 1 ); - m_delayedFocusGrid = m_aliasGrid; m_delayedFocusRow = event.GetRow(); m_delayedFocusColumn = event.GetCol(); + m_delayedFocusPage = 1; } + else + updateAliasName( true, newName ); } } @@ -500,20 +523,11 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnAliasNameText( wxCommandEvent& event ) void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnAliasNameKillFocus( wxFocusEvent& event ) { - static bool inKillFocus = false; - - // If we get an error then we're going to throw up a dialog. Since we haven't yet - // finished the KillFocus event, we'll end up getting another one. Side-effects may - // include death. - if( inKillFocus ) - return; - - inKillFocus = true; - - if( !checkAliasName( m_AliasNameCtrl->GetValue() ) ) + if( !m_delayedFocusCtrl && !checkAliasName( m_AliasNameCtrl->GetValue() ) ) + { m_delayedFocusCtrl = m_AliasNameCtrl; - - inKillFocus = false; + m_delayedFocusPage = 1; + } event.Skip(); } @@ -744,6 +758,19 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnUpdateUI( wxUpdateUIEvent& event ) m_OptionPartsLocked->Enable( m_SelNumberOfUnits->GetValue() > 1 ); m_pinNameOffset.Enable( m_PinsNameInsideButt->GetValue() ); + if( m_grid->IsCellEditControlShown() ) + { + int row = m_grid->GetGridCursorRow(); + int col = m_grid->GetGridCursorCol(); + + if( row == VALUE && col == FDC_VALUE ) + { + wxGridCellEditor* editor = m_grid->GetCellEditor( row, col ); + m_SymbolNameCtrl->ChangeValue( editor->GetValue() ); + editor->DecRef(); + } + } + // Synthesize a Select event when the selection is cleared if( m_aliasListBox->GetSelection() == wxNOT_FOUND && m_currentAlias != wxNOT_FOUND ) { @@ -762,7 +789,28 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnUpdateUI( wxUpdateUIEvent& event ) adjustGridColumns( m_grid->GetRect().GetWidth() ); } - // Handle a delayed focus + // Handle a delayed focus. The delay allows us to: + // a) change focus when the error was triggered from within a killFocus handler + // b) show the correct notebook page in the background before the error dialog comes up + // when triggered from an OK or a notebook page change + + if( m_delayedFocusPage >= 0 && m_NoteBook->GetSelection() != m_delayedFocusPage ) + { + m_NoteBook->SetSelection( (unsigned) m_delayedFocusPage ); + m_delayedFocusPage = -1; + } + + if( !m_delayedErrorMessage.IsEmpty() ) + { + // We will re-enter this routine when the error dialog is displayed, so make + // sure we don't keep putting up more dialogs. + wxString msg = m_delayedErrorMessage; + m_delayedErrorMessage = wxEmptyString; + + // Do not use DisplayErrorMessage(); it screws up window order on Mac + DisplayError( nullptr, msg ); + } + if( m_delayedFocusCtrl ) { m_delayedFocusCtrl->SetFocus(); @@ -778,21 +826,12 @@ void DIALOG_EDIT_COMPONENT_IN_LIBRARY::OnUpdateUI( wxUpdateUIEvent& event ) m_delayedFocusGrid->MakeCellVisible( m_delayedFocusRow, m_delayedFocusColumn ); m_delayedFocusGrid->SetGridCursor( m_delayedFocusRow, m_delayedFocusColumn ); - if( !m_delayedErrorMessage.IsEmpty() ) - { - // We will re-enter this routine when the error dialog is displayed, so make - // sure we don't keep putting up more dialogs. - wxString msg = m_delayedErrorMessage; - m_delayedErrorMessage = wxEmptyString; - - // Do not use DisplayErrorMessage(); it screws up window order on Mac - DisplayError( nullptr, msg ); - } - m_delayedFocusGrid->EnableCellEditControl( true ); m_delayedFocusGrid->ShowCellEditControl(); m_delayedFocusGrid = nullptr; + m_delayedFocusRow = -1; + m_delayedFocusColumn = -1; } } diff --git a/eeschema/dialogs/dialog_edit_component_in_lib.h b/eeschema/dialogs/dialog_edit_component_in_lib.h index c4bc1640bb..837c72c9f4 100644 --- a/eeschema/dialogs/dialog_edit_component_in_lib.h +++ b/eeschema/dialogs/dialog_edit_component_in_lib.h @@ -57,10 +57,12 @@ public: UNIT_BINDER m_pinNameOffset; wxControl* m_delayedFocusCtrl; - wxString m_delayedErrorMessage; WX_GRID* m_delayedFocusGrid; int m_delayedFocusRow; int m_delayedFocusColumn; + int m_delayedFocusPage; + wxString m_delayedErrorMessage; + wxString m_shownColumns; bool TransferDataToWindow() override; @@ -80,6 +82,8 @@ private: void OnDeleteField( wxCommandEvent& event ) override; void OnMoveUp( wxCommandEvent& event ) override; void OnMoveDown( wxCommandEvent& event ) override; + void OnSymbolNameKillFocus( wxFocusEvent& event ) override; + void OnSymbolNameText( wxCommandEvent& event ) override; void OnSelectAlias( wxCommandEvent& event ) override; void OnAddAlias( wxCommandEvent& event ) override; void OnDeleteAlias( wxCommandEvent& event ) override; diff --git a/eeschema/dialogs/dialog_edit_component_in_lib_base.cpp b/eeschema/dialogs/dialog_edit_component_in_lib_base.cpp index b699619c4b..6815170679 100644 --- a/eeschema/dialogs/dialog_edit_component_in_lib_base.cpp +++ b/eeschema/dialogs/dialog_edit_component_in_lib_base.cpp @@ -29,7 +29,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx wxStaticBoxSizer* sbSizer4; sbSizer4 = new wxStaticBoxSizer( new wxStaticBox( m_PanelBasic, wxID_ANY, _("Fields") ), wxVERTICAL ); - m_grid = new WX_GRID( sbSizer4->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER ); + m_grid = new WX_GRID( sbSizer4->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); // Grid m_grid->CreateGrid( 4, 11 ); @@ -126,7 +126,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx fgSizerFPID->Add( staticNameLabel, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); m_SymbolNameCtrl = new wxTextCtrl( m_PanelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizerFPID->Add( m_SymbolNameCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + fgSizerFPID->Add( m_SymbolNameCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); wxStaticText* staticDescriptionLabel; staticDescriptionLabel = new wxStaticText( m_PanelBasic, wxID_ANY, _("Description:"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -134,7 +134,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx fgSizerFPID->Add( staticDescriptionLabel, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); m_DescCtrl = new wxTextCtrl( m_PanelBasic, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); - fgSizerFPID->Add( m_DescCtrl, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); + fgSizerFPID->Add( m_DescCtrl, 0, wxEXPAND|wxRIGHT|wxLEFT, 5 ); staticKeywordsLabel = new wxStaticText( m_PanelBasic, wxID_ANY, _("Keywords:"), wxDefaultPosition, wxDefaultSize, 0 ); staticKeywordsLabel->Wrap( -1 ); @@ -301,7 +301,7 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx m_staticText12->Wrap( -1 ); bRightBoxSizerPanelAlias->Add( m_staticText12, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); - m_aliasGrid = new WX_GRID( m_PanelAlias, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER ); + m_aliasGrid = new WX_GRID( m_PanelAlias, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 ); // Grid m_aliasGrid->CreateGrid( 4, 2 ); @@ -452,6 +452,8 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE( wx m_bpMoveUp->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnMoveUp ), NULL, this ); m_bpMoveDown->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnMoveDown ), NULL, this ); m_bpDelete->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnDeleteField ), NULL, this ); + m_SymbolNameCtrl->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnSymbolNameKillFocus ), NULL, this ); + m_SymbolNameCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnSymbolNameText ), NULL, this ); m_aliasListBox->Connect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnSelectAlias ), NULL, this ); m_addAliasButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnAddAlias ), NULL, this ); m_deleteAliasButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnDeleteAlias ), NULL, this ); @@ -472,6 +474,8 @@ DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::~DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE() m_bpMoveUp->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnMoveUp ), NULL, this ); m_bpMoveDown->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnMoveDown ), NULL, this ); m_bpDelete->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnDeleteField ), NULL, this ); + m_SymbolNameCtrl->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnSymbolNameKillFocus ), NULL, this ); + m_SymbolNameCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnSymbolNameText ), NULL, this ); m_aliasListBox->Disconnect( wxEVT_COMMAND_LISTBOX_SELECTED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnSelectAlias ), NULL, this ); m_addAliasButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnAddAlias ), NULL, this ); m_deleteAliasButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE::OnDeleteAlias ), NULL, this ); diff --git a/eeschema/dialogs/dialog_edit_component_in_lib_base.fbp b/eeschema/dialogs/dialog_edit_component_in_lib_base.fbp index 13fe6ced40..2d5aab319b 100644 --- a/eeschema/dialogs/dialog_edit_component_in_lib_base.fbp +++ b/eeschema/dialogs/dialog_edit_component_in_lib_base.fbp @@ -365,7 +365,7 @@ - wxSIMPLE_BORDER + @@ -818,20 +818,20 @@ - + 5 wxEXPAND|wxRIGHT|wxLEFT 0 - + bSizerMidBasicPanel wxVERTICAL none - + 5 wxEXPAND|wxTOP|wxBOTTOM 1 - + 2 wxBOTH 1 @@ -928,7 +928,7 @@ 5 - wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + wxEXPAND|wxRIGHT|wxLEFT 0 1 @@ -993,7 +993,7 @@ - + OnSymbolNameKillFocus @@ -1010,7 +1010,7 @@ - + OnSymbolNameText @@ -1102,7 +1102,7 @@ 5 - wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT + wxEXPAND|wxRIGHT|wxLEFT 0 1 @@ -3082,7 +3082,7 @@ - wxSIMPLE_BORDER + diff --git a/eeschema/dialogs/dialog_edit_component_in_lib_base.h b/eeschema/dialogs/dialog_edit_component_in_lib_base.h index 7e3129b1eb..6b3c4d4707 100644 --- a/eeschema/dialogs/dialog_edit_component_in_lib_base.h +++ b/eeschema/dialogs/dialog_edit_component_in_lib_base.h @@ -97,6 +97,8 @@ class DIALOG_EDIT_COMPONENT_IN_LIBRARY_BASE : public DIALOG_SHIM virtual void OnMoveUp( wxCommandEvent& event ) { event.Skip(); } virtual void OnMoveDown( wxCommandEvent& event ) { event.Skip(); } virtual void OnDeleteField( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSymbolNameKillFocus( wxFocusEvent& event ) { event.Skip(); } + virtual void OnSymbolNameText( wxCommandEvent& event ) { event.Skip(); } virtual void OnSelectAlias( wxCommandEvent& event ) { event.Skip(); } virtual void OnAddAlias( wxCommandEvent& event ) { event.Skip(); } virtual void OnDeleteAlias( wxCommandEvent& event ) { event.Skip(); } diff --git a/eeschema/fields_grid_table.cpp b/eeschema/fields_grid_table.cpp index 448fd4c621..2ec01f028b 100644 --- a/eeschema/fields_grid_table.cpp +++ b/eeschema/fields_grid_table.cpp @@ -51,7 +51,8 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* a m_userUnits( aDialog->GetUserUnits() ), m_part( aPart ), m_fieldNameValidator( aFrame->IsType( FRAME_SCH_LIB_EDITOR ), FIELD_NAME ), - m_referenceValidator( aFrame->IsType( FRAME_SCH_LIB_EDITOR ), REFERENCE ) + m_referenceValidator( aFrame->IsType( FRAME_SCH_LIB_EDITOR ), REFERENCE ), + m_valueValidator( aFrame->IsType( FRAME_SCH_LIB_EDITOR ), VALUE ) { // Build the various grid cell attributes. @@ -68,6 +69,11 @@ FIELDS_GRID_TABLE::FIELDS_GRID_TABLE( DIALOG_SHIM* aDialog, SCH_BASE_FRAME* a referenceEditor->SetValidator( m_referenceValidator ); m_referenceAttr->SetEditor( referenceEditor ); + m_valueAttr = new wxGridCellAttr; + GRID_CELL_TEXT_EDITOR* valueEditor = new GRID_CELL_TEXT_EDITOR(); + valueEditor->SetValidator( m_valueValidator ); + m_valueAttr->SetEditor( valueEditor ); + m_footprintAttr = new wxGridCellAttr; m_footprintAttr->SetEditor( new GRID_CELL_FOOTPRINT_EDITOR( aDialog ) ); @@ -111,6 +117,7 @@ FIELDS_GRID_TABLE::~FIELDS_GRID_TABLE() m_fieldNameAttr->DecRef(); m_boolAttr->DecRef(); m_referenceAttr->DecRef(); + m_valueAttr->DecRef(); m_footprintAttr->DecRef(); m_urlAttr->DecRef(); m_vAlignAttr->DecRef(); @@ -199,21 +206,17 @@ wxGridCellAttr* FIELDS_GRID_TABLE::GetAttr( int aRow, int aCol, wxGridCellAtt } else if( aRow == VALUE ) { - if( m_frame->IsType( FRAME_SCH_LIB_EDITOR ) ) + // For power symbols, the value is not editable, because value and pin name must + // be the same and can be edited only in library editor. + if( m_part && m_part->IsPower() && ! m_frame->IsType( FRAME_SCH_LIB_EDITOR ) ) { - // This field is the lib name and the default value when loading this component - // in schematic. The value is now not editable here (in this dialog) because - // changing it is equivalent to create a new component or alias. This is handled - // in libedit, not in this dialog. m_readOnlyAttr->IncRef(); return m_readOnlyAttr; } - else if( m_part && m_part->IsPower() ) + else { - // For power symbols, the value is not editable, because value and pin name must - // be the same and can be edited only in library editor. - m_readOnlyAttr->IncRef(); - return m_readOnlyAttr; + m_valueAttr->IncRef(); + return m_valueAttr; } } else if( aRow == FOOTPRINT ) diff --git a/eeschema/fields_grid_table.h b/eeschema/fields_grid_table.h index 43cdf56b1e..7c56615047 100644 --- a/eeschema/fields_grid_table.h +++ b/eeschema/fields_grid_table.h @@ -101,10 +101,12 @@ private: SCH_FIELD_VALIDATOR m_fieldNameValidator; SCH_FIELD_VALIDATOR m_referenceValidator; + SCH_FIELD_VALIDATOR m_valueValidator; wxGridCellAttr* m_readOnlyAttr; wxGridCellAttr* m_fieldNameAttr; wxGridCellAttr* m_referenceAttr; + wxGridCellAttr* m_valueAttr; wxGridCellAttr* m_footprintAttr; wxGridCellAttr* m_urlAttr; wxGridCellAttr* m_boolAttr; diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp index 97928ac33c..643825a77e 100644 --- a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp +++ b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.cpp @@ -72,9 +72,11 @@ DIALOG_FOOTPRINT_FP_EDITOR::DIALOG_FOOTPRINT_FP_EDITOR( FOOTPRINT_EDIT_FRAME* aP m_texts = new TEXT_MOD_GRID_TABLE( m_units, m_frame ); m_delayedErrorMessage = wxEmptyString; + m_delayedFocusCtrl = nullptr; m_delayedFocusGrid = nullptr; m_delayedFocusRow = -1; m_delayedFocusColumn = -1; + m_delayedFocusPage = -1; // Give an icon wxIcon icon; @@ -119,13 +121,15 @@ DIALOG_FOOTPRINT_FP_EDITOR::DIALOG_FOOTPRINT_FP_EDITOR( FOOTPRINT_EDIT_FRAME* aP m_staticTextInfoValPos->SetFont( infoFont ); m_staticTextInfoCopper->SetFont( infoFont ); - m_NoteBook->SetSelection( m_page ); + if( m_page >= 0 ) + m_NoteBook->SetSelection( (unsigned) m_page ); if( m_page == 0 ) { m_delayedFocusGrid = m_itemsGrid; m_delayedFocusRow = 0; m_delayedFocusColumn = 0; + m_delayedFocusPage = 0; } else if ( m_page == 1 ) SetInitialFocus( m_NetClearanceCtrl ); @@ -134,6 +138,7 @@ DIALOG_FOOTPRINT_FP_EDITOR::DIALOG_FOOTPRINT_FP_EDITOR( FOOTPRINT_EDIT_FRAME* aP m_delayedFocusGrid = m_modelsGrid; m_delayedFocusRow = 0; m_delayedFocusColumn = 0; + m_delayedFocusPage = 2; } m_sdbSizerStdButtonsOK->SetDefault(); @@ -145,6 +150,9 @@ DIALOG_FOOTPRINT_FP_EDITOR::DIALOG_FOOTPRINT_FP_EDITOR( FOOTPRINT_EDIT_FRAME* aP m_button3DShapeBrowse->SetBitmap( KiBitmap( folder_xpm ) ); m_button3DShapeRemove->SetBitmap( KiBitmap( trash_xpm ) ); + // wxFormBuilder doesn't include this event... + m_itemsGrid->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_FOOTPRINT_FP_EDITOR::OnGridCellChanging ), NULL, this ); + FinishDialogSettings(); } @@ -156,6 +164,8 @@ DIALOG_FOOTPRINT_FP_EDITOR::~DIALOG_FOOTPRINT_FP_EDITOR() // Prevents crash bug in wxGrid's d'tor m_itemsGrid->DestroyTable( m_texts ); + m_itemsGrid->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_FOOTPRINT_FP_EDITOR::OnGridCellChanging ), NULL, this ); + // Delete the GRID_TRICKS. m_itemsGrid->PopEventHandler( true ); m_modelsGrid->PopEventHandler( true ); @@ -177,7 +187,7 @@ bool DIALOG_FOOTPRINT_FP_EDITOR::TransferDataToWindow() LIB_ID fpID = m_footprint->GetFPID(); wxString footprintName = fpID.GetLibItemName(); - m_FootprintNameCtrl->SetValue( footprintName ); + m_FootprintNameCtrl->ChangeValue( footprintName ); m_DocCtrl->SetValue( m_footprint->GetDescription() ); m_KeywordCtrl->SetValue( m_footprint->GetKeywords() ); @@ -330,6 +340,7 @@ void DIALOG_FOOTPRINT_FP_EDITOR::On3DModelCellChanged( wxGridEvent& aEvent ) m_delayedFocusGrid = m_modelsGrid; m_delayedFocusRow = aEvent.GetRow(); m_delayedFocusColumn = aEvent.GetCol(); + m_delayedFocusPage = 2; aEvent.Veto(); } @@ -459,6 +470,23 @@ void DIALOG_FOOTPRINT_FP_EDITOR::OnAdd3DRow( wxCommandEvent& ) } +bool DIALOG_FOOTPRINT_FP_EDITOR::checkFootprintName( const wxString& aFootprintName ) +{ + if( aFootprintName.IsEmpty() || !MODULE::IsLibNameValid( aFootprintName ) ) + { + if( aFootprintName.IsEmpty() ) + m_delayedErrorMessage = _( "Footprint must have a name." ); + else + m_delayedErrorMessage.Printf( _( "Footprint name may not contain \"%s\"." ), + MODULE::StringLibNameInvalidChars( true ) ); + + return false; + } + + return true; +} + + bool DIALOG_FOOTPRINT_FP_EDITOR::Validate() { if( !m_itemsGrid->CommitPendingChanges() ) @@ -470,18 +498,13 @@ bool DIALOG_FOOTPRINT_FP_EDITOR::Validate() // First, test for invalid chars in module name wxString footprintName = m_FootprintNameCtrl->GetValue(); - if( footprintName.IsEmpty() || !MODULE::IsLibNameValid( footprintName ) ) + if( !checkFootprintName( footprintName ) ) { - wxString msg; - if( footprintName.IsEmpty() ) - msg = _( "Footprint must have a name." ); - else - msg.Printf( _( "Footprint name may not contain \"%s\"." ), - MODULE::StringLibNameInvalidChars( true ) ); + if( m_NoteBook->GetSelection() != 0 ) + m_NoteBook->SetSelection( 0 ); - DisplayError( nullptr, msg ); - - m_FootprintNameCtrl->SetFocus(); + m_delayedFocusCtrl = m_FootprintNameCtrl; + m_delayedFocusPage = 0; return false; } @@ -607,6 +630,59 @@ bool DIALOG_FOOTPRINT_FP_EDITOR::TransferDataFromWindow() } +static bool footprintIsFromBoard( MODULE* aFootprint ) +{ + return aFootprint->GetLink() != 0; +} + + +void DIALOG_FOOTPRINT_FP_EDITOR::OnGridCellChanging( wxGridEvent& event ) +{ + if( event.GetRow() == 1 && event.GetCol() == TMC_TEXT ) + { + if( !checkFootprintName( event.GetString() ) ) + { + event.Veto(); + + if( m_NoteBook->GetSelection() != 0 ) + m_NoteBook->SetSelection( 0 ); + + m_delayedFocusGrid = m_itemsGrid; + m_delayedFocusRow = event.GetRow(); + m_delayedFocusColumn = event.GetCol(); + m_delayedFocusPage = 0; + } + else if( !footprintIsFromBoard( m_footprint ) ) + { + // Keep Name and Value of footprints in library in sync + m_FootprintNameCtrl->ChangeValue( event.GetString() ); + } + } +} + + +void DIALOG_FOOTPRINT_FP_EDITOR::OnFootprintNameText( wxCommandEvent& event ) +{ + if( !footprintIsFromBoard( m_footprint ) ) + { + // Keep Name and Value of footprints in library in sync + m_itemsGrid->SetCellValue( 1, TMC_TEXT, m_FootprintNameCtrl->GetValue() ); + } +} + + +void DIALOG_FOOTPRINT_FP_EDITOR::OnFootprintNameKillFocus( wxFocusEvent& event ) +{ + if( !m_delayedFocusCtrl && !checkFootprintName( m_FootprintNameCtrl->GetValue() ) ) + { + m_delayedFocusCtrl = m_FootprintNameCtrl; + m_delayedFocusPage = 0; + } + + event.Skip(); +} + + void DIALOG_FOOTPRINT_FP_EDITOR::OnAddField( wxCommandEvent& event ) { if( !m_itemsGrid->CommitPendingChanges() ) @@ -698,23 +774,52 @@ void DIALOG_FOOTPRINT_FP_EDITOR::OnUpdateUI( wxUpdateUIEvent& event ) if( !m_itemsGrid->IsCellEditControlShown() && !m_modelsGrid->IsCellEditControlShown() ) adjustGridColumns( m_itemsGrid->GetRect().GetWidth()); - // Handle a grid error. This is delayed to OnUpdateUI so that we can change focus - // even when the original validation was triggered from a killFocus event, and so - // that the corresponding notebook page can be shown in the background when triggered - // from an OK. - if( m_delayedFocusRow >= 0 ) + if( m_itemsGrid->IsCellEditControlShown() ) { - if( !m_delayedErrorMessage.IsEmpty() ) + int row = m_itemsGrid->GetGridCursorRow(); + int col = m_itemsGrid->GetGridCursorCol(); + + if( row == 1 && col == TMC_TEXT ) { - // We will re-enter this routine when the error dialog is displayed, so make - // sure we don't keep putting up more dialogs. - wxString msg = m_delayedErrorMessage; - m_delayedErrorMessage = wxEmptyString; - - // Do not use DisplayErrorMessage(); it screws up window order on Mac - DisplayError( nullptr, msg ); + wxGridCellEditor* editor = m_itemsGrid->GetCellEditor( row, col ); + m_FootprintNameCtrl->ChangeValue( editor->GetValue() ); + editor->DecRef(); } + } + // Handle a delayed focus. The delay allows us to: + // a) change focus when the error was triggered from within a killFocus handler + // b) show the correct notebook page in the background before the error dialog comes up + // when triggered from an OK or a notebook page change + + if( m_delayedFocusPage >= 0 && m_NoteBook->GetSelection() != m_delayedFocusPage ) + { + m_NoteBook->SetSelection( (unsigned) m_delayedFocusPage ); + m_delayedFocusPage = -1; + } + + if( !m_delayedErrorMessage.IsEmpty() ) + { + // We will re-enter this routine when the error dialog is displayed, so make + // sure we don't keep putting up more dialogs. + wxString msg = m_delayedErrorMessage; + m_delayedErrorMessage = wxEmptyString; + + // Do not use DisplayErrorMessage(); it screws up window order on Mac + DisplayError( nullptr, msg ); + } + + if( m_delayedFocusCtrl ) + { + m_delayedFocusCtrl->SetFocus(); + + if( dynamic_cast( m_delayedFocusCtrl ) ) + dynamic_cast( m_delayedFocusCtrl )->SelectAll(); + + m_delayedFocusCtrl = nullptr; + } + else if( m_delayedFocusGrid ) + { m_delayedFocusGrid->SetFocus(); m_delayedFocusGrid->MakeCellVisible( m_delayedFocusRow, m_delayedFocusColumn ); m_delayedFocusGrid->SetGridCursor( m_delayedFocusRow, m_delayedFocusColumn ); @@ -722,6 +827,7 @@ void DIALOG_FOOTPRINT_FP_EDITOR::OnUpdateUI( wxUpdateUIEvent& event ) m_delayedFocusGrid->EnableCellEditControl( true ); m_delayedFocusGrid->ShowCellEditControl(); + m_delayedFocusGrid = nullptr; m_delayedFocusRow = -1; m_delayedFocusColumn = -1; } diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.h b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.h index 781813399b..8cf0207094 100644 --- a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.h +++ b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor.h @@ -25,14 +25,16 @@ #ifndef DIALOG_EDIT_FOOTPRINT_FOR_MODEDIT_H #define DIALOG_EDIT_FOOTPRINT_FOR_MODEDIT_H -// Include the wxFormBuider header base: #include -#include #include #include +#include +#include + class PANEL_PREV_3D; -class MODULE; +class FOOTPRINT_EDIT_FRAME; + class DIALOG_FOOTPRINT_FP_EDITOR : public DIALOG_FOOTPRINT_FP_EDITOR_BASE { @@ -52,15 +54,17 @@ private: std::vector m_shapes3D_list; PANEL_PREV_3D* m_PreviewPane; - wxString m_delayedErrorMessage; - wxGrid* m_delayedFocusGrid; + wxControl* m_delayedFocusCtrl; + int m_delayedFocusPage; + + WX_GRID* m_delayedFocusGrid; int m_delayedFocusRow; int m_delayedFocusColumn; + wxString m_delayedErrorMessage; bool m_inSelect; public: - // Constructor and destructor DIALOG_FOOTPRINT_FP_EDITOR( FOOTPRINT_EDIT_FRAME* aParent, MODULE* aModule ); ~DIALOG_FOOTPRINT_FP_EDITOR() override; @@ -79,10 +83,15 @@ private: void OnAdd3DRow( wxCommandEvent& event ) override; void Cfg3DPath( wxCommandEvent& event ) override; void OnGridSize( wxSizeEvent& event ) override; + void OnFootprintNameKillFocus( wxFocusEvent& event ) override; + void OnFootprintNameText( wxCommandEvent& event ) override; + void OnGridCellChanging( wxGridEvent& event ); void OnAddField( wxCommandEvent& event ) override; void OnDeleteField( wxCommandEvent& event ) override; void OnUpdateUI( wxUpdateUIEvent& event ) override; + bool checkFootprintName( const wxString& aFootprintName ); + void select3DModel( int aModelIdx ); void adjustGridColumns( int aWidth ); diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.cpp b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.cpp index 6627af0284..c03f00c4ab 100644 --- a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.cpp +++ b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.cpp @@ -26,7 +26,7 @@ DIALOG_FOOTPRINT_FP_EDITOR_BASE::DIALOG_FOOTPRINT_FP_EDITOR_BASE( wxWindow* pare wxStaticBoxSizer* sbSizerTexts; sbSizerTexts = new wxStaticBoxSizer( new wxStaticBox( m_PanelGeneral, wxID_ANY, wxEmptyString ), wxVERTICAL ); - m_itemsGrid = new WX_GRID( sbSizerTexts->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), wxSIMPLE_BORDER ); + m_itemsGrid = new WX_GRID( sbSizerTexts->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxSize( -1,-1 ), 0 ); // Grid m_itemsGrid->CreateGrid( 2, 11 ); @@ -409,6 +409,8 @@ DIALOG_FOOTPRINT_FP_EDITOR_BASE::DIALOG_FOOTPRINT_FP_EDITOR_BASE( wxWindow* pare m_itemsGrid->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnGridSize ), NULL, this ); m_bpAdd->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnAddField ), NULL, this ); m_bpDelete->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnDeleteField ), NULL, this ); + m_FootprintNameCtrl->Connect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnFootprintNameKillFocus ), NULL, this ); + m_FootprintNameCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnFootprintNameText ), NULL, this ); m_modelsGrid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::On3DModelCellChanged ), NULL, this ); m_modelsGrid->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::On3DModelSelected ), NULL, this ); m_button3DShapeAdd->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnAdd3DRow ), NULL, this ); @@ -425,6 +427,8 @@ DIALOG_FOOTPRINT_FP_EDITOR_BASE::~DIALOG_FOOTPRINT_FP_EDITOR_BASE() m_itemsGrid->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnGridSize ), NULL, this ); m_bpAdd->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnAddField ), NULL, this ); m_bpDelete->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnDeleteField ), NULL, this ); + m_FootprintNameCtrl->Disconnect( wxEVT_KILL_FOCUS, wxFocusEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnFootprintNameKillFocus ), NULL, this ); + m_FootprintNameCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnFootprintNameText ), NULL, this ); m_modelsGrid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::On3DModelCellChanged ), NULL, this ); m_modelsGrid->Disconnect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::On3DModelSelected ), NULL, this ); m_button3DShapeAdd->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_FOOTPRINT_FP_EDITOR_BASE::OnAdd3DRow ), NULL, this ); diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.fbp b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.fbp index b47b1ece47..4a08f2c2f8 100644 --- a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.fbp +++ b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.fbp @@ -356,7 +356,7 @@ - wxSIMPLE_BORDER + @@ -789,7 +789,7 @@ - + OnFootprintNameKillFocus @@ -806,7 +806,7 @@ - + OnFootprintNameText diff --git a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.h b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.h index aeab93a8e0..d950675dd4 100644 --- a/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.h +++ b/pcbnew/dialogs/dialog_edit_footprint_for_fp_editor_base.h @@ -105,6 +105,8 @@ class DIALOG_FOOTPRINT_FP_EDITOR_BASE : public DIALOG_SHIM virtual void OnGridSize( wxSizeEvent& event ) { event.Skip(); } virtual void OnAddField( wxCommandEvent& event ) { event.Skip(); } virtual void OnDeleteField( wxCommandEvent& event ) { event.Skip(); } + virtual void OnFootprintNameKillFocus( wxFocusEvent& event ) { event.Skip(); } + virtual void OnFootprintNameText( wxCommandEvent& event ) { event.Skip(); } virtual void On3DModelCellChanged( wxGridEvent& event ) { event.Skip(); } virtual void On3DModelSelected( wxGridEvent& event ) { event.Skip(); } virtual void OnAdd3DRow( wxCommandEvent& event ) { event.Skip(); } diff --git a/pcbnew/footprint_edit_frame.h b/pcbnew/footprint_edit_frame.h index 06014384a3..24ef91dfa8 100644 --- a/pcbnew/footprint_edit_frame.h +++ b/pcbnew/footprint_edit_frame.h @@ -410,7 +410,7 @@ public: * Function DeleteModuleFromLibrary * deletes the given module from its library. */ - bool DeleteModuleFromLibrary( MODULE* aModule ); + bool DeleteModuleFromLibrary( const LIB_ID& aFPID, bool aConfirm ); /** * Function IsElementVisible @@ -550,6 +550,11 @@ protected: private: + /** + * Run the Footprint Properties dialog and handle changes made in it. + */ + void editFootprintProperties( MODULE* aFootprint ); + /** * Function moveExact * Move the selected item exactly, popping up a dialog to allow the diff --git a/pcbnew/footprint_editor_onclick.cpp b/pcbnew/footprint_editor_onclick.cpp index 0ec33378dc..1cf90d2d21 100644 --- a/pcbnew/footprint_editor_onclick.cpp +++ b/pcbnew/footprint_editor_onclick.cpp @@ -524,13 +524,9 @@ void FOOTPRINT_EDIT_FRAME::OnEditItemRequest( wxDC* aDC, BOARD_ITEM* aItem ) break; case PCB_MODULE_T: - { - DIALOG_FOOTPRINT_FP_EDITOR dialog( this, static_cast( aItem ) ); - dialog.ShowModal(); - GetScreen()->GetCurItem()->ClearFlags(); + editFootprintProperties( (MODULE*) aItem ); m_canvas->MoveCursorToCrossHair(); m_canvas->Refresh(); - } break; case PCB_MODULE_TEXT_T: diff --git a/pcbnew/footprint_editor_utils.cpp b/pcbnew/footprint_editor_utils.cpp index afb589a19f..4e5dd4240d 100644 --- a/pcbnew/footprint_editor_utils.cpp +++ b/pcbnew/footprint_editor_utils.cpp @@ -276,7 +276,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_MODEDIT_DELETE_PART: - if( DeleteModuleFromLibrary( LoadFootprint( getTargetFPId() ) ) ) + if( DeleteModuleFromLibrary( getTargetFPId(), true ) ) { if( getTargetFPId() == GetCurrentFPId() ) Clear_Pcb( false ); @@ -556,11 +556,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) if( GetBoard()->m_Modules ) { SetCurItem( GetBoard()->m_Modules ); - - DIALOG_FOOTPRINT_FP_EDITOR dialog( this, (MODULE*) GetScreen()->GetCurItem() ); - - dialog.ShowModal(); - GetScreen()->GetCurItem()->ClearFlags(); + editFootprintProperties( (MODULE*) GetScreen()->GetCurItem() ); m_canvas->Refresh(); } @@ -585,13 +581,9 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_PCB_EDIT_MODULE_PRMS: - { - DIALOG_FOOTPRINT_FP_EDITOR dialog( this, (MODULE*) GetScreen()->GetCurItem() ); - dialog.ShowModal(); - GetScreen()->GetCurItem()->ClearFlags(); - m_canvas->MoveCursorToCrossHair(); - m_canvas->Refresh(); - } + editFootprintProperties( (MODULE*) GetScreen()->GetCurItem() ); + m_canvas->MoveCursorToCrossHair(); + m_canvas->Refresh(); break; case ID_POPUP_PCB_MOVE_PAD_REQUEST: @@ -775,6 +767,32 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) } +void FOOTPRINT_EDIT_FRAME::editFootprintProperties( MODULE* aModule ) +{ + LIB_ID oldFPID = aModule->GetFPID(); + + DIALOG_FOOTPRINT_FP_EDITOR dialog( this, aModule ); + dialog.ShowModal(); + + if( aModule->GetValue() != oldFPID.GetLibItemName() ) + { + if( aModule->GetLink() ) + { + SaveFootprintToBoard( false ); + } + else + { + DeleteModuleFromLibrary( oldFPID, false ); + + SaveFootprint( aModule ); + SyncLibraryTree( true ); + } + } + + GetScreen()->GetCurItem()->ClearFlags(); +} + + void FOOTPRINT_EDIT_FRAME::moveExact() { wxPoint translation; diff --git a/pcbnew/footprint_libraries_utils.cpp b/pcbnew/footprint_libraries_utils.cpp index b1d7fa3fc0..fccf8a71bc 100644 --- a/pcbnew/footprint_libraries_utils.cpp +++ b/pcbnew/footprint_libraries_utils.cpp @@ -524,18 +524,13 @@ wxString PCB_BASE_EDIT_FRAME::CreateNewLibrary(const wxString& aLibName ) } -bool FOOTPRINT_EDIT_FRAME::DeleteModuleFromLibrary( MODULE* aModule ) +bool FOOTPRINT_EDIT_FRAME::DeleteModuleFromLibrary( const LIB_ID& aFPID, bool aConfirm ) { - if( !aModule ) + if( !aFPID.IsValid() ) return false; - LIB_ID fpid = aModule->GetFPID(); - - if( !fpid.IsValid() ) - return false; - - wxString nickname = fpid.GetLibNickname(); - wxString fpname = fpid.GetLibItemName(); + wxString nickname = aFPID.GetLibNickname(); + wxString fpname = aFPID.GetLibItemName(); // Legacy libraries are readable, but modifying legacy format is not allowed // So prompt the user if he try to delete a footprint from a legacy lib @@ -557,7 +552,7 @@ bool FOOTPRINT_EDIT_FRAME::DeleteModuleFromLibrary( MODULE* aModule ) // Confirmation wxString msg = wxString::Format( FMT_OK_DELETE, fpname.GetData(), nickname.GetData() ); - if( !IsOK( this, msg ) ) + if( aConfirm && !IsOK( this, msg ) ) return false; try diff --git a/pcbnew/fp_tree_synchronizing_adapter.cpp b/pcbnew/fp_tree_synchronizing_adapter.cpp index 59590f953b..0854e03d6e 100644 --- a/pcbnew/fp_tree_synchronizing_adapter.cpp +++ b/pcbnew/fp_tree_synchronizing_adapter.cpp @@ -186,6 +186,10 @@ bool FP_TREE_SYNCHRONIZING_ADAPTER::GetAttr( wxDataViewItem const& aItem, unsign if( aCol != 0 ) return false; + // don't link to a board footprint, even if the FPIDs match + if( m_frame->IsCurrentFPFromBoard() ) + return false; + auto node = ToNode( aItem ); wxCHECK( node, false );