X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Viewer.cpp;h=23560ca86031d369571e2dcf5d864eb5a43d675e;hb=d86c77d1c6210bbe04fbc3e5b00f9e212e1ec930;hp=c8cd002b9b9a3bab4ca329b42979b8174d684be1;hpb=9c985b359361fc2eb4a1b746dcb27031bc2c3c06;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Viewer.cpp b/src/XGUI/XGUI_Viewer.cpp index c8cd002b9..23560ca86 100644 --- a/src/XGUI/XGUI_Viewer.cpp +++ b/src/XGUI/XGUI_Viewer.cpp @@ -5,6 +5,7 @@ #include #include +#include #include @@ -17,6 +18,11 @@ #include #include #include +#include +#include +#include + +#include #ifdef WIN32 #include @@ -28,165 +34,191 @@ XGUI_Viewer::InteractionStyle2StatesMap XGUI_Viewer::myStateMap; XGUI_Viewer::InteractionStyle2ButtonsMap XGUI_Viewer::myButtonMap; static bool isInitialized = false; - /*! - Creates viewer 3d [ static ] -*/ -Handle(V3d_Viewer) CreateViewer( const Standard_ExtString name, - const Standard_CString displayName, - const Standard_CString domain, - const Standard_Real viewSize , - const V3d_TypeOfOrientation viewProjection, - const Standard_Boolean computedMode, - const Standard_Boolean defaultComputedMode ) + Creates viewer 3d [ static ] + */ +Handle(V3d_Viewer) CreateViewer(const Standard_ExtString name, const Standard_CString displayName, + const Standard_CString domain, const Standard_Real viewSize, + const V3d_TypeOfOrientation viewProjection, + const Standard_Boolean computedMode, + const Standard_Boolean defaultComputedMode) { static Handle(Graphic3d_GraphicDriver) aGraphicDriver; - if (aGraphicDriver.IsNull()) - { + if (aGraphicDriver.IsNull()) { Handle(Aspect_DisplayConnection) aDisplayConnection; #ifndef WIN32 aDisplayConnection = new Aspect_DisplayConnection( displayName ); #else aDisplayConnection = new Aspect_DisplayConnection(); #endif - aGraphicDriver = Graphic3d::InitGraphicDriver( aDisplayConnection ); + aGraphicDriver = Graphic3d::InitGraphicDriver(aDisplayConnection); } - return new V3d_Viewer( aGraphicDriver, name, domain, viewSize, viewProjection, - Quantity_NOC_GRAY30, V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT, - computedMode, defaultComputedMode, V3d_TEX_NONE ); + return new V3d_Viewer(aGraphicDriver, name, domain, viewSize, viewProjection, Quantity_NOC_GRAY30, + V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT, computedMode, defaultComputedMode, + V3d_TEX_NONE); } - // VSR: Uncomment below line to allow texture background support in OCC viewer #define OCC_ENABLE_TEXTURED_BACKGROUND /*! - Get data for supported background modes: gradient types, identifiers and supported image formats -*/ -QString XGUI_Viewer::backgroundData( QStringList& gradList, QIntList& idList, QIntList& txtList ) + Get data for supported background modes: gradient types, identifiers and supported image formats + */ +QString XGUI_Viewer::backgroundData(QStringList& gradList, QIntList& idList, QIntList& txtList) { - gradList << tr("GT_HORIZONTALGRADIENT") << tr("GT_VERTICALGRADIENT") << - tr("GT_FIRSTDIAGONALGRADIENT") << tr("GT_SECONDDIAGONALGRADIENT") << - tr("GT_FIRSTCORNERGRADIENT") << tr("GT_SECONDCORNERGRADIENT") << - tr("GT_THIRDCORNERGRADIENT") << tr("GT_FORTHCORNERGRADIENT"); - idList << XGUI::HorizontalGradient << XGUI::VerticalGradient << - XGUI::Diagonal1Gradient << XGUI::Diagonal2Gradient << - XGUI::Corner1Gradient << XGUI::Corner2Gradient << - XGUI::Corner3Gradient << XGUI::Corner4Gradient; + gradList << tr("Horizontal gradient") << tr("Vertical gradient") + << tr("First diagonal gradient") << tr("Second diagonal gradient") + << tr("First corner gradient") << tr("Second corner gradient") + << tr("Third corner gradient") << tr("Fourth corner gradient"); + idList << XGUI::HorizontalGradient << XGUI::VerticalGradient << XGUI::Diagonal1Gradient + << XGUI::Diagonal2Gradient << XGUI::Corner1Gradient << XGUI::Corner2Gradient + << XGUI::Corner3Gradient << XGUI::Corner4Gradient; #ifdef OCC_ENABLE_TEXTURED_BACKGROUND - txtList << XGUI::CenterTexture << XGUI::TileTexture << XGUI::StretchTexture; + txtList << XGUI::CenterTexture << XGUI::TileTexture << XGUI::StretchTexture; #endif - return tr("BG_IMAGE_FILES"); + return tr("Image files (*.bmp *.gif *.pix *.xwd *.rgb *.rs)"); } - - -XGUI_Viewer::XGUI_Viewer(XGUI_MainWindow* theParent, bool DisplayTrihedron) : -QObject(theParent), - myMainWindow(theParent), - myPreselectionEnabled(true), - mySelectionEnabled(true), - myMultiSelectionEnabled(true), - myIsRelative(true), - myInteractionStyle(XGUI::STANDARD), +XGUI_Viewer::XGUI_Viewer(XGUI_MainWindow* theParent, bool DisplayTrihedron) + : QObject(theParent), + myMainWindow(theParent), + myPreselectionEnabled(true), + mySelectionEnabled(true), + myMultiSelectionEnabled(true), + myIsRelative(true), + myInteractionStyle(XGUI::STANDARD), myTrihedronSize(100), myActiveView(0) { - if ( !isInitialized ) { - isInitialized = true; + if (!isInitialized) { + isInitialized = true; - // standard interaction style - XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::ZOOM] = Qt::ControlModifier; - XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::ZOOM] = Qt::LeftButton; + // standard interaction style + XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::ZOOM] = Qt::ControlModifier; + XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::ZOOM] = Qt::LeftButton; - XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::PAN] = Qt::ControlModifier; - XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::PAN] = Qt::MidButton; + XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::PAN] = Qt::ControlModifier; + XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::PAN] = Qt::MidButton; - XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::ROTATE] = Qt::ControlModifier; - XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::ROTATE] = Qt::RightButton; + XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::ROTATE] = Qt::ControlModifier; + XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::ROTATE] = Qt::RightButton; - XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::FIT_AREA] = Qt::ControlModifier; - XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::FIT_AREA] = Qt::RightButton; + XGUI_Viewer::myStateMap[XGUI::STANDARD][XGUI::FIT_AREA] = Qt::ControlModifier; + XGUI_Viewer::myButtonMap[XGUI::STANDARD][XGUI::FIT_AREA] = Qt::RightButton; - // "key free" interaction style - XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::ZOOM] = Qt::NoModifier; - XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::ZOOM] = Qt::RightButton; + // "key free" interaction style + XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::ZOOM] = Qt::NoModifier; + XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::ZOOM] = Qt::RightButton; - XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::PAN] = Qt::NoModifier; - XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::PAN] = Qt::MidButton; + XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::PAN] = Qt::NoModifier; + XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::PAN] = Qt::MidButton; - XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::ROTATE] = Qt::NoModifier; - XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::ROTATE] = Qt::LeftButton; + XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::ROTATE] = Qt::NoModifier; + XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::ROTATE] = Qt::LeftButton; - XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::FIT_AREA] = Qt::NoModifier; // unused - XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::FIT_AREA] = Qt::NoButton; // unused - } + XGUI_Viewer::myStateMap[XGUI::KEY_FREE][XGUI::FIT_AREA] = Qt::NoModifier; // unused + XGUI_Viewer::myButtonMap[XGUI::KEY_FREE][XGUI::FIT_AREA] = Qt::NoButton; // unused + } - // init CasCade viewers - myV3dViewer = CreateViewer(TCollection_ExtendedString("Viewer3d").ToExtString(), - "", "", 1000.0, V3d_XposYnegZpos, Standard_True, Standard_True ); - myV3dViewer->SetDefaultLights(); - - // init selector - myAISContext = new AIS_InteractiveContext( myV3dViewer ); - myAISContext->SelectionColor( Quantity_NOC_WHITE ); - - // display isoline on planar faces (box for ex.) - myAISContext->IsoOnPlane( true ); - - if ( DisplayTrihedron ) { - Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(gp::XOY()); - myTrihedron = new AIS_Trihedron(anAxis); - myTrihedron->SetInfiniteState( Standard_True ); - - Quantity_Color Col(193/255., 205/255., 193/255., Quantity_TOC_RGB); - myTrihedron->SetArrowColor( Col.Name() ); - myTrihedron->SetSize(myTrihedronSize); - Handle(AIS_Drawer) drawer = myTrihedron->Attributes(); - if (drawer->HasDatumAspect()) { - Handle(Prs3d_DatumAspect) daspect = drawer->DatumAspect(); - daspect->FirstAxisAspect()->SetColor(Quantity_Color(1.0, 0.0, 0.0, Quantity_TOC_RGB)); - daspect->SecondAxisAspect()->SetColor(Quantity_Color(0.0, 1.0, 0.0, Quantity_TOC_RGB)); - daspect->ThirdAxisAspect()->SetColor(Quantity_Color(0.0, 0.0, 1.0, Quantity_TOC_RGB)); - } + // init CasCade viewers + myV3dViewer = CreateViewer(TCollection_ExtendedString("Viewer3d").ToExtString(), "", "", 1000.0, + V3d_XposYnegZpos, Standard_True, Standard_True); + myV3dViewer->SetDefaultLights(); + + // init selector + myAISContext = new AIS_InteractiveContext(myV3dViewer); + myAISContext->SelectionColor(Quantity_NOC_WHITE); + + // display isoline on planar faces (box for ex.) + myAISContext->IsoOnPlane(true); + + if (DisplayTrihedron) { + Handle(Geom_Axis2Placement) anAxis = new Geom_Axis2Placement(gp::XOY()); + myTrihedron = new AIS_Trihedron(anAxis); + myTrihedron->SetInfiniteState( Standard_True); + + Quantity_Color Col(193 / 255., 205 / 255., 193 / 255., Quantity_TOC_RGB); + myTrihedron->SetArrowColor(Col.Name()); + myTrihedron->SetSize(myTrihedronSize); + Handle(AIS_Drawer) drawer = myTrihedron->Attributes(); + if (drawer->HasDatumAspect()) { + Handle(Prs3d_DatumAspect) daspect = drawer->DatumAspect(); + daspect->FirstAxisAspect()->SetColor(Quantity_Color(1.0, 0.0, 0.0, Quantity_TOC_RGB)); + daspect->SecondAxisAspect()->SetColor(Quantity_Color(0.0, 1.0, 0.0, Quantity_TOC_RGB)); + daspect->ThirdAxisAspect()->SetColor(Quantity_Color(0.0, 0.0, 1.0, Quantity_TOC_RGB)); } - // set zooming style to standard - //myZoomingStyle = 0; -} + } + // set zooming style to standard + //myZoomingStyle = 0; + QMdiArea* aMDI = myMainWindow->mdiArea(); + connect(aMDI, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(onWindowActivated(QMdiSubWindow*))); + +} XGUI_Viewer::~XGUI_Viewer(void) { - myAISContext.Nullify(); - myV3dViewer.Nullify(); + myAISContext.Nullify(); + myV3dViewer.Nullify(); } - QMdiSubWindow* XGUI_Viewer::createView(V3d_TypeOfView theType) { - // create view frame - XGUI_ViewWindow* view = new XGUI_ViewWindow(this, theType); - // get main view window (created by view frame) - //OCCViewer_ViewWindow* vw = view->getView(OCCViewer_ViewFrame::MAIN_VIEW); - // initialize main view window - //initView( vw ); - // set default background for view window - //vw->setBackground( background(0) ); // 0 means MAIN_VIEW (other views are not yet created here) - //// connect signal from viewport + // create view frame + XGUI_ViewWindow* view = new XGUI_ViewWindow(this, theType); + // get main view window (created by view frame) + //OCCViewer_ViewWindow* vw = view->getView(OCCViewer_ViewFrame::MAIN_VIEW); + // initialize main view window + //initView( vw ); + // set default background for view window + //vw->setBackground( background(0) ); // 0 means MAIN_VIEW (other views are not yet created here) + //// connect signal from viewport //connect(view->viewPort(), SIGNAL(vpClosed()), this, SLOT(onViewClosed())); //connect(view->viewPort(), SIGNAL(vpMapped()), this, SLOT(onViewMapped())); if (myViews.size() == 0) setTrihedronShown(true); - view->setBackground(XGUI_ViewBackground(XGUI::VerticalGradient, Qt::green, Qt::blue)); + view->setBackground(XGUI_ViewBackground(XGUI::VerticalGradient, Qt::white, QColor(Qt::blue).lighter())); + //view->setBackground(XGUI_ViewBackground(Qt::black)); - QMdiArea* aMDI = myMainWindow->mdiArea(); - QMdiSubWindow* aWnd = aMDI->addSubWindow(view, Qt::FramelessWindowHint); + QMdiArea* aMDI = myMainWindow->mdiArea(); + QMdiSubWindow* aWnd = aMDI->addSubWindow(view, Qt::FramelessWindowHint); addView(aWnd); - aWnd->setGeometry(0,0, aMDI->width() / 2, aMDI->height() / 2); - aWnd->show(); - return aWnd; + aWnd->setGeometry(0, 0, aMDI->width() / 2, aMDI->height() / 2); + aWnd->show(); + return aWnd; +} + +XGUI_ViewWindow* XGUI_Viewer::activeViewWindow() const +{ + return dynamic_cast(myActiveView->widget()); +} + +void XGUI_Viewer::getSelectedObjects(AIS_ListOfInteractive& theList) +{ + theList.Clear(); + for (myAISContext->InitSelected(); myAISContext->MoreSelected(); myAISContext->NextSelected()) + theList.Append(myAISContext->SelectedInteractive()); +} + +void XGUI_Viewer::getSelectedShapes(NCollection_List& theList) +{ + Handle(AIS_InteractiveContext) ic = AISContext(); + + for (ic->InitSelected(); ic->MoreSelected(); ic->NextSelected()) { + TopoDS_Shape aShape = ic->SelectedShape(); + if (!aShape.IsNull()) + theList.Append(aShape); + } +} + +void XGUI_Viewer::setObjectsSelected(const AIS_ListOfInteractive& theList) +{ + AIS_ListIteratorOfListOfInteractive aIt; + for (aIt.Initialize(theList); aIt.More(); aIt.Next()) + myAISContext->AddOrRemoveSelected(aIt.Value(), false); + myAISContext->UpdateCurrentViewer(); } /*! Sets hot button @@ -194,106 +226,119 @@ QMdiSubWindow* XGUI_Viewer::createView(V3d_TypeOfView theType) *\param theState - adding state to state map operations. *\param theButton - adding state to button map operations. */ -void XGUI_Viewer::setHotButton( XGUI::InteractionStyle theInteractionStyle, XGUI::HotOperation theOper, - Qt::KeyboardModifiers theState, Qt::MouseButtons theButton ) +void XGUI_Viewer::setHotButton(XGUI::InteractionStyle theInteractionStyle, + XGUI::HotOperation theOper, Qt::KeyboardModifiers theState, + Qt::MouseButtons theButton) { - myStateMap[theInteractionStyle][theOper] = theState; - myButtonMap[theInteractionStyle][theOper] = theButton; + myStateMap[theInteractionStyle][theOper] = theState; + myButtonMap[theInteractionStyle][theOper] = theButton; } /*! Gets hot button for operation \a theOper. *\param theOper - input hot operation *\param theState - output state from state map operations. *\param theButton - output state from button map operations. -*/ -void XGUI_Viewer::getHotButton( XGUI::InteractionStyle theInteractionStyle, XGUI::HotOperation theOper, - Qt::KeyboardModifiers& theState, Qt::MouseButtons& theButton ) + */ +void XGUI_Viewer::getHotButton(XGUI::InteractionStyle theInteractionStyle, + XGUI::HotOperation theOper, Qt::KeyboardModifiers& theState, + Qt::MouseButtons& theButton) { - theState = myStateMap[theInteractionStyle][theOper]; - theButton = myButtonMap[theInteractionStyle][theOper]; + theState = myStateMap[theInteractionStyle][theOper]; + theButton = myButtonMap[theInteractionStyle][theOper]; +} + +void XGUI_Viewer::setViewProjection(double theX, double theY, double theZ) +{ + XGUI_ViewWindow* aWindow = dynamic_cast(myActiveView->widget()); + if (aWindow) { + Handle(V3d_View) aView3d = aWindow->viewPort()->getView(); + if ( !aView3d.IsNull() ) + aView3d->SetProj(theX, theY, theZ); + aWindow->viewPort()->fitAll(); + } } /*! - Changes visibility of trihedron to opposite -*/ + Changes visibility of trihedron to opposite + */ void XGUI_Viewer::toggleTrihedron() { - setTrihedronShown( !isTrihedronVisible() ); + setTrihedronShown(!isTrihedronVisible()); } /*! - \return true if trihedron is visible -*/ + \return true if trihedron is visible + */ bool XGUI_Viewer::isTrihedronVisible() const { - return !myTrihedron.IsNull() && !myAISContext.IsNull() && myAISContext->IsDisplayed( myTrihedron ); + return !myTrihedron.IsNull() && !myAISContext.IsNull() && myAISContext->IsDisplayed(myTrihedron); } /*! - Sets visibility state of trihedron - \param on - new state -*/ + Sets visibility state of trihedron + \param on - new state + */ -void XGUI_Viewer::setTrihedronShown( const bool on ) +void XGUI_Viewer::setTrihedronShown(bool on) { - if ( myTrihedron.IsNull() ) - return; - - if ( on ) { - myAISContext->Display( myTrihedron ); - myAISContext->Deactivate(myTrihedron); - } else { - myAISContext->Erase( myTrihedron ); - } + if (myTrihedron.IsNull()) + return; + + if (on) { + myAISContext->Display(myTrihedron); + myAISContext->Deactivate(myTrihedron); + } else { + myAISContext->Erase(myTrihedron); + } } /*! - \return trihedron size -*/ + \return trihedron size + */ double XGUI_Viewer::trihedronSize() const { - double sz = 0; - if ( !myTrihedron.IsNull() ) - sz = myTrihedron->Size(); - return sz; + double sz = 0; + if (!myTrihedron.IsNull()) + sz = myTrihedron->Size(); + return sz; } /*! - Changes trihedron size - \param sz - new size -*/ -void XGUI_Viewer::setTrihedronSize( const double sz, bool isRelative ) + Changes trihedron size + \param sz - new size + */ +void XGUI_Viewer::setTrihedronSize(const double sz, bool isRelative) { - if ( myTrihedronSize != sz || isRelative != myIsRelative) { - myTrihedronSize = sz; - myIsRelative = isRelative; - updateTrihedron(); - } + if (myTrihedronSize != sz || isRelative != myIsRelative) { + myTrihedronSize = sz; + myIsRelative = isRelative; + updateTrihedron(); + } } /*! * Update the size of the trihedron */ -void XGUI_Viewer::updateTrihedron() +void XGUI_Viewer::updateTrihedron() { - if ( myTrihedron.IsNull() ) - return; + if (myTrihedron.IsNull()) + return; - if(myIsRelative){ - double newSz, oldSz; - - if(computeTrihedronSize(newSz, oldSz)) - myTrihedron->SetSize(newSz); - - } else if(myTrihedron->Size() != myTrihedronSize) { - myTrihedron->SetSize(myTrihedronSize); - } + if (myIsRelative) { + double newSz, oldSz; + + if (computeTrihedronSize(newSz, oldSz)) + myTrihedron->SetSize(newSz); + + } else if (myTrihedron->Size() != myTrihedronSize) { + myTrihedron->SetSize(myTrihedronSize); + } } /*! - Get new and current trihedron size corresponding to the current model size -*/ -bool XGUI_Viewer::computeTrihedronSize( double& theNewSize, double& theSize ) + Get new and current trihedron size corresponding to the current model size + */ +bool XGUI_Viewer::computeTrihedronSize(double& theNewSize, double& theSize) { theNewSize = 100; theSize = 100; @@ -301,42 +346,43 @@ bool XGUI_Viewer::computeTrihedronSize( double& theNewSize, double& theSize ) //SRN: BUG IPAL8996, a usage of method ActiveView without an initialization Handle(V3d_Viewer) viewer = v3dViewer(); viewer->InitActiveViews(); - if(!viewer->MoreActiveViews()) return false; + if (!viewer->MoreActiveViews()) + return false; Handle(V3d_View) view3d = viewer->ActiveView(); //SRN: END of fix - if ( view3d.IsNull() ) + if (view3d.IsNull()) return false; double Xmin = 0, Ymin = 0, Zmin = 0, Xmax = 0, Ymax = 0, Zmax = 0; double aMaxSide; - view3d->View()->MinMaxValues( Xmin, Ymin, Zmin, Xmax, Ymax, Zmax ); + view3d->View()->MinMaxValues(Xmin, Ymin, Zmin, Xmax, Ymax, Zmax); - if ( Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() || - Xmax == RealLast() || Ymax == RealLast() || Zmax == RealLast() ) + if (Xmin == RealFirst() || Ymin == RealFirst() || Zmin == RealFirst() || Xmax == RealLast() + || Ymax == RealLast() || Zmax == RealLast()) return false; aMaxSide = Xmax - Xmin; - if ( aMaxSide < Ymax -Ymin ) aMaxSide = Ymax -Ymin; - if ( aMaxSide < Zmax -Zmin ) aMaxSide = Zmax -Zmin; + if (aMaxSide < Ymax - Ymin) + aMaxSide = Ymax - Ymin; + if (aMaxSide < Zmax - Zmin) + aMaxSide = Zmax - Zmin; // IPAL21687 // The boundary box of the view may be initialized but nullified // (case of infinite objects) - if ( aMaxSide < Precision::Confusion() ) + if (aMaxSide < Precision::Confusion()) return false; - static float EPS = 5.0E-3; + static float EPS = (float)5.0E-3; theSize = trihedron()->Size(); //theNewSize = aMaxSide*aSizeInPercents / 100.0; - return fabs( theNewSize - theSize ) > theSize * EPS || - fabs( theNewSize - theSize) > theNewSize * EPS; + return fabs(theNewSize - theSize) > theSize * EPS || fabs(theNewSize - theSize) > theNewSize * EPS; } - void XGUI_Viewer::onViewClosed(QMdiSubWindow* theView) { if ( !theView ) @@ -375,7 +421,7 @@ void XGUI_Viewer::removeView( QMdiSubWindow* theView ) /*void XGUI_Viewer::onViewMapped() { - setTrihedronShown( true ); + setTrihedronShown(true); }*/ @@ -407,8 +453,14 @@ void XGUI_Viewer::addView(QMdiSubWindow* theView) connect(aWindow, SIGNAL(keyReleased(XGUI_ViewWindow*, QKeyEvent*)), this, SIGNAL(keyRelease(XGUI_ViewWindow*, QKeyEvent*))); - connect(aWindow, SIGNAL(contextMenuRequested( QContextMenuEvent* )), - this, SLOT (onContextMenuRequested( QContextMenuEvent* ))); +// connect(aWindow, SIGNAL(contextMenuRequested( QContextMenuEvent* )), +// this, SLOT (onContextMenuRequested( QContextMenuEvent* ))); + + connect(aWindow, SIGNAL(mouseMoving(XGUI_ViewWindow*, QMouseEvent*)), + this, SLOT(onMouseMove(XGUI_ViewWindow*, QMouseEvent*))); + + connect(aWindow, SIGNAL(mouseReleased(XGUI_ViewWindow*, QMouseEvent*)), + this, SLOT(onMouseReleased(XGUI_ViewWindow*, QMouseEvent*))); myViews.append(theView); } @@ -418,5 +470,54 @@ void XGUI_Viewer::addView(QMdiSubWindow* theView) */ void XGUI_Viewer::onWindowActivated(QMdiSubWindow* view) { + if (view && (view != myActiveView) && (!view->isMinimized())) { myActiveView = view; + ((XGUI_ViewWindow*)myActiveView->widget())->windowActivated(); + QList::iterator aIt; + for (aIt = myViews.begin(); aIt != myViews.end(); ++aIt) { + if ((*aIt) != myActiveView) { + ((XGUI_ViewWindow*)(*aIt)->widget())->windowDeactivated(); + } + } + } +} + + +void XGUI_Viewer::onWindowMinimized(QMdiSubWindow* theWnd) +{ + if (myActiveView == theWnd) { + myActiveView = 0; + QList::iterator aIt; + for (aIt = myViews.begin(); aIt != myViews.end(); ++aIt) { + if (!(*aIt)->widget()->isMinimized()) { + (*aIt)->raise(); + onWindowActivated(*aIt); + break; + } + } + } +} + +/*! + SLOT: called on mouse move, processes hilighting +*/ +void XGUI_Viewer::onMouseMove(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent) +{ + XGUI_ViewPort* aViewPort = theWindow->viewPort(); + Handle(V3d_View) aView3d = aViewPort->getView(); + + if ( !aView3d.IsNull() ) { + myAISContext->MoveTo(theEvent->x(), theEvent->y(), aView3d); + mouseMoved(theEvent->pos()); + } +} + +/*! + SLOT: called on mouse button release, finishes selection +*/ +void XGUI_Viewer::onMouseReleased(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent) +{ + myAISContext->Select(); + + emit mouseReleased(theEvent->pos()); }