X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_Viewer.cpp;h=ff33f60eb7b4c9a48e0539c9890f1d6b8b1a51b5;hb=e6aea428c7da7751e753eac36b99e16b7e3166e4;hp=e6dd6e2b728597c75ae92e6fe7e4429a9b06c0f6;hpb=a764a876ed5d1480b2a76f4e12307985bcf96c16;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_Viewer.cpp b/src/XGUI/XGUI_Viewer.cpp index e6dd6e2b7..ff33f60eb 100644 --- a/src/XGUI/XGUI_Viewer.cpp +++ b/src/XGUI/XGUI_Viewer.cpp @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include @@ -22,7 +24,6 @@ #include #include -#include #ifdef WIN32 #include @@ -89,7 +90,8 @@ XGUI_Viewer::XGUI_Viewer(XGUI_MainWindow* theParent, bool DisplayTrihedron) myIsRelative(true), myInteractionStyle(XGUI::STANDARD), myTrihedronSize(100), - myActiveView(0) + myActiveView(0), + myWndIdCount(0) { if (!isInitialized) { isInitialized = true; @@ -173,62 +175,29 @@ QMdiSubWindow* XGUI_Viewer::createView(V3d_TypeOfView theType) //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 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); + if (myViews.size() == 0) + setTrihedronShown(true); - view->setBackground(XGUI_ViewBackground(XGUI::VerticalGradient, Qt::white, QColor(Qt::blue).lighter())); + view->setBackground(XGUI_ViewBackground(XGUI::VerticalGradient, Qt::white, QColor(Qt::blue).lighter())); //view->setBackground(XGUI_ViewBackground(Qt::black)); + view->updateEnabledDrawMode(); QMdiArea* aMDI = myMainWindow->mdiArea(); QMdiSubWindow* aWnd = aMDI->addSubWindow(view, Qt::FramelessWindowHint); - addView(aWnd); + addView(aWnd); aWnd->setGeometry(0, 0, aMDI->width() / 2, aMDI->height() / 2); aWnd->show(); + aWnd->setWindowTitle(QString("Viewer #%1").arg(++myWndIdCount)); + emit viewCreated(view); return aWnd; } -void XGUI_Viewer::setLocalSelection(const AIS_ListOfInteractive& theAISObjects, const int theMode, - const bool isUpdateViewer) +XGUI_ViewWindow* XGUI_Viewer::activeViewWindow() const { - Handle(AIS_InteractiveContext) ic = AISContext(); - - // Open local context if there is no one - bool allObjects = false; // calculate by AIS shape - if (!ic->HasOpenedContext()) { - ic->ClearCurrents(false); - ic->OpenLocalContext(allObjects, true, true); - } - - // Activate selection of objects from prs - AIS_ListIteratorOfListOfInteractive aIter(theAISObjects); - for (; aIter.More(); aIter.Next()) { - Handle(AIS_InteractiveObject) anAIS = aIter.Value(); - if (!anAIS.IsNull()) { - if (anAIS->IsKind(STANDARD_TYPE(AIS_Shape))) { - ic->Load(anAIS, -1, false); - ic->Activate(anAIS, AIS_Shape::SelectionMode((TopAbs_ShapeEnum)theMode)); - } - else if (anAIS->DynamicType() != STANDARD_TYPE(AIS_Trihedron)) { - ic->Load(anAIS, -1, false); - ic->Activate(anAIS, theMode); - } - } - } - if (isUpdateViewer) - ic->UpdateCurrentViewer(); -} - -void XGUI_Viewer::setGlobalSelection(const bool isUpdateViewer) -{ - Handle(AIS_InteractiveContext) ic = AISContext(); - if (!ic.IsNull()) { - ic->CloseAllContexts(false); - if (isUpdateViewer) - ic->UpdateCurrentViewer(); - } + return dynamic_cast(myActiveView->widget()); } void XGUI_Viewer::getSelectedObjects(AIS_ListOfInteractive& theList) @@ -238,6 +207,17 @@ void XGUI_Viewer::getSelectedObjects(AIS_ListOfInteractive& theList) 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; @@ -399,22 +379,22 @@ bool XGUI_Viewer::computeTrihedronSize(double& theNewSize, double& theSize) void XGUI_Viewer::onViewClosed(QMdiSubWindow* theView) { - if ( !theView ) - return; - - emit deleteView( static_cast(theView->widget()) ); - removeView( theView ); - - // if this is last view - if (myViews.size() == 0) { - Standard_Integer aViewsNb = 0; - for ( myV3dViewer->InitActiveViews(); myV3dViewer->MoreActiveViews(); myV3dViewer->NextActiveViews()) - ++aViewsNb; - if ( aViewsNb < 2 ) { - //clean up presentations before last view is closed - myAISContext->RemoveAll(Standard_False); - } + if ( !theView ) + return; + + emit deleteView( static_cast(theView->widget()) ); + removeView( theView ); + + // if this is last view + if (myViews.size() == 0) { + Standard_Integer aViewsNb = 0; + for ( myV3dViewer->InitActiveViews(); myV3dViewer->MoreActiveViews(); myV3dViewer->NextActiveViews()) + ++aViewsNb; + if ( aViewsNb < 2 ) { + //clean up presentations before last view is closed + myAISContext->RemoveAll(Standard_False); } + } } /*!Remove view window \a theView from view manager. @@ -452,9 +432,6 @@ void XGUI_Viewer::addView(QMdiSubWindow* theView) connect(aWindow, SIGNAL(mousePressed(XGUI_ViewWindow*, QMouseEvent*)), this, SLOT(onMousePressed(XGUI_ViewWindow*, QMouseEvent*))); - connect(aWindow, SIGNAL(mouseReleased(XGUI_ViewWindow*, QMouseEvent*)), - this, SIGNAL(mouseRelease(XGUI_ViewWindow*, QMouseEvent*))); - connect(aWindow, SIGNAL(mouseDoubleClicked(XGUI_ViewWindow*, QMouseEvent*)), this, SIGNAL(mouseDoubleClick(XGUI_ViewWindow*, QMouseEvent*))); @@ -467,8 +444,10 @@ 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( contextMenuRequested(QContextMenuEvent*) ), + this, SIGNAL( contextMenuRequested(QContextMenuEvent*) ) ); connect(aWindow, SIGNAL(mouseMoving(XGUI_ViewWindow*, QMouseEvent*)), this, SLOT(onMouseMove(XGUI_ViewWindow*, QMouseEvent*))); @@ -512,16 +491,27 @@ void XGUI_Viewer::onWindowMinimized(QMdiSubWindow* theWnd) } } +/*! + SLOT: called on mouse button press, stores current mouse position as start point for transformations +*/ +void XGUI_Viewer::onMousePressed(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent) +{ + myStartPnt.setX(theEvent->x()); myStartPnt.setY(theEvent->y()); + emit mousePress(theWindow, theEvent); +} + /*! 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(); + myCurPnt.setX(theEvent->x()); myCurPnt.setY(theEvent->y()); + if (!mySelectionEnabled) return; - if ( !aView3d.IsNull() ) + Handle(V3d_View) aView3d = theWindow->viewPort()->getView(); + if ( !aView3d.IsNull() ) { myAISContext->MoveTo(theEvent->x(), theEvent->y(), aView3d); + } } /*! @@ -529,7 +519,100 @@ void XGUI_Viewer::onMouseMove(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent) */ void XGUI_Viewer::onMouseReleased(XGUI_ViewWindow* theWindow, QMouseEvent* theEvent) { - myAISContext->Select(); + if (!mySelectionEnabled || theEvent->button() != Qt::LeftButton) { + emit mouseRelease(theWindow, theEvent); + return; + } + + myEndPnt.setX(theEvent->x()); myEndPnt.setY(theEvent->y()); + bool aHasShift = (theEvent->modifiers() & Qt::ShiftModifier); + + //if (!aHasShift) + // emit deselection(); + + if (myStartPnt == myEndPnt) { + // the MoveTo is necessary for the second click in the same point. Otherwise the selection is lost. + Handle(V3d_View) aView3d = theWindow->viewPort()->getView(); + if ( !aView3d.IsNull() ) { + myAISContext->MoveTo(theEvent->x(), theEvent->y(), aView3d); + } + if (aHasShift && myMultiSelectionEnabled) + myAISContext->ShiftSelect(); + else + myAISContext->Select(); + } else { + if (aHasShift && myMultiSelectionEnabled) + myAISContext->ShiftSelect(myStartPnt.x(), myStartPnt.y(), + myEndPnt.x(), myEndPnt.y(), + theWindow->viewPort()->getView(), false ); + else + myAISContext->Select(myStartPnt.x(), myStartPnt.y(), + myEndPnt.x(), myEndPnt.y(), + theWindow->viewPort()->getView(), false ); + + int Nb = myAISContext->NbSelected(); + if( Nb>1 && !myMultiSelectionEnabled ) { + myAISContext->InitSelected(); + Handle( SelectMgr_EntityOwner ) anOwner = myAISContext->SelectedOwner(); + if( !anOwner.IsNull() ) { + myAISContext->ClearSelected( Standard_False ); + myAISContext->AddOrRemoveSelected( anOwner, Standard_False ); + } + } + myAISContext->UpdateCurrentViewer(); + } + emit mouseRelease(theWindow, theEvent); emit selectionChanged(); } + +//****************************************************** +void XGUI_Viewer::setMultiSelectionEnabled(bool toEnable) +{ + myMultiSelectionEnabled = toEnable; + updateViewsDrawMode(); +} + +//****************************************************** +void XGUI_Viewer::setSelectionEnabled(bool toEnable) +{ + mySelectionEnabled = toEnable; + updateViewsDrawMode(); +} + +//****************************************************** +void XGUI_Viewer::updateViewsDrawMode() const +{ + foreach(QMdiSubWindow* aWnd, myViews){ + XGUI_ViewWindow* aView = static_cast(aWnd->widget()); + aView->updateEnabledDrawMode(); + } +} + +//****************************************************** +//void XGUI_Viewer::onContextMenuRequested(QContextMenuEvent* theEvent) +//{ +// XGUI_ViewWindow* aWnd = dynamic_cast(sender()); +// if (!aWnd) return; +// +// QMenu aMenu; +// +// // Include Viewer actions +// if (myActions.size() > 0) { +// aMenu.addActions(myActions); +// aMenu.addSeparator(); +// } +// if (aWnd->actions().size() > 0) { +// aMenu.addActions(aWnd->actions()); +// aMenu.addSeparator(); +// } +// +// QMdiArea* aMDI = myMainWindow->mdiArea(); +// if (aMenu.actions().size() > 0) { +// QMenu* aSubMenu = aMenu.addMenu(tr("Windows")); +// aSubMenu->addActions(aMDI->actions()); +// } else { +// aMenu.addActions(aMDI->actions()); +// } +// aMenu.exec(theEvent->globalPos()); +//}