diff --git a/eeschema/libedit/lib_edit_frame.h b/eeschema/libedit/lib_edit_frame.h index 6e0148ca34..461d92b32f 100644 --- a/eeschema/libedit/lib_edit_frame.h +++ b/eeschema/libedit/lib_edit_frame.h @@ -62,9 +62,6 @@ class LIB_EDIT_FRAME : public SCH_BASE_FRAME SYMBOL_TREE_PANE* m_treePane; ///< component search tree widget LIB_MANAGER* m_libMgr; ///< manager taking care of temporary modificatoins - // Copy/cut/paste buffer to move parts between libraries - std::unique_ptr m_copiedPart; - /** Convert of the item currently being drawn. */ bool m_drawSpecificConvert; diff --git a/eeschema/libedit/libedit.cpp b/eeschema/libedit/libedit.cpp index fc701b2388..1bb4d19a4e 100644 --- a/eeschema/libedit/libedit.cpp +++ b/eeschema/libedit/libedit.cpp @@ -48,12 +48,13 @@ #include #include #include - +#include #include #include #include #include +#include void LIB_EDIT_FRAME::updateTitle() { @@ -526,7 +527,19 @@ void LIB_EDIT_FRAME::OnCopyCutPart( wxCommandEvent& aEvent ) if( !part ) return; - m_copiedPart.reset( new LIB_PART( *part ) ); + STRING_FORMATTER formatter; + SCH_LEGACY_PLUGIN::FormatPart( part, formatter ); + + auto clipboard = wxTheClipboard; + wxClipboardLocker clipboardLock( clipboard ); + + if( !clipboardLock || !clipboard->IsOpened() ) + return; + + auto data = new wxTextDataObject( wxString( formatter.GetString().c_str(), wxConvUTF8 ) ); + clipboard->SetData( data ); + + clipboard->Flush(); if( aEvent.GetId() == ID_LIBEDIT_CUT_PART ) OnRemovePart( aEvent ); @@ -543,22 +556,50 @@ void LIB_EDIT_FRAME::OnPasteDuplicatePart( wxCommandEvent& aEvent ) return; LIB_PART* srcPart = nullptr; + LIB_PART* newPart = nullptr; if( aEvent.GetId() == ID_LIBEDIT_DUPLICATE_PART ) + { srcPart = m_libMgr->GetBufferedPart( libId.GetLibItemName(), lib ); + newPart = new LIB_PART( *srcPart ); + } else if( aEvent.GetId() == ID_LIBEDIT_PASTE_PART ) - srcPart = m_copiedPart.get(); + { + auto clipboard = wxTheClipboard; + wxClipboardLocker clipboardLock( clipboard ); + + if( !clipboardLock || ! clipboard->IsSupported( wxDF_TEXT ) ) + return; + + wxTextDataObject data; + clipboard->GetData( data ); + wxString partSource = data.GetText(); + + STRING_LINE_READER reader( TO_UTF8( partSource ), "Clipboard" ); + + try + { + reader.ReadLine(); + newPart = SCH_LEGACY_PLUGIN::ParsePart( reader ); + } + catch( IO_ERROR& e ) + { + wxLogError( wxString::Format( "Malformed clipboard: %s" ), GetChars( e.What() ) ); + return; + } + } else wxFAIL; - if( !srcPart ) + if( !newPart ) return; - LIB_PART newPart( *srcPart ); - fixDuplicateAliases( &newPart, lib ); - m_libMgr->UpdatePart( &newPart, lib ); + fixDuplicateAliases( newPart, lib ); + m_libMgr->UpdatePart( newPart, lib ); SyncLibraries( false ); - m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, newPart.GetName() ) ); + m_treePane->GetLibTree()->SelectLibId( LIB_ID( lib, newPart->GetName() ) ); + + delete newPart; } diff --git a/eeschema/sch_legacy_plugin.cpp b/eeschema/sch_legacy_plugin.cpp index 6aac875062..3583bf6266 100644 --- a/eeschema/sch_legacy_plugin.cpp +++ b/eeschema/sch_legacy_plugin.cpp @@ -2672,6 +2672,9 @@ LIB_PART* SCH_LEGACY_PLUGIN_CACHE::LoadPart( LINE_READER& aReader, int aMajorVer { const char* line = aReader.Line(); + while( *line == '#' ) + aReader.ReadLine(); + wxCHECK( strCompare( "DEF", line, &line ), NULL ); long num;