diff --git a/eeschema/eeschema_id.h b/eeschema/eeschema_id.h index 4f25dd9b0f..1642416b0e 100644 --- a/eeschema/eeschema_id.h +++ b/eeschema/eeschema_id.h @@ -128,10 +128,7 @@ enum id_eeschema_frm ID_TB_OPTIONS_BUS_WIRES_ORIENT, /* Schematic editor context menu IDs. */ - ID_POPUP_SCH_DUPLICATE, - ID_POPUP_START_RANGE, - ID_POPUP_SCH_DELETE, ID_POPUP_SCH_BREAK_WIRE, ID_POPUP_SCH_BEGIN_WIRE, ID_POPUP_SCH_BEGIN_BUS, @@ -197,8 +194,10 @@ enum id_eeschema_frm ID_SCH_EDIT_COMPONENT_VALUE, ID_SCH_EDIT_COMPONENT_REFERENCE, ID_SCH_EDIT_COMPONENT_FOOTPRINT, - ID_SCH_MOVE_ITEM, - ID_SCH_DRAG_ITEM, + ID_SCH_MOVE, + ID_SCH_DRAG, + ID_SCH_DUPLICATE, + ID_SCH_DELETE, ID_SCH_UNFOLD_BUS, ID_AUTOPLACE_FIELDS, diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index cca07135e0..982410ade2 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -175,12 +175,12 @@ static EDA_HOTKEY HkEditComponentWithLibedit( _HKI( "Edit with Symbol Editor" ), ID_POPUP_SCH_CALL_LIBEDIT_AND_LOAD_CMP ); static EDA_HOTKEY HkMove( _HKI( "Move Schematic Item" ), HK_MOVE_COMPONENT_OR_ITEM, 'M', - ID_SCH_MOVE_ITEM ); + ID_SCH_MOVE ); static EDA_HOTKEY HkDuplicateItem( _HKI( "Duplicate" ), HK_DUPLICATE, 'D' + GR_KB_CTRL, - ID_POPUP_SCH_DUPLICATE ); + ID_SCH_DUPLICATE ); -static EDA_HOTKEY HkDrag( _HKI( "Drag Item" ), HK_DRAG, 'G', ID_SCH_DRAG_ITEM ); +static EDA_HOTKEY HkDrag( _HKI( "Drag Item" ), HK_DRAG, 'G', ID_SCH_DRAG ); static EDA_HOTKEY HkMove2Drag( _HKI( "Move Block -> Drag Block" ), HK_MOVEBLOCK_TO_DRAGBLOCK, '\t', ID_POPUP_DRAG_BLOCK ); static EDA_HOTKEY HkInsert( _HKI( "Repeat Last Item" ), HK_REPEAT_LAST, WXK_INSERT ); diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index 96f16b8866..3ba3d2a606 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -229,7 +229,7 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) switch( item->Type() ) { case SCH_NO_CONNECT_T: - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, _( "Delete No Connect" ), + AddMenuItem( PopMenu, ID_SCH_DELETE, _( "Delete No Connect" ), KiBitmap( delete_xpm ) ); break; @@ -292,7 +292,7 @@ bool SCH_EDIT_FRAME::OnRightClick( const wxPoint& aPosition, wxMenu* PopMenu ) AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, _( "Edit..." ), KiBitmap( edit_xpm ) ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, _( "Delete Drawing" ), + AddMenuItem( PopMenu, ID_SCH_DELETE, _( "Delete Drawing" ), KiBitmap( delete_xpm ) ); break; } @@ -332,7 +332,7 @@ void AddMenusForComponentField( wxMenu* PopMenu, SCH_FIELD* Field ) } msg = AddHotkeyName( name, g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); } switch( Field->GetId() ) @@ -390,9 +390,9 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL_LIB { msg.Printf( _( "Move %s" ), Component->GetField( REFERENCE )->GetText() ); msg = AddHotkeyName( msg, g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); msg = AddHotkeyName( _( "Drag" ), g_Schematic_Hotkeys_Descr, HK_DRAG ); - AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( drag_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DRAG, msg, KiBitmap( drag_xpm ) ); } wxMenu* orientmenu = new wxMenu; @@ -417,7 +417,7 @@ void AddMenusForComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, SYMBOL_LIB { msg = AddHotkeyName( _( "Duplicate" ), g_Schematic_Hotkeys_Descr, HK_DUPLICATE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE_CMP, msg, KiBitmap( delete_xpm ) ); } @@ -532,13 +532,13 @@ void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel ) { msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); msg = AddHotkeyName( _( "Drag" ), g_Schematic_Hotkeys_Descr, HK_DRAG ); - AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( drag_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DRAG, msg, KiBitmap( drag_xpm ) ); msg = AddHotkeyName( _( "Duplicate" ), g_Schematic_Hotkeys_Descr, HK_DUPLICATE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); } msg = AddHotkeyName( _( "Rotate Clockwise" ), g_Schematic_Hotkeys_Descr, HK_ROTATE ); @@ -546,7 +546,7 @@ void AddMenusForGLabel( wxMenu* PopMenu, SCH_GLOBALLABEL* GLabel ) msg = AddHotkeyName( _( "Edit..." ), g_Schematic_Hotkeys_Descr, HK_EDIT ); AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); // add menu change type text (to label, glabel, text): AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL, @@ -569,12 +569,12 @@ void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel ) { msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); msg = AddHotkeyName( _( "Drag" ), g_Schematic_Hotkeys_Descr, HK_DRAG ); - AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( drag_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DRAG, msg, KiBitmap( drag_xpm ) ); msg = AddHotkeyName( _( "Copy" ), g_Schematic_Hotkeys_Descr, HK_DUPLICATE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DUPLICATE, msg, KiBitmap( copy_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DUPLICATE, msg, KiBitmap( copy_xpm ) ); } msg = AddHotkeyName( _( "Rotate Clockwise" ), g_Schematic_Hotkeys_Descr, HK_ROTATE ); @@ -582,7 +582,7 @@ void AddMenusForHLabel( wxMenu* PopMenu, SCH_HIERLABEL* HLabel ) msg = AddHotkeyName( _( "Edit..." ), g_Schematic_Hotkeys_Descr, HK_EDIT ); AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); // add menu change type text (to label, glabel, text): AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL, @@ -604,11 +604,11 @@ void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ) if( !Label->GetEditFlags() ) { msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); msg = AddHotkeyName( _( "Drag" ), g_Schematic_Hotkeys_Descr, HK_DRAG ); - AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( drag_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DRAG, msg, KiBitmap( drag_xpm ) ); msg = AddHotkeyName( _( "Duplicate" ), g_Schematic_Hotkeys_Descr, HK_DUPLICATE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); } msg = AddHotkeyName( _( "Rotate Counterclockwise" ), g_Schematic_Hotkeys_Descr, HK_ROTATE ); @@ -616,7 +616,7 @@ void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ) msg = AddHotkeyName( _( "Edit..." ), g_Schematic_Hotkeys_Descr, HK_EDIT ); AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); // add menu change type text (to label, glabel, text): AddMenuItem( menu_change_type, ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL, @@ -638,9 +638,9 @@ void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ) if( !Text->GetEditFlags() ) { msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); msg = AddHotkeyName( _( "Duplicate" ), g_Schematic_Hotkeys_Descr, HK_DUPLICATE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DUPLICATE, msg, KiBitmap( duplicate_xpm ) ); } msg = AddHotkeyName( _( "Rotate Counterclockwise" ), g_Schematic_Hotkeys_Descr, HK_ROTATE ); @@ -648,7 +648,7 @@ void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ) msg = AddHotkeyName( _( "Edit..." ), g_Schematic_Hotkeys_Descr, HK_EDIT ); AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_text_xpm ) ); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); /* add menu change type text (to label, glabel, text), * but only if this is a single line text @@ -673,12 +673,12 @@ void SCH_EDIT_FRAME::addJunctionMenuEntries( wxMenu* aMenu, SCH_JUNCTION* aJunct SCH_SCREEN* screen = GetScreen(); msg = AddHotkeyName( _( "Delete Junction" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( aMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( aMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); if( !aJunction->IsNew() ) { if( m_collectedItems.IsDraggableJunction() ) - AddMenuItem( aMenu, ID_SCH_DRAG_ITEM, _( "Drag Junction" ), KiBitmap( drag_xpm ) ); + AddMenuItem( aMenu, ID_SCH_DRAG, _( "Drag Junction" ), KiBitmap( drag_xpm ) ); if( screen->GetWire( aJunction->GetPosition(), EXCLUDE_END_POINTS_T ) ) AddMenuItem( aMenu, ID_POPUP_SCH_BREAK_WIRE, _( "Break Wire" ), @@ -716,10 +716,10 @@ void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, SCH_EDIT_FRAME* frame ) } msg = AddHotkeyName( _( "Drag Wire" ), g_Schematic_Hotkeys_Descr, HK_DRAG ); - AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( drag_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DRAG, msg, KiBitmap( drag_xpm ) ); PopMenu->AppendSeparator(); msg = AddHotkeyName( _( "Delete Wire" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE_NODE, _( "Delete Node" ), KiBitmap( delete_node_xpm ) ); AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE_CONNECTION, _( "Delete Connection" ), @@ -766,7 +766,7 @@ void AddMenusForBus( wxMenu* PopMenu, SCH_LINE* Bus, SCH_EDIT_FRAME* frame ) } msg = AddHotkeyName( _( "Delete Bus" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_bus_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_bus_xpm ) ); AddMenuItem( PopMenu, ID_POPUP_SCH_BREAK_WIRE, _( "Break Bus" ), KiBitmap( break_bus_xpm ) ); @@ -812,10 +812,10 @@ void AddMenusForHierchicalSheet( wxMenu* PopMenu, SCH_SHEET* Sheet ) PopMenu->AppendSeparator(); msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); msg = AddHotkeyName( _( "Drag" ), g_Schematic_Hotkeys_Descr, HK_DRAG ); - AddMenuItem( PopMenu, ID_SCH_DRAG_ITEM, msg, KiBitmap( drag_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DRAG, msg, KiBitmap( drag_xpm ) ); PopMenu->AppendSeparator(); msg = AddHotkeyName( _( "Select Items On PCB" ), g_Schematic_Hotkeys_Descr, @@ -862,7 +862,7 @@ void AddMenusForHierchicalSheet( wxMenu* PopMenu, SCH_SHEET* Sheet ) PopMenu->AppendSeparator(); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_sheet_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_sheet_xpm ) ); } } @@ -874,13 +874,13 @@ void AddMenusForSheetPin( wxMenu* PopMenu, SCH_SHEET_PIN* PinSheet ) if( !PinSheet->GetEditFlags() ) { msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( PopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); } AddMenuItem( PopMenu, ID_SCH_EDIT_ITEM, _( "Edit..." ), KiBitmap( edit_xpm ) ); if( !PinSheet->GetEditFlags() ) - AddMenuItem( PopMenu, ID_POPUP_SCH_DELETE, _( "Delete" ), KiBitmap( delete_xpm ) ); + AddMenuItem( PopMenu, ID_SCH_DELETE, _( "Delete" ), KiBitmap( delete_xpm ) ); } @@ -936,7 +936,7 @@ void AddMenusForBlock( wxMenu* PopMenu, SCH_EDIT_FRAME* frame ) void AddMenusForMarkers( wxMenu* aPopMenu, SCH_MARKER* aMarker, SCH_EDIT_FRAME* aFrame ) { - AddMenuItem( aPopMenu, ID_POPUP_SCH_DELETE, _( "Delete Marker" ), KiBitmap( delete_xpm ) ); + AddMenuItem( aPopMenu, ID_SCH_DELETE, _( "Delete Marker" ), KiBitmap( delete_xpm ) ); AddMenuItem( aPopMenu, ID_POPUP_SCH_GETINFO_MARKER, _( "Marker Error Info" ), KiBitmap( info_xpm ) ); } @@ -950,7 +950,7 @@ void AddMenusForBitmap( wxMenu* aPopMenu, SCH_BITMAP * aBitmap ) { msg = AddHotkeyName( _( "Move" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( aPopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( aPopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); } msg = AddHotkeyName( _( "Rotate Counterclockwise" ), g_Schematic_Hotkeys_Descr, HK_ROTATE ); @@ -968,7 +968,7 @@ void AddMenusForBitmap( wxMenu* aPopMenu, SCH_BITMAP * aBitmap ) { aPopMenu->AppendSeparator(); msg = AddHotkeyName( _( "Delete" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( aPopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( aPopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); } } @@ -981,7 +981,7 @@ void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY_BASE* aBusEntry ) { msg = AddHotkeyName( _( "Move Bus Entry" ), g_Schematic_Hotkeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); - AddMenuItem( aPopMenu, ID_SCH_MOVE_ITEM, msg, KiBitmap( move_xpm ) ); + AddMenuItem( aPopMenu, ID_SCH_MOVE, msg, KiBitmap( move_xpm ) ); } if( aBusEntry->GetBusEntryShape() == '\\' ) @@ -992,5 +992,5 @@ void AddMenusForBusEntry( wxMenu* aPopMenu, SCH_BUS_ENTRY_BASE* aBusEntry ) _( "Set Bus Entry Shape \\" ), KiBitmap( change_entry_orient_xpm ) ); msg = AddHotkeyName( _( "Delete Bus Entry" ), g_Schematic_Hotkeys_Descr, HK_DELETE ); - AddMenuItem( aPopMenu, ID_POPUP_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); + AddMenuItem( aPopMenu, ID_SCH_DELETE, msg, KiBitmap( delete_xpm ) ); } diff --git a/eeschema/sch_collectors.cpp b/eeschema/sch_collectors.cpp index 993ec6b342..adba900785 100644 --- a/eeschema/sch_collectors.cpp +++ b/eeschema/sch_collectors.cpp @@ -119,7 +119,7 @@ const KICAD_T SCH_COLLECTOR::MovableItems[] = { SCH_NO_CONNECT_T, SCH_BUS_BUS_ENTRY_T, SCH_BUS_WIRE_ENTRY_T, -// SCH_LINE_T, + SCH_LINE_T, SCH_BITMAP_T, SCH_TEXT_T, SCH_LABEL_T, diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index e5a653bc2d..bf7d852379 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -282,7 +282,6 @@ BEGIN_EVENT_TABLE( SCH_EDIT_FRAME, EDA_DRAW_FRAME ) #endif /* KICAD_SPICE */ EVT_MENU( ID_CANCEL_CURRENT_COMMAND, SCH_EDIT_FRAME::OnCancelCurrentCommand ) - EVT_MENU( ID_SCH_DRAG_ITEM, SCH_EDIT_FRAME::OnDragItem ) EVT_MENU_RANGE( ID_SCH_EDIT_ITEM, ID_SCH_EDIT_COMPONENT_FOOTPRINT, SCH_EDIT_FRAME::OnEditItem ) EVT_MENU_RANGE( ID_POPUP_START_RANGE, ID_POPUP_END_RANGE, diff --git a/eeschema/sch_edit_frame.h b/eeschema/sch_edit_frame.h index 067efebb5c..97250fa327 100644 --- a/eeschema/sch_edit_frame.h +++ b/eeschema/sch_edit_frame.h @@ -803,11 +803,6 @@ private: */ void SelectAllFromSheet( wxCommandEvent& aEvent ); - /** - * Handle the #ID_SCH_DRAG_ITEM event used to drag schematic items. - */ - void OnDragItem( wxCommandEvent& aEvent ); - /** * Handles the keyboard hotkey for unfolding a bus */ diff --git a/eeschema/sch_line.cpp b/eeschema/sch_line.cpp index 3b56abc324..69c5005607 100644 --- a/eeschema/sch_line.cpp +++ b/eeschema/sch_line.cpp @@ -327,12 +327,6 @@ void SCH_LINE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset ) wxPoint start = m_start; wxPoint end = m_end; - if( ( m_Flags & STARTPOINT ) == 0 ) - start += offset; - - if( ( m_Flags & ENDPOINT ) == 0 ) - end += offset; - GRLine( panel->GetClipBox(), DC, start.x, start.y, end.x, end.y, width, color, getwxPenStyle( (PlotDashType) GetLineStyle() ) ); } @@ -559,34 +553,6 @@ bool SCH_LINE::UpdateDanglingState( std::vector& aItemList ) } -bool SCH_LINE::IsSelectStateChanged( const wxRect& aRect ) -{ - bool previousState = IsSelected(); - - if( aRect.Contains( m_start ) && aRect.Contains( m_end ) ) - { - SetFlags( SELECTED ); - ClearFlags( STARTPOINT | ENDPOINT ); - } - else if( aRect.Contains( m_start ) ) - { - ClearFlags( STARTPOINT ); - SetFlags( SELECTED | ENDPOINT ); - } - else if( aRect.Contains( m_end ) ) - { - ClearFlags( ENDPOINT ); - SetFlags( SELECTED | STARTPOINT ); - } - else - { - ClearFlags( SELECTED | STARTPOINT | ENDPOINT ); - } - - return previousState != IsSelected(); -} - - bool SCH_LINE::IsConnectable() const { if( m_Layer == LAYER_WIRE || m_Layer == LAYER_BUS ) diff --git a/eeschema/sch_line.h b/eeschema/sch_line.h index ef155e9d4b..dea4f5cc46 100644 --- a/eeschema/sch_line.h +++ b/eeschema/sch_line.h @@ -164,8 +164,6 @@ public: bool IsDangling() const override { return m_startIsDangling || m_endIsDangling; } - bool IsSelectStateChanged( const wxRect& aRect ) override; - bool IsConnectable() const override; void GetConnectionPoints(std::vector< wxPoint >& aPoints ) const override; diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index 1b46cdef78..de5a4ca9d8 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -759,16 +759,9 @@ void SCH_SCREEN::GetHierarchicalItems( EDA_ITEMS& aItems ) } +// JEY TODO: obsolete once LibEdit is moved to modern toolset void SCH_SCREEN::SelectBlockItems() { - auto addConnections = [ this ]( SCH_ITEM* item ) -> void - { - std::vector< wxPoint > connections; - item->GetConnectionPoints( connections ); - for( auto conn : connections ) - addConnectedItemsToBlock( item, conn ); - }; - PICKED_ITEMS_LIST* pickedlist = &m_BlockLocate.GetItems(); if( pickedlist->GetCount() == 0 ) @@ -781,125 +774,6 @@ void SCH_SCREEN::SelectBlockItems() SCH_ITEM* item = (SCH_ITEM*) pickedlist->GetPickedItem( ii ); item->SetFlags( SELECTED ); } - - if( !m_BlockLocate.IsDragging() ) - return; - - // Select all the items in the screen connected to the items in the block. - // be sure end lines that are on the block limits are seen inside this block - m_BlockLocate.Inflate( 1 ); - unsigned last_select_id = pickedlist->GetCount(); - - for( unsigned ii = 0; ii < last_select_id; ii++ ) - { - SCH_ITEM* item = (SCH_ITEM*)pickedlist->GetPickedItem( ii ); - item->SetFlags( IS_DRAGGED ); - - if( item->Type() == SCH_LINE_T ) - { - item->IsSelectStateChanged( m_BlockLocate ); - - if( !item->IsSelected() ) - { // This is a special case: - // this selected wire has no ends in block. - // But it was selected (because it intersects the selecting area), - // so we must keep it selected and select items connected to it - // Note: another option could be: remove it from drag list - item->SetFlags( SELECTED | SKIP_STRUCT ); - addConnections( item ); - } - - pickedlist->SetPickerFlags( item->GetFlags(), ii ); - } - else if( item->IsConnectable() ) - { - addConnections( item ); - } - } - - // Select the items that are connected to a block object that was added - // to our selection list in the last step. - for( unsigned ii = last_select_id; ii < pickedlist->GetCount(); ii++ ) - { - SCH_ITEM* item = (SCH_ITEM*)pickedlist->GetPickedItem( ii ); - - if( item->Type() == SCH_COMPONENT_T || - item->Type() == SCH_BUS_BUS_ENTRY_T || - item->Type() == SCH_BUS_WIRE_ENTRY_T || - item->Type() == SCH_SHEET_T || - ( item->Type() == SCH_LINE_T && !( item->GetFlags() & ( ENDPOINT | STARTPOINT ) ) ) ) - { - item->SetFlags( IS_DRAGGED ); - addConnections( item ); - } - } - - m_BlockLocate.Inflate( -1 ); -} - - -void SCH_SCREEN::addConnectedItemsToBlock( const SCH_ITEM* aItem, const wxPoint& position ) -{ - SCH_ITEM* item; - ITEM_PICKER picker; - - for( item = m_drawList.begin(); item; item = item->Next() ) - { - - if( !item->IsConnectable() || ( item->GetFlags() & SKIP_STRUCT ) - || !item->CanConnect( aItem ) || item == aItem ) - continue; - - // A line having 2 ends, it can be tested twice: one time per end - if( item->Type() == SCH_LINE_T ) - { - SCH_LINE* line = (SCH_LINE*) item; - - if( !item->HitTest( position ) ) - continue; - - // First time through. Flags set to denote an end that is not moving - if( !item->IsSelected() ) - item->SetFlags( CANDIDATE | STARTPOINT | ENDPOINT ); - - if( line->GetStartPoint() == position ) - item->ClearFlags( STARTPOINT ); - else if( line->GetEndPoint() == position ) - item->ClearFlags( ENDPOINT ); - else - // This picks up items such as labels that can connect to the middle of a line - item->ClearFlags( STARTPOINT | ENDPOINT ); - } - // We want to move a mid-connected label or bus entry when the full line is being moved - else if( !item->IsSelected() - && aItem->Type() == SCH_LINE_T - && !( aItem->GetFlags() & ( ENDPOINT | STARTPOINT ) ) ) - { - std::vector< wxPoint > connections; - item->GetConnectionPoints( connections ); - - for( auto conn : connections ) - { - if( aItem->HitTest( conn ) ) - { - item->SetFlags( CANDIDATE ); - break; - } - } - } - - if( item->IsSelected() ) - continue; - - if( ( item->GetFlags() & CANDIDATE ) || item->IsConnected( position ) ) // Deal with all non-line items - { - item->ClearFlags( CANDIDATE ); - item->SetFlags( SELECTED ); - picker.SetItem( item ); - picker.SetFlags( item->GetFlags() ); - m_BlockLocate.GetItems().PushItem( picker ); - } - } } diff --git a/eeschema/sch_screen.h b/eeschema/sch_screen.h index edf8ae9f75..165e37a6b6 100644 --- a/eeschema/sch_screen.h +++ b/eeschema/sch_screen.h @@ -102,18 +102,6 @@ private: /// List of bus aliases stored in this screen std::unordered_set< std::shared_ptr< BUS_ALIAS > > m_aliases; - /** - * Add items connected at \a aPosition to the block pick list. - *

- * This method tests all connectable unselected items in the screen that are connected to - * \a aPosition and adds them to the block selection pick list. This is used when a block - * drag is being performed to ensure connections to items in the block are not lost. - *

- * @param aItem = The item we are connecting from - * @param aPosition = The connection point to test. - */ - void addConnectedItemsToBlock( const SCH_ITEM* aItem, const wxPoint& aPosition ); - public: /** diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index cffc3e1528..a2523d96f5 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -95,7 +95,7 @@ break; case ID_POPUP_SCH_DELETE_CMP: - case ID_POPUP_SCH_DELETE: + case ID_SCH_DELETE: // Stop the current command (if any) but keep the current tool m_canvas->EndMouseCapture(); break; @@ -188,7 +188,7 @@ break; case ID_POPUP_SCH_DELETE_CMP: - case ID_POPUP_SCH_DELETE: + case ID_SCH_DELETE: if( item == NULL ) break; @@ -255,18 +255,6 @@ } break; - case ID_POPUP_PLACE_BLOCK: - m_canvas->SetAutoPanRequest( false ); - m_canvas->MoveCursorToCrossHair(); - HandleBlockPlace( nullptr ); - break; - - case ID_POPUP_ZOOM_BLOCK: - screen->m_BlockLocate.SetCommand( BLOCK_ZOOM ); - screen->m_BlockLocate.SetMessageBlock( this ); - HandleBlockEnd( nullptr ); - break; - case ID_POPUP_DELETE_BLOCK: if( screen->m_BlockLocate.GetCommand() != BLOCK_MOVE ) break; @@ -278,26 +266,6 @@ SetSheetNumberAndCount(); break; - case ID_POPUP_DUPLICATE_BLOCK: - if( screen->m_BlockLocate.GetCommand() != BLOCK_MOVE ) - break; - - m_canvas->MoveCursorToCrossHair(); - screen->m_BlockLocate.SetCommand( BLOCK_DUPLICATE ); - screen->m_BlockLocate.SetMessageBlock( this ); - HandleBlockEnd( nullptr ); - break; - - case ID_POPUP_DRAG_BLOCK: - if( screen->m_BlockLocate.GetCommand() != BLOCK_MOVE ) - break; - - m_canvas->MoveCursorToCrossHair(); - screen->m_BlockLocate.SetCommand( BLOCK_DRAG ); - screen->m_BlockLocate.SetMessageBlock( this ); - HandleBlockEnd( nullptr ); - break; - case ID_POPUP_SCH_GETINFO_MARKER: if( item && item->Type() == SCH_MARKER_T ) ( (SCH_MARKER*) item )->DisplayMarkerInfo( this ); @@ -565,78 +533,6 @@ void SCH_EDIT_FRAME::OnEditItem( wxCommandEvent& aEvent ) } -void SCH_EDIT_FRAME::OnDragItem( wxCommandEvent& aEvent ) -{ - SCH_SELECTION_TOOL* selTool = GetToolManager()->GetTool(); - SCH_SCREEN* screen = GetScreen(); - SCH_ITEM* item = screen->GetCurItem(); - - // The easiest way to handle a menu or a hot key drag command - // is to simulate a block drag command - // - // When a drag item is requested, some items use a BLOCK_DRAG_ITEM drag type - // an some items use a BLOCK_DRAG drag type (mainly a junction) - // a BLOCK_DRAG collects all items in a block (here a 2x2 rect centered on the cursor) - // and BLOCK_DRAG_ITEM drag only the selected item - BLOCK_COMMAND_T dragType = BLOCK_DRAG_ITEM; - - if( item == NULL ) - { - // If we didn't get here by a hot key, then something has gone wrong. - if( aEvent.GetInt() == 0 ) - return; - - EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientObject(); - - wxCHECK_RET( data != NULL, wxT( "Invalid hot key client object." ) ); - - item = selTool->SelectPoint( data->GetPosition(), SCH_COLLECTOR::DraggableItems ); - - // Exit if no item found at the current location or the item is already being edited. - if( item == NULL || item->GetEditFlags() != 0 ) - return; - - // When a junction or a node is found, a BLOCK_DRAG is better - if( m_collectedItems.IsCorner() || m_collectedItems.IsNode( false ) - || m_collectedItems.IsDraggableJunction() ) - { - dragType = BLOCK_DRAG; - } - } - - switch( item->Type() ) - { - case SCH_BUS_BUS_ENTRY_T: - case SCH_BUS_WIRE_ENTRY_T: - case SCH_LINE_T: - case SCH_JUNCTION_T: - case SCH_COMPONENT_T: - case SCH_LABEL_T: - case SCH_GLOBAL_LABEL_T: - case SCH_HIER_LABEL_T: - case SCH_SHEET_T: - case SCH_TEXT_T: - m_canvas->MoveCursorToCrossHair(); - - if( screen->m_BlockLocate.GetState() == STATE_NO_BLOCK ) - { - if( !HandleBlockBegin( nullptr, dragType, GetCrossHairPosition() ) ) - break; - - // Give a non null size to the search block: - screen->m_BlockLocate.Inflate( 1 ); - screen->m_BlockLocate.SetLastCursorPosition( GetCrossHairPosition() ); - HandleBlockEnd( nullptr ); - } - - break; - - default: - wxFAIL_MSG( wxString( "Cannot drag schematic item type " ) + item->GetClass() ); - } -} - - void SCH_EDIT_FRAME::OnUnfoldBusHotkey( wxCommandEvent& aEvent ) { SCH_SELECTION_TOOL* selTool = GetToolManager()->GetTool(); diff --git a/eeschema/tools/sch_actions.cpp b/eeschema/tools/sch_actions.cpp index 5f39c1d3d5..f7c42d68d7 100644 --- a/eeschema/tools/sch_actions.cpp +++ b/eeschema/tools/sch_actions.cpp @@ -179,11 +179,13 @@ OPT SCH_ACTIONS::TranslateLegacyId( int aId ) case ID_SCHEMATIC_DELETE_ITEM_BUTT: return SCH_ACTIONS::deleteItemCursor.MakeEvent(); - case ID_POPUP_MOVE_BLOCK: - case ID_SCH_MOVE_ITEM: + case ID_SCH_MOVE: return SCH_ACTIONS::move.MakeEvent(); - case ID_POPUP_SCH_DELETE: + case ID_SCH_DRAG: + return SCH_ACTIONS::drag.MakeEvent(); + + case ID_SCH_DELETE: return SCH_ACTIONS::remove.MakeEvent(); case ID_SIM_PROBE: @@ -204,7 +206,7 @@ OPT SCH_ACTIONS::TranslateLegacyId( int aId ) case ID_SCH_MIRROR_Y: return SCH_ACTIONS::mirrorY.MakeEvent(); - case ID_POPUP_SCH_DUPLICATE: + case ID_SCH_DUPLICATE: return SCH_ACTIONS::duplicate.MakeEvent(); case ID_REPEAT_BUTT: diff --git a/eeschema/tools/sch_actions.h b/eeschema/tools/sch_actions.h index f970737ea3..513ac27fc0 100644 --- a/eeschema/tools/sch_actions.h +++ b/eeschema/tools/sch_actions.h @@ -113,6 +113,7 @@ public: // Editing static TOOL_ACTION move; + static TOOL_ACTION drag; static TOOL_ACTION duplicate; static TOOL_ACTION repeatDrawItem; static TOOL_ACTION rotateCW; diff --git a/eeschema/tools/sch_edit_tool.cpp b/eeschema/tools/sch_edit_tool.cpp index 330a467fc3..8a8f8324a1 100644 --- a/eeschema/tools/sch_edit_tool.cpp +++ b/eeschema/tools/sch_edit_tool.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -42,6 +43,10 @@ TOOL_ACTION SCH_ACTIONS::move( "eeschema.InteractiveEdit.move", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_MOVE_COMPONENT_OR_ITEM ), _( "Move" ), _( "Moves the selected item(s)" ), move_xpm, AF_ACTIVATE ); +TOOL_ACTION SCH_ACTIONS::drag( "eeschema.InteractiveEdit.drag", + AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_DRAG ), + _( "Drag" ), _( "Drags the selected item(s)" ), move_xpm, AF_ACTIVATE ); + TOOL_ACTION SCH_ACTIONS::duplicate( "eeschema.InteractiveEdit.duplicate", AS_GLOBAL, TOOL_ACTION::LegacyHotKey( HK_DUPLICATE ), _( "Duplicate" ), _( "Duplicates the selected item(s)" ), duplicate_xpm ); @@ -82,7 +87,7 @@ SCH_EDIT_TOOL::SCH_EDIT_TOOL() : m_controls( nullptr ), m_frame( nullptr ), m_menu( *this ), - m_dragging( false ) + m_moveInProgress( false ) { } @@ -119,7 +124,7 @@ bool SCH_EDIT_TOOL::Init() void SCH_EDIT_TOOL::Reset( RESET_REASON aReason ) { - m_dragging = false; + m_moveInProgress = false; // Init variables used by every drawing tool m_view = static_cast( getView() ); @@ -140,7 +145,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) SELECTION& selection = m_selectionTool->RequestSelection( SCH_COLLECTOR::MovableItems ); bool unselect = selection.IsHover(); - if( m_dragging || selection.Empty() ) + if( selection.Empty() ) return 0; Activate(); @@ -148,6 +153,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) controls->SetAutoPan( true ); bool restore_state = false; + bool isDragOperation = aEvent.IsAction( &SCH_ACTIONS::drag ); VECTOR2I totalMovement; OPT_TOOL_EVENT evt = aEvent; VECTOR2I prevPos; @@ -157,39 +163,20 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) { controls->SetSnapping( !evt->Modifier( MD_ALT ) ); - if( evt->IsAction( &SCH_ACTIONS::move ) || evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) + if( evt->IsAction( &SCH_ACTIONS::move ) || evt->IsAction( &SCH_ACTIONS::drag ) + || evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) { - if( m_dragging && evt->Category() == TC_MOUSE ) - { - m_cursor = controls->GetCursorPosition(); - VECTOR2I movement( m_cursor - prevPos ); - selection.SetReferencePoint( m_cursor ); - - totalMovement += movement; - prevPos = m_cursor; - - // Drag items to the current cursor position - for( int i = 0; i < selection.GetSize(); ++i ) - { - SCH_ITEM* item = static_cast( selection.GetItem( i ) ); - - // Don't double move pins, fields, etc. - if( item->GetParent() && item->GetParent()->IsSelected() ) - continue; - - moveItem( item, movement ); - updateView( item ); - } - - m_frame->UpdateMsgPanel(); - } - else if( !m_dragging ) // Prepare to start dragging + if( !m_moveInProgress ) // Prepare to start moving/dragging { + // // Save items, so changes can be undone + // for( int i = 0; i < selection.GetSize(); ++i ) { SCH_ITEM* item = static_cast( selection.GetItem( i ) ); + item->ClearFlags( STARTPOINT | ENDPOINT ); + // No need to save children of selected items if( item->GetParent() && item->GetParent()->IsSelected() ) continue; @@ -198,26 +185,50 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) saveCopyInUndoList( item, UR_CHANGED, i > 0 ); } - // Mark dangling pins at the edges of the block: - std::vector internalPoints; - - for( int i = 0; i < selection.GetSize(); ++i ) + // + // Add connections to the selection for a drag; mark the edges of the block + // with dangling pins for a move + // + if( isDragOperation ) { - SCH_ITEM* item = static_cast( selection.GetItem( i ) ); - item->GetEndPoints( internalPoints ); - } - - for( int i = 0; i < selection.GetSize(); ++i ) - { - SCH_ITEM* item = static_cast( selection.GetItem( i ) ); - item->UpdateDanglingState( internalPoints ); + for( unsigned i = 0; i < selection.GetSize(); ++i ) + { + SCH_ITEM* item = static_cast( selection.GetItem( i ) ); + + if( item->IsConnectable() ) + { + std::vector connections; + item->GetConnectionPoints( connections ); + + for( wxPoint point : connections ) + selectConnectedDragItems( item, point ); + } + } + } + else + { + std::vector internalPoints; + + for( int i = 0; i < selection.GetSize(); ++i ) + { + SCH_ITEM* item = static_cast( selection.GetItem( i ) ); + item->GetEndPoints( internalPoints ); + } + + for( int i = 0; i < selection.GetSize(); ++i ) + { + SCH_ITEM* item = static_cast( selection.GetItem( i ) ); + item->UpdateDanglingState( internalPoints ); + } } + // + // Set up the starting position and move/drag offset + // m_cursor = controls->GetCursorPosition(); if( selection.HasReferencePoint() ) { - // start moving with the reference point attached to the cursor VECTOR2I delta = m_cursor - selection.GetReferencePoint(); // Drag items to the current cursor position @@ -229,7 +240,7 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) if( item->GetParent() && item->GetParent()->IsSelected() ) continue; - moveItem( item, delta ); + moveItem( item, delta, isDragOperation ); updateView( item ); } @@ -237,8 +248,8 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) } else if( selection.Size() == 1 ) { - // Set the current cursor position to the first dragged item origin, so the - // movement vector could be computed later + // Set the current cursor position to the first dragged item origin, + // so the movement vector can be computed later updateModificationPoint( selection ); m_cursor = originalCursorPos; } @@ -251,13 +262,40 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) prevPos = m_cursor; controls->SetAutoPan( true ); - m_dragging = true; + m_moveInProgress = true; + } + + else /* m_moveInProgress */ + { + // + // Follow the mouse + // + m_cursor = controls->GetCursorPosition(); + VECTOR2I movement( m_cursor - prevPos ); + selection.SetReferencePoint( m_cursor ); + + totalMovement += movement; + prevPos = m_cursor; + + for( int i = 0; i < selection.GetSize(); ++i ) + { + SCH_ITEM* item = static_cast( selection.GetItem( i ) ); + + // Don't double move pins, fields, etc. + if( item->GetParent() && item->GetParent()->IsSelected() ) + continue; + + moveItem( item, movement, isDragOperation ); + updateView( item ); + } + + m_frame->UpdateMsgPanel(); } } else if( evt->IsAction( &ACTIONS::cancelInteractive ) || evt->IsCancel() || evt->IsActivate() ) { - if( m_dragging ) + if( m_moveInProgress ) restore_state = true; break; @@ -274,14 +312,12 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) { if( evt->IsAction( &SCH_ACTIONS::remove ) ) { - // exit the loop, as there is no further processing for removed items + // Exit on a remove operation; there is no further processing for removed items. break; } else if( evt->IsAction( &SCH_ACTIONS::duplicate ) ) { - // On duplicate, stop moving this item - // The duplicate tool should then select the new item and start - // a new move procedure + // Exit on a duplicate action; it will start its own move operation. break; } } @@ -298,9 +334,8 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) controls->SetSnapping( false ); controls->SetAutoPan( false ); - m_dragging = false; + m_moveInProgress = false; - // Discard reference point when selection is "dropped" onto the board (ie: not dragging anymore) selection.ClearReferencePoint(); for( auto item : selection ) @@ -321,14 +356,113 @@ int SCH_EDIT_TOOL::Main( const TOOL_EVENT& aEvent ) } -void SCH_EDIT_TOOL::moveItem( SCH_ITEM* aItem, VECTOR2I delta ) +void SCH_EDIT_TOOL::selectConnectedDragItems( SCH_ITEM* aSourceItem, wxPoint aPoint ) { - KICAD_T itemType = aItem->Type(); + for( SCH_ITEM* item = m_frame->GetScreen()->GetDrawItems(); item; item = item->Next() ) + { + if( item->IsSelected() || !item->IsConnectable() || !item->CanConnect( aSourceItem ) ) + continue; - if( itemType == SCH_PIN_T || itemType == SCH_FIELD_T ) - aItem->Move( wxPoint( delta.x, -delta.y ) ); - else - aItem->Move( (wxPoint)delta ); + bool doSelect = false; + + switch( item->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 ); + + if( line->GetStartPoint() == aPoint ) + { + line->ClearFlags( STARTPOINT ); + + if( !line->IsSelected() ) + doSelect = true; + } + else if( line->GetEndPoint() == aPoint ) + { + line->ClearFlags( ENDPOINT ); + + if( !line->IsSelected() ) + doSelect = true; + } + break; + } + + case SCH_SHEET_T: + // Dragging a sheet just because it's connected to something else feels a bit like + // the tail wagging the dog, but this could be moved down to the next case. + break; + + case SCH_COMPONENT_T: + 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; + + break; + + case SCH_LABEL_T: + case SCH_GLOBAL_LABEL_T: + case SCH_HIER_LABEL_T: + 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 ) + { + std::vector connections; + item->GetConnectionPoints( connections ); + + for( wxPoint& point : connections ) + { + if( aSourceItem->HitTest( point ) ) + doSelect = true; + } + } + break; + } + + if( doSelect ) + { + m_toolMgr->RunAction( SCH_ACTIONS::selectItem, true, item ); + saveCopyInUndoList( item, UR_CHANGED, true ); + } + } +} + + +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( 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: + aItem->Move( wxPoint( aDelta.x, -aDelta.y ) ); + break; + + default: + aItem->Move( (wxPoint)aDelta ); + break; + } aItem->SetFlags( IS_MOVED ); } @@ -336,7 +470,7 @@ void SCH_EDIT_TOOL::moveItem( SCH_ITEM* aItem, VECTOR2I delta ) bool SCH_EDIT_TOOL::updateModificationPoint( SELECTION& aSelection ) { - if( m_dragging && aSelection.HasReferencePoint() ) + if( m_moveInProgress && aSelection.HasReferencePoint() ) return false; // When there is only one item selected, the reference point is its position... @@ -840,6 +974,7 @@ void SCH_EDIT_TOOL::saveCopyInUndoList( SCH_ITEM* aItem, UNDO_REDO_T aType, bool void SCH_EDIT_TOOL::setTransitions() { Go( &SCH_EDIT_TOOL::Main, SCH_ACTIONS::move.MakeEvent() ); + Go( &SCH_EDIT_TOOL::Main, SCH_ACTIONS::drag.MakeEvent() ); Go( &SCH_EDIT_TOOL::Duplicate, SCH_ACTIONS::duplicate.MakeEvent() ); Go( &SCH_EDIT_TOOL::RepeatDrawItem, SCH_ACTIONS::repeatDrawItem.MakeEvent() ); Go( &SCH_EDIT_TOOL::Rotate, SCH_ACTIONS::rotateCW.MakeEvent() ); diff --git a/eeschema/tools/sch_edit_tool.h b/eeschema/tools/sch_edit_tool.h index 51911138f3..607eb93a83 100644 --- a/eeschema/tools/sch_edit_tool.h +++ b/eeschema/tools/sch_edit_tool.h @@ -72,7 +72,12 @@ public: int Remove( const TOOL_EVENT& aEvent ); private: - void moveItem( SCH_ITEM* aItem, VECTOR2I delta ); + 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 ); ///> Returns the right modification point (e.g. for rotation), depending on the number of ///> selected items. @@ -98,7 +103,7 @@ private: TOOL_MENU m_menu; ///> Flag determining if anything is being dragged right now - bool m_dragging; + bool m_moveInProgress; ///> Last cursor position (needed for getModificationPoint() to avoid changes ///> of edit reference point).