| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -1008,15 +1008,48 @@ void PCB_CONTROL::pruneItemLayers( std::vector<BOARD_ITEM*>& aItems ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					int PCB_CONTROL::Paste( const TOOL_EVENT& aEvent ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // The viewer frames cannot paste
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if( !frame()->IsType( FRAME_FOOTPRINT_EDITOR ) && !frame()->IsType( FRAME_PCB_EDITOR ) ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    bool isFootprintEditor = m_isFootprintEditor || frame()->IsType( FRAME_FOOTPRINT_EDITOR ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // The clipboard can contain two different things, an entire kicad_pcb or a single footprint
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if( isFootprintEditor && ( !board() || !footprint() ) ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    BOARD_COMMIT commit( frame() ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    CLIPBOARD_IO pi; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    BOARD_ITEM*  clipItem = pi.Parse(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if( !clipItem ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        // When the clipboard doesn't parse, create a PCB textual item with the clipboard contents
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        const wxString clipText = m_toolMgr->GetClipboardUTF8(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if( clipText.empty() ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // The viewer frames cannot paste
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if( !frame()->IsType( FRAME_FOOTPRINT_EDITOR ) && !frame()->IsType( FRAME_PCB_EDITOR ) ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        std::unique_ptr<PCB_TEXT> item; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        item = std::make_unique<PCB_TEXT>( m_frame->GetModel() ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        item->SetText( clipText ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        item->SetPosition( getViewControls()->GetCursorPosition() ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        std::vector<BOARD_ITEM*> items{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            item.release(), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        bool cancelled = !placeBoardItems( &commit, items, true, false, false ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if( cancelled ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            commit.Revert(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        else | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					            commit.Push( _( "Paste Text" ) ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // If we get here, we have a parsed board/FP to paste
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    PASTE_MODE     mode = PASTE_MODE::KEEP_ANNOTATIONS; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    bool           clear_nets = false; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -1035,8 +1068,6 @@ int PCB_CONTROL::Paste( const TOOL_EVENT& aEvent ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        clear_nets = dlg.GetClearNets(); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    bool isFootprintEditor = m_isFootprintEditor || frame()->IsType( FRAME_FOOTPRINT_EDITOR ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if( clipItem->Type() == PCB_T ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        BOARD* clipBoard = static_cast<BOARD*>( clipItem ); | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -1052,11 +1083,6 @@ int PCB_CONTROL::Paste( const TOOL_EVENT& aEvent ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // The clipboard can contain two different things, an entire kicad_pcb or a single footprint
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if( isFootprintEditor && ( !board() || !footprint() ) ) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return 0; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    BOARD_COMMIT commit( frame() ); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    bool cancelled = false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    switch( clipItem->Type() ) | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |