Honor the {0, 0} reference on the clipboard.

Fixes: lp:1840819
* https://bugs.launchpad.net/kicad/+bug/1840819
This commit is contained in:
Jeff Young 2019-08-20 19:40:26 +01:00
parent a25368cc6b
commit aaa44b7348
4 changed files with 27 additions and 16 deletions

View File

@ -131,7 +131,7 @@ void CLIPBOARD_IO::SaveSelection( const PCBNEW_SELECTION& aSelected )
partialModule.Add( clone );
// locate the reference point at (0, 0) in the copied items
clone->Move( wxPoint(-refPoint.x, -refPoint.y ) );
clone->Move( (wxPoint) -refPoint );
}
// Set the new relative internal local coordinates of copied items
@ -173,7 +173,7 @@ void CLIPBOARD_IO::SaveSelection( const PCBNEW_SELECTION& aSelected )
std::unique_ptr<BOARD_ITEM> clone( static_cast<BOARD_ITEM*> ( item->Clone() ) );
// locate the reference point at (0, 0) in the copied items
clone->Move( wxPoint(-refPoint.x, -refPoint.y ) );
clone->Move( (wxPoint) -refPoint );
Format( clone.get(), 1 );
}

View File

@ -331,7 +331,7 @@ int EDIT_TOOL::Move( const TOOL_EVENT& aEvent )
{
m_cursor = grid.BestSnapAnchor( controls->GetMousePosition(), item_layers,
sel_items );
controls->ForceCursorPosition(true, m_cursor );
controls->ForceCursorPosition( true, m_cursor );
VECTOR2I movement( m_cursor - prevPos );
selection.SetReferencePoint( m_cursor );

View File

@ -606,7 +606,7 @@ int PCBNEW_CONTROL::Paste( const TOOL_EVENT& aEvent )
return 0;
}
placeBoardItems( static_cast<BOARD*>( clipItem ) );
placeBoardItems( static_cast<BOARD*>( clipItem ), true );
break;
}
@ -642,7 +642,7 @@ int PCBNEW_CONTROL::Paste( const TOOL_EVENT& aEvent )
items.push_back( clipItem );
}
placeBoardItems( items, true );
placeBoardItems( items, true, true );
break;
}
@ -731,7 +731,7 @@ static void moveNoFlagToVector( ZONE_CONTAINERS& aList, std::vector<BOARD_ITEM*
int PCBNEW_CONTROL::placeBoardItems( BOARD* aBoard )
int PCBNEW_CONTROL::placeBoardItems( BOARD* aBoard, bool aAnchorAtOrigin )
{
// items are new if the current board is not the board source
bool isNew = board() != aBoard;
@ -742,11 +742,12 @@ int PCBNEW_CONTROL::placeBoardItems( BOARD* aBoard )
moveNoFlagToVector( aBoard->Drawings(), items, isNew );
moveNoFlagToVector( aBoard->Zones(), items, isNew );
return placeBoardItems( items, isNew );
return placeBoardItems( items, isNew, aAnchorAtOrigin );
}
int PCBNEW_CONTROL::placeBoardItems( std::vector<BOARD_ITEM*>& aItems, bool aIsNew )
int PCBNEW_CONTROL::placeBoardItems( std::vector<BOARD_ITEM*>& aItems, bool aIsNew,
bool aAnchorAtOrigin )
{
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
@ -769,9 +770,16 @@ int PCBNEW_CONTROL::placeBoardItems( std::vector<BOARD_ITEM*>& aItems, bool aIsN
if( selection.Size() > 0 )
{
BOARD_ITEM* item = (BOARD_ITEM*) selection.GetTopLeftItem();
if( aAnchorAtOrigin )
{
selection.SetReferencePoint( VECTOR2I( 0, 0 ) );
}
else
{
BOARD_ITEM* item = (BOARD_ITEM*) selection.GetTopLeftItem();
selection.SetReferencePoint( item->GetPosition() );
}
selection.SetReferencePoint( item->GetPosition() );
getViewControls()->SetCursorPosition( getViewControls()->GetMousePosition(), false );
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
@ -855,7 +863,7 @@ int PCBNEW_CONTROL::AppendBoard( PLUGIN& pi, wxString& fileName )
brd->SetEnabledLayers( enabledLayers );
brd->SetVisibleLayers( enabledLayers );
return placeBoardItems( brd );
return placeBoardItems( brd, false );
}

View File

@ -97,14 +97,17 @@ public:
void setTransitions() override;
private:
int placeBoardItems( BOARD* aBoard );
/** add and selec or just select for move/place command a list of board items.
/**
* Add and select or just select for move/place command a list of board items.
* @param aItems is the list of items
* @param aIsNew = true to add items to the current board, false to just select if
* items are already managed by the current board
* items are already managed by the current board
* @param aAnchorAtOrigin = true if the items are translated so that the anchor is {0, 0}
* (if false, the top-left item's origin will be used)
*/
int placeBoardItems( std::vector<BOARD_ITEM*>& aItems, bool aIsNew );
int placeBoardItems( std::vector<BOARD_ITEM*>& aItems, bool aIsNew, bool aAnchorAtOrigin );
int placeBoardItems( BOARD* aBoard, bool aAnchorAtOrigin );
///> Pointer to the currently used edit frame.
PCB_BASE_FRAME* m_frame;