Split rotate and flip operations into separate functions.

Added Properties action (display properties windows)
This commit is contained in:
Maciej Suminski 2013-12-03 15:57:09 +01:00
parent ad3cb1f36a
commit b582162cb5
6 changed files with 164 additions and 45 deletions

View File

@ -36,9 +36,13 @@ TOOL_ACTION COMMON_ACTIONS::moveActivate( "pcbnew.InteractiveMove",
"Move", "Moves the selected item(s)" ); "Move", "Moves the selected item(s)" );
TOOL_ACTION COMMON_ACTIONS::rotate( "pcbnew.InteractiveMove.rotate", TOOL_ACTION COMMON_ACTIONS::rotate( "pcbnew.InteractiveMove.rotate",
AS_CONTEXT, ' ', AS_CONTEXT, 'R',
"Rotate", "Rotates selected item(s)" ); "Rotate", "Rotates selected item(s)" );
TOOL_ACTION COMMON_ACTIONS::flip( "pcbnew.InteractiveMove.flip", TOOL_ACTION COMMON_ACTIONS::flip( "pcbnew.InteractiveMove.flip",
AS_CONTEXT, 'F', AS_CONTEXT, 'F',
"Flip", "Flips selected item(s)" ); "Flip", "Flips selected item(s)" );
TOOL_ACTION COMMON_ACTIONS::properties( "pcbnew.InteractiveMove.properties",
AS_GLOBAL, 'E',
"Properties...", "Displays properties window" );

View File

@ -24,7 +24,7 @@
#include <tool/tool_action.h> #include <tool/tool_action.h>
class ACTION_MANAGER; //class ACTION_MANAGER;
/** /**
* Class COMMON_ACTIONS * Class COMMON_ACTIONS
@ -46,4 +46,7 @@ public:
/// Flipping of selected objects /// Flipping of selected objects
static TOOL_ACTION flip; static TOOL_ACTION flip;
/// Activation of the edit tool
static TOOL_ACTION properties;
}; };

View File

@ -24,6 +24,7 @@
#include <class_board.h> #include <class_board.h>
#include <class_module.h> #include <class_module.h>
#include <wxPcbStruct.h>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <view/view_controls.h> #include <view/view_controls.h>
#include <confirm.h> #include <confirm.h>
@ -41,38 +42,26 @@ MOVE_TOOL::MOVE_TOOL() :
} }
MOVE_TOOL::~MOVE_TOOL()
{
}
void MOVE_TOOL::Reset()
{
// The tool launches upon reception of action event ("pcbnew.InteractiveMove")
Go( &MOVE_TOOL::Main, COMMON_ACTIONS::moveActivate.MakeEvent() );
}
bool MOVE_TOOL::Init() bool MOVE_TOOL::Init()
{ {
// Find the selection tool, so they can cooperate // Find the selection tool, so they can cooperate
TOOL_BASE* selectionTool = m_toolMgr->FindTool( "pcbnew.InteractiveSelection" ); TOOL_BASE* selectionTool = m_toolMgr->FindTool( "pcbnew.InteractiveSelection" );
if( selectionTool ) m_selectionTool = static_cast<SELECTION_TOOL*>( selectionTool );
{ if( !selectionTool )
m_selectionTool = static_cast<SELECTION_TOOL*>( selectionTool );
// Add context menu entries that are displayed when selection tool is active
m_selectionTool->AddMenuItem( COMMON_ACTIONS::moveActivate );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::rotate );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::flip );
}
else
{ {
DisplayError( NULL, wxT( "pcbnew.InteractiveSelection tool is not available" ) ); DisplayError( NULL, wxT( "pcbnew.InteractiveSelection tool is not available" ) );
return false; return false;
} }
// Add context menu entries that are displayed when selection tool is active
m_selectionTool->AddMenuItem( COMMON_ACTIONS::moveActivate );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::rotate );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::flip );
m_selectionTool->AddMenuItem( COMMON_ACTIONS::properties );
setTransitions();
return true; return true;
} }
@ -85,7 +74,7 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
return 0; // there are no items to operate on return 0; // there are no items to operate on
VECTOR2D dragPosition; VECTOR2D dragPosition;
bool dragging = false; m_dragging = false;
bool restore = false; // Should items' state be restored when finishing the tool? bool restore = false; // Should items' state be restored when finishing the tool?
VIEW_CONTROLS* controls = getViewControls(); VIEW_CONTROLS* controls = getViewControls();
@ -105,23 +94,15 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
// Dispatch TOOL_ACTIONs // Dispatch TOOL_ACTIONs
else if( evt->Category() == TC_COMMAND ) else if( evt->Category() == TC_COMMAND )
{ {
VECTOR2D cursorPos = getView()->ToWorld( getViewControls()->GetCursorPosition() ); if( evt->IsAction( &COMMON_ACTIONS::rotate ) )
Rotate( aEvent );
if( evt->IsAction( &COMMON_ACTIONS::rotate ) ) // got rotation event? else if( evt->IsAction( &COMMON_ACTIONS::flip ) )
{ Flip( aEvent );
m_state.Rotate( cursorPos, 900.0 );
selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
}
else if( evt->IsAction( &COMMON_ACTIONS::flip ) ) // got flip event?
{
m_state.Flip( cursorPos );
selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
}
} }
else if( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) else if( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) )
{ {
if( dragging ) if( m_dragging )
{ {
// Drag items to the current cursor position // Drag items to the current cursor position
VECTOR2D movement = ( evt->Position() - dragPosition ); VECTOR2D movement = ( evt->Position() - dragPosition );
@ -138,16 +119,19 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
m_state.Save( *it ); m_state.Save( *it );
} }
dragging = true; m_dragging = true;
} }
selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY ); selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
dragPosition = evt->Position(); dragPosition = evt->Position();
} }
else if( evt->IsMouseUp( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) ) else if( evt->IsMouseUp( BUT_LEFT ) || evt->IsClick( BUT_LEFT ) )
break; // Finish break; // Finish
} }
m_dragging = false;
if( restore ) if( restore )
{ {
// Modifications has to be rollbacked, so restore the previous state of items // Modifications has to be rollbacked, so restore the previous state of items
@ -165,5 +149,91 @@ int MOVE_TOOL::Main( TOOL_EVENT& aEvent )
controls->SetSnapping( false ); controls->SetSnapping( false );
controls->SetAutoPan( false ); controls->SetAutoPan( false );
setTransitions();
return 0; return 0;
} }
int MOVE_TOOL::Properties( TOOL_EVENT& aEvent )
{
const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection();
// Properties are displayed when there is only one item selected
if( selection.items.size() == 1 )
{
// Display properties dialog
PCB_EDIT_FRAME* editFrame = static_cast<PCB_EDIT_FRAME*>( m_toolMgr->GetEditFrame() );
BOARD_ITEM* item = *selection.items.begin();
editFrame->OnEditItemRequest( NULL, item );
item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
setTransitions();
return 0;
}
int MOVE_TOOL::Rotate( TOOL_EVENT& aEvent )
{
const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection();
VECTOR2D cursorPos = getView()->ToWorld( getViewControls()->GetCursorPosition() );
if( m_dragging )
{
m_state.Rotate( cursorPos, 900.0 );
selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
}
else
{
std::set<BOARD_ITEM*>::iterator it;
for( it = selection.items.begin(); it != selection.items.end(); ++it )
{
(*it)->Rotate( wxPoint( cursorPos.x, cursorPos.y ), 900.0 );
(*it)->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
}
setTransitions();
}
return 0;
}
int MOVE_TOOL::Flip( TOOL_EVENT& aEvent )
{
const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection();
VECTOR2D cursorPos = getView()->ToWorld( getViewControls()->GetCursorPosition() );
if( m_dragging )
{
m_state.Flip( cursorPos );
selection.group->ViewUpdate( VIEW_ITEM::GEOMETRY );
}
else
{
std::set<BOARD_ITEM*>::iterator it;
for( it = selection.items.begin(); it != selection.items.end(); ++it )
{
(*it)->Flip( wxPoint( cursorPos.x, cursorPos.y ) );
(*it)->ViewUpdate( KIGFX::VIEW_ITEM::LAYERS );
}
setTransitions();
}
return 0;
}
void MOVE_TOOL::setTransitions()
{
Go( &MOVE_TOOL::Main, COMMON_ACTIONS::moveActivate.MakeEvent() );
Go( &MOVE_TOOL::Rotate, COMMON_ACTIONS::rotate.MakeEvent() );
Go( &MOVE_TOOL::Flip, COMMON_ACTIONS::flip.MakeEvent() );
Go( &MOVE_TOOL::Properties, COMMON_ACTIONS::properties.MakeEvent() );
}

View File

@ -49,10 +49,9 @@ class MOVE_TOOL : public TOOL_INTERACTIVE
{ {
public: public:
MOVE_TOOL(); MOVE_TOOL();
~MOVE_TOOL();
/// @copydoc TOOL_INTERACTIVE::Reset() /// @copydoc TOOL_INTERACTIVE::Reset()
void Reset(); void Reset() {};
/// @copydoc TOOL_INTERACTIVE::Init() /// @copydoc TOOL_INTERACTIVE::Init()
bool Init(); bool Init();
@ -61,15 +60,43 @@ public:
* Function Main() * Function Main()
* *
* Main loop in which events are handled. * Main loop in which events are handled.
* @param aEvent is the handled event.
*/ */
int Main( TOOL_EVENT& aEvent ); int Main( TOOL_EVENT& aEvent );
/**
* Function Edit()
*
* Displays properties window for the selected object.
*/
int Properties( TOOL_EVENT& aEvent );
/**
* Function Rotate()
*
* Rotates currently selected items.
*/
int Rotate( TOOL_EVENT& aEvent );
/**
* Function Flip()
*
* Rotates currently selected items. The rotation point is the current cursor position.
*/
int Flip( TOOL_EVENT& aEvent );
private: private:
/// Saves the state of items and allows to restore them ///> Saves the state of items and allows to restore them
ITEM_STATE m_state; ITEM_STATE m_state;
/// Selection tool used for obtaining selected items ///> Selection tool used for obtaining selected items
SELECTION_TOOL* m_selectionTool; SELECTION_TOOL* m_selectionTool;
///> Flag determining if anything is being dragged right now
bool m_dragging;
///> Sets up handlers for various events
void setTransitions();
}; };
#endif #endif

View File

@ -51,6 +51,7 @@ void PCB_EDIT_FRAME::setupTools()
m_toolManager->RegisterAction( &COMMON_ACTIONS::selectionActivate ); m_toolManager->RegisterAction( &COMMON_ACTIONS::selectionActivate );
m_toolManager->RegisterAction( &COMMON_ACTIONS::rotate ); m_toolManager->RegisterAction( &COMMON_ACTIONS::rotate );
m_toolManager->RegisterAction( &COMMON_ACTIONS::flip ); m_toolManager->RegisterAction( &COMMON_ACTIONS::flip );
m_toolManager->RegisterAction( &COMMON_ACTIONS::properties );
// Register tools // Register tools
m_toolManager->RegisterTool( new SELECTION_TOOL ); m_toolManager->RegisterTool( new SELECTION_TOOL );

View File

@ -102,11 +102,25 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent )
} }
// single click? Select single object // single click? Select single object
if( evt->IsClick( BUT_LEFT ) ) else if( evt->IsClick( BUT_LEFT ) )
{
if( !m_additive && m_selection.Size() > 1 )
clearSelection();
selectSingle( evt->Position() ); selectSingle( evt->Position() );
}
else if( evt->IsDblClick( BUT_LEFT ) )
{
if( m_selection.Empty() )
selectSingle( evt->Position() );
// Display properties window
m_toolMgr->RunAction( "pcbnew.InteractiveMove.properties" );
}
// drag with LMB? Select multiple objects (or at least draw a selection box) or drag them // drag with LMB? Select multiple objects (or at least draw a selection box) or drag them
if( evt->IsDrag( BUT_LEFT ) ) else if( evt->IsDrag( BUT_LEFT ) )
{ {
if( m_selection.Empty() || m_additive ) if( m_selection.Empty() || m_additive )
{ {