X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FSVTK%2FSVTK_RenderWindowInteractor.cxx;h=ac07e118c22a87257ff3833547f9a329635b537c;hb=259ecb356eb789678497db6b655cc3e377a67cce;hp=a2b8aa176ab3623824c19fa99080b5a5900bebba;hpb=9f1a66957ba9a2308f8fdc3f9397140af9df5fd0;p=modules%2Fgui.git diff --git a/src/SVTK/SVTK_RenderWindowInteractor.cxx b/src/SVTK/SVTK_RenderWindowInteractor.cxx index a2b8aa176..ac07e118c 100644 --- a/src/SVTK/SVTK_RenderWindowInteractor.cxx +++ b/src/SVTK/SVTK_RenderWindowInteractor.cxx @@ -1,39 +1,44 @@ -// SALOME VTKViewer : build VTK viewer into Salome desktop +// Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // -// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. // +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. // +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// + +// SALOME VTKViewer : build VTK viewer into Salome desktop // File : // Author : -// Module : SALOME -// $Header$ #include "SVTK_RenderWindowInteractor.h" -#include "SVTK_GenericRenderWindowInteractor.h" #include "SVTK_InteractorStyle.h" #include "SVTK_Renderer.h" #include "SVTK_Functor.h" #include "SALOME_Actor.h" +// QT Includes +// Put Qt includes before the X11 includes which #define the symbol None +// (see SVTK_SpaceMouse.h) to avoid the compilation error. +#ifndef WIN32 +# include +#endif +#include + #include "SVTK_SpaceMouse.h" #include "SVTK_Event.h" @@ -49,61 +54,72 @@ #include #include -// QT Includes -#include -#include -#include -#include - -using namespace std; - -static bool GENERATE_SUIT_EVENTS = false; +static bool GENERATE_SUIT_EVENTS = true; static bool FOCUS_UNDER_MOUSE = false; +// workaround about the bug in vtkImplicitPlaneWidget class +// that eats mouse button release event +// causing clipping plane preview in SMESH sticking up +#define Fix_Of_vtkImplicitPlaneWidget_bug -//---------------------------------------------------------------------------- +/*! + Constructor +*/ QVTK_RenderWindowInteractor ::QVTK_RenderWindowInteractor(QWidget* theParent, - const char* theName): - QWidget(theParent,theName,Qt::WNoAutoErase), + const char* theName): + QWidget(theParent), myRenderWindow(vtkRenderWindow::New()) { + setAttribute( Qt::WA_PaintOnScreen ); + setAttribute( Qt::WA_NoSystemBackground ); + + setObjectName(theName); + setMouseTracking(true); myRenderWindow->Delete(); myRenderWindow->DoubleBufferOn(); -#ifndef WNT - myRenderWindow->SetDisplayId((void*)x11Display()); +#ifndef WIN32 + myRenderWindow->SetDisplayId((void*)QX11Info::display()); #endif myRenderWindow->SetWindowId((void*)winId()); } - +/*! + To initialize by vtkGenericRenderWindowInteractor instance +*/ void QVTK_RenderWindowInteractor ::Initialize(vtkGenericRenderWindowInteractor* theDevice) { - if(GetDevice()) - myDevice->SetRenderWindow(NULL); + if ( GetDevice() ) + myDevice->SetRenderWindow( NULL ); myDevice = theDevice; - if(theDevice) - theDevice->SetRenderWindow(getRenderWindow()); + if ( theDevice ) + theDevice->SetRenderWindow( getRenderWindow() ); } -//---------------------------------------------------------------------------- +/*! + Destructor +*/ QVTK_RenderWindowInteractor ::~QVTK_RenderWindowInteractor() { - if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()) - if(aSpaceMouse->isSpaceMouseOn()) - aSpaceMouse->close(x11Display()); +#ifndef WIN32 + SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance(); + if ( aSpaceMouse && aSpaceMouse->isSpaceMouseOn() ) + aSpaceMouse->close( QX11Info::display() ); +#endif } -//---------------------------------------------------------------------------- +/*! + \return corresponding render window interactor +*/ vtkGenericRenderWindowInteractor* QVTK_RenderWindowInteractor ::GetDevice() @@ -111,7 +127,9 @@ QVTK_RenderWindowInteractor return myDevice.GetPointer(); } -//---------------------------------------------------------------------------- +/*! + \return corresponding render window +*/ vtkRenderWindow* QVTK_RenderWindowInteractor ::getRenderWindow() @@ -119,7 +137,9 @@ QVTK_RenderWindowInteractor return myRenderWindow.GetPointer(); } -//---------------------------------------------------------------------------- +/*! + Just to simplify usage of its device (vtkGenericRenderWindowInteractor) +*/ void QVTK_RenderWindowInteractor ::InvokeEvent(unsigned long theEvent, void* theCallData) @@ -127,7 +147,17 @@ QVTK_RenderWindowInteractor GetDevice()->InvokeEvent(theEvent,theCallData); } -//---------------------------------------------------------------------------- +/*! + Get paint engine for the scene +*/ +QPaintEngine* QVTK_RenderWindowInteractor::paintEngine() const +{ + return 0; +} + +/*! + Need for initial contents display on Win32 +*/ void QVTK_RenderWindowInteractor ::show() @@ -136,20 +166,24 @@ QVTK_RenderWindowInteractor update(); // needed for initial contents display on Win32 } -//---------------------------------------------------------------------------- +/*! + To implement final initialization, just before the widget is displayed +*/ void QVTK_RenderWindowInteractor ::polish() { // Final initialization just before the widget is displayed GetDevice()->SetSize(width(),height()); - if(!GetDevice()->GetInitialized()){ + if(!GetDevice()->GetInitialized() && GetDevice()->GetRenderWindow()){ GetDevice()->Initialize(); GetDevice()->ConfigureEvent(); } } -//---------------------------------------------------------------------------- +/*! + To adjust widget and vtkRenderWindow size +*/ void QVTK_RenderWindowInteractor ::resize(int w, int h) @@ -157,16 +191,20 @@ QVTK_RenderWindowInteractor GetDevice()->UpdateSize(w,h); } -//---------------------------------------------------------------------------- +/*! + Custom paint event handler +*/ void QVTK_RenderWindowInteractor ::paintEvent( QPaintEvent* theEvent ) { - GetDevice()->Render(); + GetDevice()->CreateTimer(VTKI_TIMER_FIRST); } -//---------------------------------------------------------------------------- +/*! + Custom resize event handler +*/ void QVTK_RenderWindowInteractor ::resizeEvent( QResizeEvent* theEvent ) @@ -183,13 +221,13 @@ QVTK_RenderWindowInteractor aRenderers->InitTraversal(); double aCoeff = 1.0; if(vtkRenderer *aRenderer = aRenderers->GetNextItem()) { - vtkCamera *aCamera = aRenderer->GetActiveCamera(); - double aScale = aCamera->GetParallelScale(); - if((aWidth - width())*(aHeight - height()) > 0) - aCoeff = sqrt(double(aWidth)/double(width())*double(height())/double(aHeight)); - else - aCoeff = double(aWidth)/double(width()); - aCamera->SetParallelScale(aScale*aCoeff); + vtkCamera *aCamera = aRenderer->GetActiveCamera(); + double aScale = aCamera->GetParallelScale(); + if((aWidth - width())*(aHeight - height()) > 0) + aCoeff = sqrt(double(aWidth)/double(width())*double(height())/double(aHeight)); + else + aCoeff = double(aWidth)/double(width()); + aCamera->SetParallelScale(aScale*aCoeff); } } } @@ -198,117 +236,159 @@ QVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- + +/*! + Custom context menu event handler +*/ void QVTK_RenderWindowInteractor ::contextMenuEvent( QContextMenuEvent* event ) {} - -//---------------------------------------------------------------------------- +/*! + Custom mouse move event handler +*/ void QVTK_RenderWindowInteractor ::mouseMoveEvent( QMouseEvent* event ) { GetDevice()->SetEventInformationFlipY(event->x(), - event->y(), - event->state() & ControlButton, - event->state() & ShiftButton); + event->y(), + event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier); GetDevice()->MouseMoveEvent(); } -//---------------------------------------------------------------------------- +/*! + Custom mouse press event handler +*/ void QVTK_RenderWindowInteractor ::mousePressEvent( QMouseEvent* event ) { GetDevice()->SetEventInformationFlipY(event->x(), - event->y(), - event->state() & ControlButton, - event->state() & ShiftButton); - if( event->button() & LeftButton ) + event->y(), + event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier); + if( event->button() & Qt::LeftButton ) GetDevice()->LeftButtonPressEvent(); - else if( event->button() & MidButton ) + else if( event->button() & Qt::MidButton ) GetDevice()->MiddleButtonPressEvent(); - else if( event->button() & RightButton ) + else if( event->button() & Qt::RightButton ) GetDevice()->RightButtonPressEvent(); } -//---------------------------------------------------------------------------- +/*! + Custom mouse release event handler +*/ void QVTK_RenderWindowInteractor ::mouseReleaseEvent( QMouseEvent *event ) { GetDevice()->SetEventInformationFlipY(event->x(), - event->y(), - event->state() & ControlButton, - event->state() & ShiftButton); + event->y(), + event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier); - if( event->button() & LeftButton ) + if( event->button() & Qt::LeftButton ) GetDevice()->LeftButtonReleaseEvent(); - else if( event->button() & MidButton ) + else if( event->button() & Qt::MidButton ) GetDevice()->MiddleButtonReleaseEvent(); - else if( event->button() & RightButton ) + else if( event->button() & Qt::RightButton ) { +#if defined(Fix_Of_vtkImplicitPlaneWidget_bug) + GetDevice()->SetEventInformationFlipY( -99999, -99999, + event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier); + bool blocked = blockSignals( true ); + GetDevice()->LeftButtonPressEvent(); + GetDevice()->LeftButtonReleaseEvent(); + blockSignals( blocked ); + GetDevice()->SetEventInformationFlipY(event->x(), + event->y(), + event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier); +#endif GetDevice()->RightButtonReleaseEvent(); + } } -//---------------------------------------------------------------------------- +/*! + Custom mouse double click event handler +*/ void QVTK_RenderWindowInteractor ::mouseDoubleClickEvent( QMouseEvent* event ) {} -//---------------------------------------------------------------------------- +/*! + Custom mouse wheel event handler +*/ void QVTK_RenderWindowInteractor ::wheelEvent( QWheelEvent* event ) { - setActiveWindow(); + activateWindow(); setFocus(); + GetDevice()->SetEventInformationFlipY(event->x(), + event->y(), + event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier); + if ( event->delta()>0) + GetDevice()->MouseWheelForwardEvent(); + else + GetDevice()->MouseWheelBackwardEvent(); } -//---------------------------------------------------------------------------- +/*! + Custom key press event handler +*/ void QVTK_RenderWindowInteractor ::keyPressEvent( QKeyEvent* event ) { - GetDevice()->SetKeyEventInformation(event->state() & ControlButton, - event->state() & ShiftButton, - event->key()); + GetDevice()->SetKeyEventInformation(event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier, + event->key()); GetDevice()->KeyPressEvent(); GetDevice()->CharEvent(); } -//---------------------------------------------------------------------------- +/*! + Custom key release event handler +*/ void QVTK_RenderWindowInteractor ::keyReleaseEvent( QKeyEvent * event ) { - GetDevice()->SetKeyEventInformation(event->state() & ControlButton, - event->state() & ShiftButton, - event->key()); + GetDevice()->SetKeyEventInformation(event->modifiers() & Qt::ControlModifier, + event->modifiers() & Qt::ShiftModifier, + event->key()); GetDevice()->KeyReleaseEvent(); } -//---------------------------------------------------------------------------- +/*! + Custom enter event handler +*/ void QVTK_RenderWindowInteractor ::enterEvent( QEvent* event ) { if(FOCUS_UNDER_MOUSE){ - setActiveWindow(); + activateWindow(); setFocus(); } GetDevice()->EnterEvent(); } -//---------------------------------------------------------------------------- +/*! + Custom leave event handler +*/ void QVTK_RenderWindowInteractor ::leaveEvent( QEvent * ) @@ -316,58 +396,87 @@ QVTK_RenderWindowInteractor GetDevice()->LeaveEvent(); } - -//---------------------------------------------------------------------------- +/*! + Reimplemented from QWidget in order to set window - receiver + of space mouse events. +*/ void QVTK_RenderWindowInteractor ::focusInEvent( QFocusEvent* event ) { QWidget::focusInEvent( event ); +#ifndef WIN32 // register set space mouse events receiver - if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()){ - if(!aSpaceMouse->isSpaceMouseOn()) {// initialize 3D space mouse driver - aSpaceMouse->initialize(x11Display(),winId()); - }else{ - aSpaceMouse->setWindow(x11Display(),winId()); - } + SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance(); + + if ( aSpaceMouse ) + { + if ( !aSpaceMouse->isSpaceMouseOn() ) + // initialize 3D space mouse driver + aSpaceMouse->initialize( QX11Info::display(), winId() ); + else + aSpaceMouse->setWindow( QX11Info::display(), winId() ); } +#endif } -//---------------------------------------------------------------------------- +/*! + Reimplemented from QWidget in order to set window - receiver + of space mouse events. +*/ void QVTK_RenderWindowInteractor ::focusOutEvent ( QFocusEvent* event ) { QWidget::focusOutEvent( event ); +#ifndef WIN32 // unregister set space mouse events receiver - if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()){ - if(aSpaceMouse->isSpaceMouseOn()) - aSpaceMouse->setWindow(x11Display(),0); - } + SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance(); + if ( aSpaceMouse && aSpaceMouse->isSpaceMouseOn() ) + aSpaceMouse->setWindow( QX11Info::display(), 0 ); +#endif +} + + +#ifdef WIN32 + +/*! + To handle native Win32 events (from such devices as SpaceMouse) +*/ +bool QVTK_RenderWindowInteractor::winEvent( MSG* msg, long* result ) +{ + // TODO: Implement event handling for SpaceMouse + return QWidget::winEvent( msg, result); } +#else -//---------------------------------------------------------------------------- +/*! + To handle native X11 events (from such devices as SpaceMouse) +*/ bool QVTK_RenderWindowInteractor ::x11Event( XEvent *xEvent ) { // handle 3d space mouse events - if(SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance()){ - if(aSpaceMouse->isSpaceMouseOn() && xEvent->type == ClientMessage){ + if ( SVTK_SpaceMouse* aSpaceMouse = SVTK_SpaceMouse::getInstance() ) + { + if ( aSpaceMouse->isSpaceMouseOn() && xEvent->type == ClientMessage ) + { SVTK_SpaceMouse::MoveEvent anEvent; - int type = aSpaceMouse->translateEvent( x11Display(), xEvent, &anEvent, 1.0, 1.0 ); - switch( type ){ - case SVTK_SpaceMouse::SpaceMouseMove : - GetDevice()->InvokeEvent(SVTK::SpaceMouseMoveEvent, anEvent.data ); - break; - case SVTK_SpaceMouse::SpaceButtonPress : - GetDevice()->InvokeEvent( SVTK::SpaceMouseButtonEvent, &anEvent.button ); - break; - case SVTK_SpaceMouse::SpaceButtonRelease : - break; + int type = aSpaceMouse->translateEvent( QX11Info::display(), xEvent, &anEvent, 1.0, 1.0 ); + switch ( type ) + { + case SVTK_SpaceMouse::SpaceMouseMove: + GetDevice()->InvokeEvent( SVTK::SpaceMouseMoveEvent, anEvent.data ); + break; + case SVTK_SpaceMouse::SpaceButtonPress: + GetDevice()->InvokeEvent( SVTK::SpaceMouseButtonEvent, &anEvent.button ); + break; + case SVTK_SpaceMouse::SpaceButtonRelease: + break; } return true; // stop handling the event } @@ -376,11 +485,14 @@ QVTK_RenderWindowInteractor return QWidget::x11Event( xEvent ); } +#endif -//---------------------------------------------------------------------------- +/*! + Constructor +*/ SVTK_RenderWindowInteractor ::SVTK_RenderWindowInteractor(QWidget* theParent, - const char* theName): + const char* theName): QVTK_RenderWindowInteractor(theParent,theName), myEventCallbackCommand(vtkCallbackCommand::New()) { @@ -392,18 +504,23 @@ SVTK_RenderWindowInteractor myEventCallbackCommand->SetCallback(SVTK_RenderWindowInteractor::ProcessEvents); } +/*! + To initialize properly the class +*/ void SVTK_RenderWindowInteractor ::Initialize(vtkGenericRenderWindowInteractor* theDevice, - SVTK_Renderer* theRenderer, - SVTK_Selector* theSelector) + SVTK_Renderer* theRenderer, + SVTK_Selector* theSelector) { QVTK_RenderWindowInteractor::Initialize(theDevice); SetRenderer(theRenderer); SetSelector(theSelector); } -//---------------------------------------------------------------------------- +/*! + Destructor +*/ SVTK_RenderWindowInteractor ::~SVTK_RenderWindowInteractor() { @@ -421,7 +538,9 @@ SVTK_RenderWindowInteractor GetDevice()->SetRenderWindow(NULL); } -//---------------------------------------------------------------------------- +/*! + To get corresponding SVTK_Renderer instance +*/ SVTK_Renderer* SVTK_RenderWindowInteractor ::GetRenderer() @@ -429,6 +548,9 @@ SVTK_RenderWindowInteractor return myRenderer.GetPointer(); } +/*! + To get corresponding SVTK_Renderer device (just to simplify collobaration with SVTK_Renderer) +*/ vtkRenderer* SVTK_RenderWindowInteractor ::getRenderer() @@ -436,6 +558,10 @@ SVTK_RenderWindowInteractor return GetRenderer()->GetDevice(); } +/*! + Changes renderer + \param theRenderer - new renderer +*/ void SVTK_RenderWindowInteractor ::SetRenderer(SVTK_Renderer* theRenderer) @@ -453,7 +579,10 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- +/*! + Changes interactor style + \param theStyle - new interactor style +*/ void SVTK_RenderWindowInteractor ::InitInteractorStyle(vtkInteractorStyle* theStyle) @@ -461,8 +590,9 @@ SVTK_RenderWindowInteractor GetDevice()->SetInteractorStyle(theStyle); } - -//---------------------------------------------------------------------------- +/*! + To change current interactor style by pushing the new one into the container +*/ void SVTK_RenderWindowInteractor ::PushInteractorStyle(vtkInteractorStyle* theStyle) @@ -471,8 +601,9 @@ SVTK_RenderWindowInteractor InitInteractorStyle(theStyle); } - -//---------------------------------------------------------------------------- +/*! + To restore previous interactor style +*/ void SVTK_RenderWindowInteractor ::PopInteractorStyle() @@ -484,8 +615,9 @@ SVTK_RenderWindowInteractor InitInteractorStyle(GetInteractorStyle()); } - -//---------------------------------------------------------------------------- +/*! + To get current interactor style +*/ vtkInteractorStyle* SVTK_RenderWindowInteractor ::GetInteractorStyle() @@ -494,7 +626,9 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- +/*! + To get current selector +*/ SVTK_Selector* SVTK_RenderWindowInteractor ::GetSelector() @@ -503,6 +637,10 @@ SVTK_RenderWindowInteractor } +/*! + Changes selector + \param theSelector - new selector +*/ void SVTK_RenderWindowInteractor ::SetSelector(SVTK_Selector* theSelector) @@ -514,18 +652,19 @@ SVTK_RenderWindowInteractor if(mySelector.GetPointer()) mySelector->AddObserver(vtkCommand::EndPickEvent, - myEventCallbackCommand.GetPointer(), - myPriority); + myEventCallbackCommand.GetPointer(), + myPriority); } - -//---------------------------------------------------------------------------- +/*! + Main process VTK event method +*/ void SVTK_RenderWindowInteractor ::ProcessEvents(vtkObject* vtkNotUsed(theObject), - unsigned long theEvent, - void* theClientData, - void* vtkNotUsed(theCallData)) + unsigned long theEvent, + void* theClientData, + void* vtkNotUsed(theCallData)) { SVTK_RenderWindowInteractor* self = reinterpret_cast(theClientData); @@ -536,8 +675,9 @@ SVTK_RenderWindowInteractor } } - -//---------------------------------------------------------------- +/*! + To change selection mode (just to simplify collobaration with SVTK_Selector) +*/ void SVTK_RenderWindowInteractor ::SetSelectionMode(Selection_Mode theMode) @@ -545,8 +685,9 @@ SVTK_RenderWindowInteractor mySelector->SetSelectionMode(theMode); } - -//---------------------------------------------------------------- +/*! + To get current selection mode (just to simplify collobaration with SVTK_Selector) +*/ Selection_Mode SVTK_RenderWindowInteractor ::SelectionMode() const @@ -555,7 +696,9 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------- +/*! + Emits signal selectionChanged() +*/ void SVTK_RenderWindowInteractor ::onEmitSelectionChanged() @@ -564,7 +707,9 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- +/*! + Custom mouse move event handler +*/ void SVTK_RenderWindowInteractor ::mouseMoveEvent( QMouseEvent* event ) @@ -576,7 +721,9 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- +/*! + Custom mouse press event handler +*/ void SVTK_RenderWindowInteractor ::mousePressEvent( QMouseEvent* event ) @@ -588,23 +735,55 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- +/*! + Custom mouse release event handler +*/ void SVTK_RenderWindowInteractor ::mouseReleaseEvent( QMouseEvent *event ) { + SVTK_InteractorStyle* style = 0; + bool aRightBtn = event->button() == Qt::RightButton; + bool isOperation = false; + bool isPolygonalSelection = false; + if( aRightBtn && GetInteractorStyle()) { + style = dynamic_cast( GetInteractorStyle() ); + if ( style ) + isOperation = style->CurrentState() != VTK_INTERACTOR_STYLE_CAMERA_NONE; + } + QVTK_RenderWindowInteractor::mouseReleaseEvent(event); + if ( style ) { + isPolygonalSelection = style->GetPolygonState() == Finished; + style->SetPolygonState( Disable ); + } + + if ( aRightBtn && !isOperation && !isPolygonalSelection && + !( event->modifiers() & Qt::ControlModifier ) && + !( event->modifiers() & Qt::ShiftModifier ) ) { + QContextMenuEvent aEvent( QContextMenuEvent::Mouse, + event->pos(), event->globalPos() ); + emit contextMenuRequested( &aEvent ); + } if(GENERATE_SUIT_EVENTS) emit MouseButtonReleased( event ); } -//---------------------------------------------------------------------------- +/*! + Custom mouse double click event handler +*/ void SVTK_RenderWindowInteractor ::mouseDoubleClickEvent( QMouseEvent* event ) { + if( GetInteractorStyle() && event->button() == Qt::LeftButton ) { + SVTK_InteractorStyle* style = dynamic_cast( GetInteractorStyle() ); + if ( style ) + style->OnMouseButtonDoubleClick(); + } + QVTK_RenderWindowInteractor::mouseDoubleClickEvent(event); if(GENERATE_SUIT_EVENTS) @@ -612,7 +791,9 @@ SVTK_RenderWindowInteractor } -//---------------------------------------------------------------------------- +/*! + Custom mouse wheel event handler +*/ void SVTK_RenderWindowInteractor ::wheelEvent( QWheelEvent* event ) @@ -628,8 +809,9 @@ SVTK_RenderWindowInteractor emit WheelMoved( event ); } - -//---------------------------------------------------------------------------- +/*! + Custom key press event handler +*/ void SVTK_RenderWindowInteractor ::keyPressEvent( QKeyEvent* event ) @@ -640,7 +822,9 @@ SVTK_RenderWindowInteractor emit KeyPressed( event ); } -//---------------------------------------------------------------------------- +/*! + Custom key release event handler +*/ void SVTK_RenderWindowInteractor ::keyReleaseEvent( QKeyEvent * event ) @@ -651,11 +835,3 @@ SVTK_RenderWindowInteractor emit KeyReleased( event ); } -//---------------------------------------------------------------------------- -void -SVTK_RenderWindowInteractor -::contextMenuEvent( QContextMenuEvent* event ) -{ - if( !( event->state() & KeyButtonMask ) ) - emit contextMenuRequested( event ); -}