More robust solution for adding dragged items to selection.
Fixes: lp:1839780 * https://bugs.launchpad.net/kicad/+bug/1839780
This commit is contained in:
parent
2274895acf
commit
bc450853ae
|
@ -82,8 +82,6 @@ bool SCH_MOVE_TOOL::Init()
|
||||||
- add preferences option "Drag always selects"
|
- add preferences option "Drag always selects"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define STD_VECTOR_REMOVE( v, item ) v.erase( std::remove( v.begin(), v.end(), item ), v.end() )
|
|
||||||
|
|
||||||
|
|
||||||
int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
|
@ -185,8 +183,10 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
//
|
//
|
||||||
for( SCH_ITEM* it = m_frame->GetScreen()->GetDrawItems(); it; it = it->Next() )
|
for( SCH_ITEM* it = m_frame->GetScreen()->GetDrawItems(); it; it = it->Next() )
|
||||||
{
|
{
|
||||||
|
it->ClearFlags(TEMP_SELECTED );
|
||||||
|
|
||||||
if( !it->IsSelected() )
|
if( !it->IsSelected() )
|
||||||
it->ClearFlags( STARTPOINT | ENDPOINT | SELECTEDNODE );
|
it->ClearFlags( STARTPOINT | ENDPOINT );
|
||||||
|
|
||||||
if( !selection.IsHover() && it->IsSelected() )
|
if( !selection.IsHover() && it->IsSelected() )
|
||||||
it->SetFlags( STARTPOINT | ENDPOINT );
|
it->SetFlags( STARTPOINT | ENDPOINT );
|
||||||
|
@ -232,11 +232,10 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
if( item->IsNew() )
|
if( item->IsNew() )
|
||||||
{
|
{
|
||||||
if( item->HasFlag( SELECTEDNODE ) && m_isDragOperation )
|
if( item->HasFlag(TEMP_SELECTED ) && m_isDragOperation )
|
||||||
{
|
{
|
||||||
// Item was added in getConnectedDragItems
|
// Item was added in getConnectedDragItems
|
||||||
saveCopyInUndoList( (SCH_ITEM*) item, UR_NEW, appendUndo );
|
saveCopyInUndoList( (SCH_ITEM*) item, UR_NEW, appendUndo );
|
||||||
STD_VECTOR_REMOVE( m_dragAdditions, item );
|
|
||||||
appendUndo = true;
|
appendUndo = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -433,11 +432,6 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
if( restore_state )
|
if( restore_state )
|
||||||
{
|
{
|
||||||
m_frame->RollbackSchematicFromUndo();
|
m_frame->RollbackSchematicFromUndo();
|
||||||
|
|
||||||
if( unselect )
|
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
|
||||||
else
|
|
||||||
m_toolMgr->ProcessEvent( EVENTS::SelectedEvent );
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -445,14 +439,24 @@ int SCH_MOVE_TOOL::Main( const TOOL_EVENT& aEvent )
|
||||||
m_frame->SchematicCleanUp();
|
m_frame->SchematicCleanUp();
|
||||||
m_frame->TestDanglingEnds();
|
m_frame->TestDanglingEnds();
|
||||||
|
|
||||||
if( unselect )
|
|
||||||
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
|
||||||
else
|
|
||||||
m_selectionTool->RemoveItemsFromSel( &m_dragAdditions, QUIET_MODE );
|
|
||||||
|
|
||||||
m_frame->OnModify();
|
m_frame->OnModify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( unselect )
|
||||||
|
m_toolMgr->RunAction( EE_ACTIONS::clearSelection, true );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_dragAdditions.clear();
|
||||||
|
|
||||||
|
for( SCH_ITEM* it = m_frame->GetScreen()->GetDrawItems(); it; it = it->Next() )
|
||||||
|
{
|
||||||
|
if( it->HasFlag( TEMP_SELECTED ) )
|
||||||
|
m_dragAdditions.push_back( it );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_selectionTool->RemoveItemsFromSel( &m_dragAdditions, QUIET_MODE );
|
||||||
|
}
|
||||||
|
|
||||||
m_dragAdditions.clear();
|
m_dragAdditions.clear();
|
||||||
m_moveInProgress = false;
|
m_moveInProgress = false;
|
||||||
m_frame->PopTool( tool );
|
m_frame->PopTool( tool );
|
||||||
|
@ -477,17 +481,17 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, wxPoint aPoi
|
||||||
|
|
||||||
if( testLine->GetStartPoint() == aPoint )
|
if( testLine->GetStartPoint() == aPoint )
|
||||||
{
|
{
|
||||||
if( !testLine->HasFlag( SELECTEDNODE ) )
|
if( !testLine->HasFlag(TEMP_SELECTED ) )
|
||||||
aList.push_back( testLine );
|
aList.push_back( testLine );
|
||||||
|
|
||||||
testLine->SetFlags( STARTPOINT | SELECTEDNODE );
|
testLine->SetFlags(STARTPOINT | TEMP_SELECTED );
|
||||||
}
|
}
|
||||||
else if( testLine->GetEndPoint() == aPoint )
|
else if( testLine->GetEndPoint() == aPoint )
|
||||||
{
|
{
|
||||||
if( !testLine->HasFlag( SELECTEDNODE ) )
|
if( !testLine->HasFlag(TEMP_SELECTED ) )
|
||||||
aList.push_back( testLine );
|
aList.push_back( testLine );
|
||||||
|
|
||||||
testLine->SetFlags( ENDPOINT | SELECTEDNODE );
|
testLine->SetFlags(ENDPOINT | TEMP_SELECTED );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -506,7 +510,7 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, wxPoint aPoi
|
||||||
newWire->SetFlags( IS_NEW );
|
newWire->SetFlags( IS_NEW );
|
||||||
m_frame->AddToScreen( newWire, m_frame->GetScreen() );
|
m_frame->AddToScreen( newWire, m_frame->GetScreen() );
|
||||||
|
|
||||||
newWire->SetFlags( SELECTEDNODE | STARTPOINT );
|
newWire->SetFlags(TEMP_SELECTED | STARTPOINT );
|
||||||
aList.push_back( newWire );
|
aList.push_back( newWire );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -514,8 +518,11 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, wxPoint aPoi
|
||||||
case SCH_NO_CONNECT_T:
|
case SCH_NO_CONNECT_T:
|
||||||
case SCH_JUNCTION_T:
|
case SCH_JUNCTION_T:
|
||||||
// Select no-connects and junctions that are connected to items being moved.
|
// Select no-connects and junctions that are connected to items being moved.
|
||||||
if( test->IsConnected( aPoint ) )
|
if( !test->HasFlag(TEMP_SELECTED ) && test->IsConnected( aPoint ) )
|
||||||
|
{
|
||||||
aList.push_back( test );
|
aList.push_back( test );
|
||||||
|
test->SetFlags(TEMP_SELECTED );
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -525,7 +532,7 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, wxPoint aPoi
|
||||||
case SCH_BUS_WIRE_ENTRY_T:
|
case SCH_BUS_WIRE_ENTRY_T:
|
||||||
case SCH_BUS_BUS_ENTRY_T:
|
case SCH_BUS_BUS_ENTRY_T:
|
||||||
// Select labels and bus entries that are connected to a wire being moved.
|
// Select labels and bus entries that are connected to a wire being moved.
|
||||||
if( aOriginalItem->Type() == SCH_LINE_T )
|
if( !test->HasFlag(TEMP_SELECTED ) && aOriginalItem->Type() == SCH_LINE_T )
|
||||||
{
|
{
|
||||||
std::vector<wxPoint> connections;
|
std::vector<wxPoint> connections;
|
||||||
test->GetConnectionPoints( connections );
|
test->GetConnectionPoints( connections );
|
||||||
|
@ -533,7 +540,11 @@ void SCH_MOVE_TOOL::getConnectedDragItems( SCH_ITEM* aOriginalItem, wxPoint aPoi
|
||||||
for( wxPoint& point : connections )
|
for( wxPoint& point : connections )
|
||||||
{
|
{
|
||||||
if( aOriginalItem->HitTest( point ) )
|
if( aOriginalItem->HitTest( point ) )
|
||||||
|
{
|
||||||
|
test->SetFlags(TEMP_SELECTED );
|
||||||
aList.push_back( test );
|
aList.push_back( test );
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -125,7 +125,7 @@ typedef const INSPECTOR_FUNC& INSPECTOR; /// std::function passed to nested u
|
||||||
#define STARTPOINT (1 << 9) ///< When a line is selected, these flags indicate which
|
#define STARTPOINT (1 << 9) ///< When a line is selected, these flags indicate which
|
||||||
#define ENDPOINT (1 << 10) ///< ends. (Used to support dragging.)
|
#define ENDPOINT (1 << 10) ///< ends. (Used to support dragging.)
|
||||||
#define SELECTED (1 << 11)
|
#define SELECTED (1 << 11)
|
||||||
#define SELECTEDNODE (1 << 12) ///< flag indicating that the structure has already selected
|
#define TEMP_SELECTED (1 << 12) ///< flag indicating that the structure has already selected
|
||||||
#define STRUCT_DELETED (1 << 13) ///< flag indication structures to be erased
|
#define STRUCT_DELETED (1 << 13) ///< flag indication structures to be erased
|
||||||
#define CANDIDATE (1 << 14) ///< flag indicating that the structure is connected
|
#define CANDIDATE (1 << 14) ///< flag indicating that the structure is connected
|
||||||
#define SKIP_STRUCT (1 << 15) ///< flag indicating that the structure should be ignored
|
#define SKIP_STRUCT (1 << 15) ///< flag indicating that the structure should be ignored
|
||||||
|
|
Loading…
Reference in New Issue