Salome HOME
Modify default icon for the module
[modules/gui.git] / src / Plot2d / Plot2d_ViewWindow.cxx
1 // Plot2d_ViewWindow.cxx: implementation of the Plot2d_ViewWindow class.
2 //
3 //////////////////////////////////////////////////////////////////////
4 #include "Plot2d_ViewWindow.h"
5
6 #include "SUIT_ViewManager.h"
7 #include "SUIT_ResourceMgr.h"
8 #include "SUIT_Session.h"
9 #include "SUIT_ToolButton.h"
10
11 #include <qstatusbar.h>
12 #include <qlayout.h>
13 #include <qapplication.h>
14
15 //////////////////////////////////////////////////////////////////////
16 // Construction/Destruction
17 //////////////////////////////////////////////////////////////////////
18
19 Plot2d_ViewWindow::Plot2d_ViewWindow(SUIT_Desktop* theDesktop, Plot2d_Viewer* theModel)
20 : SUIT_ViewWindow(theDesktop)
21 {
22   myModel = theModel;
23
24   myViewFrame = new Plot2d_ViewFrame(this, "plotView");
25   setCentralWidget(myViewFrame);
26
27   myToolBar = new QToolBar(this);
28   myToolBar->setCloseMode(QDockWindow::Undocked);
29   myToolBar->setLabel(tr("LBL_TOOLBAR_LABEL"));
30   createActions();
31   createToolBar();
32
33   connect(myViewFrame, SIGNAL(vpModeHorChanged()), this, SLOT(onChangeHorMode()));
34   connect(myViewFrame, SIGNAL(vpModeVerChanged()), this, SLOT(onChangeVerMode()));
35   connect(myViewFrame, SIGNAL(vpCurveChanged()),   this, SLOT(onChangeCurveMode()));
36   connect(myViewFrame, SIGNAL(contextMenuRequested( QContextMenuEvent * )),
37           this,        SIGNAL(contextMenuRequested( QContextMenuEvent * )) );
38
39 }
40
41 Plot2d_ViewWindow::~Plot2d_ViewWindow()
42 {
43 }
44
45 //****************************************************************
46 void Plot2d_ViewWindow::putInfo(QString theMsg)
47 {
48   QStatusBar*   aStatusBar = myDesktop->statusBar();
49   aStatusBar->message(theMsg, 3000);
50 }
51
52 //****************************************************************
53 void Plot2d_ViewWindow::contextMenuPopup( QPopupMenu* thePopup )
54 {
55   // scaling
56   QPopupMenu* scalingPopup = new QPopupMenu( thePopup );
57   myActionsMap[ PModeXLinearId ]->addTo( scalingPopup );
58   myActionsMap[ PModeXLogarithmicId ]->addTo( scalingPopup );
59   onChangeHorMode();
60   scalingPopup->insertSeparator();
61   myActionsMap[ PModeYLinearId ]->addTo( scalingPopup );
62   myActionsMap[ PModeYLogarithmicId ]->addTo( scalingPopup );
63   thePopup->insertItem( tr( "SCALING_POPUP" ), scalingPopup );
64   onChangeVerMode();
65
66   thePopup->insertItem(tr("TOT_PLOT2D_FITDATA"), myViewFrame, SLOT(onFitData()));
67   // curve type
68   QPopupMenu* curTypePopup = new QPopupMenu( thePopup );
69   myActionsMap[ CurvPointsId ]->addTo( curTypePopup );
70   myActionsMap[ CurvLinesId ]->addTo( curTypePopup );
71   myActionsMap[ CurvSplinesId ]->addTo( curTypePopup );
72   thePopup->insertItem( tr( "CURVE_TYPE_POPUP" ), curTypePopup );
73
74   // legend
75   myActionsMap[ LegendId ]->addTo(thePopup);
76   // settings
77   myActionsMap[ CurvSettingsId ]->addTo(thePopup);
78 }
79
80 //****************************************************************
81 bool Plot2d_ViewWindow::eventFilter(QObject* watched, QEvent* e)
82 {
83   if (watched == myViewFrame) {
84     int aType = e->type();
85     switch(aType) {
86     case QEvent::MouseButtonPress:
87       emit mousePressed(this, (QMouseEvent*) e);
88       return true;
89
90     case QEvent::MouseButtonRelease:
91       emit mouseReleased(this, (QMouseEvent*) e);
92       return true;
93
94     case QEvent::MouseMove:
95       emit mouseMoving(this, (QMouseEvent*) e);
96       return true;
97
98     default:
99       break;
100     }
101   }
102   return SUIT_ViewWindow::eventFilter(watched, e);
103 }
104
105 //****************************************************************
106 void Plot2d_ViewWindow::createActions()
107 {
108   if ( !myActionsMap.isEmpty() )
109     return;
110
111   QtxAction* aAction;
112   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
113
114   // Dump view
115   aAction = new QtxAction(tr("MNU_DUMP_VIEW"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_DUMP" ) ),
116                            tr( "MNU_DUMP_VIEW" ), 0, this);
117   aAction->setStatusTip(tr("DSC_DUMP_VIEW"));
118   connect(aAction, SIGNAL(activated()), this, SLOT(onDumpView()));
119   myActionsMap[ DumpId ] = aAction;
120
121   // FitAll
122   aAction = new QtxAction(tr("MNU_FITALL"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_FIT_ALL" ) ),
123                            tr( "MNU_FITALL" ), 0, this);
124   aAction->setStatusTip(tr("DSC_FITALL"));
125   connect(aAction, SIGNAL(activated()), this, SLOT(onFitAll()));
126   myActionsMap[ FitAllId ] = aAction;
127
128   // FitRect
129   aAction = new QtxAction(tr("MNU_FITRECT"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_FIT_AREA" ) ),
130                            tr( "MNU_FITRECT" ), 0, this);
131   aAction->setStatusTip(tr("DSC_FITRECT"));
132   connect(aAction, SIGNAL(activated()), this, SLOT(onFitRect()));
133   myActionsMap[ FitRectId ] = aAction;
134
135   // Zoom
136   aAction = new QtxAction(tr("MNU_ZOOM_VIEW"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_ZOOM" ) ),
137                            tr( "MNU_ZOOM_VIEW" ), 0, this);
138   aAction->setStatusTip(tr("DSC_ZOOM_VIEW"));
139   connect(aAction, SIGNAL(activated()), this, SLOT(onZoom()));
140   myActionsMap[ ZoomId ] = aAction;
141
142   // Panning
143   aAction = new QtxAction(tr("MNU_PAN_VIEW"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_PAN" ) ),
144                            tr( "MNU_PAN_VIEW" ), 0, this);
145   aAction->setStatusTip(tr("DSC_PAN_VIEW"));
146   connect(aAction, SIGNAL(activated()), this, SLOT(onPanning()));
147   myActionsMap[ PanId ] = aAction;
148
149   // Global Panning
150   aAction = new QtxAction(tr("MNU_GLOBALPAN_VIEW"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_GLOBALPAN" ) ),
151                            tr( "MNU_GLOBALPAN_VIEW" ), 0, this);
152   aAction->setStatusTip(tr("DSC_GLOBALPAN_VIEW"));
153   connect(aAction, SIGNAL(activated()), this, SLOT(onGlobalPanning()));
154   myActionsMap[ GlobalPanId ] = aAction;
155
156   // Curve type - points
157   aAction = new QtxAction(tr("TOT_PLOT2D_CURVES_POINTS"),
158                 aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_CURVES_POINTS")),
159                 tr("MEN_PLOT2D_CURVES_POINTS"), 0, this);
160   aAction->setStatusTip(tr("PRP_PLOT2D_CURVES_POINTS"));
161   connect(aAction, SIGNAL(activated()), this, SLOT(onCurves()));
162   aAction->setToggleAction(true);
163   myActionsMap[ CurvPointsId ] = aAction;
164
165   // Curve type - lines
166   aAction = new QtxAction(tr("TOT_PLOT2D_CURVES_LINES"),
167                aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_CURVES_LINES")),
168                tr("MEN_PLOT2D_CURVES_LINES"), 0, this);
169   aAction->setStatusTip(tr("PRP_PLOT2D_CURVES_LINES"));
170   connect(aAction, SIGNAL(activated()), this, SLOT(onCurves()));
171   aAction->setToggleAction(true);
172   myActionsMap[ CurvLinesId ] = aAction;
173
174   // Curve type - splines
175   aAction = new QtxAction(tr("TOT_PLOT2D_CURVES_SPLINES"),
176                  aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_CURVES_SPLINES")),
177                  tr("MEN_PLOT2D_CURVES_SPLINES"), 0, this);
178   aAction->setStatusTip(tr("PRP_PLOT2D_CURVES_SPLINES"));
179   connect(aAction, SIGNAL(activated()), this, SLOT(onCurves()));
180   aAction->setToggleAction(true);
181   myActionsMap[ CurvSplinesId ] = aAction;
182
183   // Mode for X (linear or logarithmic)
184   aAction = new QtxAction(tr("TOT_PLOT2D_MODE_LINEAR_HOR"),
185                  aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_MODE_LINEAR_HOR")),
186                  tr("MEN_PLOT2D_MODE_LINEAR_HOR"), 0, this);
187   aAction->setStatusTip (tr("PRP_PLOT2D_MODE_LINEAR_HOR"));
188   connect(aAction, SIGNAL(activated()), this, SLOT(onViewHorMode()));
189   myActionsMap[ HorId ] = aAction;
190
191   // Mode for Y (linear or logarithmic)
192   aAction = new QtxAction(tr("TOT_PLOT2D_MODE_LINEAR_VER"),
193                  aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_MODE_LINEAR_VER")),
194                  tr("MEN_PLOT2D_MODE_LINEAR_VER" ), 0, this);
195   aAction->setStatusTip(tr("PRP_PLOT2D_MODE_LINEAR_VER"));
196   connect(aAction, SIGNAL(activated()), this, SLOT(onViewVerMode()));
197   myActionsMap[ VerId ] = aAction;
198
199   // Legend
200   aAction = new QtxAction(tr("TOT_PLOT2D_SHOW_LEGEND"),
201                 aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_SHOW_LEGEND")),
202                 tr("MEN_PLOT2D_SHOW_LEGEND"), 0, this);
203   aAction->setStatusTip(tr("PRP_PLOT2D_SHOW_LEGEND"));
204   connect(aAction, SIGNAL(activated()), this, SLOT(onLegend()));
205   aAction->setToggleAction(true);
206   myActionsMap[ LegendId ] = aAction;
207
208   // Settings
209   aAction = new QtxAction(tr( "TOT_PLOT2D_SETTINGS"),
210                 aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_SETTINGS")),
211                 tr("MEN_PLOT2D_SETTINGS"), 0, this);
212   aAction->setStatusTip(tr( "PRP_PLOT2D_SETTINGS"));
213   connect(aAction, SIGNAL(activated()), myViewFrame, SLOT(onSettings()));
214   myActionsMap[ CurvSettingsId ] = aAction;
215
216   // Clone
217   aAction = new QtxAction(tr("MNU_CLONE_VIEW"), aResMgr->loadPixmap( "Plot2d", tr( "ICON_PLOT2D_CLONE_VIEW" ) ),
218                            tr( "MNU_CLONE_VIEW" ), 0, this);
219   aAction->setStatusTip(tr("DSC_CLONE_VIEW"));
220   connect(aAction, SIGNAL(activated()), this, SIGNAL(cloneView()));
221   myActionsMap[ CloneId ] = aAction;
222
223   /* Popup Actions */
224   /* Linear/logarithmic mode */
225   // Horizontal axis
226   aAction = new QtxAction(tr("TOT_PLOT2D_MODE_LINEAR_HOR"),
227                  aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_MODE_LINEAR_HOR")),
228                  tr("MEN_PLOT2D_MODE_LINEAR_HOR"), 0, this);
229   aAction->setStatusTip (tr("PRP_PLOT2D_MODE_LINEAR_HOR"));
230   aAction->setToggleAction(true);
231   myActionsMap[PModeXLinearId] = aAction;
232   connect(aAction, SIGNAL(activated()), this, SLOT(onViewHorMode()));
233
234   aAction = new QtxAction(tr("TOT_PLOT2D_MODE_LOGARITHMIC_HOR"),
235               aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_MODE_LOGARITHMIC_HOR")),
236               tr("MEN_PLOT2D_MODE_LOGARITHMIC_HOR"), 0, this);
237   aAction->setStatusTip(tr("PRP_PLOT2D_MODE_LOGARITHMIC_HOR"));
238   aAction->setToggleAction(true);
239   myActionsMap[PModeXLogarithmicId] = aAction;
240   connect(aAction, SIGNAL(activated()), this, SLOT(onViewHorMode()));
241
242   // Vertical axis
243   aAction = new QtxAction(tr("TOT_PLOT2D_MODE_LINEAR_VER"),
244                  aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_MODE_LINEAR_VER")),
245                  tr("MEN_PLOT2D_MODE_LINEAR_VER" ), 0, this);
246   aAction->setStatusTip(tr("PRP_PLOT2D_MODE_LINEAR_VER"));
247   aAction->setToggleAction(true);
248   myActionsMap[PModeYLinearId] = aAction;
249   connect(aAction, SIGNAL(activated()), this, SLOT(onViewVerMode()));
250
251   aAction = new QtxAction(tr("TOT_PLOT2D_MODE_LOGARITHMIC_VER"),
252                  aResMgr->loadPixmap("Plot2d", tr("ICON_PLOT2D_MODE_LOGARITHMIC_VER")),
253                  tr("MEN_PLOT2D_MODE_LOGARITHMIC_VER" ), 0, this);
254   aAction->setStatusTip(tr("PRP_PLOT2D_MODE_LOGARITHMIC_VER"));
255   aAction->setToggleAction(true);
256   myActionsMap[PModeYLogarithmicId] = aAction;
257   connect(aAction, SIGNAL(activated()), this, SLOT(onViewVerMode()));
258
259 }
260
261 //****************************************************************
262 void Plot2d_ViewWindow::createToolBar()
263 {
264   myActionsMap[DumpId]->addTo(myToolBar);
265
266   SUIT_ToolButton* aScaleBtn = new SUIT_ToolButton(myToolBar);
267   aScaleBtn->AddAction(myActionsMap[FitAllId]);
268   aScaleBtn->AddAction(myActionsMap[FitRectId]);
269   aScaleBtn->AddAction(myActionsMap[ZoomId]);
270
271   SUIT_ToolButton* aPanBtn = new SUIT_ToolButton(myToolBar);
272   aPanBtn->AddAction(myActionsMap[PanId]);
273   aPanBtn->AddAction(myActionsMap[GlobalPanId]);
274
275   myCurveBtn = new SUIT_ToolButton(myToolBar);
276   myCurveBtn->AddAction(myActionsMap[CurvPointsId]);
277   myCurveBtn->AddAction(myActionsMap[CurvLinesId]);
278   myCurveBtn->AddAction(myActionsMap[CurvSplinesId]);
279   myActionsMap[CurvLinesId]->setOn(true);
280   onChangeCurveMode();
281
282   myActionsMap[HorId]->addTo(myToolBar);
283   onChangeHorMode();
284   myActionsMap[VerId]->addTo(myToolBar);
285   onChangeVerMode();
286
287   myActionsMap[LegendId]->addTo(myToolBar);
288   myActionsMap[CurvSettingsId]->addTo(myToolBar);
289   myActionsMap[CloneId]->addTo(myToolBar);
290   onChangeLegendMode();
291 }
292
293 //****************************************************************
294 void Plot2d_ViewWindow::onChangeHorMode()
295 {
296   bool aLinear = myViewFrame->isModeHorLinear();
297   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
298
299   myActionsMap[PModeXLinearId]->setOn( aLinear );
300   myActionsMap[PModeXLogarithmicId]->setOn( !aLinear );
301
302   QPixmap pix = aResMgr->loadPixmap( "Plot2d", tr( aLinear ? "ICON_PLOT2D_MODE_LOGARITHMIC_HOR" :
303                                                              "ICON_PLOT2D_MODE_LINEAR_HOR" ) );
304   myActionsMap[HorId]->setIconSet( pix );
305   myActionsMap[HorId]->setToolTip( tr( aLinear ? "TOT_PLOT2D_MODE_LOGARITHMIC_HOR" :
306                                                  "TOT_PLOT2D_MODE_LINEAR_HOR" ) );
307   myActionsMap[HorId]->setStatusTip( tr( aLinear ? "PRP_PLOT2D_MODE_LOGARITHMIC_HOR" :
308                                                    "PRP_PLOT2D_MODE_LINEAR_HOR" ) );
309
310   myActionsMap[GlobalPanId]->setEnabled( myViewFrame->isModeVerLinear() && myViewFrame->isModeHorLinear() );
311 }
312
313 //****************************************************************
314 void Plot2d_ViewWindow::onChangeVerMode()
315 {
316   bool aLinear = myViewFrame->isModeVerLinear();
317   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
318
319   myActionsMap[PModeYLinearId]->setOn( aLinear );
320   myActionsMap[PModeYLogarithmicId]->setOn( !aLinear );
321
322   QPixmap pix = aResMgr->loadPixmap( "Plot2d", tr( aLinear ? "ICON_PLOT2D_MODE_LOGARITHMIC_VER" :
323                                                              "ICON_PLOT2D_MODE_LINEAR_VER" ) );
324   myActionsMap[VerId]->setIconSet( pix );
325   myActionsMap[VerId]->setToolTip( tr( aLinear ? "TOT_PLOT2D_MODE_LOGARITHMIC_VER" :
326                                                  "TOT_PLOT2D_MODE_LINEAR_VER" ) );
327   myActionsMap[VerId]->setStatusTip( tr( aLinear ? "PRP_PLOT2D_MODE_LOGARITHMIC_VER" :
328                                                    "PRP_PLOT2D_MODE_LINEAR_VER" ) );
329
330   myActionsMap[GlobalPanId]->setEnabled( myViewFrame->isModeVerLinear() && myViewFrame->isModeHorLinear() );
331 }
332
333 //****************************************************************
334 void Plot2d_ViewWindow::onChangeCurveMode()
335 {
336   myCurveBtn->SetItem(myViewFrame->getCurveType());
337 }
338
339 //****************************************************************
340 void Plot2d_ViewWindow::onChangeLegendMode()
341 {
342   myActionsMap[ LegendId ]->setOn(myViewFrame->isLegendShow());
343 }
344
345 //****************************************************************
346 void Plot2d_ViewWindow::onFitAll()
347 {
348   myViewFrame->onViewFitAll();
349 }
350
351 //****************************************************************
352 void Plot2d_ViewWindow::onFitRect()
353 {
354   myViewFrame->onViewFitArea();
355 }
356
357 //****************************************************************
358 void Plot2d_ViewWindow::onZoom()
359 {
360   myViewFrame->onViewZoom();
361 }
362
363 //****************************************************************
364 void Plot2d_ViewWindow::onPanning()
365 {
366   myViewFrame->onViewPan();
367 }
368
369 //****************************************************************
370 void Plot2d_ViewWindow::onGlobalPanning()
371 {
372   myViewFrame->onViewGlobalPan();
373 }
374
375 //****************************************************************
376 void Plot2d_ViewWindow::onViewHorMode()
377 {
378   if (myViewFrame->isModeHorLinear())
379     myViewFrame->setHorScaleMode(1);
380   else
381     myViewFrame->setHorScaleMode(0);
382 }
383
384 //****************************************************************
385 void Plot2d_ViewWindow::onViewVerMode()
386 {
387   if (myViewFrame->isModeVerLinear())
388     myViewFrame->setVerScaleMode(1);
389   else
390     myViewFrame->setVerScaleMode(0);
391 }
392
393 //****************************************************************
394 void Plot2d_ViewWindow::onLegend()
395 {
396   myViewFrame->showLegend(!myViewFrame->isLegendShow());
397   onChangeLegendMode();
398 }
399
400 //****************************************************************
401 void Plot2d_ViewWindow::onCurves()
402 {
403   QtxAction* aSender = (QtxAction*) sender();
404   if(aSender == myActionsMap[CurvPointsId]) {
405     myActionsMap[CurvPointsId]->setOn(true);
406     myActionsMap[CurvLinesId]->setOn(false);
407     myActionsMap[CurvSplinesId]->setOn(false);
408     myViewFrame->setCurveType(0);
409   }
410   else if(aSender == myActionsMap[CurvLinesId]) {
411     myActionsMap[CurvLinesId]->setOn(true);
412     myActionsMap[CurvPointsId]->setOn(false);
413     myActionsMap[CurvSplinesId]->setOn(false);
414     myViewFrame->setCurveType(1);
415   }
416   else if(aSender == myActionsMap[CurvSplinesId]) {
417     myActionsMap[CurvSplinesId]->setOn( true );
418     myActionsMap[CurvPointsId]->setOn( false );
419     myActionsMap[CurvLinesId]->setOn( false );
420     myViewFrame->setCurveType(2);
421   }
422 }
423
424 //****************************************************************
425 void Plot2d_ViewWindow::onDumpView()
426 {
427   qApp->postEvent( myViewFrame, new QPaintEvent( QRect( 0, 0, myViewFrame->width(), myViewFrame->height() ), TRUE ) );
428   SUIT_ViewWindow::onDumpView();
429 }
430
431 //****************************************************************
432 QImage Plot2d_ViewWindow::dumpView()
433 {
434   QPixmap px = QPixmap::grabWindow( myViewFrame->winId() );
435   return px.convertToImage();
436 }