Loading pcbnew/tools/selection_tool.cpp +52 −40 Original line number Diff line number Diff line Loading @@ -66,7 +66,7 @@ SELECTION_TOOL::~SELECTION_TOOL() void SELECTION_TOOL::Reset() { clearSelection(); ClearSelection(); // Reinsert the VIEW_GROUP, in case it was removed from the VIEW getView()->Remove( m_selection.group ); Loading @@ -89,7 +89,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) if( evt->IsCancel() ) { if( !m_selection.Empty() ) // Cancel event deselects items... clearSelection(); ClearSelection(); // This tool never exits } Loading @@ -98,7 +98,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else if( evt->IsClick( BUT_LEFT ) ) { if( !m_additive && m_selection.Size() > 1 ) clearSelection(); ClearSelection(); selectSingle( evt->Position() ); } Loading Loading @@ -132,7 +132,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else { // No -> clear the selection list clearSelection(); ClearSelection(); } } } Loading @@ -145,6 +145,28 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) } void SELECTION_TOOL::ClearSelection() { KIGFX::VIEW_GROUP::const_iter it, it_end; // Restore the initial properties for( it = m_selection.group->Begin(), it_end = m_selection.group->End(); it != it_end; ++it ) { BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it ); item->ViewSetVisible( true ); item->ClearSelected(); } m_selection.Clear(); getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL ); // Do not show the context menu when there is nothing selected SetContextMenu( &m_menu, CMENU_OFF ); } void SELECTION_TOOL::AddMenuItem( const TOOL_ACTION& aAction ) { assert( aAction.GetId() > 0 ); // Check if the action was registered before in ACTION_MANAGER Loading @@ -155,48 +177,25 @@ void SELECTION_TOOL::AddMenuItem( const TOOL_ACTION& aAction ) void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem ) { if( m_selection.items.find( aItem ) != m_selection.items.end() ) if( isSelected( aItem ) ) { deselectItem( aItem ); // If there is nothing selected, disable the context menu if( m_selection.Empty() ) SetContextMenu( &m_menu, CMENU_OFF ); } else { if( !m_additive ) clearSelection(); ClearSelection(); // Prevent selection of invisible or inactive items if( selectable( aItem ) ) { selectItem( aItem ); // Now the context menu should be enabled SetContextMenu( &m_menu, CMENU_BUTTON ); } } } void SELECTION_TOOL::clearSelection() bool SELECTION_TOOL::isSelected( const BOARD_ITEM* aItem ) const { KIGFX::VIEW_GROUP::const_iter it, it_end; // Restore the initial properties for( it = m_selection.group->Begin(), it_end = m_selection.group->End(); it != it_end; ++it ) { BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it ); item->ViewSetVisible( true ); item->ClearSelected(); } m_selection.Clear(); // Do not show the context menu when there is nothing selected SetContextMenu( &m_menu, CMENU_OFF ); return ( m_selection.items.find( const_cast<BOARD_ITEM*>( aItem ) ) != m_selection.items.end() ); } Loading @@ -214,7 +213,7 @@ void SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere ) { case 0: if( !m_additive ) clearSelection(); ClearSelection(); break; Loading Loading @@ -308,7 +307,7 @@ bool SELECTION_TOOL::selectMultiple() if( evt->IsDrag( BUT_LEFT ) ) { if( !m_additive ) clearSelection(); ClearSelection(); // Start drawing a selection box m_selArea->SetOrigin( evt->DragOrigin() ); Loading Loading @@ -338,11 +337,10 @@ bool SELECTION_TOOL::selectMultiple() selectItem( item ); } // Now the context menu should be enabled if( !m_selection.Empty() ) SetContextMenu( &m_menu, CMENU_BUTTON ); // Do not display information about selected item,as there is more than one getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL ); break; break; // Stop waiting for events } } Loading Loading @@ -413,9 +411,6 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector ) // Removes possible brighten mark getView()->MarkTargetDirty( KIGFX::TARGET_OVERLAY ); // Restore the original menu SetContextMenu( &m_menu, CMENU_BUTTON ); return current; } Loading Loading @@ -542,6 +537,16 @@ void SELECTION_TOOL::selectItem( BOARD_ITEM* aItem ) // Add items to the VIEW_GROUP, so they will be displayed on the overlay selectBase( aItem ); m_selection.items.insert( aItem ); // It is enough to do it only for the first selected item if( m_selection.items.size() == 1 ) { // Set as the current item, so the information about selection is displayed getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( aItem, true ); // Now the context menu should be enabled SetContextMenu( &m_menu, CMENU_BUTTON ); } } Loading Loading @@ -584,6 +589,13 @@ void SELECTION_TOOL::deselectItem( BOARD_ITEM* aItem ) deselectBase( aItem ); m_selection.items.erase( aItem ); // If there is nothing selected, disable the context menu if( m_selection.Empty() ) { SetContextMenu( &m_menu, CMENU_OFF ); getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL ); } } Loading pcbnew/tools/selection_tool.h +12 −3 Original line number Diff line number Diff line Loading @@ -104,6 +104,12 @@ public: return m_selection; } /** * Function ClearSelection() * Clears the current selection. */ void ClearSelection(); /** * Function AddAction() * Loading Loading @@ -156,10 +162,13 @@ private: void toggleSelection( BOARD_ITEM* aItem ); /** * Function clearSelection() * Clears selections of currently selected items. * Function isSelected() * Tests if an item is currently selected. * * @param aItem is the item to be checked. * @return True if the item is selected, false otherwise. */ void clearSelection(); bool isSelected( const BOARD_ITEM* aItem ) const; /** * Function selectable() Loading Loading
pcbnew/tools/selection_tool.cpp +52 −40 Original line number Diff line number Diff line Loading @@ -66,7 +66,7 @@ SELECTION_TOOL::~SELECTION_TOOL() void SELECTION_TOOL::Reset() { clearSelection(); ClearSelection(); // Reinsert the VIEW_GROUP, in case it was removed from the VIEW getView()->Remove( m_selection.group ); Loading @@ -89,7 +89,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) if( evt->IsCancel() ) { if( !m_selection.Empty() ) // Cancel event deselects items... clearSelection(); ClearSelection(); // This tool never exits } Loading @@ -98,7 +98,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else if( evt->IsClick( BUT_LEFT ) ) { if( !m_additive && m_selection.Size() > 1 ) clearSelection(); ClearSelection(); selectSingle( evt->Position() ); } Loading Loading @@ -132,7 +132,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) else { // No -> clear the selection list clearSelection(); ClearSelection(); } } } Loading @@ -145,6 +145,28 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) } void SELECTION_TOOL::ClearSelection() { KIGFX::VIEW_GROUP::const_iter it, it_end; // Restore the initial properties for( it = m_selection.group->Begin(), it_end = m_selection.group->End(); it != it_end; ++it ) { BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it ); item->ViewSetVisible( true ); item->ClearSelected(); } m_selection.Clear(); getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL ); // Do not show the context menu when there is nothing selected SetContextMenu( &m_menu, CMENU_OFF ); } void SELECTION_TOOL::AddMenuItem( const TOOL_ACTION& aAction ) { assert( aAction.GetId() > 0 ); // Check if the action was registered before in ACTION_MANAGER Loading @@ -155,48 +177,25 @@ void SELECTION_TOOL::AddMenuItem( const TOOL_ACTION& aAction ) void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem ) { if( m_selection.items.find( aItem ) != m_selection.items.end() ) if( isSelected( aItem ) ) { deselectItem( aItem ); // If there is nothing selected, disable the context menu if( m_selection.Empty() ) SetContextMenu( &m_menu, CMENU_OFF ); } else { if( !m_additive ) clearSelection(); ClearSelection(); // Prevent selection of invisible or inactive items if( selectable( aItem ) ) { selectItem( aItem ); // Now the context menu should be enabled SetContextMenu( &m_menu, CMENU_BUTTON ); } } } void SELECTION_TOOL::clearSelection() bool SELECTION_TOOL::isSelected( const BOARD_ITEM* aItem ) const { KIGFX::VIEW_GROUP::const_iter it, it_end; // Restore the initial properties for( it = m_selection.group->Begin(), it_end = m_selection.group->End(); it != it_end; ++it ) { BOARD_ITEM* item = static_cast<BOARD_ITEM*>( *it ); item->ViewSetVisible( true ); item->ClearSelected(); } m_selection.Clear(); // Do not show the context menu when there is nothing selected SetContextMenu( &m_menu, CMENU_OFF ); return ( m_selection.items.find( const_cast<BOARD_ITEM*>( aItem ) ) != m_selection.items.end() ); } Loading @@ -214,7 +213,7 @@ void SELECTION_TOOL::selectSingle( const VECTOR2I& aWhere ) { case 0: if( !m_additive ) clearSelection(); ClearSelection(); break; Loading Loading @@ -308,7 +307,7 @@ bool SELECTION_TOOL::selectMultiple() if( evt->IsDrag( BUT_LEFT ) ) { if( !m_additive ) clearSelection(); ClearSelection(); // Start drawing a selection box m_selArea->SetOrigin( evt->DragOrigin() ); Loading Loading @@ -338,11 +337,10 @@ bool SELECTION_TOOL::selectMultiple() selectItem( item ); } // Now the context menu should be enabled if( !m_selection.Empty() ) SetContextMenu( &m_menu, CMENU_BUTTON ); // Do not display information about selected item,as there is more than one getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL ); break; break; // Stop waiting for events } } Loading Loading @@ -413,9 +411,6 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector ) // Removes possible brighten mark getView()->MarkTargetDirty( KIGFX::TARGET_OVERLAY ); // Restore the original menu SetContextMenu( &m_menu, CMENU_BUTTON ); return current; } Loading Loading @@ -542,6 +537,16 @@ void SELECTION_TOOL::selectItem( BOARD_ITEM* aItem ) // Add items to the VIEW_GROUP, so they will be displayed on the overlay selectBase( aItem ); m_selection.items.insert( aItem ); // It is enough to do it only for the first selected item if( m_selection.items.size() == 1 ) { // Set as the current item, so the information about selection is displayed getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( aItem, true ); // Now the context menu should be enabled SetContextMenu( &m_menu, CMENU_BUTTON ); } } Loading Loading @@ -584,6 +589,13 @@ void SELECTION_TOOL::deselectItem( BOARD_ITEM* aItem ) deselectBase( aItem ); m_selection.items.erase( aItem ); // If there is nothing selected, disable the context menu if( m_selection.Empty() ) { SetContextMenu( &m_menu, CMENU_OFF ); getEditFrame<PCB_EDIT_FRAME>()->SetCurItem( NULL ); } } Loading
pcbnew/tools/selection_tool.h +12 −3 Original line number Diff line number Diff line Loading @@ -104,6 +104,12 @@ public: return m_selection; } /** * Function ClearSelection() * Clears the current selection. */ void ClearSelection(); /** * Function AddAction() * Loading Loading @@ -156,10 +162,13 @@ private: void toggleSelection( BOARD_ITEM* aItem ); /** * Function clearSelection() * Clears selections of currently selected items. * Function isSelected() * Tests if an item is currently selected. * * @param aItem is the item to be checked. * @return True if the item is selected, false otherwise. */ void clearSelection(); bool isSelected( const BOARD_ITEM* aItem ) const; /** * Function selectable() Loading