1 // Copyright (C) 2007-2015 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License, or (at your option) any later version.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 #include "OCCViewer_ViewFrame.h"
24 #include "OCCViewer_ViewWindow.h"
25 #include "OCCViewer_ViewModel.h"
27 #include <SUIT_ViewManager.h>
28 #include <SUIT_Session.h>
29 #include <SUIT_ResourceMgr.h>
31 #include <QtxResourceMgr.h>
32 #include <QtxWorkstackAction.h>
36 #include <QApplication>
38 OCCViewer_ViewFrame::OCCViewer_ViewFrame(SUIT_Desktop* theDesktop, OCCViewer_Viewer* theModel)
39 : OCCViewer_ViewWindow( theDesktop, theModel ), myPopupRequestedView(0), mySplitMode(-1)
41 QFrame* centralFrame = new QFrame( this );
42 setCentralWidget( centralFrame );
44 OCCViewer_ViewWindow* view0 = theModel->createSubWindow();
45 updateWindowTitle( view0 );
46 view0->setParent( centralFrame );
47 myViews.append( view0 ); // MAIN_VIEW
49 myLayout = new QGridLayout( centralFrame );
50 myLayout->setMargin( 0 );
51 myLayout->setSpacing( 1 );
53 myLayout->addWidget( view0, 0, 0 );
54 myMaximizedView = view0;
55 connectViewSignals(view0);
58 OCCViewer_ViewFrame::~OCCViewer_ViewFrame()
62 bool OCCViewer_ViewFrame::event( QEvent* e )
64 if ( e->type() == QEvent::WindowTitleChange ) {
65 updateWindowTitle( getView( MAIN_VIEW ) );
66 updateWindowTitle( getView( BOTTOM_LEFT ) );
67 updateWindowTitle( getView( TOP_LEFT ) );
68 updateWindowTitle( getView( TOP_RIGHT ) );
70 return OCCViewer_ViewWindow::event( e );
73 //**************************************************************************************
74 OCCViewer_ViewWindow* OCCViewer_ViewFrame::getView( const int i ) const
76 return ( i >= 0 && i < myViews.count() ) ? myViews.at( i ) : 0 ;
79 //**************************************************************************************
80 void OCCViewer_ViewFrame::setViewManager( SUIT_ViewManager* theMgr )
82 OCCViewer_ViewWindow::setViewManager(theMgr);
83 foreach (OCCViewer_ViewWindow* aView, myViews) {
84 aView->setViewManager(theMgr);
88 //**************************************************************************************
89 void OCCViewer_ViewFrame::returnTo3dView()
91 OCCViewer_ViewWindow* view = 0;
92 for (int i = BOTTOM_RIGHT; i <= TOP_RIGHT; i++ ) {
94 view->setVisible( view->get2dMode() == No2dMode );
95 view->setMaximized( true, false );
96 if (view->get2dMode() == No2dMode) myMaximizedView = view;
98 myLayout->setColumnStretch(0, 0);
99 myLayout->setColumnStretch(1, 0);
100 myLayout->addWidget( myMaximizedView, 0, 0 );
103 myLayout->invalidate();
106 //**************************************************************************************
107 void OCCViewer_ViewFrame::onMaximizedView( OCCViewer_ViewWindow* theView, bool isMaximized)
109 myMaximizedView = theView;
111 if (myViews.count() <= 1)
113 myLayout->setColumnStretch(0, 0);
114 myLayout->setColumnStretch(1, 0);
115 myLayout->addWidget( theView, 0, 0 );
117 OCCViewer_ViewWindow* view = 0;
118 for ( i = BOTTOM_RIGHT; i <= TOP_RIGHT; i++ ) {
119 view = myViews.at(i);
120 view->setVisible( view == theView );
121 view->setMaximized( view == theView, false );
129 QtxSplitDlg CreateSubViewsDlg( this, NULL, CreateSubViews );
130 if ( CreateSubViewsDlg.exec() ) {
131 mySplitMode = CreateSubViewsDlg.getSplitMode();
132 myViewsMode = CreateSubViewsDlg.getViewsMode();
134 myMaximizedView->setMaximized(false, false);
137 myLayout->invalidate();
140 //**************************************************************************************
141 void OCCViewer_ViewFrame::createSubViews()
143 OCCViewer_Viewer* aModel = dynamic_cast<OCCViewer_Viewer*>(myManager->getViewModel());
146 if (myViews.count() == 1) {
147 //QColor aColor = myViews.at( MAIN_VIEW )->backgroundColor();
148 OCCViewer_ViewWindow* view = 0;
149 for ( i = BOTTOM_LEFT; i <= TOP_RIGHT; i++) {
150 view = aModel->createSubWindow();
151 view->set2dMode( (Mode2dType) i );
152 view->setParent( centralWidget() );
153 view->setViewManager(myManager);
154 updateWindowTitle( view );
155 myViews.append( view );
156 aModel->initView(view);
157 view->setMaximized(false, false);
158 view->setDropDownButtons( dropDownButtons() );
159 connectViewSignals(view);
160 view->setBackground(aModel->background(i));
165 void OCCViewer_ViewFrame::splitSubViews()
167 if( mySplitMode == -1 )
171 if ( mySplitMode >= 0 && mySplitMode < 2)
173 else if( mySplitMode >= 2 && mySplitMode < 8 )
175 else if( mySplitMode >=8 && mySplitMode < 29 )
178 if( aNbViews != myViewsMode.count() )
181 int SubViews3Map[6][3][4] = {
182 { {0,0,1,1}, {0,1,1,1}, {0,2,1,1} },
183 { {0,0,1,1}, {1,0,1,1}, {2,0,1,1} },
184 { {0,0,1,1}, {1,0,1,1}, {0,1,2,1} },
185 { {0,0,2,1}, {0,1,1,1}, {1,1,1,1} },
186 { {0,0,1,2}, {1,0,1,1}, {1,1,1,1} },
187 { {0,0,1,1}, {0,1,1,1}, {1,0,1,2} }
190 int SubViews4Map[21][4][4] = {
191 { {0,0,1,1}, {0,1,1,1}, {0,2,1,1}, {0,3,1,1} },
192 { {0,0,1,1}, {1,0,1,1}, {2,0,1,1}, {3,0,1,1} },
193 { {0,0,1,1}, {0,1,1,1}, {1,0,1,1}, {1,1,1,1} },
194 { {0,0,1,1}, {1,0,1,1}, {0,1,2,1}, {0,2,2,1} },
195 { {0,0,2,1}, {0,1,1,1}, {1,1,1,1}, {0,2,2,1} },
196 { {0,0,2,1}, {0,1,2,1}, {0,2,1,1}, {1,2,1,1} },
197 { {0,0,1,1}, {0,1,1,1}, {1,0,1,2}, {2,0,1,2} },
198 { {0,0,1,2}, {1,0,1,1}, {1,1,1,1}, {2,0,1,2} },
199 { {0,0,1,2}, {1,0,1,2}, {2,0,1,1}, {2,1,1,1} },
200 { {0,0,1,1}, {1,0,1,1}, {0,1,2,1}, {2,0,1,2} },
201 { {0,0,2,1}, {0,1,1,1}, {1,1,1,1}, {2,0,1,2} },
202 { {0,0,1,2}, {1,0,1,1}, {2,0,1,1}, {1,1,2,1} },
203 { {0,0,1,2}, {1,0,2,1}, {1,1,1,1}, {2,1,1,1} },
204 { {0,0,2,1}, {0,1,1,1}, {0,2,1,1}, {1,1,1,2} },
205 { {0,0,2,1}, {0,1,1,2}, {1,1,1,1}, {1,2,1,1} },
206 { {0,0,1,1}, {0,1,1,1}, {1,0,1,2}, {0,2,2,1} },
207 { {0,0,1,2}, {1,0,1,1}, {1,1,1,1}, {0,2,2,1} },
208 { {0,0,1,3}, {1,0,1,1}, {1,1,1,1}, {1,2,1,1} },
209 { {0,0,1,1}, {0,1,1,1}, {0,2,1,1}, {1,0,1,3} },
210 { {0,0,1,1}, {1,0,1,1}, {2,0,1,1}, {0,1,3,1} },
211 { {0,0,3,1}, {0,1,1,1}, {1,1,1,1}, {2,1,1,1} },
214 if( aNbViews == 2 ) {
215 if( mySplitMode == 0 ) {
216 myLayout->addWidget( myViews.at(myViewsMode[0]), 0,0,2,1 );
217 myLayout->addWidget( myViews.at(myViewsMode[1]), 0,1,2,1 );
219 else if( mySplitMode == 1 ) {
220 myLayout->addWidget( myViews.at(myViewsMode[0]), 0,0,1,2 );
221 myLayout->addWidget( myViews.at(myViewsMode[1]), 1,0,1,2 );
224 else if( aNbViews == 3 ) {
225 int aSplitMode = mySplitMode - 2;
226 for( int i = 0; i < 3; i++ ) {
227 myLayout->addWidget( myViews.at(myViewsMode[i]),
228 SubViews3Map[aSplitMode][i][0],
229 SubViews3Map[aSplitMode][i][1],
230 SubViews3Map[aSplitMode][i][2],
231 SubViews3Map[aSplitMode][i][3]);
234 else if( aNbViews == 4 ) {
235 int aSplitMode = mySplitMode - 8;
236 for( int i = 0; i < 4; i++ ) {
237 myLayout->addWidget( myViews.at(myViewsMode[i]),
238 SubViews4Map[aSplitMode][i][0],
239 SubViews4Map[aSplitMode][i][1],
240 SubViews4Map[aSplitMode][i][2],
241 SubViews4Map[aSplitMode][i][3]);
245 OCCViewer_ViewWindow* view = 0;
246 bool isVisible3dView = false;
247 for ( int i = 0; i< myViews.count(); i++ ) {
248 view = myViews.at(i);
249 bool isShowed = false;
250 for( int j = 0; j < myViewsMode.count(); j++ ) {
251 OCCViewer_ViewWindow* view2 = 0;
252 view2 = myViews.at( myViewsMode[j] );
258 view->setMaximized( false, false );
259 if ( view->get2dMode() == No2dMode ) isVisible3dView = true;
260 ///////////////QApplication::processEvents(); // VSR: hangs up ?
261 if ( view != myMaximizedView )
262 view->onViewFitAll();
265 view->setVisible( false );
267 if ( !isVisible3dView ) {
268 for ( int i = 0; i< myViews.count(); i++ ){
269 view = myViews.at(i);
270 if( view->isVisible() )
271 view->setReturnedTo3dView( false );
276 //**************************************************************************************
277 OCCViewer_ViewPort3d* OCCViewer_ViewFrame::getViewPort(int theView)
279 return getView(theView)? getView(theView)->getViewPort() : 0;
282 //**************************************************************************************
283 void OCCViewer_ViewFrame::updateEnabledDrawMode()
285 foreach (OCCViewer_ViewWindow* aView, myViews) {
286 aView->updateEnabledDrawMode();
290 //**************************************************************************************
291 void OCCViewer_ViewFrame::setCuttingPlane( bool on, const double x , const double y , const double z,
292 const double dx, const double dy, const double dz)
294 foreach (OCCViewer_ViewWindow* aView, myViews) {
295 aView->setCuttingPlane(on, x, y, z, dx, dy, dz);
300 //**************************************************************************************
301 void OCCViewer_ViewFrame::setCuttingPlane( bool on, const gp_Pln thePln )
303 foreach (OCCViewer_ViewWindow* aView, myViews) {
304 aView->setCuttingPlane(on, thePln);
309 //**************************************************************************************
310 void OCCViewer_ViewFrame::setInteractionStyle( const int i )
312 foreach (OCCViewer_ViewWindow* aView, myViews) {
313 aView->setInteractionStyle(i);
317 //**************************************************************************************
318 void OCCViewer_ViewFrame::setZoomingStyle( const int i )
320 foreach (OCCViewer_ViewWindow* aView, myViews) {
321 aView->setZoomingStyle(i);
325 //**************************************************************************************
326 void OCCViewer_ViewFrame::connectViewSignals(OCCViewer_ViewWindow* theView)
328 connect( theView, SIGNAL( returnedTo3d( ) ), this, SLOT( returnTo3dView( ) ) );
330 connect( theView, SIGNAL( maximized( OCCViewer_ViewWindow*, bool ) ),
331 this, SLOT( onMaximizedView( OCCViewer_ViewWindow*, bool ) ) );
333 connect( theView, SIGNAL( wheeling(SUIT_ViewWindow*, QWheelEvent*) ),
334 this, SIGNAL( wheeling(SUIT_ViewWindow*, QWheelEvent*) ) );
336 connect( theView, SIGNAL( keyReleased(SUIT_ViewWindow*, QKeyEvent*) ),
337 this, SIGNAL( keyReleased(SUIT_ViewWindow*, QKeyEvent*) ) );
338 connect( theView, SIGNAL( keyPressed(SUIT_ViewWindow*, QKeyEvent*) ),
339 this, SIGNAL( keyPressed(SUIT_ViewWindow*, QKeyEvent*) ) );
341 connect( theView, SIGNAL( mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*) ),
342 this, SIGNAL( mouseDoubleClicked(SUIT_ViewWindow*, QMouseEvent*) ) );
343 connect( theView, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ),
344 this, SIGNAL( mousePressed(SUIT_ViewWindow*, QMouseEvent*) ) );
345 connect( theView, SIGNAL( mouseReleased(SUIT_ViewWindow*, QMouseEvent*) ),
346 this, SIGNAL( mouseReleased(SUIT_ViewWindow*, QMouseEvent*) ) );
347 connect( theView, SIGNAL( mouseMoving(SUIT_ViewWindow*, QMouseEvent*) ),
348 this, SIGNAL( mouseMoving(SUIT_ViewWindow*, QMouseEvent*) ) );
350 // The signal is used to process get/set background color from popup
351 connect( theView, SIGNAL( contextMenuRequested(QContextMenuEvent*) ),
352 this, SLOT( onContextMenuRequested(QContextMenuEvent*) ) );
354 connect( theView, SIGNAL( contextMenuRequested(QContextMenuEvent*) ),
355 this, SIGNAL( contextMenuRequested(QContextMenuEvent*) ) );
357 connect( theView, SIGNAL( viewCloned( SUIT_ViewWindow* ) ),
358 this, SIGNAL( viewCloned( SUIT_ViewWindow* ) ) );
362 void OCCViewer_ViewFrame::setBackgroundColor( const QColor& theColor )
364 if (myPopupRequestedView)
365 myPopupRequestedView->setBackgroundColor(theColor);
367 foreach (OCCViewer_ViewWindow* aView, myViews) {
368 if (aView->isVisible())
369 aView->setBackgroundColor(theColor);
373 void OCCViewer_ViewFrame::setBackground( const Qtx::BackgroundData& theBackground )
375 if (myPopupRequestedView)
376 myPopupRequestedView->setBackground(theBackground);
378 foreach (OCCViewer_ViewWindow* aView, myViews) {
379 if (aView->isVisible())
380 aView->setBackground(theBackground);
385 void OCCViewer_ViewFrame::onViewFitAll()
387 foreach (OCCViewer_ViewWindow* aView, myViews) {
388 aView->onViewFitAll();
392 void OCCViewer_ViewFrame::onFitAll()
394 foreach (OCCViewer_ViewWindow* aView, myViews) {
400 QColor OCCViewer_ViewFrame::backgroundColor() const
402 if (myPopupRequestedView)
403 return myPopupRequestedView->backgroundColor();
405 foreach (OCCViewer_ViewWindow* aView, myViews) {
406 if (aView->isVisible())
407 return aView->backgroundColor();
409 return getView(MAIN_VIEW)->backgroundColor();
412 Qtx::BackgroundData OCCViewer_ViewFrame::background() const
414 if (myPopupRequestedView)
415 return myPopupRequestedView->background();
417 foreach (OCCViewer_ViewWindow* aView, myViews) {
418 if (aView->isVisible())
419 return aView->background();
421 return getView(MAIN_VIEW)->background();
424 void OCCViewer_ViewFrame::showStaticTrihedron( bool on )
426 if ( myPopupRequestedView )
427 myPopupRequestedView->showStaticTrihedron( on );
429 foreach ( OCCViewer_ViewWindow* aView, myViews ) {
430 aView->showStaticTrihedron( on );
435 QImage OCCViewer_ViewFrame::dumpView()
437 foreach (OCCViewer_ViewWindow* aView, myViews) {
438 if (aView->isVisible())
439 return aView->dumpView();
444 bool OCCViewer_ViewFrame::dumpViewToFormat( const QImage& image, const QString& fileName, const QString& format )
446 foreach (OCCViewer_ViewWindow* aView, myViews) {
447 if (aView->isVisible())
448 return aView->dumpViewToFormat( image, fileName, format );
453 void OCCViewer_ViewFrame::onContextMenuRequested(QContextMenuEvent*)
455 myPopupRequestedView = dynamic_cast<OCCViewer_ViewWindow*>(sender());
458 void OCCViewer_ViewFrame::onDumpView()
460 if (myPopupRequestedView) {
461 myPopupRequestedView->onDumpView();
464 getView(MAIN_VIEW)->onDumpView();
468 void OCCViewer_ViewFrame::setDropDownButtons( bool on )
470 foreach( OCCViewer_ViewWindow* aView, myViews ) {
471 aView->setDropDownButtons( on );
473 OCCViewer_ViewWindow::setDropDownButtons( on );
476 QString OCCViewer_ViewFrame::getVisualParameters()
479 QStringList splitParams;
480 if( mySplitMode != -1 && myViewsMode.count() != 0 ) {
481 splitParams << QString::number( mySplitMode );
482 foreach ( int aViewMode, myViewsMode )
483 splitParams << QString::number( aViewMode );
484 params.append( splitParams.join("*") );
487 params.append( QString::number( mySplitMode ) );
488 int maximizedView = 999;
489 for ( int i = BOTTOM_RIGHT; i <= TOP_RIGHT && i < myViews.count(); i++) {
490 if ( getView(i)->isVisible() )
491 maximizedView = ( maximizedView != -1 ) ? ( maximizedView == 999 ? i : -1 ) : ( maximizedView );
492 params << getView(i)->getVisualParameters();
494 params.prepend( QString::number( maximizedView ) );
495 return params.join( "|" );
498 void OCCViewer_ViewFrame::setVisualParameters( const QString& parameters )
500 QStringList params = parameters.split( "|" );
501 if ( params.count() > 1 ) {
502 int maximizedView = params[0].toInt();
503 if ( myViews.count() < params.count()-2 )
504 createSubViews(); // secondary views are not created yet, but should be
506 for ( int i = 2; i < params.count(); i++ ) {
508 getView( idx )->setVisualParameters( params[i] );
511 QStringList aSplitParams = params[1].split("*");
512 if( aSplitParams.count() > 1 ) {
513 mySplitMode = aSplitParams[0].toInt();
514 for( int i = 1; i < aSplitParams.count(); i++ )
515 myViewsMode << aSplitParams[i].toInt();
517 if( mySplitMode != -1 )
520 onMaximizedView( getView( maximizedView ), true ); // set proper sub-window maximized
523 // handle obsolete versions - no parameters for xy, yz, xz views
524 getView(MAIN_VIEW)->setVisualParameters( parameters );
528 SUIT_CameraProperties OCCViewer_ViewFrame::cameraProperties()
530 // view frame does not have camera properties
531 return SUIT_CameraProperties();
534 void OCCViewer_ViewFrame::updateWindowTitle(OCCViewer_ViewWindow* theView)
539 switch ( theView->get2dMode() ) {
551 if ( !title.isEmpty() )
552 theView->setWindowTitle( windowTitle() + " - " + title );
555 void OCCViewer_ViewFrame::enableSelection( bool isEnabled )
557 foreach (OCCViewer_ViewWindow* aView, myViews) {
558 aView->enableSelection(isEnabled);
562 void OCCViewer_ViewFrame::enablePreselection( bool isEnabled )
564 foreach (OCCViewer_ViewWindow* aView, myViews) {
565 aView->enablePreselection(isEnabled);