diff --git a/Changes b/Changes index e5765041022..e81307ca23a 100644 --- a/Changes +++ b/Changes @@ -18,6 +18,8 @@ * Added drag and drop node connection re-wiring (#78). +* Viewports can be panned/tracked using middle mouse with no modifier key (#28). + 0.58.0 ====== diff --git a/src/GafferUI/ViewportGadget.cpp b/src/GafferUI/ViewportGadget.cpp index 81db0e9b31d..24765f8b85d 100644 --- a/src/GafferUI/ViewportGadget.cpp +++ b/src/GafferUI/ViewportGadget.cpp @@ -244,17 +244,21 @@ bool ViewportGadget::buttonPress( GadgetPtr gadget, const ButtonEvent &event ) gadgetsAt( V2f( event.line.p0.x, event.line.p0.y ), gadgets ); GadgetPtr handler = 0; + m_lastButtonPressGadget = 0; bool result = dispatchEvent( gadgets, &Gadget::buttonPressSignal, event, handler ); if( result ) { m_lastButtonPressGadget = handler; + return true; } - else + + if ( event.buttons == ButtonEvent::Middle && event.modifiers == ModifiableEvent::None ) { - m_lastButtonPressGadget = 0; + // accept press so we get a dragBegin opportunity for camera movement + return true; } - return result; + return false; } bool ViewportGadget::buttonRelease( GadgetPtr gadget, const ButtonEvent &event ) @@ -346,7 +350,19 @@ bool ViewportGadget::mouseMove( GadgetPtr gadget, const ButtonEvent &event ) IECore::RunTimeTypedPtr ViewportGadget::dragBegin( GadgetPtr gadget, const DragDropEvent &event ) { - if( event.modifiers & ModifiableEvent::Alt ) + if ( !(event.modifiers & ModifiableEvent::Alt) && m_lastButtonPressGadget ) + { + // see if a child gadget would like to start a drag + RunTimeTypedPtr data = dispatchEvent( m_lastButtonPressGadget, &Gadget::dragBeginSignal, event ); + if( data ) + { + const_cast( event ).sourceGadget = m_lastButtonPressGadget; + + return data; + } + } + + if ( event.modifiers & ModifiableEvent::Alt || ( event.buttons == ButtonEvent::Middle && event.modifiers == ModifiableEvent::None ) ) { // start camera motion @@ -392,23 +408,6 @@ IECore::RunTimeTypedPtr ViewportGadget::dragBegin( GadgetPtr gadget, const DragD return 0; } } - else - { - // see if a child gadget would like to start a drag - if( m_lastButtonPressGadget ) - { - RunTimeTypedPtr data = dispatchEvent( m_lastButtonPressGadget, &Gadget::dragBeginSignal, event ); - if( data ) - { - const_cast( event ).sourceGadget = m_lastButtonPressGadget; - } - return data; - } - else - { - return 0; - } - } return 0; }