Commit 44bafd1c authored by Maciej Suminski's avatar Maciej Suminski

Improved selection rules. Added some comments to the selection tool.

parent 55744d1e
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <class_drawpanel_gal.h> #include <class_drawpanel_gal.h>
#include <class_board.h> #include <class_board.h>
#include <class_board_item.h> #include <class_board_item.h>
#include <class_track.h>
#include <class_module.h> #include <class_module.h>
#include <wxPcbStruct.h> #include <wxPcbStruct.h>
...@@ -68,6 +69,10 @@ void SELECTION_TOOL::Reset() ...@@ -68,6 +69,10 @@ void SELECTION_TOOL::Reset()
int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
{ {
bool dragging = false; bool dragging = false;
m_board = static_cast<PCB_BASE_FRAME*>( m_toolMgr->GetEditFrame() )->GetBoard();
if( !m_board )
return 0;
// Main loop: keep receiving events // Main loop: keep receiving events
while( OPT_TOOL_EVENT evt = Wait() ) while( OPT_TOOL_EVENT evt = Wait() )
...@@ -131,8 +136,12 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem ) ...@@ -131,8 +136,12 @@ void SELECTION_TOOL::toggleSelection( BOARD_ITEM* aItem )
if( !m_additive ) if( !m_additive )
clearSelection(); clearSelection();
aItem->SetSelected(); // Prevent selection of invisible items
m_selectedItems.insert( aItem ); if( selectable( aItem ) )
{
aItem->SetSelected();
m_selectedItems.insert( aItem );
}
} }
} }
...@@ -214,11 +223,6 @@ BOARD_ITEM* SELECTION_TOOL::pickSmallestComponent( GENERAL_COLLECTOR* aCollector ...@@ -214,11 +223,6 @@ BOARD_ITEM* SELECTION_TOOL::pickSmallestComponent( GENERAL_COLLECTOR* aCollector
} }
void SELECTION_TOOL::handleHighlight( const VECTOR2D& aP )
{
}
void SELECTION_TOOL::selectMultiple() void SELECTION_TOOL::selectMultiple()
{ {
OPT_TOOL_EVENT evt; OPT_TOOL_EVENT evt;
...@@ -258,8 +262,8 @@ void SELECTION_TOOL::selectMultiple() ...@@ -258,8 +262,8 @@ void SELECTION_TOOL::selectMultiple()
{ {
BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->first ); BOARD_ITEM* item = static_cast<BOARD_ITEM*>( it->first );
// Add only those items which are fully within a selection box // Add only those items which are visible and fully within the selection box
if( selectionBox.Contains( item->ViewBBox() ) ) if( selectable( item ) && selectionBox.Contains( item->ViewBBox() ) )
{ {
item->SetSelected(); item->SetSelected();
m_selectedItems.insert( item ); m_selectedItems.insert( item );
...@@ -331,3 +335,40 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector ) ...@@ -331,3 +335,40 @@ BOARD_ITEM* SELECTION_TOOL::disambiguationMenu( GENERAL_COLLECTOR* aCollector )
return NULL; return NULL;
} }
bool SELECTION_TOOL::selectable( const BOARD_ITEM* aItem ) const
{
switch( aItem->Type() )
{
case PCB_VIA_T:
{
// For vias it is enough if only one of layers is visible
LAYER_NUM top, bottom;
static_cast<const SEGVIA*>( aItem )->ReturnLayerPair( &top, &bottom );
return ( m_board->IsLayerVisible( top ) ||
m_board->IsLayerVisible( bottom ) );
}
break;
case PCB_PAD_T:
// Pads are supposed to be on top, bottom or both at the same time (THT)
if( aItem->IsOnLayer( LAYER_N_FRONT ) && m_board->IsLayerVisible( LAYER_N_FRONT ) )
return true;
if( aItem->IsOnLayer( LAYER_N_BACK ) && m_board->IsLayerVisible( LAYER_N_BACK ) )
return true;
return false;
break;
case PCB_MODULE_EDGE_T:
// These are not selectable, otherwise silkscreen drawings would be easily destroyed
return false;
break;
}
// All other items
return m_board->IsLayerVisible( aItem->GetLayer() );
}
...@@ -35,7 +35,6 @@ class SELECTION_AREA; ...@@ -35,7 +35,6 @@ class SELECTION_AREA;
class BOARD_ITEM; class BOARD_ITEM;
class GENERAL_COLLECTOR; class GENERAL_COLLECTOR;
/** /**
* Class SELECTION_TOOL * Class SELECTION_TOOL
* *
...@@ -43,8 +42,6 @@ class GENERAL_COLLECTOR; ...@@ -43,8 +42,6 @@ class GENERAL_COLLECTOR;
* - pick single objects (click LMB) * - pick single objects (click LMB)
* - add objects to existing selection (Shift+LMB) * - add objects to existing selection (Shift+LMB)
* - draw selection box (drag LMB) * - draw selection box (drag LMB)
*
* WORK IN PROGRESS. CONSIDER AS A DEMO!
*/ */
class SELECTION_TOOL : public TOOL_INTERACTIVE class SELECTION_TOOL : public TOOL_INTERACTIVE
...@@ -53,25 +50,98 @@ public: ...@@ -53,25 +50,98 @@ public:
SELECTION_TOOL(); SELECTION_TOOL();
~SELECTION_TOOL(); ~SELECTION_TOOL();
/**
* Function Reset()
*
* Initializes the selection tool.
*/
void Reset(); void Reset();
/**
* Function Main()
*
* The main loop.
*/
int Main( TOOL_EVENT& aEvent ); int Main( TOOL_EVENT& aEvent );
/**
* Function GetSelection()
*
* Returns the set of currently selected items.
*/
const std::set<BOARD_ITEM*>& GetSelection() const const std::set<BOARD_ITEM*>& GetSelection() const
{ {
return m_selectedItems; return m_selectedItems;
} }
private: private:
/**
* Function selectSingle()
* Selects an item pointed by the parameter aWhere. If there is more than one item at that
* place, there is a menu displayed that allows to choose the item.
*
* @param aWhere is the place where the item should be selected.
*/
void selectSingle( const VECTOR2I& aWhere ); void selectSingle( const VECTOR2I& aWhere );
/**
* Function selectMultiple()
* Handles drawing a selection box that allows to select many items at the same time.
*/
void selectMultiple(); void selectMultiple();
void handleHighlight( const VECTOR2D& aP );
/**
* Function disambiguationMenu()
* Handles the menu that allows to select one of many items in case there is more than one
* item at the selected point (@see selectSingle()).
*
* @param aItems contains list of items that are displayed to the user.
*/
BOARD_ITEM* disambiguationMenu( GENERAL_COLLECTOR* aItems ); BOARD_ITEM* disambiguationMenu( GENERAL_COLLECTOR* aItems );
/**
* Function pickSmallestComponent()
* Allows to find the smallest (in terms of bounding box area) item from the list.
*
* @param aCollector containes the list of items.
*/
BOARD_ITEM* pickSmallestComponent( GENERAL_COLLECTOR* aCollector ); BOARD_ITEM* pickSmallestComponent( GENERAL_COLLECTOR* aCollector );
/**
* Function toggleSelection()
* Changes selection status of a given item.
*
* @param aItem is the item to have selection status changed.
*/
void toggleSelection( BOARD_ITEM* aItem ); void toggleSelection( BOARD_ITEM* aItem );
/**
* Function clearSelection()
* Clears selections of currently selected items.
*/
void clearSelection(); void clearSelection();
/**
* Function selectable()
* Checks conditions for an item to be selected.
*
* @return True if the item fulfills conditions to be selected.
*/
bool selectable( const BOARD_ITEM* aItem ) const;
/// Currently used PCB
BOARD* m_board;
/// Container storing currently selected items
std::set<BOARD_ITEM*> m_selectedItems; std::set<BOARD_ITEM*> m_selectedItems;
/// Visual representation of selection area
SELECTION_AREA* m_selArea; SELECTION_AREA* m_selArea;
/// Menu shown in case of selection ambiguity
boost::shared_ptr<CONTEXT_MENU> m_menu; boost::shared_ptr<CONTEXT_MENU> m_menu;
/// Flag saying if items should be added to the current selection or rather replace it
bool m_additive; bool m_additive;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment