Fix issues with dragging, moving and rotating wires.
This commit is contained in:
parent
2edb09e583
commit
7e3ad4585a
|
@ -353,6 +353,18 @@ void SCH_LINE::Rotate( wxPoint aPosition )
|
|||
}
|
||||
|
||||
|
||||
void SCH_LINE::RotateStart( wxPoint aPosition )
|
||||
{
|
||||
RotatePoint( &m_start, aPosition, 900 );
|
||||
}
|
||||
|
||||
|
||||
void SCH_LINE::RotateEnd( wxPoint aPosition )
|
||||
{
|
||||
RotatePoint( &m_end, aPosition, 900 );
|
||||
}
|
||||
|
||||
|
||||
bool SCH_LINE::IsSameQuadrant( SCH_LINE* aLine, const wxPoint& aPosition )
|
||||
{
|
||||
wxPoint first;
|
||||
|
|
|
@ -137,6 +137,8 @@ public:
|
|||
void MirrorX( int aXaxis_position ) override;
|
||||
void MirrorY( int aYaxis_position ) override;
|
||||
void Rotate( wxPoint aPosition ) override;
|
||||
void RotateStart( wxPoint aPosition );
|
||||
void RotateEnd( wxPoint aPosition );
|
||||
|
||||
/**
|
||||
* Check line against \a aLine to see if it overlaps and merge if it does.
|
||||
|
|
|
@ -174,6 +174,10 @@ TOOL_ACTION SCH_ACTIONS::breakBus( "eeschema.InteractiveEdit.breakBus",
|
|||
break_line_xpm );
|
||||
|
||||
|
||||
// For adding to or removing from selections
|
||||
#define QUIET_MODE true
|
||||
|
||||
|
||||
class SYMBOL_UNIT_MENU : public CONTEXT_MENU
|
||||
{
|
||||
public:
|
||||
|
@ -241,7 +245,7 @@ SCH_EDIT_TOOL::SCH_EDIT_TOOL() :
|
|||
m_frame( nullptr ),
|
||||
m_menu( *this ),
|
||||
m_moveInProgress( false ),
|
||||
m_totalMovement( 0, 0 )
|
||||
m_moveOffset( 0, 0 )
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -464,7 +468,7 @@ void SCH_EDIT_TOOL::Reset( RESET_REASON aReason )
|
|||
if( aReason == MODEL_RELOAD )
|
||||
{
|
||||
m_moveInProgress = false;
|
||||
m_totalMovement = { 0, 0 };
|
||||
m_moveOffset = { 0, 0 };
|
||||
|
||||
// Init variables used by every drawing tool
|
||||
m_view = static_cast<KIGFX::SCH_VIEW*>( getView() );
|
||||
|
@ -504,7 +508,8 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
// 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).
|
||||
SELECTION& selection = m_selectionTool->RequestSelection( movableItems );
|
||||
bool unselect = selection.IsHover();
|
||||
EDA_ITEMS dragAdditions;
|
||||
bool unselect = selection.IsHover();
|
||||
|
||||
if( selection.Empty() )
|
||||
return 0;
|
||||
|
@ -526,10 +531,12 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
if( m_moveInProgress )
|
||||
{
|
||||
// User must have switched from move to drag or vice-versa. Reset the moved items
|
||||
// so we can start again with the current m_isDragOperation and m_totalMovement.
|
||||
// so we can start again with the current m_isDragOperation and m_moveOffset.
|
||||
m_frame->RollbackSchematicFromUndo();
|
||||
m_selectionTool->RemoveItemsFromSel( &dragAdditions, QUIET_MODE );
|
||||
m_moveInProgress = false;
|
||||
// And give it a kick so it doesn't have to wait for the first mouse movement.
|
||||
// And give it a kick so it doesn't have to wait for the first mouse movement to
|
||||
// refresh.
|
||||
m_toolMgr->RunAction( SCH_ACTIONS::refreshPreview );
|
||||
return 0;
|
||||
}
|
||||
|
@ -545,31 +552,37 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
{
|
||||
if( !m_moveInProgress ) // Prepare to start moving/dragging
|
||||
{
|
||||
//------------------------------------------------------------------------
|
||||
// Setup a drag or a move
|
||||
//
|
||||
for( SCH_ITEM* it = m_frame->GetScreen()->GetDrawItems(); it; it = it->Next() )
|
||||
{
|
||||
if( it->IsSelected() )
|
||||
it->SetFlags( STARTPOINT | ENDPOINT | SELECTEDNODE );
|
||||
else
|
||||
it->ClearFlags( STARTPOINT | ENDPOINT | SELECTEDNODE );
|
||||
}
|
||||
|
||||
// Add connections to the selection for a drag.
|
||||
//
|
||||
if( m_frame->GetToolId() == ID_SCH_DRAG )
|
||||
{
|
||||
for( unsigned i = 0; i < selection.GetSize(); ++i )
|
||||
for( EDA_ITEM* item : selection )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
|
||||
item->ClearFlags( STARTPOINT | ENDPOINT );
|
||||
}
|
||||
|
||||
int originalEnd = selection.GetSize();
|
||||
for( unsigned i = 0; i < originalEnd && i < selection.GetSize(); ++i )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
|
||||
if( item->IsConnectable() )
|
||||
if( static_cast<SCH_ITEM*>( item )->IsConnectable() )
|
||||
{
|
||||
std::vector<wxPoint> connections;
|
||||
item->GetConnectionPoints( connections );
|
||||
static_cast<SCH_ITEM*>( item )->GetConnectionPoints( connections );
|
||||
|
||||
for( wxPoint point : connections )
|
||||
selectConnectedDragItems( item, point );
|
||||
getConnectedDragItems( (SCH_ITEM*) item, point, dragAdditions );
|
||||
}
|
||||
}
|
||||
|
||||
m_selectionTool->AddItemsToSel( &dragAdditions, QUIET_MODE );
|
||||
|
||||
for( EDA_ITEM* item : dragAdditions )
|
||||
saveCopyInUndoList( (SCH_ITEM*) item, UR_CHANGED, true );
|
||||
}
|
||||
|
||||
// Mark the edges of the block with dangling flags for a move.
|
||||
|
@ -578,40 +591,31 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
{
|
||||
std::vector<DANGLING_END_ITEM> internalPoints;
|
||||
|
||||
for( unsigned i = 0; i < selection.GetSize(); ++i )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
item->GetEndPoints( internalPoints );
|
||||
}
|
||||
for( EDA_ITEM* item : selection )
|
||||
static_cast<SCH_ITEM*>( item )->GetEndPoints( internalPoints );
|
||||
|
||||
for( unsigned i = 0; i < selection.GetSize(); ++i )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
item->UpdateDanglingState( internalPoints );
|
||||
}
|
||||
for( EDA_ITEM* item : selection )
|
||||
static_cast<SCH_ITEM*>( item )->UpdateDanglingState( internalPoints );
|
||||
}
|
||||
|
||||
// Save items for undo.
|
||||
// Generic setup
|
||||
//
|
||||
for( unsigned i = 0; i < selection.GetSize(); ++i )
|
||||
bool first = true;
|
||||
for( EDA_ITEM* item : selection )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
if( item->IsNew() || ( item->GetParent() && item->GetParent()->IsSelected() ) )
|
||||
{
|
||||
// already saved to undo
|
||||
}
|
||||
else
|
||||
{
|
||||
saveCopyInUndoList( (SCH_ITEM*) item, UR_CHANGED, !first );
|
||||
first = false;
|
||||
}
|
||||
|
||||
// No need to save children of selected items
|
||||
if( item->GetParent() && item->GetParent()->IsSelected() )
|
||||
continue;
|
||||
|
||||
if( !item->IsNew() )
|
||||
saveCopyInUndoList( item, UR_CHANGED, i > 0 );
|
||||
}
|
||||
|
||||
// Apply any initial offset in case we're coming from a previous command.
|
||||
//
|
||||
for( unsigned i = 0; i < selection.GetSize(); ++i )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
|
||||
moveItem( item, m_totalMovement, m_frame->GetToolId() == ID_SCH_DRAG );
|
||||
// Apply any initial offset in case we're coming from a previous command.
|
||||
//
|
||||
moveItem( (SCH_ITEM*) item, m_moveOffset, m_frame->GetToolId() == ID_SCH_DRAG );
|
||||
}
|
||||
|
||||
// Set up the starting position and move/drag offset
|
||||
|
@ -656,30 +660,31 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
m_moveInProgress = true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Follow the mouse
|
||||
//
|
||||
m_cursor = controls->GetCursorPosition();
|
||||
VECTOR2I movement( m_cursor - prevPos );
|
||||
VECTOR2I delta( m_cursor - prevPos );
|
||||
selection.SetReferencePoint( m_cursor );
|
||||
|
||||
m_totalMovement += movement;
|
||||
m_moveOffset += delta;
|
||||
prevPos = m_cursor;
|
||||
|
||||
for( int i = 0; i < selection.GetSize(); ++i )
|
||||
for( EDA_ITEM* item : selection )
|
||||
{
|
||||
SCH_ITEM* item = static_cast<SCH_ITEM*>( selection.GetItem( i ) );
|
||||
|
||||
// Don't double move pins, fields, etc.
|
||||
if( item->GetParent() && item->GetParent()->IsSelected() )
|
||||
continue;
|
||||
|
||||
moveItem( item, movement, m_frame->GetToolId() == ID_SCH_DRAG );
|
||||
moveItem( (SCH_ITEM*) item, delta, m_frame->GetToolId() == ID_SCH_DRAG );
|
||||
updateView( item );
|
||||
}
|
||||
|
||||
m_frame->UpdateMsgPanel();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Handle cancel
|
||||
//
|
||||
else if( TOOL_EVT_UTILS::IsCancelInteractive( evt.get() ) )
|
||||
{
|
||||
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
|
||||
|
@ -689,14 +694,14 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Handle TOOL_ACTION special cases
|
||||
//
|
||||
else if( evt->Action() == TA_UNDO_REDO_PRE )
|
||||
{
|
||||
unselect = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Handle TOOL_ACTION special cases
|
||||
else if( evt->Category() == TC_COMMAND )
|
||||
{
|
||||
if( evt->IsAction( &SCH_ACTIONS::doDelete ) )
|
||||
|
@ -735,12 +740,16 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Handle context menu
|
||||
//
|
||||
else if( evt->IsClick( BUT_RIGHT ) )
|
||||
{
|
||||
m_menu.ShowContextMenu( selection );
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
// Handle drop
|
||||
//
|
||||
else if( evt->IsMouseUp( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) )
|
||||
{
|
||||
break; // Finish
|
||||
|
@ -754,7 +763,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
controls->SetAutoPan( false );
|
||||
|
||||
if( !chain_commands )
|
||||
m_totalMovement = { 0, 0 };
|
||||
m_moveOffset = { 0, 0 };
|
||||
|
||||
m_moveInProgress = false;
|
||||
m_frame->SetNoToolSelected();
|
||||
|
@ -766,6 +775,8 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
|
||||
if( unselect )
|
||||
m_toolMgr->RunAction( SCH_ACTIONS::clearSelection, true );
|
||||
else
|
||||
m_selectionTool->RemoveItemsFromSel( &dragAdditions, QUIET_MODE );
|
||||
|
||||
if( restore_state )
|
||||
{
|
||||
|
@ -783,40 +794,35 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void SCH_EDIT_TOOL::selectConnectedDragItems( SCH_ITEM* aSourceItem, wxPoint aPoint )
|
||||
void SCH_EDIT_TOOL::getConnectedDragItems( SCH_ITEM* aItem, wxPoint aPoint, EDA_ITEMS& aList )
|
||||
{
|
||||
for( SCH_ITEM* item = m_frame->GetScreen()->GetDrawItems(); item; item = item->Next() )
|
||||
for( SCH_ITEM* test = m_frame->GetScreen()->GetDrawItems(); test; test = test->Next() )
|
||||
{
|
||||
if( item->IsSelected() || !item->IsConnectable() || !item->CanConnect( aSourceItem ) )
|
||||
if( test->IsSelected() || !test->IsConnectable() || !test->CanConnect( aItem ) )
|
||||
continue;
|
||||
|
||||
bool doSelect = false;
|
||||
|
||||
switch( item->Type() )
|
||||
switch( test->Type() )
|
||||
{
|
||||
default:
|
||||
case SCH_LINE_T:
|
||||
{
|
||||
// Select wires/busses that are connected at one end and/or the other. Any
|
||||
// unconnected ends must be flagged (STARTPOINT or ENDPOINT).
|
||||
SCH_LINE* line = (SCH_LINE*) item;
|
||||
|
||||
if( !line->IsSelected() )
|
||||
line->SetFlags( STARTPOINT | ENDPOINT );
|
||||
SCH_LINE* line = (SCH_LINE*) test;
|
||||
|
||||
if( line->GetStartPoint() == aPoint )
|
||||
{
|
||||
line->ClearFlags( STARTPOINT );
|
||||
if( !( line->GetFlags() & SELECTEDNODE ) )
|
||||
aList.push_back( line );
|
||||
|
||||
if( !line->IsSelected() )
|
||||
doSelect = true;
|
||||
line->SetFlags( STARTPOINT | SELECTEDNODE );
|
||||
}
|
||||
else if( line->GetEndPoint() == aPoint )
|
||||
{
|
||||
line->ClearFlags( ENDPOINT );
|
||||
if( !( line->GetFlags() & SELECTEDNODE ) )
|
||||
aList.push_back( line );
|
||||
|
||||
if( !line->IsSelected() )
|
||||
doSelect = true;
|
||||
line->SetFlags( ENDPOINT | SELECTEDNODE );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -830,8 +836,8 @@ void SCH_EDIT_TOOL::selectConnectedDragItems( SCH_ITEM* aSourceItem, wxPoint aPo
|
|||
case SCH_NO_CONNECT_T:
|
||||
case SCH_JUNCTION_T:
|
||||
// Select connected items that have no wire between them.
|
||||
if( aSourceItem->Type() != SCH_LINE_T && item->IsConnected( aPoint ) )
|
||||
doSelect = true;
|
||||
if( aItem->Type() != SCH_LINE_T && test->IsConnected( aPoint ) )
|
||||
aList.push_back( test );
|
||||
|
||||
break;
|
||||
|
||||
|
@ -841,25 +847,19 @@ void SCH_EDIT_TOOL::selectConnectedDragItems( SCH_ITEM* aSourceItem, wxPoint aPo
|
|||
case SCH_BUS_WIRE_ENTRY_T:
|
||||
case SCH_BUS_BUS_ENTRY_T:
|
||||
// Select labels and bus entries that are connected to a wire being moved.
|
||||
if( aSourceItem->Type() == SCH_LINE_T )
|
||||
if( aItem->Type() == SCH_LINE_T )
|
||||
{
|
||||
std::vector<wxPoint> connections;
|
||||
item->GetConnectionPoints( connections );
|
||||
test->GetConnectionPoints( connections );
|
||||
|
||||
for( wxPoint& point : connections )
|
||||
{
|
||||
if( aSourceItem->HitTest( point ) )
|
||||
doSelect = true;
|
||||
if( aItem->HitTest( point ) )
|
||||
aList.push_back( test );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if( doSelect )
|
||||
{
|
||||
m_selectionTool->AddItemToSel( item, true /*quiet mode*/ );
|
||||
saveCopyInUndoList( item, UR_CHANGED, true );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -869,17 +869,13 @@ void SCH_EDIT_TOOL::moveItem( SCH_ITEM* aItem, VECTOR2I aDelta, bool isDrag )
|
|||
switch( aItem->Type() )
|
||||
{
|
||||
case SCH_LINE_T:
|
||||
{
|
||||
SCH_LINE* line = (SCH_LINE*) aItem;
|
||||
if( aItem->GetFlags() & STARTPOINT )
|
||||
static_cast<SCH_LINE*>( aItem )->MoveStart( (wxPoint) aDelta );
|
||||
|
||||
if( aItem->GetFlags() & ENDPOINT )
|
||||
static_cast<SCH_LINE*>( aItem )->MoveEnd( (wxPoint) aDelta );
|
||||
|
||||
if( isDrag && ( line->GetFlags() & STARTPOINT ) )
|
||||
line->MoveEnd( (wxPoint)aDelta );
|
||||
else if( isDrag && ( line->GetFlags() & ENDPOINT ) )
|
||||
line->MoveStart( (wxPoint)aDelta );
|
||||
else
|
||||
line->Move( (wxPoint)aDelta );
|
||||
break;
|
||||
}
|
||||
|
||||
case SCH_PIN_T:
|
||||
case SCH_FIELD_T:
|
||||
|
@ -887,7 +883,7 @@ void SCH_EDIT_TOOL::moveItem( SCH_ITEM* aItem, VECTOR2I aDelta, bool isDrag )
|
|||
break;
|
||||
|
||||
default:
|
||||
aItem->Move( (wxPoint)aDelta );
|
||||
aItem->Move( (wxPoint) aDelta );
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1027,7 +1023,20 @@ int SCH_EDIT_TOOL::Rotate( const TOOL_EVENT& aEvent )
|
|||
if( !moving )
|
||||
saveCopyInUndoList( item, UR_CHANGED, ii > 0 );
|
||||
|
||||
item->Rotate( rotPoint );
|
||||
if( item->Type() == SCH_LINE_T )
|
||||
{
|
||||
SCH_LINE* line = (SCH_LINE*) item;
|
||||
|
||||
if( item->GetFlags() & STARTPOINT )
|
||||
line->RotateStart( rotPoint );
|
||||
|
||||
if( item->GetFlags() & ENDPOINT )
|
||||
line->RotateEnd( rotPoint );
|
||||
}
|
||||
else
|
||||
{
|
||||
item->Rotate( rotPoint );
|
||||
}
|
||||
|
||||
connections |= item->IsConnectable();
|
||||
m_frame->RefreshItem( item );
|
||||
|
@ -1217,7 +1226,7 @@ int SCH_EDIT_TOOL::Duplicate( const TOOL_EVENT& aEvent )
|
|||
if( selection.Front()->IsNew() )
|
||||
return 0;
|
||||
|
||||
std::vector<SCH_ITEM*> newItems;
|
||||
EDA_ITEMS newItems;
|
||||
|
||||
// Keep track of existing sheet paths. Duplicating a selection can modify this list
|
||||
bool copiedSheets = false;
|
||||
|
|
|
@ -86,10 +86,10 @@ public:
|
|||
private:
|
||||
void moveItem( SCH_ITEM* aItem, VECTOR2I aDelta, bool isDrag );
|
||||
|
||||
///> Selects additional items for a drag operation.
|
||||
///> Connected items with no wire are selected (as there is no wire to adjust for the drag).
|
||||
///> Connected wires are selected with any un-connected ends flagged (STARTPOINT or ENDPOINT).
|
||||
void selectConnectedDragItems( SCH_ITEM* aSourceItem, wxPoint aPoint );
|
||||
///> Finds additional items for a drag operation.
|
||||
///> Connected items with no wire are included (as there is no wire to adjust for the drag).
|
||||
///> Connected wires are included with any un-connected ends flagged (STARTPOINT or ENDPOINT).
|
||||
void getConnectedDragItems( SCH_ITEM* aItem, wxPoint aPoint, EDA_ITEMS& aList );
|
||||
|
||||
///> Returns the right modification point (e.g. for rotation), depending on the number of
|
||||
///> selected items.
|
||||
|
@ -118,7 +118,7 @@ private:
|
|||
bool m_moveInProgress;
|
||||
|
||||
///> Used for chaining commands
|
||||
VECTOR2I m_totalMovement;
|
||||
VECTOR2I m_moveOffset;
|
||||
|
||||
///> Last cursor position (needed for getModificationPoint() to avoid changes
|
||||
///> of edit reference point).
|
||||
|
|
|
@ -573,7 +573,7 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
|
|||
// SCH_LEGACY_PLUGIN added the items to the DLIST, but not to the view or anything
|
||||
// else. Pull them back out to start with.
|
||||
//
|
||||
std::vector<SCH_ITEM*> loadedItems;
|
||||
EDA_ITEMS loadedItems;
|
||||
SCH_ITEM* next = nullptr;
|
||||
|
||||
// We also make sure any pasted sheets will not cause recursion in the destination.
|
||||
|
@ -646,7 +646,7 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
|
|||
|
||||
for( int i = 0; i < loadedItems.size(); ++i )
|
||||
{
|
||||
SCH_ITEM* item = loadedItems[i];
|
||||
EDA_ITEM* item = loadedItems[i];
|
||||
|
||||
if( item->Type() == SCH_COMPONENT_T )
|
||||
{
|
||||
|
@ -660,7 +660,7 @@ int SCH_EDITOR_CONTROL::Paste( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
item->SetFlags( IS_NEW | IS_MOVED );
|
||||
m_frame->AddItemToScreenAndUndoList( item, i > 0 );
|
||||
m_frame->AddItemToScreenAndUndoList( (SCH_ITEM*) item, i > 0 );
|
||||
}
|
||||
|
||||
if( sheetsPasted )
|
||||
|
|
|
@ -659,22 +659,6 @@ int SCH_SELECTION_TOOL::SelectConnection( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
|
||||
int SCH_SELECTION_TOOL::AddItemsToSel( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
std::vector<SCH_ITEM*>* items = aEvent.Parameter<std::vector<SCH_ITEM*>*>();
|
||||
|
||||
if( items )
|
||||
{
|
||||
for( SCH_ITEM* item : *items )
|
||||
select( item );
|
||||
|
||||
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int SCH_SELECTION_TOOL::AddItemToSel( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
AddItemToSel( aEvent.Parameter<SCH_ITEM*>() );
|
||||
|
@ -682,7 +666,7 @@ int SCH_SELECTION_TOOL::AddItemToSel( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::AddItemToSel( SCH_ITEM* aItem, bool aQuietMode )
|
||||
void SCH_SELECTION_TOOL::AddItemToSel( EDA_ITEM* aItem, bool aQuietMode )
|
||||
{
|
||||
if( aItem )
|
||||
{
|
||||
|
@ -695,22 +679,27 @@ void SCH_SELECTION_TOOL::AddItemToSel( SCH_ITEM* aItem, bool aQuietMode )
|
|||
}
|
||||
|
||||
|
||||
int SCH_SELECTION_TOOL::RemoveItemsFromSel( const TOOL_EVENT& aEvent )
|
||||
int SCH_SELECTION_TOOL::AddItemsToSel( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
std::vector<SCH_ITEM*>* items = aEvent.Parameter<std::vector<SCH_ITEM*>*>();
|
||||
|
||||
if( items )
|
||||
{
|
||||
for( SCH_ITEM* item : *items )
|
||||
unselect( item );
|
||||
|
||||
m_toolMgr->ProcessEvent( EVENTS::UnselectedEvent );
|
||||
}
|
||||
|
||||
AddItemsToSel( aEvent.Parameter<EDA_ITEMS*>(), false );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::AddItemsToSel( EDA_ITEMS* aList, bool aQuietMode )
|
||||
{
|
||||
if( aList )
|
||||
{
|
||||
for( EDA_ITEM* item : *aList )
|
||||
select( item );
|
||||
|
||||
// Inform other potentially interested tools
|
||||
if( !aQuietMode )
|
||||
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int SCH_SELECTION_TOOL::RemoveItemFromSel( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
RemoveItemFromSel( aEvent.Parameter<SCH_ITEM*>() );
|
||||
|
@ -718,7 +707,7 @@ int SCH_SELECTION_TOOL::RemoveItemFromSel( const TOOL_EVENT& aEvent )
|
|||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::RemoveItemFromSel( SCH_ITEM* aItem, bool aQuietMode )
|
||||
void SCH_SELECTION_TOOL::RemoveItemFromSel( EDA_ITEM* aItem, bool aQuietMode )
|
||||
{
|
||||
if( aItem )
|
||||
{
|
||||
|
@ -731,6 +720,27 @@ void SCH_SELECTION_TOOL::RemoveItemFromSel( SCH_ITEM* aItem, bool aQuietMode )
|
|||
}
|
||||
|
||||
|
||||
int SCH_SELECTION_TOOL::RemoveItemsFromSel( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
RemoveItemsFromSel( aEvent.Parameter<EDA_ITEMS*>(), false );
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::RemoveItemsFromSel( EDA_ITEMS* aList, bool aQuietMode )
|
||||
{
|
||||
if( aList )
|
||||
{
|
||||
for( EDA_ITEM* item : *aList )
|
||||
unselect( item );
|
||||
|
||||
// Inform other potentially interested tools
|
||||
if( !aQuietMode )
|
||||
m_toolMgr->ProcessEvent( EVENTS::UnselectedEvent );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int SCH_SELECTION_TOOL::ClearSelection( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
clearSelection();
|
||||
|
@ -830,7 +840,7 @@ bool SCH_SELECTION_TOOL::doSelectionMenu( SCH_COLLECTOR* aCollector )
|
|||
}
|
||||
|
||||
|
||||
bool SCH_SELECTION_TOOL::selectable( const SCH_ITEM* aItem, bool checkVisibilityOnly ) const
|
||||
bool SCH_SELECTION_TOOL::selectable( const EDA_ITEM* aItem, bool checkVisibilityOnly ) const
|
||||
{
|
||||
// NOTE: in the future this is where eeschema layer/itemtype visibility will be handled
|
||||
|
||||
|
@ -873,7 +883,7 @@ void SCH_SELECTION_TOOL::clearSelection()
|
|||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::toggleSelection( SCH_ITEM* aItem, bool aForce )
|
||||
void SCH_SELECTION_TOOL::toggleSelection( EDA_ITEM* aItem, bool aForce )
|
||||
{
|
||||
if( aItem->IsSelected() )
|
||||
{
|
||||
|
@ -902,19 +912,19 @@ void SCH_SELECTION_TOOL::toggleSelection( SCH_ITEM* aItem, bool aForce )
|
|||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::select( SCH_ITEM* aItem )
|
||||
void SCH_SELECTION_TOOL::select( EDA_ITEM* aItem )
|
||||
{
|
||||
highlight( aItem, SELECTED, &m_selection );
|
||||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::unselect( SCH_ITEM* aItem )
|
||||
void SCH_SELECTION_TOOL::unselect( EDA_ITEM* aItem )
|
||||
{
|
||||
unhighlight( aItem, SELECTED, &m_selection );
|
||||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::highlight( SCH_ITEM* aItem, int aMode, SELECTION* aGroup )
|
||||
void SCH_SELECTION_TOOL::highlight( EDA_ITEM* aItem, int aMode, SELECTION* aGroup )
|
||||
{
|
||||
if( aMode == SELECTED )
|
||||
aItem->SetSelected();
|
||||
|
@ -969,7 +979,7 @@ void SCH_SELECTION_TOOL::highlight( SCH_ITEM* aItem, int aMode, SELECTION* aGrou
|
|||
}
|
||||
|
||||
|
||||
void SCH_SELECTION_TOOL::unhighlight( SCH_ITEM* aItem, int aMode, SELECTION* aGroup )
|
||||
void SCH_SELECTION_TOOL::unhighlight( EDA_ITEM* aItem, int aMode, SELECTION* aGroup )
|
||||
{
|
||||
if( aMode == SELECTED )
|
||||
aItem->ClearSelected();
|
||||
|
|
|
@ -105,12 +105,14 @@ public:
|
|||
bool* aSelectionCancelledFlag = NULL, bool aCheckLocked = false );
|
||||
|
||||
int AddItemToSel( const TOOL_EVENT& aEvent );
|
||||
void AddItemToSel( SCH_ITEM* aItem, bool aQuietMode = false );
|
||||
void AddItemToSel( EDA_ITEM* aItem, bool aQuietMode = false );
|
||||
int AddItemsToSel( const TOOL_EVENT& aEvent );
|
||||
void AddItemsToSel( EDA_ITEMS* aList, bool aQuietMode = false );
|
||||
|
||||
int RemoveItemFromSel( const TOOL_EVENT& aEvent );
|
||||
void RemoveItemFromSel( SCH_ITEM* aItem, bool aQuietMode = false );
|
||||
void RemoveItemFromSel( EDA_ITEM* aItem, bool aQuietMode = false );
|
||||
int RemoveItemsFromSel( const TOOL_EVENT& aEvent );
|
||||
void RemoveItemsFromSel( EDA_ITEMS* aList, bool aQuietMode = false );
|
||||
|
||||
///> Find (but don't select) node under cursor
|
||||
SCH_ITEM* GetNode( VECTOR2I aPosition );
|
||||
|
@ -170,7 +172,7 @@ private:
|
|||
* @param aItem is the item to have selection status changed.
|
||||
* @param aForce causes the toggle to happen without checking selectability
|
||||
*/
|
||||
void toggleSelection( SCH_ITEM* aItem, bool aForce = false );
|
||||
void toggleSelection( EDA_ITEM* aItem, bool aForce = false );
|
||||
|
||||
/**
|
||||
* Function selectable()
|
||||
|
@ -178,7 +180,7 @@ private:
|
|||
*
|
||||
* @return True if the item fulfills conditions to be selected.
|
||||
*/
|
||||
bool selectable( const SCH_ITEM* aItem, bool checkVisibilityOnly = false ) const;
|
||||
bool selectable( const EDA_ITEM* aItem, bool checkVisibilityOnly = false ) const;
|
||||
|
||||
/**
|
||||
* Function select()
|
||||
|
@ -186,7 +188,7 @@ private:
|
|||
*
|
||||
* @param aItem is an item to be selected.
|
||||
*/
|
||||
void select( SCH_ITEM* aItem );
|
||||
void select( EDA_ITEM* aItem );
|
||||
|
||||
/**
|
||||
* Function unselect()
|
||||
|
@ -194,7 +196,7 @@ private:
|
|||
*
|
||||
* @param aItem is an item to be unselected.
|
||||
*/
|
||||
void unselect( SCH_ITEM* aItem );
|
||||
void unselect( EDA_ITEM* aItem );
|
||||
|
||||
/**
|
||||
* Function highlight()
|
||||
|
@ -203,7 +205,7 @@ private:
|
|||
* @param aHighlightMode should be either SELECTED or BRIGHTENED
|
||||
* @param aGroup is the group to add the item to in the BRIGHTENED mode.
|
||||
*/
|
||||
void highlight( SCH_ITEM* aItem, int aHighlightMode, SELECTION* aGroup = nullptr );
|
||||
void highlight( EDA_ITEM* aItem, int aHighlightMode, SELECTION* aGroup = nullptr );
|
||||
|
||||
/**
|
||||
* Function unhighlight()
|
||||
|
@ -212,7 +214,7 @@ private:
|
|||
* @param aHighlightMode should be either SELECTED or BRIGHTENED
|
||||
* @param aGroup is the group to remove the item from.
|
||||
*/
|
||||
void unhighlight( SCH_ITEM* aItem, int aHighlightMode, SELECTION* aGroup = nullptr );
|
||||
void unhighlight( EDA_ITEM* aItem, int aHighlightMode, SELECTION* aGroup = nullptr );
|
||||
|
||||
/**
|
||||
* Function selectionContains()
|
||||
|
|
Loading…
Reference in New Issue