From 89a138c09efb148a84414951f45fa30ad2f69ffc Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Wed, 21 Aug 2013 17:37:27 +0200 Subject: [PATCH] Added handling keyboard events for the Tool framework. --- common/drawframe.cpp | 1 + common/drawpanel.cpp | 1 - common/drawpanel_gal.cpp | 30 +++++--- common/gal/cairo/cairo_gal.cpp | 15 ++-- common/gal/opengl/opengl_gal.cpp | 15 ++-- common/tool/tool_dispatcher.cpp | 77 ++++++++++++-------- common/tool/tool_event.cpp | 42 ++++++++--- common/view/wx_view_controls.cpp | 38 +++++----- include/class_drawpanel_gal.h | 1 + include/gal/cairo/cairo_gal.h | 2 +- include/tool/tool_dispatcher.h | 16 ++-- include/tool/tool_event.h | 121 ++++++++++++++++++++----------- include/view/wx_view_controls.h | 8 +- pcbnew/tools/selection_tool.cpp | 2 +- 14 files changed, 224 insertions(+), 145 deletions(-) diff --git a/common/drawframe.cpp b/common/drawframe.cpp index 5681ceac03..b7c9c9c139 100644 --- a/common/drawframe.cpp +++ b/common/drawframe.cpp @@ -1017,5 +1017,6 @@ void EDA_DRAW_FRAME::UseGalCanvas( bool aEnable ) m_auimgr.GetPane( wxT( "DrawFrameGal" ) ).Show( aEnable ); m_auimgr.Update(); + m_galCanvas->SetFocus(); m_galCanvasActive = aEnable; } diff --git a/common/drawpanel.cpp b/common/drawpanel.cpp index 0fc2374e13..8c96634191 100644 --- a/common/drawpanel.cpp +++ b/common/drawpanel.cpp @@ -1334,7 +1334,6 @@ void EDA_DRAW_PANEL::OnKeyEvent( wxKeyEvent& event ) Screen->SetMousePosition( pos ); GetParent()->GeneralControl( &DC, pos, localkey ); - } diff --git a/common/drawpanel_gal.cpp b/common/drawpanel_gal.cpp index a6f11ff8b0..678994b788 100644 --- a/common/drawpanel_gal.cpp +++ b/common/drawpanel_gal.cpp @@ -84,20 +84,21 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin m_viewControls = new KiGfx::WX_VIEW_CONTROLS( m_view, this ); - Connect( wxEVT_PAINT, wxPaintEventHandler( EDA_DRAW_PANEL_GAL::onPaint ), NULL, this ); - Connect( wxEVT_SIZE, wxSizeEventHandler( EDA_DRAW_PANEL_GAL::onSize ), NULL, this ); + Connect( wxEVT_PAINT, wxPaintEventHandler( EDA_DRAW_PANEL_GAL::onPaint ), NULL, this ); + Connect( wxEVT_SIZE, wxSizeEventHandler( EDA_DRAW_PANEL_GAL::onSize ), NULL, this ); /* Generic events for the Tool Dispatcher */ - Connect( wxEVT_MOTION, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_LEFT_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_LEFT_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_RIGHT_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_RIGHT_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_MIDDLE_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_MOTION, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_LEFT_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_LEFT_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_RIGHT_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_RIGHT_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_MIDDLE_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); Connect( wxEVT_MIDDLE_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_MOUSEWHEEL, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_KEY_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); - Connect( wxEVT_KEY_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_MOUSEWHEEL, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_CHAR_HOOK, wxEventHandler( EDA_DRAW_PANEL_GAL::skipEvent ), NULL, this ); + Connect( wxEVT_KEY_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); + Connect( wxEVT_KEY_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); } @@ -209,3 +210,10 @@ void EDA_DRAW_PANEL_GAL::onEvent( wxEvent& aEvent ) m_eventDispatcher->DispatchWxEvent( aEvent ); } } + + +void EDA_DRAW_PANEL_GAL::skipEvent( wxEvent& aEvent ) +{ + // This is necessary for CHAR_HOOK event to generate KEY_UP and KEY_DOWN events + aEvent.Skip(); +} diff --git a/common/gal/cairo/cairo_gal.cpp b/common/gal/cairo/cairo_gal.cpp index 7b4f6972f7..9425fd084f 100644 --- a/common/gal/cairo/cairo_gal.cpp +++ b/common/gal/cairo/cairo_gal.cpp @@ -52,17 +52,16 @@ CAIRO_GAL::CAIRO_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener, groupCounter = 0; // Connecting the event handlers - Connect( wxEVT_PAINT, wxPaintEventHandler( CAIRO_GAL::onPaint ) ); + Connect( wxEVT_PAINT, wxPaintEventHandler( CAIRO_GAL::onPaint ) ); // Mouse events are skipped to the parent - Connect( wxEVT_MOTION, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); - Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); - Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); - Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); - Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); - Connect( wxEVT_LEFT_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); + Connect( wxEVT_MOTION, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); + Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); + Connect( wxEVT_LEFT_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); - Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); + Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); + Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); + Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); #if defined _WIN32 || defined _WIN64 Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( CAIRO_GAL::skipMouseEvent ) ); #endif diff --git a/common/gal/opengl/opengl_gal.cpp b/common/gal/opengl/opengl_gal.cpp index 0325a173fe..5cbd4fa162 100644 --- a/common/gal/opengl/opengl_gal.cpp +++ b/common/gal/opengl/opengl_gal.cpp @@ -66,17 +66,16 @@ OPENGL_GAL::OPENGL_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener, groupCounter = 0; // Connecting the event handlers - Connect( wxEVT_PAINT, wxPaintEventHandler( OPENGL_GAL::onPaint ) ); + Connect( wxEVT_PAINT, wxPaintEventHandler( OPENGL_GAL::onPaint ) ); // Mouse events are skipped to the parent - Connect( wxEVT_MOTION, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); - Connect( wxEVT_MOUSEWHEEL, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); - Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); - Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); - Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); - Connect( wxEVT_LEFT_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); + Connect( wxEVT_MOTION, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); + Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); + Connect( wxEVT_LEFT_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); Connect( wxEVT_MIDDLE_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); - Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); + Connect( wxEVT_MIDDLE_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); + Connect( wxEVT_RIGHT_DOWN, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); + Connect( wxEVT_RIGHT_UP, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); #if defined _WIN32 || defined _WIN64 Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( OPENGL_GAL::skipMouseEvent ) ); #endif diff --git a/common/tool/tool_dispatcher.cpp b/common/tool/tool_dispatcher.cpp index 5eb905af23..ddf168fba0 100644 --- a/common/tool/tool_dispatcher.cpp +++ b/common/tool/tool_dispatcher.cpp @@ -44,7 +44,7 @@ using boost::optional; struct TOOL_DISPATCHER::ButtonState { ButtonState( TOOL_MouseButtons aButton, const wxEventType& aDownEvent, - const wxEventType & aUpEvent, bool aTriggerMenu = false) : + const wxEventType& aUpEvent, bool aTriggerMenu = false ) : button( aButton ), downEvent( aDownEvent ), upEvent( aUpEvent ), @@ -63,7 +63,7 @@ struct TOOL_DISPATCHER::ButtonState bool triggerContextMenu; wxLongLong downTimestamp; - + void Reset() { dragging = false; @@ -72,8 +72,8 @@ struct TOOL_DISPATCHER::ButtonState }; -TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER *aToolMgr, PCB_BASE_FRAME *aEditFrame ) : - m_toolMgr(aToolMgr), m_editFrame(aEditFrame) +TOOL_DISPATCHER::TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr, PCB_BASE_FRAME* aEditFrame ) : + m_toolMgr( aToolMgr ), m_editFrame( aEditFrame ) { m_buttons.push_back( new ButtonState( MB_Left, wxEVT_LEFT_DOWN, wxEVT_LEFT_UP ) ); m_buttons.push_back( new ButtonState( MB_Right, wxEVT_RIGHT_DOWN, wxEVT_RIGHT_UP, true ) ); @@ -103,23 +103,22 @@ KiGfx::VIEW* TOOL_DISPATCHER::getView() } -int TOOL_DISPATCHER::decodeModifiers( wxEvent& aEvent ) +int TOOL_DISPATCHER::decodeModifiers( const wxKeyboardState* aState ) const { - wxMouseEvent* me = static_cast( &aEvent ); int mods = 0; - if( me->ControlDown() ) - mods |= MB_ModCtrl; - if( me->AltDown() ) - mods |= MB_ModAlt; - if( me->ShiftDown() ) - mods |= MB_ModShift; + if( aState->ControlDown() ) + mods |= MD_ModCtrl; + if( aState->AltDown() ) + mods |= MD_ModAlt; + if( aState->ShiftDown() ) + mods |= MD_ModShift; - return mods; + return mods; } -bool TOOL_DISPATCHER::handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMotion ) +bool TOOL_DISPATCHER::handleMouseButton( wxEvent& aEvent, int aIndex, bool aMotion ) { ButtonState* st = m_buttons[aIndex]; wxEventType type = aEvent.GetEventType(); @@ -128,7 +127,7 @@ bool TOOL_DISPATCHER::handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMot bool up = type == st->upEvent; bool down = type == st->downEvent; - int mods = decodeModifiers( aEvent ); + int mods = decodeModifiers( static_cast( &aEvent ) ); int args = st->button | mods; if( down ) @@ -139,7 +138,7 @@ bool TOOL_DISPATCHER::handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMot st->pressed = true; evt = TOOL_EVENT( TC_Mouse, TA_MouseDown, args ); } - else if ( up ) + else if( up ) { bool isClick = false; st->pressed = false; @@ -148,7 +147,8 @@ bool TOOL_DISPATCHER::handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMot { wxLongLong t = wxGetLocalTimeMillis(); - if( t - st->downTimestamp < DragTimeThreshold && st->dragMaxDelta < DragDistanceThreshold ) + if( t - st->downTimestamp < DragTimeThreshold && + st->dragMaxDelta < DragDistanceThreshold ) isClick = true; else evt = TOOL_EVENT( TC_Mouse, TA_MouseUp, args ); @@ -159,7 +159,7 @@ bool TOOL_DISPATCHER::handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMot if( isClick ) { - if( st -> triggerContextMenu && !mods ) + if( st->triggerContextMenu && !mods ) {} // evt = TOOL_EVENT( TC_Command, TA_ContextMenu ); else @@ -197,7 +197,7 @@ bool TOOL_DISPATCHER::handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMot } -void TOOL_DISPATCHER::DispatchWxEvent( wxEvent &aEvent ) +void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent ) { bool motion = false, buttonEvents = false; VECTOR2D pos; @@ -205,25 +205,42 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent &aEvent ) int type = aEvent.GetEventType(); - if( type == wxEVT_MOTION ) + // Mouse handling + if( type == wxEVT_MOTION || type == wxEVT_MOUSEWHEEL || + type == wxEVT_LEFT_DOWN || type == wxEVT_LEFT_UP || + type == wxEVT_MIDDLE_DOWN || type == wxEVT_MIDDLE_UP || + type == wxEVT_RIGHT_DOWN || type == wxEVT_RIGHT_UP ) { - wxMouseEvent *me = static_cast( &aEvent ); + wxMouseEvent* me = static_cast( &aEvent ); pos = getView()->ToWorld( VECTOR2D( me->GetX(), me->GetY() ) ); if( pos != m_lastMousePos ) { motion = true; m_lastMousePos = pos; } + + for( unsigned int i = 0; i < m_buttons.size(); i++ ) + buttonEvents |= handleMouseButton( aEvent, i, motion ); + + if( !buttonEvents && motion ) + { + evt = TOOL_EVENT( TC_Mouse, TA_MouseMotion ); + evt->SetMousePosition( pos ); + } } - for( unsigned int i = 0; i < m_buttons.size(); i++ ) - buttonEvents |= handleMouseButton( aEvent, i, motion ); + // Keyboard handling + else if( type == wxEVT_KEY_UP || type == wxEVT_KEY_DOWN ) + { + wxKeyEvent* ke = static_cast( &aEvent ); + int key = ke->GetKeyCode(); + int mods = decodeModifiers( ke ); - if( !buttonEvents && motion ) - { - evt = TOOL_EVENT (TC_Mouse, TA_MouseMotion ); - evt->SetMousePosition( pos ); - } + if( type == wxEVT_KEY_UP ) + evt = TOOL_EVENT( TC_Keyboard, TA_KeyUp, key | mods ); + else + evt = TOOL_EVENT( TC_Keyboard, TA_KeyDown, key | mods ); + } if( evt ) m_toolMgr->ProcessEvent( *evt ); @@ -237,7 +254,7 @@ void TOOL_DISPATCHER::DispatchWxCommand( wxCommandEvent &aEvent ) bool activateTool = false; std::string toolName; - switch ( aEvent.GetId() ) + switch( aEvent.GetId() ) { case ID_SELECTION_TOOL: toolName = "pcbnew.InteractiveSelection"; @@ -247,7 +264,7 @@ void TOOL_DISPATCHER::DispatchWxCommand( wxCommandEvent &aEvent ) if( activateTool ) { - TOOL_EVENT evt ( TC_Command, TA_ActivateTool, toolName ); + TOOL_EVENT evt( TC_Command, TA_ActivateTool, toolName ); m_toolMgr->ProcessEvent( evt ); } } diff --git a/common/tool/tool_event.cpp b/common/tool/tool_event.cpp index 3d03692b82..4c5a0c2f98 100644 --- a/common/tool/tool_event.cpp +++ b/common/tool/tool_event.cpp @@ -44,9 +44,13 @@ struct FlagString static const std::string flag2string( int flag, const FlagString* exps ) { std::string rv; - for(int i = 0; exps[i].str.length(); i++) - if(exps[i].flag & flag) - rv+=exps[i].str+" "; + + for( int i = 0; exps[i].str.length(); i++ ) + { + if( exps[i].flag & flag ) + rv += exps[i].str + " "; + } + return rv; } @@ -57,6 +61,7 @@ const std::string TOOL_EVENT::Format() const const FlagString categories[] = { { TC_Mouse, "mouse" }, + { TC_Keyboard, "keyboard" }, { TC_Command, "command" }, { TC_Message, "message" }, { TC_View, "view" }, @@ -70,6 +75,8 @@ const std::string TOOL_EVENT::Format() const { TA_MouseDrag, "drag" }, { TA_MouseMotion, "motion" }, { TA_MouseWheel, "wheel" }, + { TA_KeyUp, "key-up" }, + { TA_KeyDown, "key-down" }, { TA_ViewRefresh, "view-refresh" }, { TA_ViewZoom, "view-zoom" }, { TA_ViewPan, "view-pan" }, @@ -87,23 +94,40 @@ const std::string TOOL_EVENT::Format() const { MB_Left, "left" }, { MB_Right, "right" }, { MB_Middle, "middle" }, - { MB_ModShift, "shift" }, - { MB_ModCtrl, "ctrl" }, - { MB_ModAlt, "alt" }, { 0, "" } }; + const FlagString modifiers[] = { + { MD_ModShift, "shift" }, + { MD_ModCtrl, "ctrl" }, + { MD_ModAlt, "alt" }, + { 0, "" } + }; + ev = "category: "; ev += flag2string( m_category, categories ); - ev +=" action: "; + ev += " action: "; ev += flag2string( m_actions, actions ); if( m_actions & TA_Mouse ) { - ev +=" btns: "; + ev += " btns: "; ev += flag2string( m_mouseButtons, buttons ); - }; + } + + if( m_actions & TA_Keyboard ) + { + char tmp[128]; + sprintf( tmp, "key: %d", m_keyCode ); + ev += tmp; + } + if( m_actions & ( TA_Mouse | TA_Keyboard ) ) + { + ev += " mods: "; + ev += flag2string( m_modifiers, modifiers ); + } + if( m_commandId ) { char tmp[128]; diff --git a/common/view/wx_view_controls.cpp b/common/view/wx_view_controls.cpp index 43727c376b..0076668238 100644 --- a/common/view/wx_view_controls.cpp +++ b/common/view/wx_view_controls.cpp @@ -53,11 +53,11 @@ WX_VIEW_CONTROLS::WX_VIEW_CONTROLS( VIEW* aView, wxWindow* aParentPanel ) : } -void WX_VIEW_CONTROLS::onMotion( wxMouseEvent& event ) +void WX_VIEW_CONTROLS::onMotion( wxMouseEvent& aEvent ) { - if( event.Dragging() && m_isDragPanning ) + if( aEvent.Dragging() && m_isDragPanning ) { - VECTOR2D mousePoint( event.GetX(), event.GetY() ); + VECTOR2D mousePoint( aEvent.GetX(), aEvent.GetY() ); VECTOR2D d = m_dragStartPoint - mousePoint; VECTOR2D delta = m_view->ToWorld( d, false ); @@ -65,19 +65,19 @@ void WX_VIEW_CONTROLS::onMotion( wxMouseEvent& event ) m_parentPanel->Refresh(); } - event.Skip(); + aEvent.Skip(); } -void WX_VIEW_CONTROLS::onWheel( wxMouseEvent& event ) +void WX_VIEW_CONTROLS::onWheel( wxMouseEvent& aEvent ) { const double wheelPanSpeed = 0.001; - if( event.ControlDown() || event.ShiftDown() ) + if( aEvent.ControlDown() || aEvent.ShiftDown() ) { // Scrolling VECTOR2D scrollVec = m_view->ToWorld( m_view->GetScreenPixelSize() * - ( (double) event.GetWheelRotation() * wheelPanSpeed ), false ); + ( (double) aEvent.GetWheelRotation() * wheelPanSpeed ), false ); double scrollSpeed; if( abs( scrollVec.x ) > abs( scrollVec.y ) ) @@ -85,8 +85,8 @@ void WX_VIEW_CONTROLS::onWheel( wxMouseEvent& event ) else scrollSpeed = scrollVec.y; - VECTOR2D delta( event.ControlDown() ? -scrollSpeed : 0.0, - event.ShiftDown() ? -scrollSpeed : 0.0 ); + VECTOR2D delta( aEvent.ControlDown() ? -scrollSpeed : 0.0, + aEvent.ShiftDown() ? -scrollSpeed : 0.0 ); m_view->SetCenter( m_view->GetCenter() + delta ); m_parentPanel->Refresh(); @@ -103,41 +103,41 @@ void WX_VIEW_CONTROLS::onWheel( wxMouseEvent& event ) // Set scaling speed depending on scroll wheel event interval if( timeDiff < 500 && timeDiff > 0 ) { - zoomScale = ( event.GetWheelRotation() > 0.0 ) ? 2.05 - timeDiff / 500 : + zoomScale = ( aEvent.GetWheelRotation() > 0.0 ) ? 2.05 - timeDiff / 500 : 1.0 / ( 2.05 - timeDiff / 500 ); } else { - zoomScale = ( event.GetWheelRotation() > 0.0 ) ? 1.05 : 0.95; + zoomScale = ( aEvent.GetWheelRotation() > 0.0 ) ? 1.05 : 0.95; } - VECTOR2D anchor = m_view->ToWorld( VECTOR2D( event.GetX(), event.GetY() ) ); + VECTOR2D anchor = m_view->ToWorld( VECTOR2D( aEvent.GetX(), aEvent.GetY() ) ); m_view->SetScale( m_view->GetScale() * zoomScale, anchor ); m_parentPanel->Refresh(); } - event.Skip(); + aEvent.Skip(); } -void WX_VIEW_CONTROLS::onButton( wxMouseEvent& event ) +void WX_VIEW_CONTROLS::onButton( wxMouseEvent& aEvent ) { - if( event.MiddleDown() ) + if( aEvent.MiddleDown() ) { m_isDragPanning = true; - m_dragStartPoint = VECTOR2D( event.GetX(), event.GetY() ); + m_dragStartPoint = VECTOR2D( aEvent.GetX(), aEvent.GetY() ); m_lookStartPoint = m_view->GetCenter(); } - else if( event.MiddleUp() ) + else if( aEvent.MiddleUp() ) { m_isDragPanning = false; } - event.Skip(); + aEvent.Skip(); } -void WX_VIEW_CONTROLS::onEnter( wxMouseEvent& event ) +void WX_VIEW_CONTROLS::onEnter( wxMouseEvent& aEvent ) { m_parentPanel->SetFocus(); } diff --git a/include/class_drawpanel_gal.h b/include/class_drawpanel_gal.h index 9206c69338..542787fd0d 100644 --- a/include/class_drawpanel_gal.h +++ b/include/class_drawpanel_gal.h @@ -115,6 +115,7 @@ protected: void onPaint( wxPaintEvent& WXUNUSED( aEvent ) ); void onSize( wxSizeEvent& aEvent ); void onEvent( wxEvent& aEvent ); + void skipEvent( wxEvent& aEvent ); KiGfx::GAL* m_gal; ///< Interface for drawing objects on a 2D-surface KiGfx::VIEW* m_view; ///< Stores view settings (scale, center, etc.) diff --git a/include/gal/cairo/cairo_gal.h b/include/gal/cairo/cairo_gal.h index 0c584049f1..f96f5fc766 100644 --- a/include/gal/cairo/cairo_gal.h +++ b/include/gal/cairo/cairo_gal.h @@ -285,7 +285,7 @@ private: wxPoint savedCursorPosition; ///< The last cursor position wxBitmap* cursorPixels; ///< Cursor pixels wxBitmap* cursorPixelsSaved; ///< Saved cursor pixels - int cursorSize; ///< Cursor size + int cursorSize; ///< Cursor size /// Maximum number of arguments for one command static const int MAX_CAIRO_ARGUMENTS = 6; diff --git a/include/tool/tool_dispatcher.h b/include/tool/tool_dispatcher.h index 2060b0d544..8072274dfe 100644 --- a/include/tool/tool_dispatcher.h +++ b/include/tool/tool_dispatcher.h @@ -30,6 +30,7 @@ #include #include +#include class TOOL_MANAGER; class PCB_BASE_FRAME; @@ -69,21 +70,18 @@ private: static const int DragTimeThreshold = 300; static const int DragDistanceThreshold = 8; - bool handleMouseButton ( wxEvent& aEvent, int aIndex, bool aMotion ); - bool handleKeys ( wxEvent& aEvent ); - bool handlePopupMenu ( wxEvent& aEvent ); + bool handleMouseButton( wxEvent& aEvent, int aIndex, bool aMotion ); + bool handlePopupMenu( wxEvent& aEvent ); - int decodeModifiers( wxEvent& aEvent ); - - KiGfx::VIEW* getView(); + int decodeModifiers( const wxKeyboardState* aState ) const; struct ButtonState; - - TOOL_MANAGER* m_toolMgr; - PCB_BASE_FRAME* m_editFrame; VECTOR2D m_lastMousePos; std::vector m_buttons; + KiGfx::VIEW* getView(); + TOOL_MANAGER* m_toolMgr; + PCB_BASE_FRAME* m_editFrame; }; #endif diff --git a/include/tool/tool_event.h b/include/tool/tool_event.h index 8a771a9297..cdaaa45408 100644 --- a/include/tool/tool_event.h +++ b/include/tool/tool_event.h @@ -40,32 +40,39 @@ class TOOL_MANAGER; */ enum TOOL_EventCategory { - TC_None = 0x0, - TC_Mouse = 0x1, - TC_Command = 0x2, - TC_Message = 0x4, - TC_View = 0x8, - TC_Any = 0xffffffff + TC_None = 0x00, + TC_Mouse = 0x01, + TC_Keyboard = 0x02, + TC_Command = 0x04, + TC_Message = 0x08, + TC_View = 0x10, + TC_Any = 0xffffffff }; enum TOOL_Actions { - TA_None = 0x0, - TA_MouseClick = 0x1, - TA_MouseUp = 0x2, - TA_MouseDown = 0x4, - TA_MouseDrag = 0x8, - TA_MouseMotion = 0x10, - TA_MouseWheel = 0x20, - TA_Mouse = 0x3f, - TA_ViewRefresh = 0x40, - TA_ViewZoom = 0x80, - TA_ViewPan = 0x100, - TA_ViewDirty = 0x200, - TA_ChangeLayer = 0x1000, + // UI input events + TA_None = 0x0000, + TA_MouseClick = 0x0001, + TA_MouseUp = 0x0002, + TA_MouseDown = 0x0004, + TA_MouseDrag = 0x0008, + TA_MouseMotion = 0x0010, + TA_MouseWheel = 0x0020, + TA_Mouse = 0x003f, + TA_KeyUp = 0x0040, + TA_KeyDown = 0x0080, + TA_Keyboard = TA_KeyUp | TA_KeyDown, + + // View related events + TA_ViewRefresh = 0x0100, + TA_ViewZoom = 0x0200, + TA_ViewPan = 0x0400, + TA_ViewDirty = 0x0800, + TA_ChangeLayer = 0x1000, // Tool cancel event. Issued automagically when the user hits escape or selects End Tool from the context menu. - TA_CancelTool = 0x2000, + TA_CancelTool = 0x2000, // Tool activation event. Issued by the GUI upon pressing a button/menu selection. TA_ActivateTool = 0x4000, @@ -81,25 +88,28 @@ enum TOOL_Actions enum TOOL_MouseButtons { - MB_None = 0x0, - MB_Left = 0x1, - MB_Right = 0x2, - MB_Middle = 0x4, - MB_ButtonMask = MB_Left | MB_Right | MB_Middle, - MB_ModShift = 0x8, - MB_ModCtrl = 0x10, - MB_ModAlt = 0x20, - MB_ModifierMask = MB_ModShift | MB_ModCtrl | MB_ModAlt, - MB_Any = 0xffffffff + MB_None = 0x0, + MB_Left = 0x1, + MB_Right = 0x2, + MB_Middle = 0x4, + MB_ButtonMask = MB_Left | MB_Right | MB_Middle, + MB_Any = 0xffffffff }; +enum TOOL_Modifiers +{ + MD_ModShift = 0x1000, + MD_ModCtrl = 0x2000, + MD_ModAlt = 0x4000, + MD_ModifierMask = MD_ModShift | MD_ModCtrl | MD_ModAlt, +}; // Defines when a context menu is opened. enum TOOL_ContextMenuTrigger { - CMENU_BUTTON = 0, // On the right button - CMENU_NOW, // Right now (after TOOL_INTERACTIVE::SetContextMenu) - CMENU_OFF // Never + CMENU_BUTTON = 0, // On the right button + CMENU_NOW, // Right now (after TOOL_INTERACTIVE::SetContextMenu) + CMENU_OFF // Never }; /** @@ -112,22 +122,38 @@ class TOOL_EVENT public: const std::string Format() const; - TOOL_EVENT( TOOL_EventCategory aCategory = TC_None, TOOL_Actions aAction = TA_None ): + TOOL_EVENT( TOOL_EventCategory aCategory = TC_None, TOOL_Actions aAction = TA_None ) : m_category( aCategory ), m_actions( aAction ), - m_mouseButtons( 0 ) {} + m_mouseButtons( 0 ), + m_keyCode( 0 ), + m_modifiers( 0 ) {} - TOOL_EVENT( TOOL_EventCategory aCategory, TOOL_Actions aAction, int aExtraParam ): + TOOL_EVENT( TOOL_EventCategory aCategory, TOOL_Actions aAction, int aExtraParam ) : m_category( aCategory ), m_actions( aAction ) { if( aCategory == TC_Mouse ) - m_mouseButtons = aExtraParam; + { + m_mouseButtons = aExtraParam & MB_ButtonMask; + } + else if( aCategory == TC_Keyboard ) + { + m_keyCode = aExtraParam & ~MD_ModifierMask; // Filter out modifiers + } else if ( aCategory == TC_Command ) + { m_commandId = aExtraParam; + } + + if( aCategory & ( TC_Mouse | TC_Keyboard ) ) + { + m_modifiers = aExtraParam & MD_ModifierMask; + } } - TOOL_EVENT( TOOL_EventCategory aCategory, TOOL_Actions aAction, const std::string& aExtraParam ): + TOOL_EVENT( TOOL_EventCategory aCategory, TOOL_Actions aAction, + const std::string& aExtraParam ) : m_category( aCategory ), m_actions( aAction ), m_mouseButtons( 0 ) @@ -193,9 +219,14 @@ public: return m_actions == TA_CancelTool; } - bool Modifier( int aMask = MB_ModifierMask ) const + bool Modifier( int aMask = MD_ModifierMask ) const { - return ( m_mouseButtons & aMask ); + return ( m_modifiers & aMask ); + } + + int KeyCode() const + { + return m_keyCode; } void Ignore(); @@ -250,6 +281,8 @@ private: VECTOR2D m_mouseDragOrigin; int m_mouseButtons; + int m_keyCode; + int m_modifiers; boost::optional m_commandId; boost::optional m_commandStr; }; @@ -299,12 +332,12 @@ public: return m_events.end(); } - const_iterator cbegin() const + const_iterator cbegin() const { return m_events.begin(); } - const_iterator cend() const + const_iterator cend() const { return m_events.end(); } @@ -354,7 +387,7 @@ private: std::deque m_events; }; -inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& a, const TOOL_EVENT &b ) +inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& a, const TOOL_EVENT& b ) { TOOL_EVENT_LIST l; @@ -364,7 +397,7 @@ inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& a, const TOOL_EVENT & return l; } -inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT & a, const TOOL_EVENT_LIST &b ) +inline const TOOL_EVENT_LIST operator||( const TOOL_EVENT& a, const TOOL_EVENT_LIST& b ) { TOOL_EVENT_LIST l( b ); diff --git a/include/view/wx_view_controls.h b/include/view/wx_view_controls.h index 8e7400df67..149a0eb310 100644 --- a/include/view/wx_view_controls.h +++ b/include/view/wx_view_controls.h @@ -52,10 +52,10 @@ public: WX_VIEW_CONTROLS( VIEW* aView, wxWindow* aParentPanel ); ~WX_VIEW_CONTROLS() {}; - void onWheel( wxMouseEvent& event ); - void onMotion( wxMouseEvent& event ); - void onButton( wxMouseEvent& event ); - void onEnter( wxMouseEvent& event ); + void onWheel( wxMouseEvent& aEvent ); + void onMotion( wxMouseEvent& aEvent ); + void onButton( wxMouseEvent& aEvent ); + void onEnter( wxMouseEvent& aEvent ); void SetEventDispatcher( TOOL_DISPATCHER *aEventDispatcher ); diff --git a/pcbnew/tools/selection_tool.cpp b/pcbnew/tools/selection_tool.cpp index 14e1b0e403..a7ac0c682d 100644 --- a/pcbnew/tools/selection_tool.cpp +++ b/pcbnew/tools/selection_tool.cpp @@ -69,7 +69,7 @@ int SELECTION_TOOL::Main( TOOL_EVENT& aEvent ) // Main loop: keep receiving events while( OPT_TOOL_EVENT evt = Wait() ) { - m_additive = evt->Modifier( MB_ModShift ); + m_additive = evt->Modifier( MD_ModShift ); if( evt->IsCancel() ) return 0;