-// Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014 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-2007 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 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.
+// 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
+// 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
+// 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 <vtkPicker.h>
#include <vtkCamera.h>
-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):
+ const char* theName):
QWidget(theParent),
myRenderWindow(vtkRenderWindow::New())
{
GetDevice()->InvokeEvent(theEvent,theCallData);
}
+/*!
+ Get paint engine for the scene
+*/
+QPaintEngine* QVTK_RenderWindowInteractor::paintEngine() const
+{
+ return 0;
+}
+
/*!
Need for initial contents display on Win32
*/
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);
}
}
}
::mouseMoveEvent( QMouseEvent* event )
{
GetDevice()->SetEventInformationFlipY(event->x(),
- event->y(),
- event->modifiers() & Qt::ControlModifier,
- event->modifiers() & Qt::ShiftModifier);
+ event->y(),
+ event->modifiers() & Qt::ControlModifier,
+ event->modifiers() & Qt::ShiftModifier);
GetDevice()->MouseMoveEvent();
}
::mousePressEvent( QMouseEvent* event )
{
GetDevice()->SetEventInformationFlipY(event->x(),
- event->y(),
- event->modifiers() & Qt::ControlModifier,
- event->modifiers() & Qt::ShiftModifier);
+ event->y(),
+ event->modifiers() & Qt::ControlModifier,
+ event->modifiers() & Qt::ShiftModifier);
if( event->button() & Qt::LeftButton )
GetDevice()->LeftButtonPressEvent();
else if( event->button() & Qt::MidButton )
::mouseReleaseEvent( QMouseEvent *event )
{
GetDevice()->SetEventInformationFlipY(event->x(),
- event->y(),
- event->modifiers() & Qt::ControlModifier,
- event->modifiers() & Qt::ShiftModifier);
+ event->y(),
+ event->modifiers() & Qt::ControlModifier,
+ event->modifiers() & Qt::ShiftModifier);
if( event->button() & Qt::LeftButton )
GetDevice()->LeftButtonReleaseEvent();
else if( event->button() & Qt::MidButton )
GetDevice()->MiddleButtonReleaseEvent();
- else if( event->button() & Qt::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();
+ }
}
{
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();
}
::keyPressEvent( QKeyEvent* event )
{
GetDevice()->SetKeyEventInformation(event->modifiers() & Qt::ControlModifier,
- event->modifiers() & Qt::ShiftModifier,
- event->key());
+ event->modifiers() & Qt::ShiftModifier,
+ event->key());
GetDevice()->KeyPressEvent();
GetDevice()->CharEvent();
}
::keyReleaseEvent( QKeyEvent * event )
{
GetDevice()->SetKeyEventInformation(event->modifiers() & Qt::ControlModifier,
- event->modifiers() & Qt::ShiftModifier,
- event->key());
+ event->modifiers() & Qt::ShiftModifier,
+ event->key());
GetDevice()->KeyReleaseEvent();
}
switch ( type )
{
case SVTK_SpaceMouse::SpaceMouseMove:
- GetDevice()->InvokeEvent( SVTK::SpaceMouseMoveEvent, anEvent.data );
- break;
+ GetDevice()->InvokeEvent( SVTK::SpaceMouseMoveEvent, anEvent.data );
+ break;
case SVTK_SpaceMouse::SpaceButtonPress:
- GetDevice()->InvokeEvent( SVTK::SpaceMouseButtonEvent, &anEvent.button );
- break;
+ GetDevice()->InvokeEvent( SVTK::SpaceMouseButtonEvent, &anEvent.button );
+ break;
case SVTK_SpaceMouse::SpaceButtonRelease:
- break;
+ break;
}
return true; // stop handling the event
}
*/
SVTK_RenderWindowInteractor
::SVTK_RenderWindowInteractor(QWidget* theParent,
- const char* theName):
+ const char* theName):
QVTK_RenderWindowInteractor(theParent,theName),
myEventCallbackCommand(vtkCallbackCommand::New())
{
void
SVTK_RenderWindowInteractor
::Initialize(vtkGenericRenderWindowInteractor* theDevice,
- SVTK_Renderer* theRenderer,
- SVTK_Selector* theSelector)
+ SVTK_Renderer* theRenderer,
+ SVTK_Selector* theSelector)
{
QVTK_RenderWindowInteractor::Initialize(theDevice);
SetRenderer(theRenderer);
if(mySelector.GetPointer())
mySelector->AddObserver(vtkCommand::EndPickEvent,
- myEventCallbackCommand.GetPointer(),
- myPriority);
+ myEventCallbackCommand.GetPointer(),
+ myPriority);
}
/*!
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<SVTK_RenderWindowInteractor*>(theClientData);
SVTK_RenderWindowInteractor
::mouseReleaseEvent( QMouseEvent *event )
{
+ SVTK_InteractorStyle* style = 0;
bool aRightBtn = event->button() == Qt::RightButton;
bool isOperation = false;
+ bool isPolygonalSelection = false;
if( aRightBtn && GetInteractorStyle()) {
- SVTK_InteractorStyle* style = dynamic_cast<SVTK_InteractorStyle*>( GetInteractorStyle() );
+ style = dynamic_cast<SVTK_InteractorStyle*>( GetInteractorStyle() );
if ( style )
isOperation = style->CurrentState() != VTK_INTERACTOR_STYLE_CAMERA_NONE;
}
QVTK_RenderWindowInteractor::mouseReleaseEvent(event);
- if ( aRightBtn && !isOperation && !( event->modifiers() & Qt::ControlModifier ) &&
+ 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() );
SVTK_RenderWindowInteractor
::mouseDoubleClickEvent( QMouseEvent* event )
{
+ if( GetInteractorStyle() && event->button() == Qt::LeftButton ) {
+ SVTK_InteractorStyle* style = dynamic_cast<SVTK_InteractorStyle*>( GetInteractorStyle() );
+ if ( style )
+ style->OnMouseButtonDoubleClick();
+ }
+
QVTK_RenderWindowInteractor::mouseDoubleClickEvent(event);
if(GENERATE_SUIT_EVENTS)