Make LibEdit respect the Move-warps-cursor setting.
This commit is contained in:
parent
b15f039444
commit
039bd92ea5
|
@ -24,11 +24,9 @@
|
||||||
#include <tool/tool_manager.h>
|
#include <tool/tool_manager.h>
|
||||||
#include <tools/ee_selection_tool.h>
|
#include <tools/ee_selection_tool.h>
|
||||||
#include <ee_actions.h>
|
#include <ee_actions.h>
|
||||||
#include <view/view.h>
|
|
||||||
#include <bitmaps.h>
|
#include <bitmaps.h>
|
||||||
#include <base_struct.h>
|
#include <base_struct.h>
|
||||||
#include <lib_edit_frame.h>
|
#include <lib_edit_frame.h>
|
||||||
#include <eeschema_id.h>
|
|
||||||
#include "lib_move_tool.h"
|
#include "lib_move_tool.h"
|
||||||
#include "lib_pin_tool.h"
|
#include "lib_pin_tool.h"
|
||||||
|
|
||||||
|
@ -71,9 +69,9 @@ void LIB_MOVE_TOOL::Reset( RESET_REASON aReason )
|
||||||
int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
KIGFX::VIEW_CONTROLS* controls = getViewControls();
|
||||||
|
|
||||||
controls->SetSnapping( true );
|
controls->SetSnapping( true );
|
||||||
VECTOR2I originalCursorPos = controls->GetCursorPosition();
|
|
||||||
|
m_anchorPos = { 0, 0 };
|
||||||
|
|
||||||
// Be sure that there is at least one item that we can move. If there's no selection try
|
// Be sure that there is at least one item that we can move. If there's no selection try
|
||||||
// looking for the stuff under mouse cursor (i.e. Kicad old-style hover selection).
|
// looking for the stuff under mouse cursor (i.e. Kicad old-style hover selection).
|
||||||
|
@ -98,6 +96,8 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
if( !selection.Front()->IsNew() )
|
if( !selection.Front()->IsNew() )
|
||||||
saveCopyInUndoList( m_frame->GetCurPart(), UR_LIBEDIT );
|
saveCopyInUndoList( m_frame->GetCurPart(), UR_LIBEDIT );
|
||||||
|
|
||||||
|
m_cursor = controls->GetCursorPosition();
|
||||||
|
|
||||||
// Main loop: keep receiving events
|
// Main loop: keep receiving events
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@ -109,15 +109,17 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
if( !m_moveInProgress ) // Prepare to start moving/dragging
|
if( !m_moveInProgress ) // Prepare to start moving/dragging
|
||||||
{
|
{
|
||||||
|
LIB_ITEM* lib_item = (LIB_ITEM*) selection.Front();
|
||||||
|
|
||||||
// Pick up any synchronized pins
|
// Pick up any synchronized pins
|
||||||
//
|
//
|
||||||
// Careful when pasting. The pasted pin will be at the same location as it
|
// Careful when pasting. The pasted pin will be at the same location as it
|
||||||
// was copied from, leading us to believe it's a synchronized pin. It's not.
|
// was copied from, leading us to believe it's a synchronized pin. It's not.
|
||||||
if( selection.GetSize() == 1 && selection.Front()->Type() == LIB_PIN_T
|
if( selection.GetSize() == 1 && lib_item->Type() == LIB_PIN_T
|
||||||
&& m_frame->SynchronizePins()
|
&& m_frame->SynchronizePins()
|
||||||
&& ( selection.Front()->GetEditFlags() & IS_PASTED ) == 0 )
|
&& ( lib_item->GetEditFlags() & IS_PASTED ) == 0 )
|
||||||
{
|
{
|
||||||
LIB_PIN* cur_pin = (LIB_PIN*) selection.Front();
|
LIB_PIN* cur_pin = (LIB_PIN*) lib_item;
|
||||||
LIB_PART* part = m_frame->GetCurPart();
|
LIB_PART* part = m_frame->GetCurPart();
|
||||||
|
|
||||||
for( LIB_PIN* pin = part->GetNextPin(); pin; pin = part->GetNextPin( pin ) )
|
for( LIB_PIN* pin = part->GetNextPin(); pin; pin = part->GetNextPin( pin ) )
|
||||||
|
@ -140,36 +142,34 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
//
|
//
|
||||||
m_cursor = controls->GetCursorPosition();
|
m_cursor = controls->GetCursorPosition();
|
||||||
|
|
||||||
if( selection.HasReferencePoint() )
|
if( ( lib_item->GetFlags() & IS_NEW ) != 0 )
|
||||||
{
|
{
|
||||||
VECTOR2I delta = m_cursor - mapCoords( selection.GetReferencePoint() );
|
m_anchorPos = selection.GetReferencePoint();
|
||||||
|
VECTOR2I delta = m_cursor - mapCoords( m_anchorPos );
|
||||||
|
|
||||||
// Drag items to the current cursor position
|
// Drag items to the current cursor position
|
||||||
for( EDA_ITEM* item : selection )
|
for( EDA_ITEM* item : selection )
|
||||||
{
|
{
|
||||||
// Don't double move pins, fields, etc.
|
|
||||||
if( item->GetParent() && item->GetParent()->IsSelected() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
moveItem( item, delta );
|
moveItem( item, delta );
|
||||||
updateView( item );
|
updateView( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
selection.SetReferencePoint( m_cursor );
|
m_anchorPos = m_cursor;
|
||||||
}
|
}
|
||||||
else if( selection.Size() == 1 )
|
else if( selection.Size() == 1 && m_frame->GetMoveWarpsCursor() )
|
||||||
{
|
{
|
||||||
// Set the current cursor position to the first dragged item origin,
|
m_anchorPos = lib_item->GetPosition();
|
||||||
// so the movement vector can be computed later
|
getViewControls()->WarpCursor( m_anchorPos, true, true );
|
||||||
updateModificationPoint( selection );
|
m_cursor = m_anchorPos;
|
||||||
m_cursor = originalCursorPos;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
updateModificationPoint( selection );
|
m_cursor = getViewControls()->GetCursorPosition( true );
|
||||||
|
m_anchorPos = m_cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
controls->SetCursorPosition( m_cursor, false );
|
controls->SetCursorPosition( m_cursor, false );
|
||||||
|
m_toolMgr->PostEvent( EVENTS::SelectedItemsModified );
|
||||||
|
|
||||||
prevPos = m_cursor;
|
prevPos = m_cursor;
|
||||||
controls->SetAutoPan( true );
|
controls->SetAutoPan( true );
|
||||||
|
@ -181,7 +181,7 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
//
|
//
|
||||||
m_cursor = controls->GetCursorPosition();
|
m_cursor = controls->GetCursorPosition();
|
||||||
VECTOR2I delta( m_cursor - prevPos );
|
VECTOR2I delta( m_cursor - prevPos );
|
||||||
selection.SetReferencePoint( m_cursor );
|
m_anchorPos = m_cursor;
|
||||||
|
|
||||||
m_moveOffset += delta;
|
m_moveOffset += delta;
|
||||||
prevPos = m_cursor;
|
prevPos = m_cursor;
|
||||||
|
@ -271,18 +271,27 @@ int LIB_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
if( !chain_commands )
|
if( !chain_commands )
|
||||||
m_moveOffset = { 0, 0 };
|
m_moveOffset = { 0, 0 };
|
||||||
|
|
||||||
|
m_anchorPos = { 0, 0 };
|
||||||
|
|
||||||
for( auto item : selection )
|
for( auto item : selection )
|
||||||
item->ClearEditFlags();
|
item->ClearEditFlags();
|
||||||
|
|
||||||
if( unselect )
|
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
|
||||||
else
|
|
||||||
selection.ClearReferencePoint();
|
|
||||||
|
|
||||||
if( restore_state )
|
if( restore_state )
|
||||||
|
{
|
||||||
m_frame->RollbackPartFromUndo();
|
m_frame->RollbackPartFromUndo();
|
||||||
|
|
||||||
|
if( unselect )
|
||||||
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
|
else
|
||||||
|
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if( unselect )
|
||||||
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
|
|
||||||
m_frame->OnModify();
|
m_frame->OnModify();
|
||||||
|
}
|
||||||
|
|
||||||
m_moveInProgress = false;
|
m_moveInProgress = false;
|
||||||
m_frame->PopTool( tool );
|
m_frame->PopTool( tool );
|
||||||
|
|
|
@ -70,6 +70,7 @@ private:
|
||||||
///> Last cursor position (needed for getModificationPoint() to avoid changes
|
///> Last cursor position (needed for getModificationPoint() to avoid changes
|
||||||
///> of edit reference point).
|
///> of edit reference point).
|
||||||
VECTOR2I m_cursor;
|
VECTOR2I m_cursor;
|
||||||
|
VECTOR2I m_anchorPos;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //KICAD_LIB_MOVE_TOOL_H
|
#endif //KICAD_LIB_MOVE_TOOL_H
|
||||||
|
|
Loading…
Reference in New Issue