Salome HOME
Merge branch 'master' of ssh://git.salome-platform.org/modules/gui
[modules/gui.git] / src / GraphicsView / GraphicsView_ViewFrame.cxx
1 // Copyright (C) 2013-2014  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "GraphicsView_ViewFrame.h"
21
22 #include "GraphicsView_Viewer.h"
23 #include "GraphicsView_ViewPort.h"
24
25 #include <QtxAction.h>
26 #include <QtxActionToolMgr.h>
27 #include <QtxMultiAction.h>
28 #include <QtxToolBar.h>
29
30 #include <SUIT_Desktop.h>
31 #include <SUIT_MessageBox.h>
32 #include <SUIT_Session.h>
33 #include <SUIT_ResourceMgr.h>
34
35 #include <QColor>
36 #include <QFrame>
37 #include <QFileDialog>
38 #include <QGraphicsSceneMouseEvent>
39 #include <QGraphicsSceneWheelEvent>
40 #include <QHBoxLayout>
41 #include <QImage>
42 #include <QMouseEvent>
43 #include <QString>
44 #include <QWheelEvent>
45
46 //=======================================================================
47 // Name    : GraphicsView_ViewFrame
48 // Purpose : Constructor
49 //=======================================================================
50 GraphicsView_ViewFrame::GraphicsView_ViewFrame( SUIT_Desktop* d, GraphicsView_Viewer* vw, QWidget* w )
51 : SUIT_ViewWindow( d ),
52   myViewer( vw )
53 {
54   QFrame* aFrame = new QFrame( this );
55   setCentralWidget( aFrame );
56
57   QBoxLayout* aLayout = new QHBoxLayout( aFrame );
58   aLayout->setMargin( 0 );
59   aLayout->setSpacing( 0 );
60
61   if( w )
62     myViewPort = dynamic_cast<GraphicsView_ViewPort*>(w);
63   else
64     myViewPort = new GraphicsView_ViewPort( aFrame );
65
66   aLayout->addWidget( myViewPort );
67
68   createActions();
69   myToolBarId = createToolBar();
70
71   connect( myViewPort, SIGNAL( vpKeyEvent( QKeyEvent* ) ),
72            this, SLOT( keyEvent( QKeyEvent* ) ) );
73   connect( myViewPort, SIGNAL( vpMouseEvent( QGraphicsSceneMouseEvent* ) ),
74            this, SLOT( mouseEvent( QGraphicsSceneMouseEvent* ) ) );
75   connect( myViewPort, SIGNAL( vpWheelEvent( QGraphicsSceneWheelEvent* ) ),
76            this, SLOT( wheelEvent( QGraphicsSceneWheelEvent* ) ) );
77   connect( myViewPort, SIGNAL( vpContextMenuEvent( QGraphicsSceneContextMenuEvent* ) ),
78            this, SLOT( contextMenuEvent( QGraphicsSceneContextMenuEvent* ) ) );
79
80   connect( myViewPort, SIGNAL( vpSketchingFinished( QPainterPath ) ),
81            this, SIGNAL( sketchingFinished( QPainterPath ) ) );
82 }
83
84 //=======================================================================
85 // Name    : GraphicsView_ViewFrame
86 // Purpose : Destructor
87 //=======================================================================
88 GraphicsView_ViewFrame::~GraphicsView_ViewFrame()
89 {
90 }
91
92 //================================================================
93 // Function : createActions
94 // Purpose  : 
95 //================================================================
96 void GraphicsView_ViewFrame::createActions()
97 {
98   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
99   QtxAction* anAction;
100
101   // Dump view
102   anAction = new QtxAction( tr( "MNU_DUMP_VIEW" ),
103                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_DUMP" ) ),
104                            tr( "MNU_DUMP_VIEW" ), 0, this );
105   anAction->setStatusTip( tr( "DSC_DUMP_VIEW" ) );
106   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onDumpView() ) );
107   toolMgr()->registerAction( anAction, DumpId );
108
109   // FitAll
110   anAction = new QtxAction( tr( "MNU_FITALL" ),
111                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_FITALL" ) ),
112                            tr( "MNU_FITALL" ), 0, this );
113   anAction->setStatusTip( tr( "DSC_FITALL" ) );
114   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitAll() ) );
115   toolMgr()->registerAction( anAction, FitAllId );
116
117   // FitRect
118   anAction = new QtxAction( tr( "MNU_FITRECT" ),
119                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_FITAREA" ) ),
120                            tr( "MNU_FITRECT" ), 0, this );
121   anAction->setStatusTip( tr( "DSC_FITRECT" ) );
122   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitArea() ) );
123   toolMgr()->registerAction( anAction, FitRectId );
124
125   // FitSelect
126   anAction = new QtxAction( tr( "MNU_FITSELECT" ),
127                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_FITSELECT" ) ),
128                            tr( "MNU_FITSELECT" ), 0, this );
129   anAction->setStatusTip( tr( "DSC_FITSELECT" ) );
130   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewFitSelect() ) );
131   toolMgr()->registerAction( anAction, FitSelectId );
132
133   // Zoom
134   anAction = new QtxAction( tr( "MNU_ZOOM_VIEW" ),
135                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_ZOOM" ) ),
136                            tr( "MNU_ZOOM_VIEW" ), 0, this );
137   anAction->setStatusTip( tr( "DSC_ZOOM_VIEW" ) );
138   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewZoom() ) );
139   toolMgr()->registerAction( anAction, ZoomId );
140
141   // Panning
142   anAction = new QtxAction( tr( "MNU_PAN_VIEW" ),
143                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_PAN" ) ),
144                            tr( "MNU_PAN_VIEW" ), 0, this );
145   anAction->setStatusTip( tr( "DSC_PAN_VIEW" ) );
146   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewPan() ) );
147   toolMgr()->registerAction( anAction, PanId );
148
149   // Global Panning
150   anAction = new QtxAction( tr( "MNU_GLOBALPAN_VIEW" ),
151                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_GLOBALPAN" ) ),
152                            tr( "MNU_GLOBALPAN_VIEW" ), 0, this );
153   anAction->setStatusTip( tr( "DSC_GLOBALPAN_VIEW" ) );
154   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewGlobalPan() ) );
155   toolMgr()->registerAction( anAction, GlobalPanId );
156
157   // Reset (obsolete)
158   /*
159   anAction = new QtxAction( tr( "MNU_RESET_VIEW" ),
160                            aResMgr->loadPixmap( "GraphicsView", tr( "ICON_GV_RESET" ) ),
161                            tr( "MNU_RESET_VIEW" ), 0, this );
162   anAction->setStatusTip( tr( "DSC_RESET_VIEW" ) );
163   connect( anAction, SIGNAL( triggered( bool ) ), this, SLOT( onViewReset() ) );
164   toolMgr()->registerAction( anAction, ResetId );
165   */
166 }
167
168 //================================================================
169 // Function : createToolBar
170 // Purpose  : 
171 //================================================================
172 int GraphicsView_ViewFrame::createToolBar()
173 {
174   int tid = toolMgr()->createToolBar( tr("LBL_TOOLBAR_LABEL"),                 // title (language-dependant)
175                                       QString( "GraphicsViewViewOperations" ), // name (language-independant)
176                                       false );                                 // disable floatable toolbar
177   toolMgr()->append( DumpId, tid );
178
179   myScaleAction = new QtxMultiAction( this );
180   myScaleAction->insertAction( toolMgr()->action( FitAllId ) );
181   myScaleAction->insertAction( toolMgr()->action( FitRectId ) );
182   myScaleAction->insertAction( toolMgr()->action( FitSelectId ) );
183   myScaleAction->insertAction( toolMgr()->action( ZoomId ) );
184   toolMgr()->append( myScaleAction, tid );
185
186   myPanAction = new QtxMultiAction( this );
187   myPanAction->insertAction( toolMgr()->action( PanId ) );
188   myPanAction->insertAction( toolMgr()->action( GlobalPanId ) );
189   toolMgr()->append( myPanAction, tid );
190
191   toolMgr()->append( toolMgr()->action( ResetId ), tid );
192
193   return tid;
194 }
195
196 //================================================================
197 // Function : getToolBarId
198 // Purpose  :
199 //================================================================
200 int GraphicsView_ViewFrame::getToolBarId()
201 {
202   return myToolBarId;
203 }
204
205 //================================================================
206 // Function : dumpView
207 // Purpose  : 
208 //================================================================
209 QImage GraphicsView_ViewFrame::dumpView()
210 {
211   return myViewPort->dumpView();
212 }
213
214 //================================================================
215 // Function : getVisualParameters
216 // Purpose  : 
217 //================================================================
218 QString GraphicsView_ViewFrame::getVisualParameters()
219 {
220   QTransform aTransform = myViewPort->transform();
221
222   QString aString;
223   aString.sprintf( "%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f*%.3f",
224     aTransform.m11(), aTransform.m12(), aTransform.m13(),
225     aTransform.m21(), aTransform.m22(), aTransform.m23(),
226     aTransform.m31(), aTransform.m32(), aTransform.m33() );
227   return aString;
228 }
229
230 //================================================================
231 // Function : setVisualParameters
232 // Purpose  : 
233 //================================================================
234 void GraphicsView_ViewFrame::setVisualParameters( const QString& theParameters )
235 {
236   QStringList aList = theParameters.split( '*' );
237   if( aList.size() < 9 )
238     return;
239
240   bool anIsOk[9];
241   QTransform aTransform( aList[0].toDouble( &anIsOk[0] ),
242                          aList[1].toDouble( &anIsOk[1] ),
243                          aList[2].toDouble( &anIsOk[2] ),
244                          aList[3].toDouble( &anIsOk[3] ),
245                          aList[4].toDouble( &anIsOk[4] ),
246                          aList[5].toDouble( &anIsOk[5] ),
247                          aList[6].toDouble( &anIsOk[6] ),
248                          aList[7].toDouble( &anIsOk[7] ),
249                          aList[8].toDouble( &anIsOk[8] ) );
250   for( int i = 0; i < 9; i++ )
251     if( !anIsOk[ i ] )
252       return;
253
254   myViewPort->setTransform( aTransform );
255   myViewPort->applyTransform();
256 }
257
258 //================================================================
259 // Function : expandToolBarActions
260 // Purpose  : 
261 //================================================================
262 void GraphicsView_ViewFrame::expandToolBarActions()
263 {
264   QList<QtxMultiAction*> anExpandableActions;
265   anExpandableActions.append( myScaleAction );
266   anExpandableActions.append( myPanAction );
267
268   QListIterator<QtxMultiAction*> anIter( anExpandableActions );
269   while( anIter.hasNext() )
270   {
271     if( QtxMultiAction* aMultiAction = anIter.next() )
272     {
273       QList<QAction*> aLocalActions = aMultiAction->actions();
274       QListIterator<QAction*> aLocalIter( aLocalActions );
275       while( aLocalIter.hasNext() )
276         if( QAction* anAction = aLocalIter.next() )
277           toolMgr()->append( anAction, myToolBarId );
278
279       int anId = toolMgr()->actionId( aMultiAction );
280       toolMgr()->remove( anId, myToolBarId );
281     }
282   }
283 }
284
285 //================================================================
286 // Function : onViewPan
287 // Purpose  : 
288 //================================================================
289 void GraphicsView_ViewFrame::onViewPan()
290 {
291   myViewer->activateTransform( GraphicsView_Viewer::Pan );
292 }
293
294 //================================================================
295 // Function : onViewZoom
296 // Purpose  : 
297 //================================================================
298 void GraphicsView_ViewFrame::onViewZoom()
299 {
300   myViewer->activateTransform( GraphicsView_Viewer::Zoom );
301 }
302
303 //================================================================
304 // Function : onViewFitAll
305 // Purpose  : 
306 //================================================================
307 void GraphicsView_ViewFrame::onViewFitAll()
308 {
309   myViewer->activateTransform( GraphicsView_Viewer::FitAll );
310 }
311
312 //================================================================
313 // Function : onViewFitArea
314 // Purpose  : 
315 //================================================================
316 void GraphicsView_ViewFrame::onViewFitArea()
317 {
318   myViewer->activateTransform( GraphicsView_Viewer::FitRect );
319 }
320
321 //================================================================
322 // Function : onViewFitSelect
323 // Purpose  : 
324 //================================================================
325 void GraphicsView_ViewFrame::onViewFitSelect()
326 {
327   myViewer->activateTransform( GraphicsView_Viewer::FitSelect );
328 }
329
330 //================================================================
331 // Function : onViewGlobalPan
332 // Purpose  : 
333 //================================================================
334 void GraphicsView_ViewFrame::onViewGlobalPan()
335 {
336   myViewer->activateTransform( GraphicsView_Viewer::PanGlobal );
337 }
338
339 //================================================================
340 // Function : onViewReset
341 // Purpose  : 
342 //================================================================
343 void GraphicsView_ViewFrame::onViewReset()
344 {
345   myViewer->activateTransform( GraphicsView_Viewer::Reset );
346 }
347
348 //================================================================
349 // Function : keyEvent
350 // Purpose  : 
351 //================================================================
352 void GraphicsView_ViewFrame::keyEvent( QKeyEvent* e )
353 {
354   switch ( e->type() )
355   {
356     case QEvent::KeyPress:
357       emit keyPressed( e );
358       break;
359     case QEvent::KeyRelease:
360       emit keyReleased( e );
361       break;
362     default:
363       break;
364   }
365 }
366
367 //================================================================
368 // Function : mouseEvent
369 // Purpose  : 
370 //================================================================
371 void GraphicsView_ViewFrame::mouseEvent( QGraphicsSceneMouseEvent* e )
372 {
373   switch ( e->type() )
374   {
375     case QEvent::GraphicsSceneMousePress:
376       emit mousePressed( e );
377       break;
378     case QEvent::GraphicsSceneMouseMove:
379       emit mouseMoving( e );
380       break;
381     case QEvent::GraphicsSceneMouseRelease:
382       emit mouseReleased( e );
383       break;
384     case QEvent::GraphicsSceneMouseDoubleClick:
385       emit mouseDoubleClicked( e );
386       break;
387     default:
388       break;
389   }
390 }
391
392 //================================================================
393 // Function : wheelEvent
394 // Purpose  : 
395 //================================================================
396 void GraphicsView_ViewFrame::wheelEvent( QGraphicsSceneWheelEvent* e )
397 {
398   switch ( e->type() )
399   {
400     case QEvent::GraphicsSceneWheel:
401       emit wheeling( e );
402       break;
403     default:
404       break;
405   }
406 }
407
408 //================================================================
409 // Function : contextMenuEvent
410 // Purpose  : 
411 //================================================================
412 void GraphicsView_ViewFrame::contextMenuEvent( QGraphicsSceneContextMenuEvent* e )
413 {
414   QPoint aPos = myViewPort->mapFromScene( e->scenePos() );
415   QContextMenuEvent* anEvent = new QContextMenuEvent( (QContextMenuEvent::Reason)e->reason(),
416                                                       aPos, e->screenPos(), e->modifiers() );
417   emit contextMenuRequested( anEvent );
418   delete anEvent;
419 }