Symbol editor: fix symbol save as menu enable logic issue.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/7451
This commit is contained in:
Wayne Stambaugh 2021-02-07 18:21:38 -05:00
parent c93b012627
commit 356c2d3508
4 changed files with 40 additions and 27 deletions

View File

@ -355,30 +355,37 @@ void SYMBOL_EDIT_FRAME::setupUIConditions()
auto libSelectedCondition =
[this] ( const SELECTION& sel )
{
return !getTargetLibId().GetLibNickname().empty();
return !GetTargetLibId().GetLibNickname().empty();
};
auto canEditLib =
[this] ( const SELECTION& sel )
{
const wxString libName = getTargetLibId().GetLibNickname();
[this] ( const SELECTION& sel )
{
const wxString libName = GetTargetLibId().GetLibNickname();
return !libName.empty() && m_libMgr->LibraryExists( libName )
&& !m_libMgr->IsLibraryReadOnly( libName );
};
return !libName.empty() && m_libMgr->LibraryExists( libName )
&& !m_libMgr->IsLibraryReadOnly( libName );
};
auto canEditProperties =
[this] ( const SELECTION& sel )
{
return m_my_part && ( !IsSymbolFromLegacyLibrary() || IsSymbolFromSchematic() );
};
[this] ( const SELECTION& sel )
{
return m_my_part && ( !IsSymbolFromLegacyLibrary() || IsSymbolFromSchematic() );
};
auto saveSymbolAsCondition =
[ this ]( const SELECTION& aSel )
{
LIB_ID sel = GetTargetLibId();
return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
};
mgr->SetConditions( ACTIONS::saveAll,
ENABLE( schematicModifiedCond || libModifiedCondition ) );
mgr->SetConditions( ACTIONS::save,
ENABLE( schematicModifiedCond || libModifiedCondition ) );
mgr->SetConditions( EE_ACTIONS::saveLibraryAs, ENABLE( libSelectedCondition ) );
mgr->SetConditions( EE_ACTIONS::saveSymbolAs, ENABLE( haveSymbolCond ) );
mgr->SetConditions( EE_ACTIONS::saveSymbolAs, ENABLE( saveSymbolAsCondition ) );
mgr->SetConditions( EE_ACTIONS::newSymbol, ENABLE( !libSelectedCondition || canEditLib ) );
mgr->SetConditions( EE_ACTIONS::importSymbol, ENABLE( !libSelectedCondition || canEditLib ) );
@ -884,7 +891,7 @@ LIB_PART* SYMBOL_EDIT_FRAME::getTargetPart() const
}
LIB_ID SYMBOL_EDIT_FRAME::getTargetLibId() const
LIB_ID SYMBOL_EDIT_FRAME::GetTargetLibId() const
{
LIB_ID id = GetTreeLIBID();
@ -903,7 +910,7 @@ LIB_TREE_NODE* SYMBOL_EDIT_FRAME::GetCurrentTreeNode() const
wxString SYMBOL_EDIT_FRAME::getTargetLib() const
{
return getTargetLibId().GetLibNickname();
return GetTargetLibId().GetLibNickname();
}
@ -972,7 +979,7 @@ void SYMBOL_EDIT_FRAME::SyncLibraries( bool aShowProgress, const wxString& aForc
void SYMBOL_EDIT_FRAME::RegenerateLibraryTree()
{
LIB_ID target = getTargetLibId();
LIB_ID target = GetTargetLibId();
m_treePane->GetLibTree()->Regenerate( true );

View File

@ -350,6 +350,10 @@ public:
///< Restore the empty editor screen, without any part or library selected.
void emptyScreen();
///< Return either the part selected in the symbol tree, if context menu is active or the
///< currently modified part.
LIB_ID GetTargetLibId() const;
protected:
void setupUIConditions() override;
@ -433,10 +437,6 @@ private:
///< Return currently edited part.
LIB_PART* getTargetPart() const;
///< Return either the part selected in the symbol tree, if context menu is active or the
///< currently modified part.
LIB_ID getTargetLibId() const;
///< Return either the library selected in the symbol tree, if context menu is active or
///< the library that is currently modified.
wxString getTargetLib() const;

View File

@ -523,9 +523,9 @@ void SYMBOL_EDIT_FRAME::Save()
saveCurrentPart();
}
}
else if( !getTargetLibId().GetLibNickname().empty() )
else if( !GetTargetLibId().GetLibNickname().empty() )
{
LIB_ID libId = getTargetLibId();
LIB_ID libId = GetTargetLibId();
const wxString& libName = libId.GetLibNickname();
if( m_libMgr->IsLibraryReadOnly( libName ) )
@ -549,9 +549,9 @@ void SYMBOL_EDIT_FRAME::Save()
void SYMBOL_EDIT_FRAME::SaveLibraryAs()
{
wxCHECK( !getTargetLibId().GetLibNickname().empty(), /* void */ );
wxCHECK( !GetTargetLibId().GetLibNickname().empty(), /* void */ );
const wxString& libName = getTargetLibId().GetLibNickname();
const wxString& libName = GetTargetLibId().GetLibNickname();
saveLibrary( libName, true );
m_treePane->GetLibTree()->RefreshLibTree();
@ -560,7 +560,7 @@ void SYMBOL_EDIT_FRAME::SaveLibraryAs()
void SYMBOL_EDIT_FRAME::SaveSymbolAs()
{
wxCHECK( getTargetLibId().IsValid(), /* void */ );
wxCHECK( GetTargetLibId().IsValid(), /* void */ );
savePartAs();
@ -713,7 +713,7 @@ void SYMBOL_EDIT_FRAME::UpdateAfterSymbolProperties( wxString* aOldName )
void SYMBOL_EDIT_FRAME::DeletePartFromLibrary()
{
LIB_ID libId = getTargetLibId();
LIB_ID libId = GetTargetLibId();
if( m_libMgr->IsPartModified( libId.GetLibItemName(), libId.GetLibNickname() )
&& !IsOK( this, _( wxString::Format( "The symbol \"%s\" has been modified\n"
@ -869,7 +869,7 @@ void SYMBOL_EDIT_FRAME::ensureUniqueName( LIB_PART* aPart, const wxString& aLibr
void SYMBOL_EDIT_FRAME::Revert( bool aConfirm )
{
LIB_ID libId = getTargetLibId();
LIB_ID libId = GetTargetLibId();
const wxString& libName = libId.GetLibNickname();
// Empty if this is the library itself that is selected.

View File

@ -79,6 +79,12 @@ bool SYMBOL_EDITOR_CONTROL::Init()
LIB_ID sel = editFrame->GetTreeLIBID();
return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
};
auto saveSymbolAsCondition =
[ editFrame ]( const SELECTION& aSel )
{
LIB_ID sel = editFrame->GetTargetLibId();
return !sel.GetLibNickname().empty() && !sel.GetLibItemName().empty();
};
ctxMenu.AddItem( ACTIONS::pinLibrary, unpinnedLibSelectedCondition );
ctxMenu.AddItem( ACTIONS::unpinLibrary, pinnedLibSelectedCondition );
@ -97,7 +103,7 @@ bool SYMBOL_EDITOR_CONTROL::Init()
ctxMenu.AddSeparator();
ctxMenu.AddItem( ACTIONS::save, symbolSelectedCondition );
ctxMenu.AddItem( EE_ACTIONS::saveSymbolAs, symbolSelectedCondition );
ctxMenu.AddItem( EE_ACTIONS::saveSymbolAs, saveSymbolAsCondition );
ctxMenu.AddItem( ACTIONS::revert, symbolSelectedCondition );
ctxMenu.AddSeparator();