]> SALOME platform Git repositories - modules/gui.git/blob - src/PVViewer/PVViewer_GUIElements.cxx
Salome HOME
Merge branch 'master' into pre/V8_2_BR
[modules/gui.git] / src / PVViewer / PVViewer_GUIElements.cxx
1 // Copyright (C) 2014-2016  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 // Author: Adrien Bruneton (CEA)
20
21 #include "PVViewer_GUIElements.h"
22 #include "PVServer_ServiceWrapper.h"
23 #include "PVViewer_Core.h"
24 #include "PVViewer_ViewManager.h"
25
26 #include <pqActiveObjects.h>
27 #include <pqAnimationManager.h>
28 #include <pqAnimationTimeToolbar.h>
29 #include <pqApplicationCore.h>
30 #include <pqApplyBehavior.h>
31 #include <pqAxesToolbar.h>
32 #include <pqCameraToolbar.h>
33 #include <pqColorToolbar.h>
34 #include <pqMainControlsToolbar.h>
35 #include <pqPVApplicationCore.h>
36 #include <pqParaViewMenuBuilders.h>
37 #include <pqPipelineBrowserWidget.h>
38 #include <pqPipelineModel.h>
39 #include <pqPropertiesPanel.h>
40 #include <pqPythonManager.h>
41 #include <pqRepresentationToolbar.h>
42 #include <pqServerConnectReaction.h>
43 #include <pqServerManagerModel.h>
44 #include <pqServerResource.h>
45 #include <pqSetName.h>
46 #include <pqVCRToolbar.h>
47 #include <pqPipelineSource.h>
48
49 #include <vtkSMSessionProxyManager.h>
50 #include <vtkSMProxyIterator.h>
51
52 #include <QAction>
53 #include <QCoreApplication>
54 #include <QLayout>
55 #include <QList>
56 #include <QMainWindow>
57 #include <QMenu>
58 #include <QToolBar>
59
60
61 PVViewer_GUIElements * PVViewer_GUIElements::theInstance = 0;
62
63 PVViewer_GUIElements::PVViewer_GUIElements(QMainWindow* desk) :
64   myDesktop(desk),
65   propertiesPanel(0),
66   pipelineBrowserWidget(0),
67   pipelineModel(0),
68   sourcesMenu(0),
69   filtersMenu(0),
70   macrosMenu(0),
71   myPVWidgetsFlag(false)
72 {
73 }
74
75 PVViewer_GUIElements * PVViewer_GUIElements::GetInstance(QMainWindow* desk)
76 {
77   if (! theInstance)
78     theInstance = new PVViewer_GUIElements(desk);
79   return theInstance;
80 }
81
82 /**
83  * See ParaView source code: pqParaViewMenuBuilders::buildToolbars()
84  * to keep this function up to date:
85  */
86 void PVViewer_GUIElements::buildPVWidgets()
87 {
88   if (!myPVWidgetsFlag) {
89
90     //Pipeline Browser
91     if ( !pipelineBrowserWidget ) {
92         pqPipelineModel* pipelineModel = new pqPipelineModel(*pqApplicationCore::instance()->getServerManagerModel(), this);
93         pipelineModel->setView(pqActiveObjects::instance().activeView());
94         pipelineBrowserWidget  = new pqPipelineBrowserWidget(myDesktop);
95         pipelineBrowserWidget->setModel(pipelineModel);
96     }
97
98     // Properties panel
99     if ( !propertiesPanel ) {
100       propertiesPanel = new pqPropertiesPanel(myDesktop);
101     }
102     
103     // Sources Menu
104     if (!sourcesMenu) {
105       sourcesMenu = new QMenu(0);
106       pqParaViewMenuBuilders::buildSourcesMenu(*sourcesMenu, myDesktop);
107     }
108
109     //Filer Menu
110     if (!filtersMenu) {
111       filtersMenu = new QMenu(0);
112       pqParaViewMenuBuilders::buildFiltersMenu(*filtersMenu, myDesktop);
113     }
114
115     // Macros Menu
116     if (!macrosMenu) {
117       macrosMenu = new QMenu(0);
118       pqParaViewMenuBuilders::buildMacrosMenu(*macrosMenu);
119     }
120
121     mainToolBar = new pqMainControlsToolbar(myDesktop)
122       << pqSetName("MainControlsToolbar");
123     mainToolBar->layout()->setSpacing(0);
124
125     vcrToolbar = new pqVCRToolbar(myDesktop)
126       << pqSetName("VCRToolbar");
127     vcrToolbar->layout()->setSpacing(0);
128
129     timeToolbar = new pqAnimationTimeToolbar(myDesktop)
130       << pqSetName("currentTimeToolbar");
131     timeToolbar->layout()->setSpacing(0);
132
133     colorToolbar = new pqColorToolbar(myDesktop)
134       << pqSetName("variableToolbar");
135     colorToolbar->layout()->setSpacing(0);
136
137     reprToolbar = new pqRepresentationToolbar(myDesktop)
138       << pqSetName("representationToolbar");
139     reprToolbar->layout()->setSpacing(0);
140
141     cameraToolbar = new pqCameraToolbar(myDesktop)
142       << pqSetName("cameraToolbar");
143     cameraToolbar->layout()->setSpacing(0);
144     
145     axesToolbar = new pqAxesToolbar(myDesktop)
146       << pqSetName("axesToolbar");
147     axesToolbar->layout()->setSpacing(0);
148     
149     // Give the macros menu to the pqPythonMacroSupervisor
150     pqPythonManager* manager = qobject_cast<pqPythonManager*>(
151     pqApplicationCore::instance()->manager("PYTHON_MANAGER"));
152
153     macrosToolbar = new QToolBar("Macros Toolbars", myDesktop)
154       << pqSetName("MacrosToolbar");
155     manager->addWidgetForRunMacros(macrosToolbar);
156     
157     commonToolbar = new QToolBar("Common", myDesktop) << pqSetName("Common");
158     commonToolbar->layout()->setSpacing(0);
159     
160     dataToolbar = new QToolBar("DataAnalysis", myDesktop) << pqSetName("DataAnalysis");
161     dataToolbar->layout()->setSpacing(0);
162     
163     // add Toolbars    
164     myDesktop->addToolBar(Qt::TopToolBarArea, mainToolBar);
165     myDesktop->addToolBar(Qt::TopToolBarArea, vcrToolbar);
166     myDesktop->addToolBar(Qt::TopToolBarArea, timeToolbar);
167     myDesktop->addToolBar(Qt::TopToolBarArea, colorToolbar);
168     myDesktop->insertToolBarBreak(colorToolbar);
169     myDesktop->addToolBar(Qt::TopToolBarArea, reprToolbar);
170     myDesktop->addToolBar(Qt::TopToolBarArea, cameraToolbar);
171     myDesktop->addToolBar(Qt::TopToolBarArea, axesToolbar);
172     myDesktop->addToolBar(Qt::TopToolBarArea, macrosToolbar);
173     myDesktop->addToolBar(Qt::TopToolBarArea, commonToolbar);
174     myDesktop->addToolBar(Qt::TopToolBarArea, dataToolbar);
175     
176     mainAction = mainToolBar->toggleViewAction();
177     vcrAction = vcrToolbar->toggleViewAction();
178     timeAction = timeToolbar->toggleViewAction();
179     colorAction = colorToolbar->toggleViewAction();
180     reprAction = reprToolbar->toggleViewAction();
181     cameraAction = cameraToolbar->toggleViewAction();
182     axesAction = axesToolbar->toggleViewAction();
183     macrosAction = macrosToolbar->toggleViewAction();
184     commonAction = commonToolbar->toggleViewAction();
185     dataAction = dataToolbar->toggleViewAction();
186
187     // The piece od the code below is neccessary to correct update "Pipeline Browser",
188     // "Properties Panel", toolbars and menus
189     
190     // Initilaize pqApplyBehavior here because witout pqPropertiesPanel instance it doesn't make sence
191     pqApplyBehavior* applyBehavior = new pqApplyBehavior(this);
192     foreach (pqPropertiesPanel* ppanel, myDesktop->findChildren<pqPropertiesPanel*>())
193       {
194         applyBehavior->registerPanel(ppanel);
195       }
196     
197     QMetaObject::invokeMethod( &pqActiveObjects::instance(),
198                                "portChanged",
199                                Qt::AutoConnection,
200                                Q_ARG( pqOutputPort*, pqActiveObjects::instance().activePort() ) );
201     
202     QMetaObject::invokeMethod( &pqActiveObjects::instance(),
203                                "viewChanged",
204                                Qt::AutoConnection,
205                                Q_ARG( pqView*, pqActiveObjects::instance().activeView() ) ); 
206
207     pqServerManagerModel *smModel = pqApplicationCore::instance()->getServerManagerModel();
208     pqServer* serv = pqActiveObjects::instance().activeServer();    
209
210     if (serv) {
211       QMetaObject::invokeMethod( smModel,
212                                  "serverAdded",
213                                  Qt::AutoConnection,
214                                  Q_ARG( pqServer*, serv ) );
215       
216       QMetaObject::invokeMethod( serv,
217                                  "nameChanged",
218                                  Qt::AutoConnection,
219                                  Q_ARG( pqServerManagerModelItem* , NULL ) );
220     }
221     
222     //publishExistingSources();
223     myPVWidgetsFlag = true;
224   }
225 }
226
227 void PVViewer_GUIElements::setToolBarVisible(bool show)
228 {  
229   QCoreApplication::processEvents();
230   if (!myPVWidgetsFlag)
231     return;
232   
233   mainAction->setChecked(!show);
234   mainAction->setVisible(show);
235   mainAction->trigger();
236
237   setVCRTimeToolBarVisible(show);
238
239   colorAction->setChecked(!show);
240   colorAction->setVisible(show);
241   colorAction->trigger();
242   reprAction->setChecked(!show);
243   reprAction->setVisible(show);
244   reprAction->trigger();
245   cameraAction->setChecked(!show);
246   cameraAction->setVisible(show);
247   cameraAction->trigger();
248   axesAction->setChecked(!show);
249   axesAction->setVisible(show);
250   axesAction->trigger();
251   macrosAction->setChecked(!show);
252   macrosAction->setVisible(show);
253   macrosAction->trigger();
254   commonAction->setChecked(!show);
255   commonAction->setVisible(show);
256   commonAction->trigger();
257   dataAction->setChecked(!show);
258   dataAction->setVisible(show);
259   dataAction->trigger();
260 }
261
262 void PVViewer_GUIElements::setVCRTimeToolBarVisible(bool show)
263 {
264   vcrAction->setChecked(!show);
265   vcrAction->setVisible(show);
266   vcrAction->trigger();
267   timeAction->setChecked(!show);
268   timeAction->setVisible(show);
269   timeAction->trigger();
270 }
271
272 QList<QToolBar*> PVViewer_GUIElements::getToolbars()
273 {
274   buildPVWidgets();
275   QList<QToolBar*> l;
276   l << mainToolBar << vcrToolbar << timeToolbar << colorToolbar
277     << reprToolbar << cameraToolbar << axesToolbar << macrosToolbar
278     << commonToolbar << dataToolbar;
279   return l;
280 }
281
282 void PVViewer_GUIElements::setToolBarEnabled(bool enabled)
283 {
284   if (!myPVWidgetsFlag)
285     return;
286   
287   mainToolBar  ->setEnabled(enabled);
288   vcrToolbar   ->setEnabled(enabled);
289   timeToolbar  ->setEnabled(enabled);
290   colorToolbar ->setEnabled(enabled);
291   reprToolbar  ->setEnabled(enabled);
292   cameraToolbar->setEnabled(enabled);
293   axesToolbar  ->setEnabled(enabled);
294   macrosToolbar->setEnabled(enabled);
295   commonToolbar->setEnabled(enabled);
296   dataToolbar  ->setEnabled(enabled);
297 }
298
299
300 pqPropertiesPanel* PVViewer_GUIElements::getPropertiesPanel()
301 {
302   buildPVWidgets();
303   return propertiesPanel;
304 }
305
306 pqPipelineBrowserWidget* PVViewer_GUIElements::getPipelineBrowserWidget()
307 {
308   buildPVWidgets();
309   return pipelineBrowserWidget;   
310 }
311
312
313 pqVCRToolbar* PVViewer_GUIElements::getVCRToolbar()
314 {
315   buildPVWidgets();
316   return vcrToolbar;
317 }
318
319 pqAnimationTimeToolbar* PVViewer_GUIElements::getTimeToolbar()
320 {
321   buildPVWidgets();
322   return timeToolbar;
323 }
324
325 QMenu* PVViewer_GUIElements::getFiltersMenu() {
326   buildPVWidgets();
327   return filtersMenu;
328 }
329 QMenu* PVViewer_GUIElements::getSourcesMenu() {
330   buildPVWidgets();
331   return sourcesMenu;
332 }
333
334 QMenu* PVViewer_GUIElements::getMacrosMenu()  {
335   buildPVWidgets();
336   return macrosMenu;
337 }
338
339 void PVViewer_GUIElements::publishExistingSources() {
340   vtkSMSessionProxyManager* pxm = pqActiveObjects::instance().proxyManager();
341   pqServerManagerModel* smmodel = pqApplicationCore::instance()->getServerManagerModel();
342   if( !pxm || !smmodel )
343     return;
344   vtkSMProxyIterator* iter = vtkSMProxyIterator::New();
345   iter->SetModeToOneGroup();
346   iter->SetSessionProxyManager( pxm );
347   for ( iter->Begin( "sources" ); !iter->IsAtEnd(); iter->Next() ) {
348     if ( pqProxy* item = smmodel->findItem<pqProxy*>( iter->GetProxy() ) ) {
349       pqPipelineSource* source = qobject_cast<pqPipelineSource*>( item );
350       QMetaObject::invokeMethod( smmodel,
351                                  "sourceAdded",
352                                  Qt::AutoConnection,
353                                  Q_ARG( pqPipelineSource* , source ) );
354     }
355   }
356 }