Library Editor: component cut/copy/paste/duplicate
This commit is contained in:
parent
2ed19668cd
commit
7fc1e1d53c
|
@ -175,7 +175,6 @@ struct null_deleter
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
LIB_PART::LIB_PART( const wxString& aName, PART_LIB* aLibrary ) :
|
||||
EDA_ITEM( LIB_PART_T ),
|
||||
m_me( this, null_deleter() )
|
||||
|
|
|
@ -251,7 +251,7 @@ class LIB_PART : public EDA_ITEM
|
|||
private:
|
||||
void deleteAllFields();
|
||||
|
||||
// LIB_PART() { } // not legal
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -201,6 +201,10 @@ enum id_eeschema_frm
|
|||
ID_LIBEDIT_SAVE_PART,
|
||||
ID_LIBEDIT_REVERT_PART,
|
||||
ID_LIBEDIT_REMOVE_PART,
|
||||
ID_LIBEDIT_CUT_PART,
|
||||
ID_LIBEDIT_COPY_PART,
|
||||
ID_LIBEDIT_PASTE_PART,
|
||||
ID_LIBEDIT_DUPLICATE_PART,
|
||||
|
||||
/* Library editor horizontal toolbar IDs. */
|
||||
ID_DE_MORGAN_NORMAL_BUTT,
|
||||
|
|
|
@ -375,6 +375,81 @@ void LIB_EDIT_FRAME::OnRemovePart( wxCommandEvent& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void LIB_EDIT_FRAME::OnCopyCutPart( wxCommandEvent& aEvent )
|
||||
{
|
||||
int unit = 0;
|
||||
LIB_ID partId = m_treePane->GetCmpTree()->GetSelectedLibId( &unit );
|
||||
LIB_PART* part = m_libMgr->GetBufferedPart( partId.GetLibItemName(), partId.GetLibNickname() );
|
||||
|
||||
if( !part )
|
||||
return;
|
||||
|
||||
LIB_ID libId = getTargetLibId();
|
||||
m_copiedPart.reset( new LIB_PART( *part ) );
|
||||
|
||||
if( aEvent.GetId() == ID_LIBEDIT_CUT_PART )
|
||||
{
|
||||
if( isCurrentPart( libId ) )
|
||||
emptyScreen();
|
||||
|
||||
m_libMgr->RemovePart( libId.GetLibItemName(), libId.GetLibNickname() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LIB_EDIT_FRAME::OnPasteDuplicatePart( wxCommandEvent& aEvent )
|
||||
{
|
||||
int unit = 0;
|
||||
LIB_ID libId = m_treePane->GetCmpTree()->GetSelectedLibId( &unit );
|
||||
wxString lib = libId.GetLibNickname();
|
||||
|
||||
if( !m_libMgr->LibraryExists( lib ) )
|
||||
return;
|
||||
|
||||
LIB_PART* srcPart = nullptr;
|
||||
|
||||
if( aEvent.GetId() == ID_LIBEDIT_DUPLICATE_PART )
|
||||
srcPart = m_libMgr->GetBufferedPart( libId.GetLibItemName(), lib );
|
||||
else if( aEvent.GetId() == ID_LIBEDIT_PASTE_PART )
|
||||
srcPart = m_copiedPart.get();
|
||||
else
|
||||
wxFAIL;
|
||||
|
||||
if( !srcPart )
|
||||
return;
|
||||
|
||||
LIB_PART newPart( *srcPart );
|
||||
fixDuplicateAliases( &newPart, lib );
|
||||
m_libMgr->UpdatePart( &newPart, lib );
|
||||
}
|
||||
|
||||
|
||||
void LIB_EDIT_FRAME::fixDuplicateAliases( LIB_PART* aPart, const wxString& aLibrary )
|
||||
{
|
||||
wxString newName;
|
||||
|
||||
for( int i = 0; i < aPart->GetAliasCount(); ++i )
|
||||
{
|
||||
LIB_ALIAS* alias = aPart->GetAlias( i );
|
||||
int sfx = 0;
|
||||
newName = alias->GetName();
|
||||
|
||||
while( m_libMgr->PartExists( newName, aLibrary ) )
|
||||
{
|
||||
wxString suffix = ( sfx == 0 ) ? wxT( " (copy)" )
|
||||
: wxString::Format( _( " (copy %d)" ), sfx );
|
||||
newName = alias->GetName() + suffix;
|
||||
++sfx;
|
||||
}
|
||||
|
||||
if( i == 0 )
|
||||
aPart->SetName( newName );
|
||||
else
|
||||
alias->SetName( newName );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LIB_EDIT_FRAME::OnRevertPart( wxCommandEvent& aEvent )
|
||||
{
|
||||
LIB_ID libId = getTargetLibId();
|
||||
|
|
|
@ -103,6 +103,10 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
|
|||
EVT_TOOL( ID_LIBEDIT_SAVE_PART, LIB_EDIT_FRAME::OnSavePart )
|
||||
EVT_TOOL( ID_LIBEDIT_REVERT_PART, LIB_EDIT_FRAME::OnRevertPart )
|
||||
EVT_TOOL( ID_LIBEDIT_REMOVE_PART, LIB_EDIT_FRAME::OnRemovePart )
|
||||
EVT_TOOL( ID_LIBEDIT_CUT_PART, LIB_EDIT_FRAME::OnCopyCutPart )
|
||||
EVT_TOOL( ID_LIBEDIT_COPY_PART, LIB_EDIT_FRAME::OnCopyCutPart )
|
||||
EVT_TOOL( ID_LIBEDIT_PASTE_PART, LIB_EDIT_FRAME::OnPasteDuplicatePart )
|
||||
EVT_TOOL( ID_LIBEDIT_DUPLICATE_PART, LIB_EDIT_FRAME::OnPasteDuplicatePart )
|
||||
|
||||
// Main horizontal toolbar.
|
||||
EVT_TOOL( ID_TO_LIBVIEW, LIB_EDIT_FRAME::OnOpenLibraryViewer )
|
||||
|
@ -166,6 +170,7 @@ BEGIN_EVENT_TABLE( LIB_EDIT_FRAME, EDA_DRAW_FRAME )
|
|||
EVT_UPDATE_UI( ID_LIBEDIT_EXPORT_PART, LIB_EDIT_FRAME::OnUpdateEditingPart )
|
||||
EVT_UPDATE_UI( ID_LIBEDIT_SAVE_PART, LIB_EDIT_FRAME::OnUpdatePartModified )
|
||||
EVT_UPDATE_UI( ID_LIBEDIT_REVERT_PART, LIB_EDIT_FRAME::OnUpdatePartModified )
|
||||
EVT_UPDATE_UI( ID_LIBEDIT_PASTE_PART, LIB_EDIT_FRAME::OnUpdateClipboardNotEmpty )
|
||||
EVT_UPDATE_UI( ID_LIBEDIT_GET_FRAME_EDIT_FIELDS, LIB_EDIT_FRAME::OnUpdateEditingPart )
|
||||
EVT_UPDATE_UI( ID_LIBEDIT_CHECK_PART, LIB_EDIT_FRAME::OnUpdateEditingPart )
|
||||
EVT_UPDATE_UI( ID_LIBEDIT_GET_FRAME_EDIT_PART, LIB_EDIT_FRAME::OnUpdateEditingPart )
|
||||
|
@ -525,6 +530,12 @@ void LIB_EDIT_FRAME::OnUpdateLibModified( wxUpdateUIEvent& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void LIB_EDIT_FRAME::OnUpdateClipboardNotEmpty( wxUpdateUIEvent& aEvent )
|
||||
{
|
||||
aEvent.Enable( !!m_copiedPart );
|
||||
}
|
||||
|
||||
|
||||
void LIB_EDIT_FRAME::OnUpdateUndo( wxUpdateUIEvent& event )
|
||||
{
|
||||
event.Enable( GetCurPart() && GetScreen() &&
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <lib_draw_item.h>
|
||||
#include <lib_collectors.h>
|
||||
|
||||
#include <core/optional.h>
|
||||
|
||||
class SCH_EDIT_FRAME;
|
||||
class SYMBOL_LIB_TABLE;
|
||||
|
@ -288,6 +289,9 @@ public:
|
|||
*/
|
||||
void OnRemovePart( wxCommandEvent& aEvent );
|
||||
|
||||
void OnCopyCutPart( wxCommandEvent& aEvent );
|
||||
void OnPasteDuplicatePart( wxCommandEvent& aEvent );
|
||||
|
||||
void OnSelectAlias( wxCommandEvent& event );
|
||||
void OnSelectPart( wxCommandEvent& event );
|
||||
|
||||
|
@ -317,6 +321,7 @@ public:
|
|||
void OnUpdateEditingPart( wxUpdateUIEvent& event );
|
||||
void OnUpdatePartModified( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateLibModified( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateClipboardNotEmpty( wxUpdateUIEvent& aEvent );
|
||||
void OnUpdateUndo( wxUpdateUIEvent& event );
|
||||
void OnUpdateRedo( wxUpdateUIEvent& event );
|
||||
void OnUpdateSaveLib( wxUpdateUIEvent& event );
|
||||
|
@ -714,6 +719,13 @@ public:
|
|||
|
||||
void emptyScreen();
|
||||
|
||||
private:
|
||||
///> Renames LIB_PART aliases to avoid conflicts before adding a component to a library
|
||||
void fixDuplicateAliases( LIB_PART* aPart, const wxString& aLibrary );
|
||||
|
||||
// Copy/cut/paste buffer
|
||||
std::unique_ptr<LIB_PART> m_copiedPart;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
|
|
|
@ -56,6 +56,7 @@ CMP_TREE_PANE::CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr )
|
|||
menuLibrary->AppendSeparator();
|
||||
menuLibrary->Append( ID_LIBEDIT_NEW_PART, _( "New component..." ) );
|
||||
menuLibrary->Append( ID_LIBEDIT_IMPORT_PART, _( "Import component..." ) );
|
||||
menuLibrary->Append( ID_LIBEDIT_PASTE_PART, _( "Paste component" ) );
|
||||
|
||||
std::unique_ptr<wxMenu> menuPart = std::make_unique<wxMenu>();
|
||||
menuPart->Append( ID_LIBEDIT_EDIT_PART, _( "Edit" ) );
|
||||
|
@ -64,6 +65,10 @@ CMP_TREE_PANE::CMP_TREE_PANE( LIB_EDIT_FRAME* aParent, LIB_MANAGER* aLibMgr )
|
|||
menuPart->Append( ID_LIBEDIT_SAVE_PART, _( "Save" ) );
|
||||
menuPart->Append( ID_LIBEDIT_REVERT_PART, _( "Revert" ) );
|
||||
menuPart->AppendSeparator();
|
||||
menuPart->Append( ID_LIBEDIT_CUT_PART, _( "Cut component" ) );
|
||||
menuPart->Append( ID_LIBEDIT_COPY_PART, _( "Copy component" ) );
|
||||
menuPart->Append( ID_LIBEDIT_DUPLICATE_PART, _( "Duplicate component" ) );
|
||||
menuPart->AppendSeparator();
|
||||
|
||||
// Append the library menu to the component menu
|
||||
for( size_t i = 0; i < menuLibrary->GetMenuItemCount(); ++i )
|
||||
|
|
Loading…
Reference in New Issue