1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-21 10:13:43 +03:00
occt/samples/qt/Common/src/View.cxx

865 lines
24 KiB
C++
Executable File

#if !defined _WIN32
#define QT_CLEAN_NAMESPACE /* avoid definition of INT32 and INT8 */
#endif
#include "View.h"
#include "ApplicationCommon.h"
#include <Standard_WarningsDisable.hxx>
#include <QApplication>
#include <QPainter>
#include <QMenu>
#include <QColorDialog>
#include <QCursor>
#include <QFileInfo>
#include <QFileDialog>
#include <QMouseEvent>
#include <QRubberBand>
#include <QMdiSubWindow>
#include <QStyleFactory>
#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && QT_VERSION < 0x050000
#include <QX11Info>
#endif
#include <Standard_WarningsRestore.hxx>
#include <Graphic3d_GraphicDriver.hxx>
#include <Graphic3d_TextureEnv.hxx>
#include <OcctWindow.h>
#include <Aspect_DisplayConnection.hxx>
namespace
{
//! Map Qt buttons bitmask to virtual keys.
Aspect_VKeyMouse qtMouseButtons2VKeys (Qt::MouseButtons theButtons)
{
Aspect_VKeyMouse aButtons = Aspect_VKeyMouse_NONE;
if ((theButtons & Qt::LeftButton) != 0)
{
aButtons |= Aspect_VKeyMouse_LeftButton;
}
if ((theButtons & Qt::MiddleButton) != 0)
{
aButtons |= Aspect_VKeyMouse_MiddleButton;
}
if ((theButtons & Qt::RightButton) != 0)
{
aButtons |= Aspect_VKeyMouse_RightButton;
}
return aButtons;
}
//! Map Qt mouse modifiers bitmask to virtual keys.
Aspect_VKeyFlags qtMouseModifiers2VKeys (Qt::KeyboardModifiers theModifiers)
{
Aspect_VKeyFlags aFlags = Aspect_VKeyFlags_NONE;
if ((theModifiers & Qt::ShiftModifier) != 0)
{
aFlags |= Aspect_VKeyFlags_SHIFT;
}
if ((theModifiers & Qt::ControlModifier) != 0)
{
aFlags |= Aspect_VKeyFlags_CTRL;
}
if ((theModifiers & Qt::AltModifier) != 0)
{
aFlags |= Aspect_VKeyFlags_ALT;
}
return aFlags;
}
}
static QCursor* defCursor = NULL;
static QCursor* handCursor = NULL;
static QCursor* panCursor = NULL;
static QCursor* globPanCursor = NULL;
static QCursor* zoomCursor = NULL;
static QCursor* rotCursor = NULL;
View::View( Handle(AIS_InteractiveContext) theContext, QWidget* parent )
: QWidget( parent ),
myIsRaytracing( false ),
myIsShadowsEnabled (true),
myIsReflectionsEnabled (false),
myIsAntialiasingEnabled (false),
myViewActions( 0 ),
myRaytraceActions( 0 ),
myBackMenu( NULL )
{
#if !defined(_WIN32) && (!defined(__APPLE__) || defined(MACOSX_USE_GLX)) && QT_VERSION < 0x050000
XSynchronize(x11Info().display(),true);
#endif
myContext = theContext;
myCurZoom = 0;
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_NoSystemBackground);
setAttribute(Qt::WA_NativeWindow);
myDefaultGestures = myMouseGestureMap;
myCurrentMode = CurAction3d_Nothing;
setMouseTracking( true );
initViewActions();
initCursors();
setBackgroundRole( QPalette::NoRole );//NoBackground );
// set focus policy to threat QContextMenuEvent from keyboard
setFocusPolicy( Qt::StrongFocus );
init();
}
View::~View()
{
delete myBackMenu;
}
void View::init()
{
if ( myView.IsNull() )
myView = myContext->CurrentViewer()->CreateView();
Handle(OcctWindow) hWnd = new OcctWindow ( this );
myView->SetWindow (hWnd);
if ( !hWnd->IsMapped() )
{
hWnd->Map();
}
myView->SetBackgroundColor (Quantity_NOC_BLACK);
myView->MustBeResized();
if (myIsRaytracing)
myView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING;
}
void View::paintEvent( QPaintEvent * )
{
// QApplication::syncX();
myView->InvalidateImmediate();
FlushViewEvents (myContext, myView, true);
}
void View::resizeEvent( QResizeEvent * )
{
// QApplication::syncX();
if( !myView.IsNull() )
{
myView->MustBeResized();
}
}
void View::OnSelectionChanged (const Handle(AIS_InteractiveContext)& ,
const Handle(V3d_View)& )
{
ApplicationCommonWindow::getApplication()->onSelectionChanged();
}
void View::fitAll()
{
myView->FitAll();
myView->ZFitAll();
myView->Redraw();
}
void View::fitArea()
{
setCurrentAction (CurAction3d_WindowZooming);
}
void View::zoom()
{
setCurrentAction (CurAction3d_DynamicZooming);
}
void View::pan()
{
setCurrentAction (CurAction3d_DynamicPanning);
}
void View::rotation()
{
setCurrentAction (CurAction3d_DynamicRotation);
}
void View::globalPan()
{
// save the current zoom value
myCurZoom = myView->Scale();
// Do a Global Zoom
myView->FitAll();
// Set the mode
setCurrentAction (CurAction3d_GlobalPanning);
}
void View::front()
{
myView->SetProj( V3d_Yneg );
}
void View::back()
{
myView->SetProj( V3d_Ypos );
}
void View::top()
{
myView->SetProj( V3d_Zpos );
}
void View::bottom()
{
myView->SetProj( V3d_Zneg );
}
void View::left()
{
myView->SetProj( V3d_Xneg );
}
void View::right()
{
myView->SetProj( V3d_Xpos );
}
void View::axo()
{
myView->SetProj( V3d_XposYnegZpos );
}
void View::reset()
{
myView->Reset();
}
void View::hlrOff()
{
QApplication::setOverrideCursor( Qt::WaitCursor );
myView->SetComputedMode (false);
myView->Redraw();
QApplication::restoreOverrideCursor();
}
void View::hlrOn()
{
QApplication::setOverrideCursor( Qt::WaitCursor );
myView->SetComputedMode (true);
myView->Redraw();
QApplication::restoreOverrideCursor();
}
void View::SetRaytracedShadows (bool theState)
{
myView->ChangeRenderingParams().IsShadowEnabled = theState;
myIsShadowsEnabled = theState;
myContext->UpdateCurrentViewer();
}
void View::SetRaytracedReflections (bool theState)
{
myView->ChangeRenderingParams().IsReflectionEnabled = theState;
myIsReflectionsEnabled = theState;
myContext->UpdateCurrentViewer();
}
void View::onRaytraceAction()
{
QAction* aSentBy = (QAction*)sender();
if (aSentBy == myRaytraceActions->at (ToolRaytracingId))
{
bool aState = myRaytraceActions->at (ToolRaytracingId)->isChecked();
QApplication::setOverrideCursor (Qt::WaitCursor);
if (aState)
EnableRaytracing();
else
DisableRaytracing();
QApplication::restoreOverrideCursor();
}
if (aSentBy == myRaytraceActions->at (ToolShadowsId))
{
bool aState = myRaytraceActions->at (ToolShadowsId)->isChecked();
SetRaytracedShadows (aState);
}
if (aSentBy == myRaytraceActions->at (ToolReflectionsId))
{
bool aState = myRaytraceActions->at (ToolReflectionsId)->isChecked();
SetRaytracedReflections (aState);
}
if (aSentBy == myRaytraceActions->at (ToolAntialiasingId))
{
bool aState = myRaytraceActions->at (ToolAntialiasingId)->isChecked();
SetRaytracedAntialiasing (aState);
}
}
void View::SetRaytracedAntialiasing (bool theState)
{
myView->ChangeRenderingParams().IsAntialiasingEnabled = theState;
myIsAntialiasingEnabled = theState;
myContext->UpdateCurrentViewer();
}
void View::EnableRaytracing()
{
if (!myIsRaytracing)
myView->ChangeRenderingParams().Method = Graphic3d_RM_RAYTRACING;
myIsRaytracing = true;
myContext->UpdateCurrentViewer();
}
void View::DisableRaytracing()
{
if (myIsRaytracing)
myView->ChangeRenderingParams().Method = Graphic3d_RM_RASTERIZATION;
myIsRaytracing = false;
myContext->UpdateCurrentViewer();
}
void View::updateToggled( bool isOn )
{
QAction* sentBy = (QAction*)sender();
if( !isOn )
return;
for ( int i = ViewFitAllId; i < ViewHlrOffId; i++ )
{
QAction* anAction = myViewActions->at( i );
if ( ( anAction == myViewActions->at( ViewFitAreaId ) ) ||
( anAction == myViewActions->at( ViewZoomId ) ) ||
( anAction == myViewActions->at( ViewPanId ) ) ||
( anAction == myViewActions->at( ViewGlobalPanId ) ) ||
( anAction == myViewActions->at( ViewRotationId ) ) )
{
if ( anAction && ( anAction != sentBy ) )
{
anAction->setCheckable( true );
anAction->setChecked( false );
}
else
{
if ( sentBy == myViewActions->at( ViewFitAreaId ) )
setCursor( *handCursor );
else if ( sentBy == myViewActions->at( ViewZoomId ) )
setCursor( *zoomCursor );
else if ( sentBy == myViewActions->at( ViewPanId ) )
setCursor( *panCursor );
else if ( sentBy == myViewActions->at( ViewGlobalPanId ) )
setCursor( *globPanCursor );
else if ( sentBy == myViewActions->at( ViewRotationId ) )
setCursor( *rotCursor );
else
setCursor( *defCursor );
sentBy->setCheckable( false );
}
}
}
}
void View::initCursors()
{
if ( !defCursor )
defCursor = new QCursor( Qt::ArrowCursor );
if ( !handCursor )
handCursor = new QCursor( Qt::PointingHandCursor );
if ( !panCursor )
panCursor = new QCursor( Qt::SizeAllCursor );
if ( !globPanCursor )
globPanCursor = new QCursor( Qt::CrossCursor );
if ( !zoomCursor )
zoomCursor = new QCursor( QPixmap( ApplicationCommonWindow::getResourceDir() + QString( "/" ) + QObject::tr( "ICON_CURSOR_ZOOM" ) ) );
if ( !rotCursor )
rotCursor = new QCursor( QPixmap( ApplicationCommonWindow::getResourceDir() + QString( "/" ) + QObject::tr( "ICON_CURSOR_ROTATE" ) ) );
}
QList<QAction*>* View::getViewActions()
{
initViewActions();
return myViewActions;
}
QList<QAction*>* View::getRaytraceActions()
{
initRaytraceActions();
return myRaytraceActions;
}
/*!
Get paint engine for the OpenGL viewer. [ virtual public ]
*/
QPaintEngine* View::paintEngine() const
{
return 0;
}
void View::initViewActions()
{
if ( myViewActions )
return;
myViewActions = new QList<QAction*>();
QString dir = ApplicationCommonWindow::getResourceDir() + QString( "/" );
QAction* a;
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_FITALL") ), QObject::tr("MNU_FITALL"), this );
a->setToolTip( QObject::tr("TBR_FITALL") );
a->setStatusTip( QObject::tr("TBR_FITALL") );
connect( a, SIGNAL( triggered() ) , this, SLOT( fitAll() ) );
myViewActions->insert(ViewFitAllId, a);
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_FITAREA") ), QObject::tr("MNU_FITAREA"), this );
a->setToolTip( QObject::tr("TBR_FITAREA") );
a->setStatusTip( QObject::tr("TBR_FITAREA") );
connect( a, SIGNAL( triggered() ) , this, SLOT( fitArea() ) );
a->setCheckable( true );
connect( a, SIGNAL( toggled( bool ) ) , this, SLOT( updateToggled( bool ) ) );
myViewActions->insert( ViewFitAreaId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_ZOOM") ), QObject::tr("MNU_ZOOM"), this );
a->setToolTip( QObject::tr("TBR_ZOOM") );
a->setStatusTip( QObject::tr("TBR_ZOOM") );
connect( a, SIGNAL( triggered() ) , this, SLOT( zoom() ) );
a->setCheckable( true );
connect( a, SIGNAL( toggled(bool) ) , this, SLOT( updateToggled(bool) ) );
myViewActions->insert( ViewZoomId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_PAN") ), QObject::tr("MNU_PAN"), this );
a->setToolTip( QObject::tr("TBR_PAN") );
a->setStatusTip( QObject::tr("TBR_PAN") );
connect( a, SIGNAL( triggered() ) , this, SLOT( pan() ) );
a->setCheckable( true );
connect( a, SIGNAL( toggled(bool) ) , this, SLOT( updateToggled(bool) ) );
myViewActions->insert( ViewPanId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_GLOBALPAN") ), QObject::tr("MNU_GLOBALPAN"), this );
a->setToolTip( QObject::tr("TBR_GLOBALPAN") );
a->setStatusTip( QObject::tr("TBR_GLOBALPAN") );
connect( a, SIGNAL( triggered() ) , this, SLOT( globalPan() ) );
a->setCheckable( true );
connect( a, SIGNAL( toggled(bool) ) , this, SLOT( updateToggled(bool) ) );
myViewActions->insert( ViewGlobalPanId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_FRONT") ), QObject::tr("MNU_FRONT"), this );
a->setToolTip( QObject::tr("TBR_FRONT") );
a->setStatusTip( QObject::tr("TBR_FRONT") );
connect( a, SIGNAL( triggered() ) , this, SLOT( front() ) );
myViewActions->insert( ViewFrontId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_BACK") ), QObject::tr("MNU_BACK"), this );
a->setToolTip( QObject::tr("TBR_BACK") );
a->setStatusTip( QObject::tr("TBR_BACK") );
connect( a, SIGNAL( triggered() ) , this, SLOT( back() ) );
myViewActions->insert(ViewBackId, a);
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_TOP") ), QObject::tr("MNU_TOP"), this );
a->setToolTip( QObject::tr("TBR_TOP") );
a->setStatusTip( QObject::tr("TBR_TOP") );
connect( a, SIGNAL( triggered() ) , this, SLOT( top() ) );
myViewActions->insert( ViewTopId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_BOTTOM") ), QObject::tr("MNU_BOTTOM"), this );
a->setToolTip( QObject::tr("TBR_BOTTOM") );
a->setStatusTip( QObject::tr("TBR_BOTTOM") );
connect( a, SIGNAL( triggered() ) , this, SLOT( bottom() ) );
myViewActions->insert( ViewBottomId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_LEFT") ), QObject::tr("MNU_LEFT"), this );
a->setToolTip( QObject::tr("TBR_LEFT") );
a->setStatusTip( QObject::tr("TBR_LEFT") );
connect( a, SIGNAL( triggered() ) , this, SLOT( left() ) );
myViewActions->insert( ViewLeftId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_RIGHT") ), QObject::tr("MNU_RIGHT"), this );
a->setToolTip( QObject::tr("TBR_RIGHT") );
a->setStatusTip( QObject::tr("TBR_RIGHT") );
connect( a, SIGNAL( triggered() ) , this, SLOT( right() ) );
myViewActions->insert( ViewRightId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_AXO") ), QObject::tr("MNU_AXO"), this );
a->setToolTip( QObject::tr("TBR_AXO") );
a->setStatusTip( QObject::tr("TBR_AXO") );
connect( a, SIGNAL( triggered() ) , this, SLOT( axo() ) );
myViewActions->insert( ViewAxoId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_ROTATION") ), QObject::tr("MNU_ROTATION"), this );
a->setToolTip( QObject::tr("TBR_ROTATION") );
a->setStatusTip( QObject::tr("TBR_ROTATION") );
connect( a, SIGNAL( triggered() ) , this, SLOT( rotation() ) );
a->setCheckable( true );
connect( a, SIGNAL( toggled(bool) ) , this, SLOT( updateToggled(bool) ) );
myViewActions->insert( ViewRotationId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_RESET") ), QObject::tr("MNU_RESET"), this );
a->setToolTip( QObject::tr("TBR_RESET") );
a->setStatusTip( QObject::tr("TBR_RESET") );
connect( a, SIGNAL( triggered() ) , this, SLOT( reset() ) );
myViewActions->insert( ViewResetId, a );
QActionGroup* ag = new QActionGroup( this );
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_HLROFF") ), QObject::tr("MNU_HLROFF"), this );
a->setToolTip( QObject::tr("TBR_HLROFF") );
a->setStatusTip( QObject::tr("TBR_HLROFF") );
connect( a, SIGNAL( triggered() ) , this, SLOT( hlrOff() ) );
a->setCheckable( true );
ag->addAction(a);
myViewActions->insert(ViewHlrOffId, a);
a = new QAction( QPixmap( dir+QObject::tr("ICON_VIEW_HLRON") ), QObject::tr("MNU_HLRON"), this );
a->setToolTip( QObject::tr("TBR_HLRON") );
a->setStatusTip( QObject::tr("TBR_HLRON") );
connect( a, SIGNAL( triggered() ) ,this, SLOT( hlrOn() ) );
a->setCheckable( true );
ag->addAction(a);
myViewActions->insert( ViewHlrOnId, a );
}
void View::initRaytraceActions()
{
if ( myRaytraceActions )
return;
myRaytraceActions = new QList<QAction*>();
QString dir = ApplicationCommonWindow::getResourceDir() + QString( "/" );
QAction* a;
a = new QAction( QPixmap( dir+QObject::tr("ICON_TOOL_RAYTRACING") ), QObject::tr("MNU_TOOL_RAYTRACING"), this );
a->setToolTip( QObject::tr("TBR_TOOL_RAYTRACING") );
a->setStatusTip( QObject::tr("TBR_TOOL_RAYTRACING") );
a->setCheckable( true );
a->setChecked( false );
connect( a, SIGNAL( triggered() ) , this, SLOT( onRaytraceAction() ) );
myRaytraceActions->insert( ToolRaytracingId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_TOOL_SHADOWS") ), QObject::tr("MNU_TOOL_SHADOWS"), this );
a->setToolTip( QObject::tr("TBR_TOOL_SHADOWS") );
a->setStatusTip( QObject::tr("TBR_TOOL_SHADOWS") );
a->setCheckable( true );
a->setChecked( true );
connect( a, SIGNAL( triggered() ) , this, SLOT( onRaytraceAction() ) );
myRaytraceActions->insert( ToolShadowsId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_TOOL_REFLECTIONS") ), QObject::tr("MNU_TOOL_REFLECTIONS"), this );
a->setToolTip( QObject::tr("TBR_TOOL_REFLECTIONS") );
a->setStatusTip( QObject::tr("TBR_TOOL_REFLECTIONS") );
a->setCheckable( true );
a->setChecked( false );
connect( a, SIGNAL( triggered() ) , this, SLOT( onRaytraceAction() ) );
myRaytraceActions->insert( ToolReflectionsId, a );
a = new QAction( QPixmap( dir+QObject::tr("ICON_TOOL_ANTIALIASING") ), QObject::tr("MNU_TOOL_ANTIALIASING"), this );
a->setToolTip( QObject::tr("TBR_TOOL_ANTIALIASING") );
a->setStatusTip( QObject::tr("TBR_TOOL_ANTIALIASING") );
a->setCheckable( true );
a->setChecked( false );
connect( a, SIGNAL( triggered() ) , this, SLOT( onRaytraceAction() ) );
myRaytraceActions->insert( ToolAntialiasingId, a );
}
void View::activateCursor( const CurrentAction3d mode )
{
switch( mode )
{
case CurAction3d_DynamicPanning:
setCursor( *panCursor );
break;
case CurAction3d_DynamicZooming:
setCursor( *zoomCursor );
break;
case CurAction3d_DynamicRotation:
setCursor( *rotCursor );
break;
case CurAction3d_GlobalPanning:
setCursor( *globPanCursor );
break;
case CurAction3d_WindowZooming:
setCursor( *handCursor );
break;
case CurAction3d_Nothing:
default:
setCursor( *defCursor );
break;
}
}
void View::mousePressEvent (QMouseEvent* theEvent)
{
const Graphic3d_Vec2i aPnt (theEvent->pos().x(), theEvent->pos().y());
const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys (theEvent->modifiers());
if (!myView.IsNull()
&& UpdateMouseButtons (aPnt,
qtMouseButtons2VKeys (theEvent->buttons()),
aFlags,
false))
{
updateView();
}
myClickPos = aPnt;
}
void View::mouseReleaseEvent (QMouseEvent* theEvent)
{
const Graphic3d_Vec2i aPnt (theEvent->pos().x(), theEvent->pos().y());
const Aspect_VKeyFlags aFlags = qtMouseModifiers2VKeys (theEvent->modifiers());
if (!myView.IsNull()
&& UpdateMouseButtons (aPnt,
qtMouseButtons2VKeys (theEvent->buttons()),
aFlags,
false))
{
updateView();
}
if (myCurrentMode == CurAction3d_GlobalPanning)
{
myView->Place (aPnt.x(), aPnt.y(), myCurZoom);
}
if (myCurrentMode != CurAction3d_Nothing)
{
setCurrentAction (CurAction3d_Nothing);
}
if (theEvent->button() == Qt::RightButton
&& (aFlags & Aspect_VKeyFlags_CTRL) == 0
&& (myClickPos - aPnt).cwiseAbs().maxComp() <= 4)
{
Popup (aPnt.x(), aPnt.y());
}
}
void View::mouseMoveEvent (QMouseEvent* theEvent)
{
const Graphic3d_Vec2i aNewPos (theEvent->pos().x(), theEvent->pos().y());
if (!myView.IsNull()
&& UpdateMousePosition (aNewPos,
qtMouseButtons2VKeys (theEvent->buttons()),
qtMouseModifiers2VKeys (theEvent->modifiers()),
false))
{
updateView();
}
}
//==============================================================================
//function : wheelEvent
//purpose :
//==============================================================================
void View::wheelEvent (QWheelEvent* theEvent)
{
const Graphic3d_Vec2i aPos (theEvent->pos().x(), theEvent->pos().y());
if (!myView.IsNull()
&& UpdateZoom (Aspect_ScrollDelta (aPos, theEvent->delta() / 8)))
{
updateView();
}
}
// =======================================================================
// function : updateView
// purpose :
// =======================================================================
void View::updateView()
{
update();
}
void View::defineMouseGestures()
{
myMouseGestureMap.Clear();
AIS_MouseGesture aRot = AIS_MouseGesture_RotateOrbit;
activateCursor (myCurrentMode);
switch (myCurrentMode)
{
case CurAction3d_Nothing:
{
noActiveActions();
myMouseGestureMap = myDefaultGestures;
break;
}
case CurAction3d_DynamicZooming:
{
myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Zoom);
break;
}
case CurAction3d_GlobalPanning:
{
break;
}
case CurAction3d_WindowZooming:
{
myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_ZoomWindow);
break;
}
case CurAction3d_DynamicPanning:
{
myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, AIS_MouseGesture_Pan);
break;
}
case CurAction3d_DynamicRotation:
{
myMouseGestureMap.Bind (Aspect_VKeyMouse_LeftButton, aRot);
break;
}
}
}
void View::Popup( const int /*x*/, const int /*y*/ )
{
ApplicationCommonWindow* stApp = ApplicationCommonWindow::getApplication();
QMdiArea* ws = ApplicationCommonWindow::getWorkspace();
QMdiSubWindow* w = ws->activeSubWindow();
if ( myContext->NbSelected() )
{
QList<QAction*>* aList = stApp->getToolActions();
QMenu* myToolMenu = new QMenu( 0 );
myToolMenu->addAction( aList->at( ApplicationCommonWindow::ToolWireframeId ) );
myToolMenu->addAction( aList->at( ApplicationCommonWindow::ToolShadingId ) );
myToolMenu->addAction( aList->at( ApplicationCommonWindow::ToolColorId ) );
QMenu* myMaterMenu = new QMenu( myToolMenu );
QList<QAction*>* aMeterActions = ApplicationCommonWindow::getApplication()->getMaterialActions();
QString dir = ApplicationCommonWindow::getResourceDir() + QString( "/" );
myMaterMenu = myToolMenu->addMenu( QPixmap( dir+QObject::tr("ICON_TOOL_MATER")), QObject::tr("MNU_MATER") );
for ( int i = 0; i < aMeterActions->size(); i++ )
myMaterMenu->addAction( aMeterActions->at( i ) );
myToolMenu->addAction( aList->at( ApplicationCommonWindow::ToolTransparencyId ) );
myToolMenu->addAction( aList->at( ApplicationCommonWindow::ToolDeleteId ) );
addItemInPopup(myToolMenu);
myToolMenu->exec( QCursor::pos() );
delete myToolMenu;
}
else
{
if (!myBackMenu)
{
myBackMenu = new QMenu( 0 );
QAction* a = new QAction( QObject::tr("MNU_CH_BACK"), this );
a->setToolTip( QObject::tr("TBR_CH_BACK") );
connect( a, SIGNAL( triggered() ), this, SLOT( onBackground() ) );
myBackMenu->addAction( a );
addItemInPopup(myBackMenu);
a = new QAction( QObject::tr("MNU_CH_ENV_MAP"), this );
a->setToolTip( QObject::tr("TBR_CH_ENV_MAP") );
connect( a, SIGNAL( triggered() ), this, SLOT( onEnvironmentMap() ) );
a->setCheckable( true );
a->setChecked( false );
myBackMenu->addAction( a );
addItemInPopup(myBackMenu);
}
myBackMenu->exec( QCursor::pos() );
}
if ( w )
w->setFocus();
}
void View::addItemInPopup( QMenu* /*theMenu*/)
{
}
void View::noActiveActions()
{
for ( int i = ViewFitAllId; i < ViewHlrOffId ; i++ )
{
QAction* anAction = myViewActions->at( i );
if( ( anAction == myViewActions->at( ViewFitAreaId ) ) ||
( anAction == myViewActions->at( ViewZoomId ) ) ||
( anAction == myViewActions->at( ViewPanId ) ) ||
( anAction == myViewActions->at( ViewGlobalPanId ) ) ||
( anAction == myViewActions->at( ViewRotationId ) ) )
{
setCursor( *defCursor );
anAction->setCheckable( true );
anAction->setChecked( false );
}
}
}
void View::onBackground()
{
QColor aColor ;
Standard_Real R1;
Standard_Real G1;
Standard_Real B1;
myView->BackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
aColor.setRgb((Standard_Integer)(R1 * 255), (Standard_Integer)(G1 * 255), (Standard_Integer)(B1 * 255));
QColor aRetColor = QColorDialog::getColor(aColor);
if( aRetColor.isValid() )
{
R1 = aRetColor.red()/255.;
G1 = aRetColor.green()/255.;
B1 = aRetColor.blue()/255.;
myView->SetBackgroundColor(Quantity_TOC_RGB,R1,G1,B1);
}
myView->Redraw();
}
void View::onEnvironmentMap()
{
if (myBackMenu->actions().at(1)->isChecked())
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
tr("All Image Files (*.bmp *.gif *.jpg *.jpeg *.png *.tga)"));
const TCollection_AsciiString anUtf8Path (fileName.toUtf8().data());
Handle(Graphic3d_TextureEnv) aTexture = new Graphic3d_TextureEnv( anUtf8Path );
myView->SetTextureEnv (aTexture);
}
else
{
myView->SetTextureEnv (Handle(Graphic3d_TextureEnv)());
}
myView->Redraw();
}
bool View::dump(Standard_CString theFile)
{
return myView->Dump(theFile);
}
Handle(V3d_View)& View::getView()
{
return myView;
}
Handle(AIS_InteractiveContext)& View::getContext()
{
return myContext;
}
View::CurrentAction3d View::getCurrentMode()
{
return myCurrentMode;
}