Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLQtViewer.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /visualization/OpenGL/src/G4OpenGLQtViewer.cc (Version 11.3.0) and /visualization/OpenGL/src/G4OpenGLQtViewer.cc (Version 10.6)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 //
                                                   >>  27 //
                                                   >>  28 // 
 26 // G4OpenGLQtViewer : Class to provide Qt spec     29 // G4OpenGLQtViewer : Class to provide Qt specific
 27 //                     functionality for OpenG     30 //                     functionality for OpenGL in GEANT4
 28 //                                                 31 //
 29 // 27/06/2003 : G.Barrand : implementation (at     32 // 27/06/2003 : G.Barrand : implementation (at last !).
 30 // 30/06/2014 : M.Kelsey :  Change QPixmap obj     33 // 30/06/2014 : M.Kelsey :  Change QPixmap objects to pointers
 31                                                    34 
                                                   >>  35 #ifdef G4VIS_BUILD_OPENGLQT_DRIVER
                                                   >>  36 
 32 #include "G4LogicalVolumeStore.hh"                 37 #include "G4LogicalVolumeStore.hh"
 33 #include "G4PhysicalVolumeStore.hh"                38 #include "G4PhysicalVolumeStore.hh"
 34 #include "G4VisCommandsGeometrySet.hh"             39 #include "G4VisCommandsGeometrySet.hh"
 35 #include "G4PhysicalVolumeModel.hh"                40 #include "G4PhysicalVolumeModel.hh"
 36 #include "G4Text.hh"                               41 #include "G4Text.hh"
 37 #include "G4UnitsTable.hh"                         42 #include "G4UnitsTable.hh"
 38 #include "G4OpenGLStoredQtViewer.hh"               43 #include "G4OpenGLStoredQtViewer.hh"
 39 #include "G4Threading.hh"                          44 #include "G4Threading.hh"
 40                                                    45 
 41 #include "G4OpenGLQtViewer.hh"                     46 #include "G4OpenGLQtViewer.hh"
 42 #include "G4OpenGLSceneHandler.hh"                 47 #include "G4OpenGLSceneHandler.hh"
 43 #include "G4OpenGLQtExportDialog.hh"               48 #include "G4OpenGLQtExportDialog.hh"
 44 #include "G4OpenGLQtMovieDialog.hh"                49 #include "G4OpenGLQtMovieDialog.hh"
 45 #include "G4Qt.hh"                                 50 #include "G4Qt.hh"
 46 #include "G4UIQt.hh"                               51 #include "G4UIQt.hh"
 47 #include "G4UImanager.hh"                          52 #include "G4UImanager.hh"
 48 #include "G4UIcommandTree.hh"                      53 #include "G4UIcommandTree.hh"
 49                                                    54 
 50 #include <CLHEP/Units/SystemOfUnits.h>             55 #include <CLHEP/Units/SystemOfUnits.h>
 51                                                    56 
 52 #include <typeinfo>                                57 #include <typeinfo>
 53 #include <mutex>                                   58 #include <mutex>
 54                                                    59 
 55 #include <qlayout.h>                               60 #include <qlayout.h>
 56 #include <qlabel.h>                                61 #include <qlabel.h>
 57 #include <qdialog.h>                               62 #include <qdialog.h>
 58 #include <qpushbutton.h>                           63 #include <qpushbutton.h>
 59 #include <qprocess.h>                              64 #include <qprocess.h>
                                                   >>  65 #include <qdesktopwidget.h>
                                                   >>  66 
 60 #include <qmenu.h>                                 67 #include <qmenu.h>
 61 #include <qimagewriter.h>                          68 #include <qimagewriter.h>
 62                                                    69 
 63 #include <qtextedit.h>                             70 #include <qtextedit.h>
 64 #include <qtreewidget.h>                           71 #include <qtreewidget.h>
 65 #include <qapplication.h>                          72 #include <qapplication.h>
 66 #include <qmessagebox.h>                           73 #include <qmessagebox.h>
 67 #include <qfiledialog.h>                           74 #include <qfiledialog.h>
                                                   >>  75 #include <qprinter.h>
 68 #include <qdatetime.h>                             76 #include <qdatetime.h>
 69 #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) << 
 70   #include <qelapsedtimer.h>                   << 
 71 #endif                                         << 
 72 #if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0))  << 
 73   #include "qdesktopwidget.h"                  << 
 74 #endif                                         << 
 75 #include <qpainter.h>                              77 #include <qpainter.h>
                                                   >>  78 #include <qgl.h> // include <qglwidget.h>
 76 #include <qdialog.h>                               79 #include <qdialog.h>
 77 #include <qcolordialog.h>                          80 #include <qcolordialog.h>
 78 #include <qevent.h> //include <qcontextmenueve     81 #include <qevent.h> //include <qcontextmenuevent.h>
 79 #include <qobject.h>                               82 #include <qobject.h>
 80 #include <qgroupbox.h>                             83 #include <qgroupbox.h>
 81 #include <qcombobox.h>                             84 #include <qcombobox.h>
 82 #include <qlineedit.h>                             85 #include <qlineedit.h>
                                                   >>  86 #if QT_VERSION < 0x050600
                                                   >>  87 #include <qsignalmapper.h>
                                                   >>  88 #else
 83 #include <qscreen.h>                               89 #include <qscreen.h>
                                                   >>  90 #endif
 84 #include <qmainwindow.h>                           91 #include <qmainwindow.h>
 85 #include <qtablewidget.h>                          92 #include <qtablewidget.h>
 86 #include <qheaderview.h>                           93 #include <qheaderview.h>
 87 #include <qscrollarea.h>                           94 #include <qscrollarea.h>
 88 #include <qsplitter.h>                             95 #include <qsplitter.h>
 89 #include <qcheckbox.h>                             96 #include <qcheckbox.h>
 90 #include <qcursor.h>                               97 #include <qcursor.h>
 91 #include <qthread.h>                               98 #include <qthread.h>
 92                                                    99 
 93 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))   << 100 namespace
 94 #include <QGLContext>                          << 101 {
 95 #else                                          << 102   G4Mutex mWaitForVisSubThreadQtOpenGLContextMoved = G4MUTEX_INITIALIZER;
 96 #include <QOpenGLContext>                      << 103   G4Mutex mWaitForVisSubThreadQtOpenGLContextInitialized = G4MUTEX_INITIALIZER;
 97 #endif                                         << 104   // avoid unused variable warning
 98                                                << 105 #ifdef G4MULTITHREADED
 99 #ifndef G4GMAKE                                << 106   G4Condition c1_VisSubThreadQtOpenGLContextInitialized = G4CONDITION_INITIALIZER;
100 #include "moc_G4OpenGLQtViewer.cpp"            << 107   G4Condition c2_VisSubThreadQtOpenGLContextMoved = G4CONDITION_INITIALIZER;
101 #endif                                            108 #endif
                                                   >> 109 }
102                                                   110 
103 //////////////////////////////////////////////    111 //////////////////////////////////////////////////////////////////////////////
104 void G4OpenGLQtViewer::CreateMainWindow (         112 void G4OpenGLQtViewer::CreateMainWindow (
105  G4QGLWidgetType* glWidget                     << 113  QGLWidget* glWidget
106  ,const QString& name                             114  ,const QString& name
107 )                                              << 115 ) 
108 //////////////////////////////////////////////    116 //////////////////////////////////////////////////////////////////////////////
109 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    117 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
110 {                                                 118 {
111                                                   119 
112   if(fGLWidget) return; //Done.                   120   if(fGLWidget) return; //Done.
113                                                   121 
114   fGLWidget = glWidget ;                          122   fGLWidget = glWidget ;
                                                   >> 123   //  fGLWidget->makeCurrent();
115                                                   124 
116 #if QT_VERSION < 0x060000                      << 125   G4Qt* interactorManager = G4Qt::getInstance ();
117   ResizeWindow(fVP.GetWindowSizeHintX(),fVP.Ge << 
118 #else                                          << 
119   ResizeWindow(glWidget->devicePixelRatio()*fV << 
120 #endif                                         << 
121                                                   126 
122   // FIXME L.Garnier 9/11/09 Has to be check ! << 127   ResizeWindow(fVP.GetWindowSizeHintX(),fVP.GetWindowSizeHintY());
                                                   >> 128     
                                                   >> 129   // FIXME L.Garnier 9/11/09 Has to be check !!! 
123   // Qt UI with Qt Vis                            130   // Qt UI with Qt Vis
124   // Qt UI with X Vis                             131   // Qt UI with X Vis
125   // X UI with Qt Vis                             132   // X UI with Qt Vis
126   // X UI with X Vis                              133   // X UI with X Vis
127   // Ne marche pas avec un UIBatch !! (ecran b    134   // Ne marche pas avec un UIBatch !! (ecran blanc)
128                                                   135 
129   // return false if G4UIQt was not launch        136   // return false if G4UIQt was not launch
130                                                   137 
131   G4UImanager* UI = G4UImanager::GetUIpointer(    138   G4UImanager* UI = G4UImanager::GetUIpointer();
132   if (UI == NULL) return;                         139   if (UI == NULL) return;
133                                                   140 
134   if (! static_cast<G4UIQt*> (UI->GetG4UIWindo    141   if (! static_cast<G4UIQt*> (UI->GetG4UIWindow())) {
135     // NO UI, should be batch mode                142     // NO UI, should be batch mode
136     fBatchMode = true;                            143     fBatchMode = true;
137     return;                                       144     return;
138   }                                               145   }
139   fUiQt = static_cast<G4UIQt*> (UI->GetG4UIWin    146   fUiQt = static_cast<G4UIQt*> (UI->GetG4UIWindow());
140                                                << 147   
141   bool isTabbedView = false;                      148   bool isTabbedView = false;
142   if ( fUiQt) {                                   149   if ( fUiQt) {
143     if (!fBatchMode) {                            150     if (!fBatchMode) {
144       G4Qt* interactorManager = G4Qt::getInsta << 
145       if (!interactorManager->IsExternalApp())    151       if (!interactorManager->IsExternalApp()) {
146         // INIT size                              152         // INIT size
147         fWinSize_x = fVP.GetWindowSizeHintX();    153         fWinSize_x = fVP.GetWindowSizeHintX();
148         fWinSize_y = fVP.GetWindowSizeHintY();    154         fWinSize_y = fVP.GetWindowSizeHintY();
149                                                   155 
150         isTabbedView = fUiQt->AddTabWidget((QW    156         isTabbedView = fUiQt->AddTabWidget((QWidget*)fGLWidget,name);
151         QObject::connect(fUiQt->GetViewerTabWi    157         QObject::connect(fUiQt->GetViewerTabWidget(),
152                          SIGNAL(currentChanged    158                          SIGNAL(currentChanged(int)),
153                          this,                    159                          this,
154                          SLOT(currentTabActiva    160                          SLOT(currentTabActivated(int)));
155                                                   161 
156 #if QT_VERSION < 0x060000                      << 
157 #else                                          << 
158         createViewerPropertiesWidget();        << 
159 #endif                                         << 
160                                                   162 
161       }                                           163       }
162       createSceneTreeWidget();                    164       createSceneTreeWidget();
163       // activate them                            165       // activate them
164     }                                             166     }
165   }                                               167   }
166                                                   168 
167   if (!isTabbedView) { // we have to do a dial    169   if (!isTabbedView) { // we have to do a dialog
168                                                   170 
169     QWidget *glDialogWidget = getParentWidget(    171     QWidget *glDialogWidget = getParentWidget();
170     if (glDialogWidget == NULL) {                 172     if (glDialogWidget == NULL) {
171       return;                                     173       return;
172     }                                             174     }
173     glWidget->setParent(glDialogWidget);          175     glWidget->setParent(glDialogWidget);
174     QHBoxLayout *mainLayout = new QHBoxLayout(    176     QHBoxLayout *mainLayout = new QHBoxLayout();
175                                                << 177     
176     mainLayout->setContentsMargins(0,0,0,0);   << 178     mainLayout->setMargin(0);
177     mainLayout->setSpacing(0);                 << 179     mainLayout->setSpacing(0);   
178     mainLayout->addWidget(fGLWidget);             180     mainLayout->addWidget(fGLWidget);
179     if (fGLWidget->inherits("QMainWindow")) {     181     if (fGLWidget->inherits("QMainWindow")) {
180       fGLWidget->setWindowTitle( name);           182       fGLWidget->setWindowTitle( name);
181     }                                             183     }
182     glDialogWidget->setLayout(mainLayout);        184     glDialogWidget->setLayout(mainLayout);
183                                                   185 
184                                                << 186     
185     //useful for MACOSX, we have to compt the     187     //useful for MACOSX, we have to compt the menuBar height
186 #if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) << 188 #if QT_VERSION >= 0x050a00
187       G4int offset = QGuiApplication::primaryS << 189       G4int offset = QApplication::desktop()->height()
188           - QGuiApplication::screenAt(QPoint(2    190           - QGuiApplication::screenAt(QPoint(20,20))->availableGeometry().height();
189 #else                                             191 #else
190       G4int offset = QApplication::desktop()->    192       G4int offset = QApplication::desktop()->height()
191           - QApplication::desktop()->available    193           - QApplication::desktop()->availableGeometry().height();
192 #endif                                            194 #endif
193                                                   195 
194     G4int YPos= fVP.GetWindowAbsoluteLocationH << 196     G4int YPos= fVP.GetWindowAbsoluteLocationHintY(QApplication::desktop()->height());
195     if (fVP.GetWindowAbsoluteLocationHintY(QGu << 197     if (fVP.GetWindowAbsoluteLocationHintY(QApplication::desktop()->height())< offset) {
196       YPos = offset;                              198       YPos = offset;
197     }                                             199     }
198     glDialogWidget->resize(getWinWidth(), getW    200     glDialogWidget->resize(getWinWidth(), getWinHeight());
199     glDialogWidget->move(fVP.GetWindowAbsolute << 201     glDialogWidget->move(fVP.GetWindowAbsoluteLocationHintX(QApplication::desktop()->width()),YPos);
200     glDialogWidget->show();                       202     glDialogWidget->show();
201   }                                               203   }
202                                                   204 
203   if(!fGLWidget) return;                          205   if(!fGLWidget) return;
204                                                << 206   
205   if (!fContextMenu)                           << 207   if (!fContextMenu) 
206     createPopupMenu();                            208     createPopupMenu();
207                                                   209 
208 }                                                 210 }
209                                                   211 
210                                                   212 
211 //////////////////////////////////////////////    213 //////////////////////////////////////////////////////////////////////////////
212 G4OpenGLQtViewer::G4OpenGLQtViewer (              214 G4OpenGLQtViewer::G4OpenGLQtViewer (
213  G4OpenGLSceneHandler& scene                      215  G4OpenGLSceneHandler& scene
214 )                                                 216 )
215   :G4VViewer (scene, -1)                          217   :G4VViewer (scene, -1)
216   ,G4OpenGLViewer (scene)                         218   ,G4OpenGLViewer (scene)
217   ,fUiQt(NULL)                                 << 
218   ,fGLWidget(NULL)                                219   ,fGLWidget(NULL)
219   ,fRecordFrameNumber(0)                          220   ,fRecordFrameNumber(0)
220   ,fMouseOnSceneTree(false)                       221   ,fMouseOnSceneTree(false)
221   ,fContextMenu(0)                                222   ,fContextMenu(0)
222   ,fLastPickPoint(-1,-1)                          223   ,fLastPickPoint(-1,-1)
223   ,fDeltaDepth(0.01)                              224   ,fDeltaDepth(0.01)
224   ,fDeltaZoom(0.05)                               225   ,fDeltaZoom(0.05)
225   ,fHoldKeyEvent(false)                           226   ,fHoldKeyEvent(false)
226   ,fHoldMoveEvent(false)                          227   ,fHoldMoveEvent(false)
227   ,fHoldRotateEvent(false)                        228   ,fHoldRotateEvent(false)
228   ,fAutoMove(false)                               229   ,fAutoMove(false)
229   ,fEncoderPath("")                               230   ,fEncoderPath("")
230   ,fTempFolderPath("")                            231   ,fTempFolderPath("")
231   ,fMovieTempFolderPath("")                       232   ,fMovieTempFolderPath("")
232   ,fSaveFileName("")                              233   ,fSaveFileName("")
233   ,fParameterFileName("ppmtompeg_encode_parame    234   ,fParameterFileName("ppmtompeg_encode_parameter_file.par")
234   ,fMovieParametersDialog(NULL)                   235   ,fMovieParametersDialog(NULL)
235   ,fRecordingStep(WAIT)                           236   ,fRecordingStep(WAIT)
236   ,fProcess(NULL)                                 237   ,fProcess(NULL)
237   ,fNbMaxFramesPerSec(100)                        238   ,fNbMaxFramesPerSec(100)
238   ,fNbMaxAnglePerSec(360)                         239   ,fNbMaxAnglePerSec(360)
239   ,fLaunchSpinDelay(100)                          240   ,fLaunchSpinDelay(100)
240   ,fUISceneTreeWidget(NULL)                       241   ,fUISceneTreeWidget(NULL)
241   ,fUIViewerPropertiesWidget(NULL)                242   ,fUIViewerPropertiesWidget(NULL)
242   ,fUIPickInfosWidget(NULL)                       243   ,fUIPickInfosWidget(NULL)
243   ,fNoKeyPress(true)                              244   ,fNoKeyPress(true)
244   ,fAltKeyPress(false)                            245   ,fAltKeyPress(false)
245   ,fControlKeyPress(false)                        246   ,fControlKeyPress(false)
246   ,fShiftKeyPress(false)                          247   ,fShiftKeyPress(false)
247   ,fBatchMode(false)                              248   ,fBatchMode(false)
248   ,fCheckSceneTreeComponentSignalLock(false)      249   ,fCheckSceneTreeComponentSignalLock(false)
249   ,fViewerPropertiesTableWidgetIsInit(false)      250   ,fViewerPropertiesTableWidgetIsInit(false)
250   ,fSceneTreeComponentTreeWidget(NULL)            251   ,fSceneTreeComponentTreeWidget(NULL)
251   ,fSceneTreeWidget(NULL)                         252   ,fSceneTreeWidget(NULL)
252   ,fPVRootNodeCreate(false)                       253   ,fPVRootNodeCreate(false)
253   ,fFilterOutput(NULL)                            254   ,fFilterOutput(NULL)
254   ,fNbRotation(0)                                 255   ,fNbRotation(0)
255   ,fTimeRotation(0)                               256   ,fTimeRotation(0)
256   ,fTouchableVolumes("Touchables")                257   ,fTouchableVolumes("Touchables")
257   ,fShortcutsDialog(NULL)                         258   ,fShortcutsDialog(NULL)
258   ,fViewerPropertiesTableWidget(NULL)             259   ,fViewerPropertiesTableWidget(NULL)
259   ,fPickInfosWidget(NULL)                         260   ,fPickInfosWidget(NULL)
260   ,fPickInfosScrollArea(NULL)                     261   ,fPickInfosScrollArea(NULL)
261   ,fTreeWidgetInfosIgnoredCommands(0)             262   ,fTreeWidgetInfosIgnoredCommands(0)
262   ,fSceneTreeDepthSlider(NULL)                    263   ,fSceneTreeDepthSlider(NULL)
263   ,fSceneTreeDepth(1)                             264   ,fSceneTreeDepth(1)
264   ,fModelShortNameItem(NULL)                      265   ,fModelShortNameItem(NULL)
265   ,fMaxPOindexInserted(-1)                        266   ,fMaxPOindexInserted(-1)
                                                   >> 267   ,fUiQt(NULL)
                                                   >> 268 #if QT_VERSION < 0x050600
                                                   >> 269   ,fSignalMapperMouse(NULL)
                                                   >> 270   ,fSignalMapperSurface(NULL)
                                                   >> 271   ,fSignalMapperPicking(NULL)
                                                   >> 272 #endif
266   ,fTreeIconOpen(NULL)                            273   ,fTreeIconOpen(NULL)
267   ,fTreeIconClosed(NULL)                          274   ,fTreeIconClosed(NULL)
268   ,fLastExportSliderValue(80)                     275   ,fLastExportSliderValue(80)
269   ,fLastHighlightColor(G4Color(0,0,0,0))          276   ,fLastHighlightColor(G4Color(0,0,0,0))
270   ,fLastHighlightName(0)                          277   ,fLastHighlightName(0)
271   ,fIsDeleting(false)                             278   ,fIsDeleting(false)
272 {                                                 279 {
                                                   >> 280     lWaitForVisSubThreadQtOpenGLContextInitialized
                                                   >> 281             = new G4AutoLock(mWaitForVisSubThreadQtOpenGLContextInitialized,
                                                   >> 282                              std::defer_lock);
                                                   >> 283     lWaitForVisSubThreadQtOpenGLContextMoved
                                                   >> 284             = new G4AutoLock(mWaitForVisSubThreadQtOpenGLContextMoved,
                                                   >> 285                              std::defer_lock);
                                                   >> 286 
273   // launch Qt if not                             287   // launch Qt if not
274   if (QCoreApplication::instance () == NULL) {    288   if (QCoreApplication::instance () == NULL) {
275     fBatchMode = true;                            289     fBatchMode = true;
276   }                                               290   }
277   G4Qt::getInstance ();                           291   G4Qt::getInstance ();
278                                                   292 
279   fLastPos3 = QPoint(-1,-1);                   << 293   fLastPos3 = QPoint(-1,-1);    
280   fLastPos2 = QPoint(-1,-1);                   << 294   fLastPos2 = QPoint(-1,-1);    
281   fLastPos1 = QPoint(-1,-1);                   << 295   fLastPos1 = QPoint(-1,-1);    
282                                                << 296   
283   initMovieParameters();                          297   initMovieParameters();
284                                                   298 
285 #if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))  << 
286   fLastEventTime = new QTime();                   299   fLastEventTime = new QTime();
287 #else                                          << 300 #if QT_VERSION < 0x050600
288   fLastEventTime = new QElapsedTimer();        << 301   fSignalMapperMouse = new QSignalMapper(this);
                                                   >> 302   fSignalMapperSurface = new QSignalMapper(this);
289 #endif                                            303 #endif
290   // Set default path and format                  304   // Set default path and format
291   fFileSavePath = QDir::currentPath();            305   fFileSavePath = QDir::currentPath();
292                                                   306 
293   // add available export format                  307   // add available export format
294   QList<QByteArray> formats =  QImageWriter::s    308   QList<QByteArray> formats =  QImageWriter::supportedImageFormats ();
295   for (int i = 0; i < formats.size(); ++i) {      309   for (int i = 0; i < formats.size(); ++i) {
296     addExportImageFormat(formats.at(i).data())    310     addExportImageFormat(formats.at(i).data());
297   }                                               311   }
298                                                   312 
299   const char * const icon1[]={                    313   const char * const icon1[]={
300     /* columns rows colors chars-per-pixel */     314     /* columns rows colors chars-per-pixel */
301           "20 20 34 1",                           315           "20 20 34 1",
302      "  c None",                                  316      "  c None",
303      ". c #7C7C7C7C7C7C",                         317      ". c #7C7C7C7C7C7C",
304      "X c #7D7D7D7D7D7D",                         318      "X c #7D7D7D7D7D7D",
305      "o c #828282828282",                         319      "o c #828282828282",
306      "O c #838383838383",                         320      "O c #838383838383",
307      "+ c #848484848484",                         321      "+ c #848484848484",
308      "@ c #858585858585",                         322      "@ c #858585858585",
309      "# c #878787878787",                         323      "# c #878787878787",
310      "$ c #888888888888",                         324      "$ c #888888888888",
311      "% c #8B8B8B8B8B8B",                         325      "% c #8B8B8B8B8B8B",
312      "& c #8C8C8C8C8C8C",                         326      "& c #8C8C8C8C8C8C",
313      "* c #8F8F8F8F8F8F",                         327      "* c #8F8F8F8F8F8F",
314      "= c #909090909090",                         328      "= c #909090909090",
315      "- c #919191919191",                         329      "- c #919191919191",
316      "; c #999999999999",                         330      "; c #999999999999",
317      ": c #9D9D9D9D9D9D",                         331      ": c #9D9D9D9D9D9D",
318      "> c #A2A2A2A2A2A2",                         332      "> c #A2A2A2A2A2A2",
319      ", c #A3A3A3A3A3A3",                         333      ", c #A3A3A3A3A3A3",
320      "< c #A5A5A5A5A5A5",                         334      "< c #A5A5A5A5A5A5",
321      "1 c #A6A6A6A6A6A6",                         335      "1 c #A6A6A6A6A6A6",
322      "2 c #B3B3B3B3B3B3",                         336      "2 c #B3B3B3B3B3B3",
323      "3 c #B6B6B6B6B6B6",                         337      "3 c #B6B6B6B6B6B6",
324      "4 c #C2C2C2C2C2C2",                         338      "4 c #C2C2C2C2C2C2",
325      "5 c #C6C6C6C6C6C6",                         339      "5 c #C6C6C6C6C6C6",
326      "6 c #CACACACACACA",                         340      "6 c #CACACACACACA",
327      "7 c #CFCFCFCFCFCF",                         341      "7 c #CFCFCFCFCFCF",
328      "8 c #D0D0D0D0D0D0",                         342      "8 c #D0D0D0D0D0D0",
329      "9 c #D4D4D4D4D4D4",                         343      "9 c #D4D4D4D4D4D4",
330      "0 c #D7D7D7D7D7D7",                         344      "0 c #D7D7D7D7D7D7",
331      "q c #DEDEDEDEDEDE",                         345      "q c #DEDEDEDEDEDE",
332      "w c #E0E0E0E0E0E0",                         346      "w c #E0E0E0E0E0E0",
333      "e c #E7E7E7E7E7E7",                         347      "e c #E7E7E7E7E7E7",
334      "r c #F4F4F4F4F4F4",                         348      "r c #F4F4F4F4F4F4",
335      "t c #F7F7F7F7F7F7",                         349      "t c #F7F7F7F7F7F7",
336      "                               ",           350      "                               ",
337      "                               ",           351      "                               ",
338      "                               ",           352      "                               ",
339      "                               ",           353      "                               ",
340      "                               ",           354      "                               ",
341      "                               ",           355      "                               ",
342      "    =========>                 ",           356      "    =========>                 ",
343      "    7&X+++Oo<e                 ",           357      "    7&X+++Oo<e                 ",
344      "     2o+@@+-8                  ",           358      "     2o+@@+-8                  ",
345      "     w;.#@+3                   ",           359      "     w;.#@+3                   ",
346      "      4$o@:q                   ",           360      "      4$o@:q                   ",
347      "      r1X%5                    ",           361      "      r1X%5                    ",
348      "       9*,t                    ",           362      "       9*,t                    ",
349      "        60                     ",           363      "        60                     ",
350      "                               ",           364      "                               ",
351      "                               ",           365      "                               ",
352      "                               ",           366      "                               ",
353      "                               ",           367      "                               ",
354      "                               ",           368      "                               ",
355      "                               "            369      "                               "
356   };                                              370   };
357   const char * const icon2[]={                    371   const char * const icon2[]={
358     "20 20 68 1",                                 372     "20 20 68 1",
359     "  c None",                                   373     "  c None",
360     ". c #5F5F10102323",                          374     ". c #5F5F10102323",
361     "X c #40405F5F1010",                          375     "X c #40405F5F1010",
362     "o c #696963632E2E",                          376     "o c #696963632E2E",
363     "O c #101019194C4C",                          377     "O c #101019194C4C",
364     "+ c #101023237070",                          378     "+ c #101023237070",
365     "@ c #70702D2D6363",                          379     "@ c #70702D2D6363",
366     "# c #73732D2D6464",                          380     "# c #73732D2D6464",
367     "$ c #79792E2E6767",                          381     "$ c #79792E2E6767",
368     "% c #19194C4C5353",                          382     "% c #19194C4C5353",
369     "& c #2D2D63636161",                          383     "& c #2D2D63636161",
370     "* c #2E2E61617070",                          384     "* c #2E2E61617070",
371     "= c #6F6F6E6E4343",                          385     "= c #6F6F6E6E4343",
372     "- c #707065655F5F",                          386     "- c #707065655F5F",
373     "; c #727279795454",                          387     "; c #727279795454",
374     ": c #535341417070",                          388     ": c #535341417070",
375     "> c #797954547979",                          389     "> c #797954547979",
376     ", c #434361617474",                          390     ", c #434361617474",
377     "< c #414170707070",                          391     "< c #414170707070",
378     "1 c #686869696363",                          392     "1 c #686869696363",
379     "2 c #6C6C69696363",                          393     "2 c #6C6C69696363",
380     "3 c #656567676F6F",                          394     "3 c #656567676F6F",
381     "4 c #69696F6F6E6E",                          395     "4 c #69696F6F6E6E",
382     "5 c #747465656767",                          396     "5 c #747465656767",
383     "6 c #757562626C6C",                          397     "6 c #757562626C6C",
384     "7 c #70706C6C6969",                          398     "7 c #70706C6C6969",
385     "8 c #616174746565",                          399     "8 c #616174746565",
386     "9 c #656573736969",                          400     "9 c #656573736969",
387     "0 c #616174746969",                          401     "0 c #616174746969",
388     "q c #707075756262",                          402     "q c #707075756262",
389     "w c #797970706565",                          403     "w c #797970706565",
390     "e c #636361617474",                          404     "e c #636361617474",
391     "r c #67676F6F7272",                          405     "r c #67676F6F7272",
392     "t c #727261617070",                          406     "t c #727261617070",
393     "y c #616170707070",                          407     "y c #616170707070",
394     "u c #6F6F72727979",                          408     "u c #6F6F72727979",
395     "i c #67676E6ED1D1",                          409     "i c #67676E6ED1D1",
396     "p c #808080808080",                          410     "p c #808080808080",
397     "a c #828282828282",                          411     "a c #828282828282",
398     "s c #838383838383",                          412     "s c #838383838383",
399     "d c #848484848484",                          413     "d c #848484848484",
400     "f c #858585858585",                          414     "f c #858585858585",
401     "g c #868686868686",                          415     "g c #868686868686",
402     "h c #888888888888",                          416     "h c #888888888888",
403     "j c #8A8A8A8A8A8A",                          417     "j c #8A8A8A8A8A8A",
404     "k c #8D8D8D8D8D8D",                          418     "k c #8D8D8D8D8D8D",
405     "l c #8F8F8F8F8F8F",                          419     "l c #8F8F8F8F8F8F",
406     "z c #909090909090",                          420     "z c #909090909090",
407     "x c #949494949494",                          421     "x c #949494949494",
408     "c c #9C9C9C9C9C9C",                          422     "c c #9C9C9C9C9C9C",
409     "v c #9F9F9F9F9F9F",                          423     "v c #9F9F9F9F9F9F",
410     "b c #A2A2A2A2A2A2",                          424     "b c #A2A2A2A2A2A2",
411     "n c #AEAEAEAEAEAE",                          425     "n c #AEAEAEAEAEAE",
412     "m c #B7B7B7B7B7B7",                          426     "m c #B7B7B7B7B7B7",
413     "M c #C7C7C7C7C7C7",                          427     "M c #C7C7C7C7C7C7",
414     "N c #C9C9C9C9C9C9",                          428     "N c #C9C9C9C9C9C9",
415     "B c #D1D1D1D1D1D1",                          429     "B c #D1D1D1D1D1D1",
416     "V c #D4D4D4D4D4D4",                          430     "V c #D4D4D4D4D4D4",
417     "C c #D9D9D9D9D9D9",                          431     "C c #D9D9D9D9D9D9",
418     "Z c #E0E0E0E0E0E0",                          432     "Z c #E0E0E0E0E0E0",
419     "A c #E2E2E2E2E2E2",                          433     "A c #E2E2E2E2E2E2",
420     "S c #EEEEEEEEEEEE",                          434     "S c #EEEEEEEEEEEE",
421     "D c #F0F0F0F0F0F0",                          435     "D c #F0F0F0F0F0F0",
422     "F c #F5F5F5F5F5F5",                          436     "F c #F5F5F5F5F5F5",
423     "G c #F6F6F6F6F6F6",                          437     "G c #F6F6F6F6F6F6",
424     "H c #F9F9F9F9F9F9",                          438     "H c #F9F9F9F9F9F9",
425     "J c #FCFCFCFCFCFC",                          439     "J c #FCFCFCFCFCFC",
426     "K c #FDFDFDFDFDFD",                          440     "K c #FDFDFDFDFDFD",
427     "                    ",                       441     "                    ",
428     "                    ",                       442     "                    ",
429     "                    ",                       443     "                    ",
430     "                    ",                       444     "                    ",
431     "                    ",                       445     "                    ",
432     "     bC             ",                       446     "     bC             ",
433     "     zjnD           ",                       447     "     zjnD           ",
434     "     ldjjMK         ",                       448     "     ldjjMK         ",
435     "     zdhdjcA        ",                       449     "     zdhdjcA        ",
436     "     zddhdddVK      ",                       450     "     zddhdddVK      ",
437     "     zghdalBH       ",                       451     "     zghdalBH       ",
438     "     zghamSK        ",                       452     "     zghamSK        ",
439     "     lubZH          ",                       453     "     lubZH          ",
440     "     xMF            ",                       454     "     xMF            ",
441     "     G              ",                       455     "     G              ",
442     "                    ",                       456     "                    ",
443     "                    ",                       457     "                    ",
444     "                    ",                       458     "                    ",
445     "                    ",                       459     "                    ",
446     "                    ",                       460     "                    ",
447                                                << 461     
448   };                                              462   };
449                                                << 463   
450   const char * const search[]  = {                464   const char * const search[]  = {
451     /* columns rows colors chars-per-pixel */     465     /* columns rows colors chars-per-pixel */
452     "19 19 8 1",                                  466     "19 19 8 1",
453     "  c #5C5C5C",                                467     "  c #5C5C5C",
454     ". c #7D7D7D",                                468     ". c #7D7D7D",
455     "X c #9B9B9B",                                469     "X c #9B9B9B",
456     "o c #C3C3C3",                                470     "o c #C3C3C3",
457     "O c None",                                   471     "O c None",
458     "+ c #000000",                                472     "+ c #000000",
459     "@ c #000000",                                473     "@ c #000000",
460     "# c None",                                   474     "# c None",
461     /* pixels */                                  475     /* pixels */
462     "OOOOOOOOOOOOOOOOOOO",                        476     "OOOOOOOOOOOOOOOOOOO",
463     "OOOOOOOOOOOOOOOOOOO",                        477     "OOOOOOOOOOOOOOOOOOO",
464     "OOOOOOOo.  .oOOOOOO",                        478     "OOOOOOOo.  .oOOOOOO",
465     "OOOOOOX      XOOOOO",                        479     "OOOOOOX      XOOOOO",
466     "OOOOOo  XOOX  oOOOO",                        480     "OOOOOo  XOOX  oOOOO",
467     "OOOOO. XOOOOX .OOOO",                        481     "OOOOO. XOOOOX .OOOO",
468     "OOOOO  OOOOOO  OOOO",                        482     "OOOOO  OOOOOO  OOOO",
469     "OOOOO  OOOOOO  OOOO",                        483     "OOOOO  OOOOOO  OOOO",
470     "OOOOO. XOOOOo .OOOO",                        484     "OOOOO. XOOOOo .OOOO",
471     "OOOOOo  oOOo  oOOOO",                        485     "OOOOOo  oOOo  oOOOO",
472     "OOOOOOX       XOOOO",                        486     "OOOOOOX       XOOOO",
473     "OOOOOOOo.  .   XOOO",                        487     "OOOOOOOo.  .   XOOO",
474     "OOOOOOOOOOOOO.  XOO",                        488     "OOOOOOOOOOOOO.  XOO",
475     "OOOOOOOOOOOOOO. XOO",                        489     "OOOOOOOOOOOOOO. XOO",
476     "OOOOOOOOOOOOOOOoOOO",                        490     "OOOOOOOOOOOOOOOoOOO",
477     "OOOOOOOOOOOOOOOOOOO",                        491     "OOOOOOOOOOOOOOOOOOO",
478     "OOOOOOOOOOOOOOOOOOO",                        492     "OOOOOOOOOOOOOOOOOOO",
479     "OOOOOOOOOOOOOOOOOOO",                        493     "OOOOOOOOOOOOOOOOOOO",
480     "OOOOOOOOOOOOOOOOOOO"                         494     "OOOOOOOOOOOOOOOOOOO"
481   };                                              495   };
482                                                << 496   
483   fSearchIcon = new QPixmap(search);              497   fSearchIcon = new QPixmap(search);
484   fTreeIconOpen = new QPixmap(icon1);             498   fTreeIconOpen = new QPixmap(icon1);
485   fTreeIconClosed = new QPixmap(icon2);           499   fTreeIconClosed = new QPixmap(icon2);
486                                                   500 
487 }                                                 501 }
488                                                   502 
489 //////////////////////////////////////////////    503 //////////////////////////////////////////////////////////////////////////////
490 G4OpenGLQtViewer::~G4OpenGLQtViewer (             504 G4OpenGLQtViewer::~G4OpenGLQtViewer (
491 )                                              << 505 ) 
492 //////////////////////////////////////////////    506 //////////////////////////////////////////////////////////////////////////////
493 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    507 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
494 {                                                 508 {
495   fIsDeleting = true;                             509   fIsDeleting = true;
496                                                << 510   
497   // remove scene tree from layout                511   // remove scene tree from layout
498   // Delete all the existing buttons in the la    512   // Delete all the existing buttons in the layout
499   QLayoutItem *wItem;                             513   QLayoutItem *wItem;
500   if (fSceneTreeWidget != NULL) {                 514   if (fSceneTreeWidget != NULL) {
501     if (fSceneTreeWidget->layout() != NULL) {     515     if (fSceneTreeWidget->layout() != NULL) {
502       while ((wItem = fSceneTreeWidget->layout    516       while ((wItem = fSceneTreeWidget->layout()->takeAt(0)) != 0) {
503   delete wItem->widget();                         517   delete wItem->widget();
504   delete wItem;                                   518   delete wItem;
505       }                                           519       }
506     }                                             520     }
507   }                                               521   }
508                                                   522 
509   // Delete the open/close icons                  523   // Delete the open/close icons
510   delete fTreeIconOpen;                           524   delete fTreeIconOpen;
511   delete fTreeIconClosed;                         525   delete fTreeIconClosed;
512                                                   526 
513 #if QT_VERSION < 0x060000                      << 527   G4cout <<removeTempFolder().toStdString().c_str() <<G4endl;
514   G4cout <<removeTempFolder().toStdString().c_ << 
515 #endif                                         << 
516                                                   528 
517 }                                              << 529   delete lWaitForVisSubThreadQtOpenGLContextInitialized;
                                                   >> 530   delete lWaitForVisSubThreadQtOpenGLContextMoved;
518                                                   531 
519 G4bool G4OpenGLQtViewer::ReadyToDraw() {       << 
520 #if QT_VERSION < 0x060000                      << 
521   return true;                                 << 
522 #else                                          << 
523   if(!fGLWidget) return false;                 << 
524   auto* qGLW = dynamic_cast<G4QGLWidgetType*>( << 
525   if (!qGLW) return false;                     << 
526   return qGLW->isValid();                      << 
527 #endif                                         << 
528 }                                                 532 }
529                                                   533 
                                                   >> 534 
530 //                                                535 //
531 //   Create a popup menu for the widget. This     536 //   Create a popup menu for the widget. This menu is activated by right-mouse click
532 //                                                537 //
533 void G4OpenGLQtViewer::createPopupMenu()    {     538 void G4OpenGLQtViewer::createPopupMenu()    {
534                                                   539 
535   fContextMenu = new QMenu("All");                540   fContextMenu = new QMenu("All");
536                                                   541 
537   QMenu *mMouseAction = fContextMenu->addMenu(    542   QMenu *mMouseAction = fContextMenu->addMenu("&Mouse actions");
538   fMouseRotateAction = mMouseAction->addAction << 543 
539   fMouseMoveAction = mMouseAction->addAction(" << 544 #if QT_VERSION < 0x050600
540   fMousePickAction = mMouseAction->addAction(" << 545   fMouseRotateAction = mMouseAction->addAction("Rotate", fSignalMapperMouse, SLOT(map()));
541   fMouseZoomOutAction = mMouseAction->addActio << 546   fMouseMoveAction = mMouseAction->addAction("Move", fSignalMapperMouse, SLOT(map()));
542   fMouseZoomInAction = mMouseAction->addAction << 547   fMousePickAction = mMouseAction->addAction("Pick", fSignalMapperMouse, SLOT(map()));
                                                   >> 548   fMouseZoomOutAction = mMouseAction->addAction("Zoom out", fSignalMapperMouse, SLOT(map()));
                                                   >> 549   fMouseZoomInAction = mMouseAction->addAction("Zoom in", fSignalMapperMouse, SLOT(map()));
                                                   >> 550 #else
                                                   >> 551   fMouseRotateAction = mMouseAction->addAction("Rotate", this, [=](){ this->toggleMouseAction(1); });
                                                   >> 552   fMouseMoveAction = mMouseAction->addAction("Move", this, [=](){ this->toggleMouseAction(2); });
                                                   >> 553   fMousePickAction = mMouseAction->addAction("Pick", this, [=](){ this->toggleMouseAction(3); });
                                                   >> 554   fMouseZoomOutAction = mMouseAction->addAction("Zoom out", this, [=](){ this->toggleMouseAction(4); });
                                                   >> 555   fMouseZoomInAction = mMouseAction->addAction("Zoom in", this, [=](){ this->toggleMouseAction(5); });
                                                   >> 556 #endif
543   QAction *shortcutsAction = mMouseAction->add    557   QAction *shortcutsAction = mMouseAction->addAction("Show shortcuts");
544                                                   558 
545   fMouseRotateAction->setCheckable(true);         559   fMouseRotateAction->setCheckable(true);
546   fMouseMoveAction->setCheckable(true);           560   fMouseMoveAction->setCheckable(true);
547   fMousePickAction->setCheckable(true);           561   fMousePickAction->setCheckable(true);
548   fMouseZoomOutAction->setCheckable(true);        562   fMouseZoomOutAction->setCheckable(true);
549   fMouseZoomInAction->setCheckable(true);         563   fMouseZoomInAction->setCheckable(true);
550   shortcutsAction->setCheckable(false);           564   shortcutsAction->setCheckable(false);
551                                                   565 
                                                   >> 566 #if QT_VERSION < 0x050600
                                                   >> 567   connect(fSignalMapperMouse, SIGNAL(mapped(int)),this, SLOT(toggleMouseAction(int)));
                                                   >> 568   fSignalMapperMouse->setMapping(fMouseRotateAction,1);
                                                   >> 569   fSignalMapperMouse->setMapping(fMouseMoveAction,2);
                                                   >> 570   fSignalMapperMouse->setMapping(fMousePickAction,3);
                                                   >> 571   fSignalMapperMouse->setMapping(fMouseZoomOutAction,4);
                                                   >> 572   fSignalMapperMouse->setMapping(fMouseZoomInAction,5);
                                                   >> 573 #endif
                                                   >> 574 
552   QObject::connect(shortcutsAction,               575   QObject::connect(shortcutsAction,
553                     SIGNAL(triggered(bool)),      576                     SIGNAL(triggered(bool)),
554                     this,                      << 577                     this, 
555                     SLOT(showShortcuts()));       578                     SLOT(showShortcuts()));
556                                                   579 
557   // === Style Menu ===                           580   // === Style Menu ===
558   QMenu *mStyle = fContextMenu->addMenu("&Styl    581   QMenu *mStyle = fContextMenu->addMenu("&Style");
559                                                   582 
560   QMenu *mProjection = mStyle->addMenu("&Proje    583   QMenu *mProjection = mStyle->addMenu("&Projection");
561                                                   584 
                                                   >> 585 #if QT_VERSION < 0x050600
                                                   >> 586   fProjectionOrtho = mProjection->addAction("Orthographic", fSignalMapperSurface, SLOT(map()));
                                                   >> 587   fProjectionPerspective = mProjection->addAction("Persepective", fSignalMapperSurface, SLOT(map()));
                                                   >> 588 
                                                   >> 589  // INIT mProjection
                                                   >> 590   if (fVP.GetFieldHalfAngle() == 0) {
                                                   >> 591     createRadioAction(fProjectionOrtho, fProjectionPerspective,SLOT(toggleProjection(bool)),1);
                                                   >> 592   } else {
                                                   >> 593     createRadioAction(fProjectionOrtho, fProjectionPerspective,SLOT(toggleProjection(bool)),2);
                                                   >> 594   }
                                                   >> 595 #else
562   // no more radioAction, not realy useful and    596   // no more radioAction, not realy useful and could be confusing to use context menu and icon at the same time
563   fProjectionOrtho = mProjection->addAction("O << 597   fProjectionOrtho = mProjection->addAction("Orthographic", this, [=](){ this->toggleProjection(1); });
564   fProjectionPerspective = mProjection->addAct << 598   fProjectionPerspective = mProjection->addAction("Persepective", this, [=](){ this->toggleProjection(2); });
                                                   >> 599 #endif
565   // === Drawing Menu ===                         600   // === Drawing Menu ===
566   QMenu *mDrawing = mStyle->addMenu("&Drawing"    601   QMenu *mDrawing = mStyle->addMenu("&Drawing");
567   fDrawingWireframe = mDrawing->addAction("Wir << 602 
568   fDrawingLineRemoval = mDrawing->addAction("H << 603 #if QT_VERSION < 0x050600
569   fDrawingSurfaceRemoval = mDrawing->addAction << 604   fDrawingWireframe = mDrawing->addAction("Wireframe", fSignalMapperSurface, SLOT(map()));
570   fDrawingLineSurfaceRemoval = mDrawing->addAc << 605 
                                                   >> 606   fDrawingLineRemoval = mDrawing->addAction("Hidden line removal", fSignalMapperSurface, SLOT(map()));
                                                   >> 607 
                                                   >> 608   fDrawingSurfaceRemoval = mDrawing->addAction("Hidden Surface removal", fSignalMapperSurface, SLOT(map()));
                                                   >> 609 
                                                   >> 610   fDrawingLineSurfaceRemoval = mDrawing->addAction("Hidden line and surface removal", fSignalMapperSurface, SLOT(map()));
                                                   >> 611 #endif
                                                   >> 612 
                                                   >> 613 #if QT_VERSION < 0x050600
                                                   >> 614   connect(fSignalMapperSurface, SIGNAL(mapped(int)),this, SLOT(toggleSurfaceAction(int)));
                                                   >> 615   fSignalMapperSurface->setMapping(fDrawingWireframe,1);
                                                   >> 616   fSignalMapperSurface->setMapping(fDrawingLineRemoval,2);
                                                   >> 617   fSignalMapperSurface->setMapping(fDrawingSurfaceRemoval,3);
                                                   >> 618   fSignalMapperSurface->setMapping(fDrawingLineSurfaceRemoval,4);
                                                   >> 619 #else
                                                   >> 620   fDrawingWireframe = mDrawing->addAction("Wireframe", this, [=](){ this->toggleSurfaceAction(1); });
                                                   >> 621   fDrawingLineRemoval = mDrawing->addAction("Hidden line removal", this, [=](){ this->toggleSurfaceAction(2); });
                                                   >> 622   fDrawingSurfaceRemoval = mDrawing->addAction("Hidden Surface removal", this, [=](){ this->toggleSurfaceAction(3); });
                                                   >> 623   fDrawingLineSurfaceRemoval = mDrawing->addAction("Hidden line and surface removal", this, [=](){ this->toggleSurfaceAction(4); });
                                                   >> 624 #endif
571                                                   625 
572   fDrawingWireframe->setCheckable(true);          626   fDrawingWireframe->setCheckable(true);
573   fDrawingLineRemoval->setCheckable(true);        627   fDrawingLineRemoval->setCheckable(true);
574   fDrawingSurfaceRemoval->setCheckable(true);     628   fDrawingSurfaceRemoval->setCheckable(true);
575   fDrawingLineSurfaceRemoval->setCheckable(tru    629   fDrawingLineSurfaceRemoval->setCheckable(true);
576                                                   630 
577   // Background Color                             631   // Background Color
578                                                   632 
579   QAction *backgroundColorChooser ;               633   QAction *backgroundColorChooser ;
580   // === Action Menu ===                          634   // === Action Menu ===
581   backgroundColorChooser = mStyle->addAction("    635   backgroundColorChooser = mStyle->addAction("Background color");
582   QObject ::connect(backgroundColorChooser,    << 636   QObject ::connect(backgroundColorChooser, 
583                     SIGNAL(triggered()),          637                     SIGNAL(triggered()),
584                     this,                         638                     this,
585                     SLOT(actionChangeBackgroun    639                     SLOT(actionChangeBackgroundColor()));
586                                                   640 
587   // Text Color                                   641   // Text Color
588                                                   642 
589   QAction *textColorChooser ;                     643   QAction *textColorChooser ;
590   // === Action Menu ===                          644   // === Action Menu ===
591   textColorChooser = mStyle->addAction("Text c    645   textColorChooser = mStyle->addAction("Text color");
592   QObject ::connect(textColorChooser,          << 646   QObject ::connect(textColorChooser, 
593                     SIGNAL(triggered()),          647                     SIGNAL(triggered()),
594                     this,                         648                     this,
595                     SLOT(actionChangeTextColor    649                     SLOT(actionChangeTextColor()));
596                                                   650 
597   // Default Color                                651   // Default Color
598                                                   652 
599   QAction *defaultColorChooser ;                  653   QAction *defaultColorChooser ;
600   // === Action Menu ===                          654   // === Action Menu ===
601   defaultColorChooser = mStyle->addAction("Def    655   defaultColorChooser = mStyle->addAction("Default color");
602   QObject ::connect(defaultColorChooser,       << 656   QObject ::connect(defaultColorChooser, 
603                     SIGNAL(triggered()),          657                     SIGNAL(triggered()),
604                     this,                         658                     this,
605                     SLOT(actionChangeDefaultCo    659                     SLOT(actionChangeDefaultColor()));
606                                                   660 
607                                                   661 
608   // === Action Menu ===                          662   // === Action Menu ===
609   QMenu *mActions = fContextMenu->addMenu("&Ac    663   QMenu *mActions = fContextMenu->addMenu("&Actions");
610   QAction *createEPS = mActions->addAction("Sa    664   QAction *createEPS = mActions->addAction("Save as ...");
611   QObject ::connect(createEPS,                 << 665   QObject ::connect(createEPS, 
612                     SIGNAL(triggered()),          666                     SIGNAL(triggered()),
613                     this,                         667                     this,
614                     SLOT(actionSaveImage()));     668                     SLOT(actionSaveImage()));
615                                                   669 
616   // === Action Menu ===                          670   // === Action Menu ===
617   QAction *movieParameters = mActions->addActi    671   QAction *movieParameters = mActions->addAction("Save as movie...");
618   QObject ::connect(movieParameters,           << 672   QObject ::connect(movieParameters, 
619                     SIGNAL(triggered()),          673                     SIGNAL(triggered()),
620                     this,                         674                     this,
621                     SLOT(actionMovieParameters    675                     SLOT(actionMovieParameters()));
622                                                   676 
623                                                   677 
624                                                   678 
625                                                   679 
626   // === Special Menu ===                         680   // === Special Menu ===
627   QMenu *mSpecial = fContextMenu->addMenu("S&p    681   QMenu *mSpecial = fContextMenu->addMenu("S&pecial");
628   QMenu *mTransparency = mSpecial->addMenu("Tr    682   QMenu *mTransparency = mSpecial->addMenu("Transparency");
629   QAction *transparencyOn = mTransparency->add    683   QAction *transparencyOn = mTransparency->addAction("On");
630   QAction *transparencyOff = mTransparency->ad    684   QAction *transparencyOff = mTransparency->addAction("Off");
631                                                   685 
632   if (transparency_enabled == false) {            686   if (transparency_enabled == false) {
633     createRadioAction(transparencyOn,transpare    687     createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(bool)),2);
634   } else if (transparency_enabled == true) {      688   } else if (transparency_enabled == true) {
635     createRadioAction(transparencyOn,transpare    689     createRadioAction(transparencyOn,transparencyOff,SLOT(toggleTransparency(bool)),1);
636   } else {                                        690   } else {
637     mSpecial->clear();                            691     mSpecial->clear();
638   }                                               692   }
639                                                   693 
640                                                   694 
641   QMenu *mAntialiasing = mSpecial->addMenu("An    695   QMenu *mAntialiasing = mSpecial->addMenu("Antialiasing");
642   QAction *antialiasingOn = mAntialiasing->add    696   QAction *antialiasingOn = mAntialiasing->addAction("On");
643   QAction *antialiasingOff = mAntialiasing->ad    697   QAction *antialiasingOff = mAntialiasing->addAction("Off");
644                                                   698 
645   if (antialiasing_enabled == false) {            699   if (antialiasing_enabled == false) {
646     createRadioAction(antialiasingOn,antialias    700     createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(bool)),2);
647   } else if (antialiasing_enabled == true) {      701   } else if (antialiasing_enabled == true) {
648     createRadioAction(antialiasingOn,antialias    702     createRadioAction(antialiasingOn,antialiasingOff,SLOT(toggleAntialiasing(bool)),1);
649   } else {                                        703   } else {
650     mAntialiasing->clear();                       704     mAntialiasing->clear();
651   }                                               705   }
652                                                   706 
653   QMenu *mHaloing = mSpecial->addMenu("Haloing    707   QMenu *mHaloing = mSpecial->addMenu("Haloing");
654   QAction *haloingOn = mHaloing->addAction("On    708   QAction *haloingOn = mHaloing->addAction("On");
655   QAction *haloingOff = mHaloing->addAction("O    709   QAction *haloingOff = mHaloing->addAction("Off");
656   if (haloing_enabled == false) {                 710   if (haloing_enabled == false) {
657     createRadioAction(haloingOn,haloingOff,SLO    711     createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(bool)),2);
658   } else if (haloing_enabled == true) {           712   } else if (haloing_enabled == true) {
659     createRadioAction(haloingOn,haloingOff,SLO    713     createRadioAction(haloingOn,haloingOff,SLOT(toggleHaloing(bool)),1);
660   } else {                                        714   } else {
661     mHaloing->clear();                            715     mHaloing->clear();
662   }                                               716   }
663                                                   717 
664   QMenu *mAux = mSpecial->addMenu("Auxiliary e    718   QMenu *mAux = mSpecial->addMenu("Auxiliary edges");
665   QAction *auxOn = mAux->addAction("On");         719   QAction *auxOn = mAux->addAction("On");
666   QAction *auxOff = mAux->addAction("Off");       720   QAction *auxOff = mAux->addAction("Off");
667   if (!fVP.IsAuxEdgeVisible()) {                  721   if (!fVP.IsAuxEdgeVisible()) {
668     createRadioAction(auxOn,auxOff,SLOT(toggle    722     createRadioAction(auxOn,auxOff,SLOT(toggleAux(bool)),2);
669   } else {                                        723   } else {
670     createRadioAction(auxOn,auxOff,SLOT(toggle    724     createRadioAction(auxOn,auxOff,SLOT(toggleAux(bool)),1);
671   }                                               725   }
672                                                   726 
673                                                   727 
674   QMenu *mHiddenMarkers = mSpecial->addMenu("H    728   QMenu *mHiddenMarkers = mSpecial->addMenu("Hidden markers");
675   QAction *hiddenMarkersOn = mHiddenMarkers->a    729   QAction *hiddenMarkersOn = mHiddenMarkers->addAction("On");
676   QAction *hiddenMarkersOff = mHiddenMarkers->    730   QAction *hiddenMarkersOff = mHiddenMarkers->addAction("Off");
677   if (fVP.IsMarkerNotHidden()) {                  731   if (fVP.IsMarkerNotHidden()) {
678     createRadioAction(hiddenMarkersOn,hiddenMa    732     createRadioAction(hiddenMarkersOn,hiddenMarkersOff,SLOT(toggleHiddenMarkers(bool)),2);
679   } else {                                        733   } else {
680     createRadioAction(hiddenMarkersOn,hiddenMa    734     createRadioAction(hiddenMarkersOn,hiddenMarkersOff,SLOT(toggleHiddenMarkers(bool)),1);
681   }                                               735   }
682                                                   736 
683                                                   737 
684                                                   738 
685   QMenu *mFullScreen = mSpecial->addMenu("&Ful    739   QMenu *mFullScreen = mSpecial->addMenu("&Full screen");
686   fFullScreenOn = mFullScreen->addAction("On")    740   fFullScreenOn = mFullScreen->addAction("On");
687   fFullScreenOff = mFullScreen->addAction("Off    741   fFullScreenOff = mFullScreen->addAction("Off");
688   createRadioAction(fFullScreenOn,fFullScreenO    742   createRadioAction(fFullScreenOn,fFullScreenOff,SLOT(toggleFullScreen(bool)),2);
689                                                   743 
690   // INIT All                                     744   // INIT All
691   updateToolbarAndMouseContextMenu();             745   updateToolbarAndMouseContextMenu();
692 }                                                 746 }
693                                                   747 
694 void G4OpenGLQtViewer::G4manageContextMenuEven    748 void G4OpenGLQtViewer::G4manageContextMenuEvent(QContextMenuEvent *e)
695 {                                                 749 {
696   if (!fGLWidget) {                               750   if (!fGLWidget) {
697     G4cerr << "Visualization window not define    751     G4cerr << "Visualization window not defined, please choose one before" << G4endl;
698   } else {                                        752   } else {
699                                                << 753   
700     if (!fContextMenu)                         << 754     if (!fContextMenu) 
701       createPopupMenu();                          755       createPopupMenu();
702                                                << 756     
703     // launch menu                                757     // launch menu
704     if ( fContextMenu ) {                         758     if ( fContextMenu ) {
705       fContextMenu->exec( e->globalPos() );       759       fContextMenu->exec( e->globalPos() );
706       //    delete fContextMenu;                  760       //    delete fContextMenu;
707     }                                             761     }
708   }                                               762   }
709   e->accept();                                    763   e->accept();
710 }                                                 764 }
711                                                   765 
712                                                   766 
713 /**                                               767 /**
714    Create a radio button menu. The two menu wi    768    Create a radio button menu. The two menu will be connected. When click on one,
715    eatch state will be invert and callback met    769    eatch state will be invert and callback method will be called.
716    @param action1 first action to connect         770    @param action1 first action to connect
717    @param action2 second action to connect        771    @param action2 second action to connect
718    @param method callback method                  772    @param method callback method
719    @param nCheck: 1 : first action will be set    773    @param nCheck: 1 : first action will be set true. 2 : second action will be set true
720 */                                                774 */
721 void G4OpenGLQtViewer::createRadioAction(QActi    775 void G4OpenGLQtViewer::createRadioAction(QAction *action1,QAction *action2, const std::string& method,unsigned int nCheck) {
722                                                   776 
723   action1->setCheckable(true);                    777   action1->setCheckable(true);
724   action2->setCheckable(true);                    778   action2->setCheckable(true);
725                                                   779 
726   if (nCheck ==1)                                 780   if (nCheck ==1)
727     action1->setChecked (true);                   781     action1->setChecked (true);
728   else                                            782   else
729     action2->setChecked (true);                   783     action2->setChecked (true);
730                                                << 784    
731   QObject ::connect(action1, SIGNAL(triggered(    785   QObject ::connect(action1, SIGNAL(triggered(bool)),action2, SLOT(toggle()));
732   QObject ::connect(action2, SIGNAL(triggered(    786   QObject ::connect(action2, SIGNAL(triggered(bool)),action1, SLOT(toggle()));
733                                                   787 
734   QObject ::connect(action1, SIGNAL(toggled(bo    788   QObject ::connect(action1, SIGNAL(toggled(bool)),this, method.c_str());
735                                                   789 
736 }                                                 790 }
737                                                   791 
738                                                   792 
739                                                   793 
740 /**                                               794 /**
741    Show shortcuts for this mouse action           795    Show shortcuts for this mouse action
742 */                                                796 */
743 void G4OpenGLQtViewer::showShortcuts() {          797 void G4OpenGLQtViewer::showShortcuts() {
744   G4String text;                                  798   G4String text;
745                                                   799 
746   text = "========= Mouse Shortcuts =========\    800   text = "========= Mouse Shortcuts =========\n";
747   if (fUiQt != NULL) {                            801   if (fUiQt != NULL) {
748     if (fUiQt->IsIconRotateSelected()) {  // r    802     if (fUiQt->IsIconRotateSelected()) {  // rotate
749       text += "Click and move mouse to rotate     803       text += "Click and move mouse to rotate volume \n";
750       text += "ALT + Click and move mouse to r    804       text += "ALT + Click and move mouse to rotate volume (Toggle View/Theta-Phi Direction) \n";
751       text += "CTRL + Click and move mouse to     805       text += "CTRL + Click and move mouse to zoom in/out \n";
752       text += "SHIFT + Click and move mouse to    806       text += "SHIFT + Click and move mouse to change camera point of view \n";
753     } else  if (fUiQt->IsIconMoveSelected()) {    807     } else  if (fUiQt->IsIconMoveSelected()) { //move
754       text += "Move camera point of view with     808       text += "Move camera point of view with mouse \n";
755     } else  if (fUiQt->IsIconPickSelected()) {    809     } else  if (fUiQt->IsIconPickSelected()) { //pick
756       text += "Click and pick \n";                810       text += "Click and pick \n";
757     }                                             811     }
758   } else {                                        812   } else {
759     text += "Click and move mouse to rotate vo    813     text += "Click and move mouse to rotate volume \n";
760     text += "ALT + Click and move mouse to rot    814     text += "ALT + Click and move mouse to rotate volume (Toggle View/Theta-Phi Direction) \n";
761     text += "CTRL + Click and zoom mouse to zo    815     text += "CTRL + Click and zoom mouse to zoom in/out \n";
762     text += "SHIFT + Click and zoommove camera    816     text += "SHIFT + Click and zoommove camera point of view \n";
763   }                                               817   }
764   text += "========= Move Shortcuts =========     818   text += "========= Move Shortcuts ========= \n";
765   text += "Press left/right arrows to move vol    819   text += "Press left/right arrows to move volume left/right \n";
766   text += "Press up/down arrows to move volume    820   text += "Press up/down arrows to move volume up/down \n";
767   text += "Press '+'/'-' to move volume toward    821   text += "Press '+'/'-' to move volume toward/forward \n";
768   text += "\n";                                   822   text += "\n";
769   text += "========= Rotation (Theta/Phi) Shor    823   text += "========= Rotation (Theta/Phi) Shortcuts ========= \n";
770   text += "Press SHIFT + left/right arrows to     824   text += "Press SHIFT + left/right arrows to rotate volume left/right \n";
771   text += "Press SHIFT + up/down arrows to rot    825   text += "Press SHIFT + up/down arrows to rotate volume up/down \n";
772   text += "\n";                                   826   text += "\n";
773   text += "========= Rotation (View Direction)    827   text += "========= Rotation (View Direction) Shortcuts ========= \n";
774   text += "Press ALT + left/right to rotate vo    828   text += "Press ALT + left/right to rotate volume around vertical direction \n";
775   text += "Press ALT + up/down to rotate volum    829   text += "Press ALT + up/down to rotate volume around horizontal direction \n";
776   text += "\n";                                   830   text += "\n";
777   text += "========= Zoom View ========= \n";     831   text += "========= Zoom View ========= \n";
778   text += "Press CTRL + '+'/'-' to zoom into v    832   text += "Press CTRL + '+'/'-' to zoom into volume \n";
779   text += "\n";                                   833   text += "\n";
780   text += "========= Misc ========= \n";          834   text += "========= Misc ========= \n";
781   text += "Press ALT +/- to slow/speed rotatio    835   text += "Press ALT +/- to slow/speed rotation/move \n";
782   text += "Press H to reset view \n";             836   text += "Press H to reset view \n";
783   text += "Press Esc to exit FullScreen \n";      837   text += "Press Esc to exit FullScreen \n";
784   text += "\n";                                   838   text += "\n";
785   text += "========= Video ========= \n";         839   text += "========= Video ========= \n";
786   text += "In video mode : \n";                   840   text += "In video mode : \n";
787   text += " Press SPACE to Start/Pause video r    841   text += " Press SPACE to Start/Pause video recording \n";
788   text += " Press RETURN to Stop video recordi    842   text += " Press RETURN to Stop video recording \n";
789   text += "\n";                                   843   text += "\n";
790                                                   844 
791   G4cout << text;                                 845   G4cout << text;
792                                                   846 
793   if (  fShortcutsDialog == NULL) {               847   if (  fShortcutsDialog == NULL) {
794     fShortcutsDialog = new QDialog();             848     fShortcutsDialog = new QDialog();
795     fShortcutsDialogInfos = new QTextEdit() ;     849     fShortcutsDialogInfos = new QTextEdit() ;
796     QVBoxLayout *mainLayout = new QVBoxLayout;    850     QVBoxLayout *mainLayout = new QVBoxLayout;
797     mainLayout->addWidget(fShortcutsDialogInfo    851     mainLayout->addWidget(fShortcutsDialogInfos);
798     fShortcutsDialog->setLayout(mainLayout);      852     fShortcutsDialog->setLayout(mainLayout);
799     fShortcutsDialog->setWindowTitle(tr("Short    853     fShortcutsDialog->setWindowTitle(tr("Shortcuts"));
800   }                                               854   }
801                                                << 855   
802   fShortcutsDialogInfos->setPlainText(text.dat    856   fShortcutsDialogInfos->setPlainText(text.data());
803   fShortcutsDialog->show();                    << 857   fShortcutsDialog->show();      
804 }                                                 858 }
805                                                   859 
806                                                   860 
807                                                   861 
808 /**                                               862 /**
809    Slot activated when mouse action is toggle     863    Slot activated when mouse action is toggle
810    @param aAction : 1 rotate, 2 move, 3 pick,     864    @param aAction : 1 rotate, 2 move, 3 pick, 4 zoom out, 5 zoom in
811    @see G4OpenGLStoredQtViewer::DrawView          865    @see G4OpenGLStoredQtViewer::DrawView
812    @see G4XXXStoredViewer::CompareForKernelVis    866    @see G4XXXStoredViewer::CompareForKernelVisit
813 */                                                867 */
814 void G4OpenGLQtViewer::toggleMouseAction(int a    868 void G4OpenGLQtViewer::toggleMouseAction(int aAction) {
815                                                   869 
816   if (aAction == 1) {                             870   if (aAction == 1) {
817     fUiQt->SetIconRotateSelected();               871     fUiQt->SetIconRotateSelected();
818   } else  if (aAction == 2) {                     872   } else  if (aAction == 2) {
819     fUiQt->SetIconMoveSelected();                 873     fUiQt->SetIconMoveSelected();
820   } else  if (aAction == 3) {                     874   } else  if (aAction == 3) {
821     togglePicking();                              875     togglePicking();
822   } else  if (aAction == 4) {                     876   } else  if (aAction == 4) {
823     fUiQt->SetIconZoomOutSelected();              877     fUiQt->SetIconZoomOutSelected();
824   } else  if (aAction == 5) {                     878   } else  if (aAction == 5) {
825     fUiQt->SetIconZoomInSelected();               879     fUiQt->SetIconZoomInSelected();
826   }                                               880   }
827                                                   881 
828   updateQWidget();                                882   updateQWidget();
829   updateToolbarAndMouseContextMenu();             883   updateToolbarAndMouseContextMenu();
830 }                                                 884 }
831                                                   885 
832                                                   886 
833 /**                                               887 /**
834    Slot activated when drawing menu is toggle     888    Slot activated when drawing menu is toggle
835    Warning : When G4OpenGLStoredQtViewer::Draw    889    Warning : When G4OpenGLStoredQtViewer::DrawView() method call,
836    KernelVisitDecision () will be call and wil    890    KernelVisitDecision () will be call and will set the fNeedKernelVisit
837    to 1. See G4XXXStoredViewer::CompareForKern    891    to 1. See G4XXXStoredViewer::CompareForKernelVisit for explanations.
838    It will cause a redraw of the view             892    It will cause a redraw of the view
839    @param aAction : 1 wireframe, 2 line remova    893    @param aAction : 1 wireframe, 2 line removal, 3 surface removal, 4 line & surface removal
840    @see G4OpenGLStoredQtViewer::DrawView          894    @see G4OpenGLStoredQtViewer::DrawView
841    @see G4XXXStoredViewer::CompareForKernelVis    895    @see G4XXXStoredViewer::CompareForKernelVisit
842 */                                                896 */
843 void G4OpenGLQtViewer::toggleSurfaceAction(int    897 void G4OpenGLQtViewer::toggleSurfaceAction(int aAction) {
844                                                   898 
845   G4ViewParameters::DrawingStyle d_style = G4V    899   G4ViewParameters::DrawingStyle d_style = G4ViewParameters::wireframe;
846                                                << 900   
847   if (aAction ==1) {                              901   if (aAction ==1) {
848     d_style = G4ViewParameters::wireframe;        902     d_style = G4ViewParameters::wireframe;
849                                                   903 
850   } else  if (aAction ==2) {                      904   } else  if (aAction ==2) {
851     d_style = G4ViewParameters::hlr;              905     d_style = G4ViewParameters::hlr;
852                                                   906 
853   } else  if (aAction ==3) {                      907   } else  if (aAction ==3) {
854     d_style = G4ViewParameters::hsr;              908     d_style = G4ViewParameters::hsr;
855                                                   909 
856   } else  if (aAction ==4) {                      910   } else  if (aAction ==4) {
857     d_style = G4ViewParameters::hlhsr;            911     d_style = G4ViewParameters::hlhsr;
858   }                                               912   }
859   fVP.SetDrawingStyle(d_style);                   913   fVP.SetDrawingStyle(d_style);
860                                                   914 
861   updateToolbarAndMouseContextMenu();             915   updateToolbarAndMouseContextMenu();
862   updateQWidget();                                916   updateQWidget();
863 }                                                 917 }
864                                                   918 
865                                                   919 
866 /**                                               920 /**
867    SLOT Activate by a click on the projection     921    SLOT Activate by a click on the projection menu
868    Warning : When G4OpenGLStoredQtViewer::Draw    922    Warning : When G4OpenGLStoredQtViewer::DrawView() method call,
869    KernelVisitDecision () will be call and wil    923    KernelVisitDecision () will be call and will set the fNeedKernelVisit
870    to 1. See G4XXXStoredViewer::CompareForKern    924    to 1. See G4XXXStoredViewer::CompareForKernelVisit for explanations.
871    It will cause a redraw of the view             925    It will cause a redraw of the view
872    @param check : 1 orthographic, 2 perspectiv    926    @param check : 1 orthographic, 2 perspective
873    @see G4OpenGLStoredQtViewer::DrawView          927    @see G4OpenGLStoredQtViewer::DrawView
874    @see G4XXXStoredViewer::CompareForKernelVis    928    @see G4XXXStoredViewer::CompareForKernelVisit
875 */                                                929 */
876 void G4OpenGLQtViewer::toggleProjection(bool c    930 void G4OpenGLQtViewer::toggleProjection(bool check) {
877                                                   931 
878   if (check) {                                 << 932   if (check == 1) {
879     fVP.SetOrthogonalProjection ();               933     fVP.SetOrthogonalProjection ();
880   } else {                                        934   } else {
881     fVP.SetPerspectiveProjection();               935     fVP.SetPerspectiveProjection();
882   }                                            << 936   }  
883   updateToolbarAndMouseContextMenu();             937   updateToolbarAndMouseContextMenu();
884   updateQWidget();                                938   updateQWidget();
885 }                                                 939 }
886                                                   940 
887                                                   941 
888 /**                                               942 /**
889    SLOT Activate by a click on the transparenc    943    SLOT Activate by a click on the transparency menu
890    @param check : 1 , 0                           944    @param check : 1 , 0
891 */                                                945 */
892 void G4OpenGLQtViewer::toggleTransparency(bool    946 void G4OpenGLQtViewer::toggleTransparency(bool check) {
893                                                << 947   
894   if (check) {                                    948   if (check) {
895     transparency_enabled = true;                  949     transparency_enabled = true;
896   } else {                                        950   } else {
897     transparency_enabled = false;                 951     transparency_enabled = false;
898   }                                               952   }
899   SetNeedKernelVisit (true);                      953   SetNeedKernelVisit (true);
900   updateToolbarAndMouseContextMenu();             954   updateToolbarAndMouseContextMenu();
901   updateQWidget();                                955   updateQWidget();
902 }                                                 956 }
903                                                   957 
904 /**                                               958 /**
905    SLOT Activate by a click on the antialiasin    959    SLOT Activate by a click on the antialiasing menu
906    @param check : 1 , 0                           960    @param check : 1 , 0
907 */                                                961 */
908 void G4OpenGLQtViewer::toggleAntialiasing(bool    962 void G4OpenGLQtViewer::toggleAntialiasing(bool check) {
909                                                   963 
910   if (!check) {                                   964   if (!check) {
911     antialiasing_enabled = false;                 965     antialiasing_enabled = false;
912     glDisable (GL_LINE_SMOOTH);                   966     glDisable (GL_LINE_SMOOTH);
913     glDisable (GL_POLYGON_SMOOTH);                967     glDisable (GL_POLYGON_SMOOTH);
914   } else {                                        968   } else {
915     antialiasing_enabled = true;                  969     antialiasing_enabled = true;
916     glEnable (GL_LINE_SMOOTH);                    970     glEnable (GL_LINE_SMOOTH);
917     glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);      971     glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
918     glEnable (GL_POLYGON_SMOOTH);                 972     glEnable (GL_POLYGON_SMOOTH);
919     glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST)    973     glHint (GL_POLYGON_SMOOTH_HINT, GL_NICEST);
920   }                                               974   }
921                                                   975 
922   updateToolbarAndMouseContextMenu();             976   updateToolbarAndMouseContextMenu();
923   updateQWidget();                                977   updateQWidget();
924 }                                                 978 }
925                                                   979 
926 /**                                               980 /**
927    SLOT Activate by a click on the haloing men    981    SLOT Activate by a click on the haloing menu
928    @param check : 1 , 0                           982    @param check : 1 , 0
929 */                                                983 */
930 //FIXME : I SEE NOTHING...                        984 //FIXME : I SEE NOTHING...
931 void G4OpenGLQtViewer::toggleHaloing(bool chec    985 void G4OpenGLQtViewer::toggleHaloing(bool check) {
932   if (check) {                                    986   if (check) {
933     haloing_enabled = false;                      987     haloing_enabled = false;
934   } else {                                        988   } else {
935     haloing_enabled = true;                       989     haloing_enabled = true;
936   }                                               990   }
937                                                   991 
938   updateToolbarAndMouseContextMenu();             992   updateToolbarAndMouseContextMenu();
939   updateQWidget();                                993   updateQWidget();
940                                                   994 
941 }                                                 995 }
942                                                   996 
943 /**                                               997 /**
944    SLOT Activate by a click on the auxiliaire     998    SLOT Activate by a click on the auxiliaire edges menu
945    @param check : 1 , 0                           999    @param check : 1 , 0
946 */                                                1000 */
947 void G4OpenGLQtViewer::toggleAux(bool check) {    1001 void G4OpenGLQtViewer::toggleAux(bool check) {
948   if (check) {                                    1002   if (check) {
949     fVP.SetAuxEdgeVisible(true);                  1003     fVP.SetAuxEdgeVisible(true);
950   } else {                                        1004   } else {
951     fVP.SetAuxEdgeVisible(false);                 1005     fVP.SetAuxEdgeVisible(false);
952   }                                               1006   }
953   SetNeedKernelVisit (true);                      1007   SetNeedKernelVisit (true);
954   updateToolbarAndMouseContextMenu();             1008   updateToolbarAndMouseContextMenu();
955   updateQWidget();                                1009   updateQWidget();
956 }                                                 1010 }
957                                                   1011 
958                                                   1012 
959 void G4OpenGLQtViewer::togglePicking() {          1013 void G4OpenGLQtViewer::togglePicking() {
960   // FIXME : Not the good way to do, we should    1014   // FIXME : Not the good way to do, we should handle the multiple cases of Icon/ContextMenu and CheckBox in a better way
961   if (fUiQt) {                                    1015   if (fUiQt) {
962     if (!fVP.IsPicking()) {                       1016     if (!fVP.IsPicking()) {
963       fUiQt->SetIconPickSelected();               1017       fUiQt->SetIconPickSelected();
964     } else {                                      1018     } else {
965       fUiQt->SetIconRotateSelected();             1019       fUiQt->SetIconRotateSelected();
966     }                                             1020     }
967   }                                               1021   }
968                                                << 1022   
969   G4UImanager* UI = G4UImanager::GetUIpointer(    1023   G4UImanager* UI = G4UImanager::GetUIpointer();
970   if(UI != NULL)  {                               1024   if(UI != NULL)  {
971     if (!fVP.IsPicking()) {                       1025     if (!fVP.IsPicking()) {
972       UI->ApplyCommand(std::string("/vis/viewe    1026       UI->ApplyCommand(std::string("/vis/viewer/set/picking true"));
973     } else {                                      1027     } else {
974       UI->ApplyCommand(std::string("/vis/viewe    1028       UI->ApplyCommand(std::string("/vis/viewer/set/picking false"));
975     }                                             1029     }
976   }                                               1030   }
977                                                   1031 
978 }                                                 1032 }
979                                                   1033 
980                                                   1034 
981 /**                                               1035 /**
982    SLOT Activate by a click on the hidden mark    1036    SLOT Activate by a click on the hidden marker menu
983    @param check : 1 , 0                           1037    @param check : 1 , 0
984 */                                                1038 */
985 void G4OpenGLQtViewer::toggleHiddenMarkers(boo    1039 void G4OpenGLQtViewer::toggleHiddenMarkers(bool check) {
986   if (check) {                                    1040   if (check) {
987     fVP.SetMarkerHidden();                        1041     fVP.SetMarkerHidden();
988   } else {                                        1042   } else {
989     fVP.SetMarkerNotHidden();                     1043     fVP.SetMarkerNotHidden();
990   }                                               1044   }
991   //  SetNeedKernelVisit (true);                  1045   //  SetNeedKernelVisit (true);
992   updateToolbarAndMouseContextMenu();             1046   updateToolbarAndMouseContextMenu();
993   updateQWidget();                                1047   updateQWidget();
994 }                                                 1048 }
995                                                   1049 
996 /**                                               1050 /**
997    SLOT Activate by a click on the full screen    1051    SLOT Activate by a click on the full screen menu
998 */                                                1052 */
999 void G4OpenGLQtViewer::toggleFullScreen(bool c    1053 void G4OpenGLQtViewer::toggleFullScreen(bool check) {
1000   if (check != fGLWidget->isFullScreen()) { /    1054   if (check != fGLWidget->isFullScreen()) { //toggle
1001     fGLWidget->setWindowState(fGLWidget->wind    1055     fGLWidget->setWindowState(fGLWidget->windowState() ^ Qt::WindowFullScreen);
1002   }                                              1056   }
1003 }                                                1057 }
1004                                                  1058 
1005                                                  1059 
1006 void G4OpenGLQtViewer::savePPMToTemp() {         1060 void G4OpenGLQtViewer::savePPMToTemp() {
1007   if (fMovieTempFolderPath == "") {              1061   if (fMovieTempFolderPath == "") {
1008     return;                                      1062     return;
1009   }                                              1063   }
1010   auto qGLW = dynamic_cast<G4QGLWidgetType*>  << 1064   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
1011   if (! qGLW) {                                  1065   if (! qGLW) {
1012     return;                                      1066     return;
1013   }                                              1067   }
1014   QString fileName ="Test"+QString::number(fR    1068   QString fileName ="Test"+QString::number(fRecordFrameNumber)+".ppm";
1015   QString filePath =fMovieTempFolderPath+file    1069   QString filePath =fMovieTempFolderPath+fileName;
1016                                                  1070 
1017   QImage image;                                  1071   QImage image;
1018 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))  << 
1019   image = qGLW->grabFrameBuffer();               1072   image = qGLW->grabFrameBuffer();
1020 #else                                         << 
1021   image = qGLW->grabFramebuffer();            << 
1022 #endif                                        << 
1023   bool res = false;                              1073   bool res = false;
1024                                               << 1074   
1025   res = image.save(filePath,0);                  1075   res = image.save(filePath,0);
1026   if (res == false) {                         << 1076   if (res == false) { 
1027     resetRecording();                            1077     resetRecording();
1028     setRecordingInfos("Can't save tmp file "+    1078     setRecordingInfos("Can't save tmp file "+filePath);
1029     return;                                      1079     return;
1030   }                                              1080   }
1031                                               << 1081   
1032   setRecordingInfos("File "+fileName+" saved"    1082   setRecordingInfos("File "+fileName+" saved");
1033   fRecordFrameNumber++;                          1083   fRecordFrameNumber++;
1034 }                                                1084 }
1035                                                  1085 
1036                                                  1086 
1037                                                  1087 
1038 void G4OpenGLQtViewer::actionSaveImage() {       1088 void G4OpenGLQtViewer::actionSaveImage() {
1039   QString filters;                               1089   QString filters;
1040   for (unsigned int i = 0; i < fExportImageFo    1090   for (unsigned int i = 0; i < fExportImageFormatVector.size(); ++i) {
1041     filters += QString("*.") + fExportImageFo    1091     filters += QString("*.") + fExportImageFormatVector.at(i).c_str() + ";;";
1042   }                                              1092   }
1043                                                  1093 
1044   QString* selectedFormat = new QString(fDefa    1094   QString* selectedFormat = new QString(fDefaultExportImageFormat.c_str());
1045   QString qFilename;                             1095   QString qFilename;
1046   qFilename =  QFileDialog::getSaveFileName (    1096   qFilename =  QFileDialog::getSaveFileName ( fGLWidget,
1047                                          tr("    1097                                          tr("Save as ..."),
1048                                          fFil    1098                                          fFileSavePath,
1049                                          filt    1099                                          filters,
1050                                          sele    1100                                          selectedFormat );
1051                                                  1101 
1052                                               << 1102   
1053   std::string name = qFilename.toStdString().    1103   std::string name = qFilename.toStdString().c_str();
1054                                                  1104 
1055   // bmp jpg jpeg png ppm xbm xpm                1105   // bmp jpg jpeg png ppm xbm xpm
1056   if (name.empty()) {                            1106   if (name.empty()) {
1057     return;                                      1107     return;
1058   }                                              1108   }
1059                                                  1109 
1060   fFileSavePath = QFileInfo(qFilename).path()    1110   fFileSavePath = QFileInfo(qFilename).path();
1061                                               << 1111   
1062   std::string format = selectedFormat->toLowe    1112   std::string format = selectedFormat->toLower().toStdString().c_str();
1063                                               << 1113   
1064   // set the format to current                   1114   // set the format to current
1065   fExportImageFormat = format.substr(format.f    1115   fExportImageFormat = format.substr(format.find_last_of(".") + 1);
1066                                                  1116 
1067   std::string filename = name;                   1117   std::string filename = name;
1068   std::string extension = "";                    1118   std::string extension = "";
1069   if (name.find_last_of(".") != std::string::    1119   if (name.find_last_of(".") != std::string::npos) {
1070     filename = name.substr(0,name.find_last_o    1120     filename = name.substr(0,name.find_last_of(".") + 1);
1071     extension = name.substr(name.find_last_of    1121     extension = name.substr(name.find_last_of(".") + 1);
1072   } else {                                       1122   } else {
1073     extension = fExportImageFormat;              1123     extension = fExportImageFormat;
1074   }                                              1124   }
1075                                               << 1125   
1076   filename+= "."+ extension;                     1126   filename+= "."+ extension;
1077                                               << 1127   
1078   if (!setExportFilename(filename.c_str(),0))    1128   if (!setExportFilename(filename.c_str(),0)) {
1079     return;                                      1129     return;
1080   }                                              1130   }
1081                                               << 1131   
1082   G4OpenGLQtExportDialog* exportDialog= new G    1132   G4OpenGLQtExportDialog* exportDialog= new G4OpenGLQtExportDialog(fGLWidget,format.c_str(),fGLWidget->height(),fGLWidget->width());
1083   if(  exportDialog->exec()) {                   1133   if(  exportDialog->exec()) {
1084                                                  1134 
1085     if ((exportDialog->getWidth() !=fGLWidget    1135     if ((exportDialog->getWidth() !=fGLWidget->width()) ||
1086         (exportDialog->getHeight() !=fGLWidge    1136         (exportDialog->getHeight() !=fGLWidget->height())) {
1087       setExportSize(exportDialog->getWidth(),    1137       setExportSize(exportDialog->getWidth(),exportDialog->getHeight());
1088                                               << 1138       
1089     }                                            1139     }
1090     if (fExportImageFormat == "eps") {           1140     if (fExportImageFormat == "eps") {
1091       fVectoredPs = exportDialog->getVectorEP    1141       fVectoredPs = exportDialog->getVectorEPS();
1092     } else if (fExportImageFormat == "ps") {     1142     } else if (fExportImageFormat == "ps") {
1093       fVectoredPs = true;                        1143       fVectoredPs = true;
1094     }                                            1144     }
1095     fLastExportSliderValue = exportDialog->ge    1145     fLastExportSliderValue = exportDialog->getSliderValue();
1096                                                  1146 
1097     if (exportImage(filename)) {                 1147     if (exportImage(filename)) {
1098       // set the default format to current       1148       // set the default format to current
1099       fDefaultExportImageFormat = format;        1149       fDefaultExportImageFormat = format;
1100     }                                            1150     }
1101   } else { // cancel selected                    1151   } else { // cancel selected
1102     return;                                      1152     return;
1103   }                                              1153   }
1104                                               << 1154   
1105 }                                                1155 }
1106                                                  1156 
1107                                                  1157 
1108 void G4OpenGLQtViewer::actionChangeBackground    1158 void G4OpenGLQtViewer::actionChangeBackgroundColor() {
1109                                                  1159 
1110   //   //I need to revisit the kernel if the     1160   //   //I need to revisit the kernel if the background colour changes and
1111   //   //hidden line removal is enabled, beca    1161   //   //hidden line removal is enabled, because hlr drawing utilises the
1112   //   //background colour in its drawing...     1162   //   //background colour in its drawing...
1113   //   // (Note added by JA 13/9/2005) Backgr    1163   //   // (Note added by JA 13/9/2005) Background now handled in view
1114   //   // parameters.  A kernel visit is trig    1164   //   // parameters.  A kernel visit is triggered on change of background.
                                                   >> 1165 
                                                   >> 1166 #if QT_VERSION < 0x040500
                                                   >> 1167   bool a;
                                                   >> 1168   const QColor color = QColor(QColorDialog::getRgba (QColor(Qt::black).rgba(),&a,fGLWidget));
                                                   >> 1169 #else
1115   const QColor color =                           1170   const QColor color =
1116     QColorDialog::getColor(Qt::black,            1171     QColorDialog::getColor(Qt::black,
1117                            fGLWidget,            1172                            fGLWidget,
1118                            " Get background c    1173                            " Get background color and transparency",
1119                            QColorDialog::Show    1174                            QColorDialog::ShowAlphaChannel);
                                                   >> 1175 #endif
1120   if (color.isValid()) {                         1176   if (color.isValid()) {
1121     G4Colour colour(((G4double)color.red())/2    1177     G4Colour colour(((G4double)color.red())/255,
1122                     ((G4double)color.green())    1178                     ((G4double)color.green())/255,
1123                     ((G4double)color.blue())/    1179                     ((G4double)color.blue())/255,
1124                     ((G4double)color.alpha())    1180                     ((G4double)color.alpha())/255);
1125     fVP.SetBackgroundColour(colour);             1181     fVP.SetBackgroundColour(colour);
1126                                                  1182 
1127     updateToolbarAndMouseContextMenu();          1183     updateToolbarAndMouseContextMenu();
1128     updateQWidget();                             1184     updateQWidget();
1129   }                                              1185   }
1130 }                                                1186 }
1131                                                  1187 
1132 void G4OpenGLQtViewer::actionChangeTextColor(    1188 void G4OpenGLQtViewer::actionChangeTextColor() {
                                                   >> 1189 
                                                   >> 1190 #if QT_VERSION < 0x040500
                                                   >> 1191   bool a;
                                                   >> 1192   const QColor color = QColor(QColorDialog::getRgba (QColor(Qt::yellow).rgba(),&a,fGLWidget));
                                                   >> 1193 #else
1133   const QColor& color =                          1194   const QColor& color =
1134     QColorDialog::getColor(Qt::yellow,           1195     QColorDialog::getColor(Qt::yellow,
1135                            fGLWidget,            1196                            fGLWidget,
1136                            " Get text color a    1197                            " Get text color and transparency",
1137                            QColorDialog::Show    1198                            QColorDialog::ShowAlphaChannel);
                                                   >> 1199 #endif
1138   if (color.isValid()) {                         1200   if (color.isValid()) {
1139     G4Colour colour(((G4double)color.red())/2    1201     G4Colour colour(((G4double)color.red())/255,
1140                     ((G4double)color.green())    1202                     ((G4double)color.green())/255,
1141                     ((G4double)color.blue())/    1203                     ((G4double)color.blue())/255,
1142                     ((G4double)color.alpha())    1204                     ((G4double)color.alpha())/255);
1143                                                  1205 
1144     fVP.SetDefaultTextColour(colour);            1206     fVP.SetDefaultTextColour(colour);
1145                                                  1207 
1146     updateToolbarAndMouseContextMenu();          1208     updateToolbarAndMouseContextMenu();
1147     updateQWidget();                             1209     updateQWidget();
1148   }                                              1210   }
1149 }                                                1211 }
1150                                                  1212 
1151 void G4OpenGLQtViewer::actionChangeDefaultCol    1213 void G4OpenGLQtViewer::actionChangeDefaultColor() {
                                                   >> 1214 
                                                   >> 1215 #if QT_VERSION < 0x040500
                                                   >> 1216   bool a;
                                                   >> 1217   const QColor color = QColor(QColorDialog::getRgba (QColor(Qt::white).rgba(),&a,fGLWidget));
                                                   >> 1218 #else
1152   const QColor& color =                          1219   const QColor& color =
1153     QColorDialog::getColor(Qt::white,            1220     QColorDialog::getColor(Qt::white,
1154                            fGLWidget,            1221                            fGLWidget,
1155                            " Get default colo    1222                            " Get default color and transparency",
1156                            QColorDialog::Show    1223                            QColorDialog::ShowAlphaChannel);
                                                   >> 1224 #endif
1157   if (color.isValid()) {                         1225   if (color.isValid()) {
1158     G4Colour colour(((G4double)color.red())/2    1226     G4Colour colour(((G4double)color.red())/255,
1159                     ((G4double)color.green())    1227                     ((G4double)color.green())/255,
1160                     ((G4double)color.blue())/    1228                     ((G4double)color.blue())/255,
1161                     ((G4double)color.alpha())    1229                     ((G4double)color.alpha())/255);
1162                                                  1230 
1163     fVP.SetDefaultColour(colour);                1231     fVP.SetDefaultColour(colour);
1164                                                  1232 
1165     updateToolbarAndMouseContextMenu();          1233     updateToolbarAndMouseContextMenu();
1166     updateQWidget();                             1234     updateQWidget();
1167   }                                              1235   }
1168 }                                                1236 }
1169                                                  1237 
1170                                                  1238 
1171 void G4OpenGLQtViewer::actionMovieParameters(    1239 void G4OpenGLQtViewer::actionMovieParameters() {
1172   showMovieParametersDialog();                   1240   showMovieParametersDialog();
1173 }                                                1241 }
1174                                                  1242 
1175                                                  1243 
1176 void G4OpenGLQtViewer::showMovieParametersDia    1244 void G4OpenGLQtViewer::showMovieParametersDialog() {
1177   if (!fMovieParametersDialog) {                 1245   if (!fMovieParametersDialog) {
1178     fMovieParametersDialog= new G4OpenGLQtMov    1246     fMovieParametersDialog= new G4OpenGLQtMovieDialog(this,fGLWidget);
1179     displayRecordingStatus();                    1247     displayRecordingStatus();
1180     fMovieParametersDialog->checkEncoderSwPar    1248     fMovieParametersDialog->checkEncoderSwParameters();
1181     fMovieParametersDialog->checkSaveFileName    1249     fMovieParametersDialog->checkSaveFileNameParameters();
1182     fMovieParametersDialog->checkTempFolderPa    1250     fMovieParametersDialog->checkTempFolderParameters();
1183     if (getEncoderPath() == "") {                1251     if (getEncoderPath() == "") {
1184       setRecordingInfos("ppmtompeg is needed     1252       setRecordingInfos("ppmtompeg is needed to encode in video format. It is available here: http://netpbm.sourceforge.net ");
1185     }                                            1253     }
1186   }                                              1254   }
1187   fMovieParametersDialog->show();                1255   fMovieParametersDialog->show();
1188 }                                                1256 }
1189                                                  1257 
1190                                                  1258 
1191                                                  1259 
1192 void G4OpenGLQtViewer::FinishView()              1260 void G4OpenGLQtViewer::FinishView()
1193 {                                                1261 {
1194  /* From Apple doc:                           << 1262  /* From Apple doc: 
1195   CGLFlushDrawable : Copies the back buffer o    1263   CGLFlushDrawable : Copies the back buffer of a double-buffered context to the front buffer.
1196   If the backing store attribute is set to fa    1264   If the backing store attribute is set to false, the buffers can be exchanged rather than copied
1197  */                                              1265  */
1198   glFlush ();                                    1266   glFlush ();
1199                                                  1267 
1200   // L. Garnier 10/2009 : Not necessary and c    1268   // L. Garnier 10/2009 : Not necessary and cause problems on mac OS X 10.6
1201   //  fGLWidget->swapBuffers ();                 1269   //  fGLWidget->swapBuffers ();
1202 }                                                1270 }
1203                                                  1271 
1204 /**                                              1272 /**
1205    Save the current mouse press point            1273    Save the current mouse press point
1206    @param p mouse click point                    1274    @param p mouse click point
1207 */                                               1275 */
1208 void G4OpenGLQtViewer::G4MousePressEvent(QMou    1276 void G4OpenGLQtViewer::G4MousePressEvent(QMouseEvent *evnt)
1209 {                                                1277 {
1210   if (evnt->button() == Qt::RightButton) {       1278   if (evnt->button() == Qt::RightButton) {
1211     return;                                      1279     return;
1212   }                                              1280   }
1213   if ((evnt->button() & Qt::LeftButton) && (!    1281   if ((evnt->button() & Qt::LeftButton) && (! (evnt->modifiers() & Qt::ControlModifier ))){
1214     fGLWidget->setMouseTracking(true);           1282     fGLWidget->setMouseTracking(true);
1215     fAutoMove = false; // stop automove          1283     fAutoMove = false; // stop automove
1216     fLastPos1 = evnt->pos();                     1284     fLastPos1 = evnt->pos();
1217     fLastPos2 = fLastPos1;                       1285     fLastPos2 = fLastPos1;
1218     fLastPos3 = fLastPos2;                       1286     fLastPos3 = fLastPos2;
1219     fLastEventTime->start();                     1287     fLastEventTime->start();
1220     if (fUiQt != NULL) {                         1288     if (fUiQt != NULL) {
1221                                                  1289 
1222       if (fUiQt->IsIconZoomInSelected()) {  /    1290       if (fUiQt->IsIconZoomInSelected()) {  // zoomIn
1223         // Move click point to center of OGL     1291         // Move click point to center of OGL
1224                                                  1292 
1225         float deltaX = ((float)getWinWidth()/    1293         float deltaX = ((float)getWinWidth()/2-evnt->pos().x());
1226         float deltaY = ((float)getWinHeight()    1294         float deltaY = ((float)getWinHeight()/2-evnt->pos().y());
1227                                                  1295 
1228         G4double coefTrans = 0;                  1296         G4double coefTrans = 0;
1229         coefTrans = ((G4double)getSceneNearWi    1297         coefTrans = ((G4double)getSceneNearWidth())/((G4double)getWinWidth());
1230         if (getWinHeight() <getWinWidth()) {     1298         if (getWinHeight() <getWinWidth()) {
1231           coefTrans = ((G4double)getSceneNear    1299           coefTrans = ((G4double)getSceneNearWidth())/((G4double)getWinHeight());
1232         }                                        1300         }
1233         fVP.IncrementPan(-deltaX*coefTrans,de    1301         fVP.IncrementPan(-deltaX*coefTrans,deltaY*coefTrans,0);
1234         fVP.SetZoomFactor(1.5 * fVP.GetZoomFa    1302         fVP.SetZoomFactor(1.5 * fVP.GetZoomFactor());
1235                                               << 1303   
1236         updateQWidget();                         1304         updateQWidget();
1237                                               << 1305         
1238       } else if (fUiQt->IsIconZoomOutSelected    1306       } else if (fUiQt->IsIconZoomOutSelected()) {  // zoomOut
1239         // Move click point to center of OGL     1307         // Move click point to center of OGL
1240         moveScene(((float)getWinWidth()/2-evn    1308         moveScene(((float)getWinWidth()/2-evnt->pos().x()),((float)getWinHeight()/2-evnt->pos().y()),0,true);
1241                                                  1309 
1242         fVP.SetZoomFactor(0.75 * fVP.GetZoomF    1310         fVP.SetZoomFactor(0.75 * fVP.GetZoomFactor());
1243         updateQWidget();                         1311         updateQWidget();
1244                                                  1312 
1245       } else if (fUiQt->IsIconRotateSelected(    1313       } else if (fUiQt->IsIconRotateSelected() ) {
1246                                               << 1314  
1247         if (fShiftKeyPress) { // move            1315         if (fShiftKeyPress) { // move
1248           fGLWidget->setCursor(QCursor(Qt::Si    1316           fGLWidget->setCursor(QCursor(Qt::SizeAllCursor));
1249                                                  1317 
1250         } else {  // rotate                      1318         } else {  // rotate
1251           fGLWidget->setCursor(QCursor(Qt::Cl    1319           fGLWidget->setCursor(QCursor(Qt::ClosedHandCursor));
1252         }                                        1320         }
1253       } else if (fUiQt->IsIconMoveSelected())    1321       } else if (fUiQt->IsIconMoveSelected()) {
1254         fGLWidget->setCursor(QCursor(Qt::Size    1322         fGLWidget->setCursor(QCursor(Qt::SizeAllCursor));
1255       } else if (fUiQt->IsIconPickSelected())    1323       } else if (fUiQt->IsIconPickSelected()) {
1256         fGLWidget->setCursor(QCursor(Qt::Poin    1324         fGLWidget->setCursor(QCursor(Qt::PointingHandCursor));
1257       }                                          1325       }
1258     }                                            1326     }
1259   }                                              1327   }
1260 }                                                1328 }
1261                                                  1329 
1262 /**                                              1330 /**
1263  */                                              1331  */
1264 void G4OpenGLQtViewer::G4MouseReleaseEvent(QM    1332 void G4OpenGLQtViewer::G4MouseReleaseEvent(QMouseEvent *evnt)
1265 {                                                1333 {
1266 #if QT_VERSION < 0x060000                     << 
1267 #else                                         << 
1268  {auto* qGLW = dynamic_cast<G4QGLWidgetType*> << 
1269   if (qGLW) qGLW->makeCurrent();}             << 
1270   ResizeGLView();                             << 
1271 #endif                                        << 
1272   GLint viewport[4];                             1334   GLint viewport[4];
1273   glGetIntegerv(GL_VIEWPORT, viewport);          1335   glGetIntegerv(GL_VIEWPORT, viewport);
1274                                                  1336 
1275   // factorX == factorY                          1337   // factorX == factorY
1276   double factorX =  ((double)viewport[2]/fGLW    1338   double factorX =  ((double)viewport[2]/fGLWidget->width());
1277   double factorY =  ((double)viewport[3]/fGLW    1339   double factorY =  ((double)viewport[3]/fGLWidget->height());
1278   fSpinningDelay = (int)fLastEventTime->elaps << 1340   fSpinningDelay = fLastEventTime->elapsed();
1279   QPoint delta = (fLastPos3-fLastPos1)*factor    1341   QPoint delta = (fLastPos3-fLastPos1)*factorX;
1280                                                  1342 
1281   // reset cursor state                          1343   // reset cursor state
1282   fGLWidget->setCursor(QCursor(Qt::ArrowCurso    1344   fGLWidget->setCursor(QCursor(Qt::ArrowCursor));
1283                                               << 1345   
1284   if (fVP.IsPicking()){  // pick                 1346   if (fVP.IsPicking()){  // pick
1285     if ((delta.x() != 0) || (delta.y() != 0))    1347     if ((delta.x() != 0) || (delta.y() != 0)) {
1286       return;                                    1348       return;
1287     }                                            1349     }
1288     updatePickInfosWidget(evnt->pos().x()*fac    1350     updatePickInfosWidget(evnt->pos().x()*factorX,evnt->pos().y()*factorY);
1289                                                  1351 
1290   } else if (fSpinningDelay < fLaunchSpinDela    1352   } else if (fSpinningDelay < fLaunchSpinDelay ) {
1291     if ((delta.x() == 0) && (delta.y() == 0))    1353     if ((delta.x() == 0) && (delta.y() == 0)) {
1292       return;                                    1354       return;
1293     }                                            1355     }
1294                                                  1356 
1295     fAutoMove = true;                            1357     fAutoMove = true;
1296 #if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) << 
1297     QTime lastMoveTime;                          1358     QTime lastMoveTime;
1298 #else                                         << 
1299     QElapsedTimer lastMoveTime;               << 
1300 #endif                                        << 
1301     lastMoveTime.start();                        1359     lastMoveTime.start();
1302     // try to addapt speed move/rotate lookin    1360     // try to addapt speed move/rotate looking to drawing speed
1303     float correctionFactor = 5;                  1361     float correctionFactor = 5;
1304     while (fAutoMove) {                          1362     while (fAutoMove) {
1305       if ( lastMoveTime.elapsed() >= (int)(10    1363       if ( lastMoveTime.elapsed() >= (int)(1000/fNbMaxFramesPerSec)) {
1306         float lTime = 1000.0f/lastMoveTime.el << 1364         float lTime = 1000/lastMoveTime.elapsed();
1307         if (((((float)delta.x())/correctionFa    1365         if (((((float)delta.x())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
1308             ((((float)delta.x())/correctionFa    1366             ((((float)delta.x())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
1309           correctionFactor = (float)delta.x()    1367           correctionFactor = (float)delta.x()*(lTime/fNbMaxAnglePerSec);
1310           if (delta.x() <0 ) {                   1368           if (delta.x() <0 ) {
1311             correctionFactor = -correctionFac    1369             correctionFactor = -correctionFactor;
1312           }                                      1370           }
1313         }                                        1371         }
1314         if (((((float)delta.y())/correctionFa    1372         if (((((float)delta.y())/correctionFactor)*lTime > fNbMaxAnglePerSec) ||
1315             ((((float)delta.y())/correctionFa    1373             ((((float)delta.y())/correctionFactor)*lTime < -fNbMaxAnglePerSec) ) {
1316           correctionFactor = (float)delta.y()    1374           correctionFactor = (float)delta.y()*(lTime/fNbMaxAnglePerSec);
1317           if (delta.y() <0 ) {                   1375           if (delta.y() <0 ) {
1318             correctionFactor = -correctionFac    1376             correctionFactor = -correctionFactor;
1319           }                                      1377           }
1320         }                                        1378         }
1321                                               << 1379                 
1322         // Check Qt Versions for META Keys       1380         // Check Qt Versions for META Keys
1323                                               << 1381                 
1324         // Click and move mouse to rotate vol    1382         // Click and move mouse to rotate volume
1325         // ALT + Click and move mouse to rota    1383         // ALT + Click and move mouse to rotate volume (View Direction)
1326         // SHIFT + Click and move camera poin    1384         // SHIFT + Click and move camera point of view
1327         // CTRL + Click and zoom mouse to zoo    1385         // CTRL + Click and zoom mouse to zoom in/out
1328                                                  1386 
1329         lastMoveTime.start();                    1387         lastMoveTime.start();
1330                                                  1388 
1331         bool rotate = false;                     1389         bool rotate = false;
1332         bool move = false;                       1390         bool move = false;
1333                                                  1391 
1334         if (fUiQt != NULL) {                     1392         if (fUiQt != NULL) {
1335           if (fUiQt->IsIconRotateSelected())     1393           if (fUiQt->IsIconRotateSelected()) {  // rotate
1336             rotate = true;                       1394             rotate = true;
1337           } else if (fUiQt->IsIconMoveSelecte    1395           } else if (fUiQt->IsIconMoveSelected()) {  // move
1338             move = true;                         1396             move = true;
1339           }                                      1397           }
1340         } else {                                 1398         } else {
1341           rotate = true;                         1399           rotate = true;
1342         }                                        1400         }
1343         // prevent from closing widget when r    1401         // prevent from closing widget when rotating (cause a crash)
1344         if (fIsDeleting) {                       1402         if (fIsDeleting) {
1345           return;                                1403           return;
1346         }                                        1404         }
1347                                               << 1405         
1348         if (rotate) {  // rotate                 1406         if (rotate) {  // rotate
1349           if (fNoKeyPress) {                     1407           if (fNoKeyPress) {
1350             rotateQtScene(((float)delta.x())/    1408             rotateQtScene(((float)delta.x())/correctionFactor,((float)delta.y())/correctionFactor);
1351           } else if (fAltKeyPress) {             1409           } else if (fAltKeyPress) {
1352             rotateQtSceneToggle(((float)delta    1410             rotateQtSceneToggle(((float)delta.x())/correctionFactor,((float)delta.y())/correctionFactor);
1353           }                                      1411           }
1354                                               << 1412           
1355         } else if (move) {  // move              1413         } else if (move) {  // move
1356           moveScene(-((float)delta.x())/corre    1414           moveScene(-((float)delta.x())/correctionFactor,-((float)delta.y())/correctionFactor,0,true);
1357         }                                        1415         }
1358       }                                          1416       }
1359       ((QApplication*)G4Qt::getInstance ())->    1417       ((QApplication*)G4Qt::getInstance ())->processEvents();
1360     }                                            1418     }
1361   }                                              1419   }
1362   fGLWidget->setMouseTracking(false);            1420   fGLWidget->setMouseTracking(false);
1363                                                  1421 
1364 }                                                1422 }
1365                                                  1423 
1366                                                  1424 
1367 void G4OpenGLQtViewer::G4MouseDoubleClickEven    1425 void G4OpenGLQtViewer::G4MouseDoubleClickEvent()
1368 {                                                1426 {
1369   fGLWidget->setMouseTracking(true);             1427   fGLWidget->setMouseTracking(true);
1370 }                                                1428 }
1371                                                  1429 
1372                                                  1430 
1373 /**                                              1431 /**
1374    @param pos_x mouse x position                 1432    @param pos_x mouse x position
1375    @param pos_y mouse y position                 1433    @param pos_y mouse y position
1376    @param mButtons mouse button active           1434    @param mButtons mouse button active
1377    @param mAutoMove true: apply this move til    1435    @param mAutoMove true: apply this move till another evnt came, false :one time move
1378 */                                               1436 */
1379                                                  1437 
1380 void G4OpenGLQtViewer::G4MouseMoveEvent(QMous    1438 void G4OpenGLQtViewer::G4MouseMoveEvent(QMouseEvent *evnt)
1381 {                                                1439 {
1382                                                  1440 
1383   Qt::MouseButtons mButtons = evnt->buttons()    1441   Qt::MouseButtons mButtons = evnt->buttons();
1384                                                  1442 
1385   updateKeyModifierState(evnt->modifiers());     1443   updateKeyModifierState(evnt->modifiers());
1386                                                  1444 
1387   if (fAutoMove) {                               1445   if (fAutoMove) {
1388     return;                                      1446     return;
1389   }                                              1447   }
1390                                                  1448 
1391   fLastPos3 = fLastPos2;                         1449   fLastPos3 = fLastPos2;
1392   fLastPos2 = fLastPos1;                         1450   fLastPos2 = fLastPos1;
1393                                               << 
1394 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))  << 
1395   fLastPos1 = QPoint(evnt->x(), evnt->y());      1451   fLastPos1 = QPoint(evnt->x(), evnt->y());
1396 #else                                         << 
1397   fLastPos1 = QPoint(evnt->position().x(), ev << 
1398 #endif                                        << 
1399                                                  1452 
1400   int deltaX = fLastPos2.x()-fLastPos1.x();      1453   int deltaX = fLastPos2.x()-fLastPos1.x();
1401   int deltaY = fLastPos2.y()-fLastPos1.y();      1454   int deltaY = fLastPos2.y()-fLastPos1.y();
1402                                                  1455 
1403   bool move = false;                             1456   bool move = false;
1404   if (fUiQt != NULL) {                           1457   if (fUiQt != NULL) {
1405     if (fUiQt->IsIconMoveSelected()) {  // mo    1458     if (fUiQt->IsIconMoveSelected()) {  // move
1406       move = true;                               1459       move = true;
1407     }                                            1460     }
1408   }                                              1461   }
1409   if (!move) {  // rotate, pick, zoom...         1462   if (!move) {  // rotate, pick, zoom...
1410     if (mButtons & Qt::LeftButton) {             1463     if (mButtons & Qt::LeftButton) {
1411       if (fNoKeyPress) {                         1464       if (fNoKeyPress) {
1412         rotateQtScene(((float)deltaX),((float    1465         rotateQtScene(((float)deltaX),((float)deltaY));
1413       } else if (fAltKeyPress) {                 1466       } else if (fAltKeyPress) {
1414         rotateQtSceneToggle(((float)deltaX),(    1467         rotateQtSceneToggle(((float)deltaX),((float)deltaY));
1415       } else if (fShiftKeyPress) {               1468       } else if (fShiftKeyPress) {
1416         unsigned int sizeWin;                    1469         unsigned int sizeWin;
1417         sizeWin = getWinWidth();                 1470         sizeWin = getWinWidth();
1418         if (getWinHeight() < getWinWidth()) {    1471         if (getWinHeight() < getWinWidth()) {
1419           sizeWin = getWinHeight();              1472           sizeWin = getWinHeight();
1420         }                                        1473         }
1421                                                  1474 
1422         // L.Garnier : 08/2010 100 is the goo    1475         // L.Garnier : 08/2010 100 is the good value, but don't ask me why !
1423         float factor = ((float)100/(float)siz    1476         float factor = ((float)100/(float)sizeWin) ;
1424         moveScene(-(float)deltaX*factor,-(flo    1477         moveScene(-(float)deltaX*factor,-(float)deltaY*factor,0,false);
1425       } else if (fControlKeyPress) {             1478       } else if (fControlKeyPress) {
1426         fVP.SetZoomFactor(fVP.GetZoomFactor() << 1479         fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+((float)deltaY))); 
1427       }                                          1480       }
1428     }                                            1481     }
1429   } else if (move) {  // move                    1482   } else if (move) {  // move
1430     if (mButtons & Qt::LeftButton) {             1483     if (mButtons & Qt::LeftButton) {
1431       moveScene(-(float)deltaX,-(float)deltaY    1484       moveScene(-(float)deltaX,-(float)deltaY,0,true);
1432     }                                            1485     }
1433   }                                              1486   }
1434                                                  1487 
1435   fLastEventTime->start();                       1488   fLastEventTime->start();
1436 }                                                1489 }
1437                                                  1490 
1438                                                  1491 
1439 /**                                              1492 /**
1440    Move the scene of dx, dy, dz values.          1493    Move the scene of dx, dy, dz values.
1441    @param dx delta mouse x position              1494    @param dx delta mouse x position
1442    @param dy delta mouse y position              1495    @param dy delta mouse y position
1443    @param mouseMove : true if event comes fro    1496    @param mouseMove : true if event comes from a mouse move, false if event comes from key action
1444 */                                               1497 */
1445                                                  1498 
1446 void G4OpenGLQtViewer::moveScene(float dx,flo    1499 void G4OpenGLQtViewer::moveScene(float dx,float dy, float dz,bool mouseMove)
1447 {                                                1500 {
1448   if (fHoldMoveEvent)                            1501   if (fHoldMoveEvent)
1449     return;                                      1502     return;
1450   fHoldMoveEvent = true;                         1503   fHoldMoveEvent = true;
1451                                                  1504 
1452   G4double coefTrans = 0;                        1505   G4double coefTrans = 0;
1453   GLdouble coefDepth = 0;                        1506   GLdouble coefDepth = 0;
1454   if(mouseMove) {                                1507   if(mouseMove) {
1455     coefTrans = ((G4double)getSceneNearWidth(    1508     coefTrans = ((G4double)getSceneNearWidth())/((G4double)getWinWidth());
1456     if (getWinHeight() <getWinWidth()) {         1509     if (getWinHeight() <getWinWidth()) {
1457       coefTrans = ((G4double)getSceneNearWidt    1510       coefTrans = ((G4double)getSceneNearWidth())/((G4double)getWinHeight());
1458     }                                            1511     }
1459   } else {                                       1512   } else {
1460     coefTrans = getSceneNearWidth()*fPan_sens    1513     coefTrans = getSceneNearWidth()*fPan_sens;
1461     coefDepth = getSceneDepth()*fDeltaDepth;     1514     coefDepth = getSceneDepth()*fDeltaDepth;
1462   }                                              1515   }
1463   fVP.IncrementPan(-dx*coefTrans,dy*coefTrans    1516   fVP.IncrementPan(-dx*coefTrans,dy*coefTrans,dz*coefDepth);
1464                                               << 1517   
1465   updateQWidget();                               1518   updateQWidget();
1466   if (fAutoMove)                                 1519   if (fAutoMove)
1467     ((QApplication*)G4Qt::getInstance ())->pr    1520     ((QApplication*)G4Qt::getInstance ())->processEvents();
1468                                               << 1521   
1469   fHoldMoveEvent = false;                        1522   fHoldMoveEvent = false;
1470 }                                                1523 }
1471                                                  1524 
1472                                                  1525 
1473 /**                                              1526 /**
1474    @param dx delta mouse x position              1527    @param dx delta mouse x position
1475    @param dy delta mouse y position              1528    @param dy delta mouse y position
1476 */                                               1529 */
1477                                                  1530 
1478 void G4OpenGLQtViewer::rotateQtScene(float dx    1531 void G4OpenGLQtViewer::rotateQtScene(float dx, float dy)
1479 {                                                1532 {
1480   if (fHoldRotateEvent)                          1533   if (fHoldRotateEvent)
1481     return;                                      1534     return;
1482   fHoldRotateEvent = true;                       1535   fHoldRotateEvent = true;
1483                                               << 1536   
1484   rotateScene(dx,dy);                            1537   rotateScene(dx,dy);
1485                                                  1538 
1486   updateQWidget();                               1539   updateQWidget();
1487                                               << 1540   
1488   fHoldRotateEvent = false;                      1541   fHoldRotateEvent = false;
1489 }                                                1542 }
1490                                                  1543 
1491 /**                                              1544 /**
1492    @param dx delta mouse x position              1545    @param dx delta mouse x position
1493    @param dy delta mouse y position              1546    @param dy delta mouse y position
1494 */                                               1547 */
1495                                                  1548 
1496 void G4OpenGLQtViewer::rotateQtSceneToggle(fl    1549 void G4OpenGLQtViewer::rotateQtSceneToggle(float dx, float dy)
1497 {                                                1550 {
1498   if (fHoldRotateEvent)                          1551   if (fHoldRotateEvent)
1499     return;                                      1552     return;
1500   fHoldRotateEvent = true;                       1553   fHoldRotateEvent = true;
1501                                               << 1554   
1502   rotateSceneToggle(dx,dy);                      1555   rotateSceneToggle(dx,dy);
1503                                                  1556 
1504   updateQWidget();                               1557   updateQWidget();
1505                                               << 1558   
1506   fHoldRotateEvent = false;                      1559   fHoldRotateEvent = false;
1507 }                                                1560 }
1508                                                  1561 
1509                                                  1562 
1510                                                  1563 
1511                                                  1564 
1512                                                  1565 
1513 /** This is the benning of a rescale function    1566 /** This is the benning of a rescale function. It does nothing for the moment
1514     @param aWidth : new width                    1567     @param aWidth : new width
1515     @param aHeight : new height                  1568     @param aHeight : new height
1516 */                                               1569 */
1517 void G4OpenGLQtViewer::rescaleImage(             1570 void G4OpenGLQtViewer::rescaleImage(
1518  int /* aWidth */                                1571  int /* aWidth */
1519 ,int /* aHeight */                               1572 ,int /* aHeight */
1520 ){                                               1573 ){
1521   //  GLfloat* feedback_buffer;                  1574   //  GLfloat* feedback_buffer;
1522   //  GLint returned;                            1575   //  GLint returned;
1523   //  FILE* file;                                1576   //  FILE* file;
1524                                               << 1577   
1525   //   feedback_buffer = new GLfloat[size];      1578   //   feedback_buffer = new GLfloat[size];
1526   //   glFeedbackBuffer (size, GL_3D_COLOR, f    1579   //   glFeedbackBuffer (size, GL_3D_COLOR, feedback_buffer);
1527   //   glRenderMode (GL_FEEDBACK);               1580   //   glRenderMode (GL_FEEDBACK);
1528                                               << 1581   
1529   //   DrawView();                               1582   //   DrawView();
1530   //   returned = glRenderMode (GL_RENDER);      1583   //   returned = glRenderMode (GL_RENDER);
1531                                                  1584 
1532 }                                                1585 }
1533                                                  1586 
1534                                                  1587 
1535                                                  1588 
1536                                                  1589 
1537 void G4OpenGLQtViewer::G4wheelEvent (QWheelEv << 1590 void G4OpenGLQtViewer::G4wheelEvent (QWheelEvent * evnt) 
1538 {                                                1591 {
1539 #if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0)) << 1592   fVP.SetZoomFactor(fVP.GetZoomFactor()+(fVP.GetZoomFactor()*(evnt->delta())/1200)); 
1540   fVP.SetZoomFactor(fVP.GetZoomFactor()+(fVP. << 
1541 #else                                         << 
1542   fVP.SetZoomFactor(fVP.GetZoomFactor()+(fVP. << 
1543 #endif                                        << 
1544   updateQWidget();                               1593   updateQWidget();
1545 }                                                1594 }
1546                                                  1595 
1547                                                  1596 
1548 void G4OpenGLQtViewer::G4keyPressEvent (QKeyE << 1597 void G4OpenGLQtViewer::G4keyPressEvent (QKeyEvent * evnt) 
1549 {                                                1598 {
1550   if (fHoldKeyEvent)                             1599   if (fHoldKeyEvent)
1551     return;                                      1600     return;
1552                                                  1601 
1553   fHoldKeyEvent = true;                          1602   fHoldKeyEvent = true;
1554                                                  1603 
1555                                               << 1604   
1556   // with no modifiers                           1605   // with no modifiers
1557   updateKeyModifierState(evnt->modifiers());     1606   updateKeyModifierState(evnt->modifiers());
1558   if ((fNoKeyPress) || (evnt->modifiers() ==     1607   if ((fNoKeyPress) || (evnt->modifiers() == Qt::KeypadModifier )) {
1559     if (evnt->key() == Qt::Key_Down) { // go     1608     if (evnt->key() == Qt::Key_Down) { // go down
1560       moveScene(0,1,0,false);                    1609       moveScene(0,1,0,false);
1561     }                                            1610     }
1562     else if (evnt->key() == Qt::Key_Up) {  //    1611     else if (evnt->key() == Qt::Key_Up) {  // go up
1563       moveScene(0,-1,0,false);                   1612       moveScene(0,-1,0,false);
1564     }                                            1613     }
1565     if (evnt->key() == Qt::Key_Left) { // go     1614     if (evnt->key() == Qt::Key_Left) { // go left
1566       moveScene(-1,0,0,false);                   1615       moveScene(-1,0,0,false);
1567     }                                            1616     }
1568     else if (evnt->key() == Qt::Key_Right) {     1617     else if (evnt->key() == Qt::Key_Right) { // go right
1569       moveScene(1,0,0,false);                    1618       moveScene(1,0,0,false);
1570     }                                            1619     }
1571     if (evnt->key() == Qt::Key_Minus) { // go    1620     if (evnt->key() == Qt::Key_Minus) { // go backward
1572       moveScene(0,0,1,false);                    1621       moveScene(0,0,1,false);
1573     }                                            1622     }
1574     else if (evnt->key() == Qt::Key_Plus) { /    1623     else if (evnt->key() == Qt::Key_Plus) { // go forward
1575       moveScene(0,0,-1,false);                   1624       moveScene(0,0,-1,false);
1576     }                                            1625     }
1577     // escaped from full screen                  1626     // escaped from full screen
1578     if (evnt->key() == Qt::Key_Escape) {         1627     if (evnt->key() == Qt::Key_Escape) {
1579       toggleFullScreen(false);                   1628       toggleFullScreen(false);
1580     }                                            1629     }
1581   }                                           << 1630   }    
1582   // several case here : If return is pressed    1631   // several case here : If return is pressed, in every case -> display the movie parameters dialog
1583   // If one parameter is wrong -> put it in r    1632   // If one parameter is wrong -> put it in red (only save filenam could be wrong..)
1584   // If encoder not found-> does nothing.Only    1633   // If encoder not found-> does nothing.Only display a message in status box
1585   // If all ok-> generate parameter file         1634   // If all ok-> generate parameter file
1586   // If ok -> put encoder button enabled         1635   // If ok -> put encoder button enabled
1587                                               << 1636   
1588   if ((evnt->key() == Qt::Key_Return) || (evn    1637   if ((evnt->key() == Qt::Key_Return) || (evnt->key() == Qt::Key_Enter)){ // end of video
1589     stopVideo();                                 1638     stopVideo();
1590   }                                              1639   }
1591   if (evnt->key() == Qt::Key_Space){ // start    1640   if (evnt->key() == Qt::Key_Space){ // start/pause of video
1592     startPauseVideo();                           1641     startPauseVideo();
1593   }                                              1642   }
1594                                               << 1643   
1595   // H : Return Home view                        1644   // H : Return Home view
1596   if (evnt->key() == Qt::Key_H){ // go Home      1645   if (evnt->key() == Qt::Key_H){ // go Home
1597     ResetView();                                 1646     ResetView();
1598                                                  1647 
1599     updateQWidget();                             1648     updateQWidget();
1600   }                                              1649   }
1601                                                  1650 
1602   // Shift Modifier                              1651   // Shift Modifier
1603   if (fShiftKeyPress) {                          1652   if (fShiftKeyPress) {
1604     fGLWidget->setCursor(QCursor(Qt::SizeAllC    1653     fGLWidget->setCursor(QCursor(Qt::SizeAllCursor));
1605                                                  1654 
1606     if (evnt->key() == Qt::Key_Down) { // rot    1655     if (evnt->key() == Qt::Key_Down) { // rotate phi
1607       rotateQtScene(0,-fRot_sens);               1656       rotateQtScene(0,-fRot_sens);
1608     }                                            1657     }
1609     else if (evnt->key() == Qt::Key_Up) { //     1658     else if (evnt->key() == Qt::Key_Up) { // rotate phi
1610       rotateQtScene(0,fRot_sens);                1659       rotateQtScene(0,fRot_sens);
1611     }                                            1660     }
1612     if (evnt->key() == Qt::Key_Left) { // rot    1661     if (evnt->key() == Qt::Key_Left) { // rotate theta
1613       rotateQtScene(fRot_sens,0);                1662       rotateQtScene(fRot_sens,0);
1614     }                                            1663     }
1615     else if (evnt->key() == Qt::Key_Right) {     1664     else if (evnt->key() == Qt::Key_Right) { // rotate theta
1616       rotateQtScene(-fRot_sens,0);               1665       rotateQtScene(-fRot_sens,0);
1617     }                                            1666     }
1618     if (evnt->key() == Qt::Key_Plus) { // go  << 1667     if (evnt->key() == Qt::Key_Plus) { // go forward  ("Plus" imply 
1619       // "Shift" on Mac French keyboard          1668       // "Shift" on Mac French keyboard
1620       moveScene(0,0,-1,false);                   1669       moveScene(0,0,-1,false);
1621     }                                            1670     }
1622                                                  1671 
1623     // Alt Modifier                              1672     // Alt Modifier
1624   }                                              1673   }
1625   if ((fAltKeyPress)) {                          1674   if ((fAltKeyPress)) {
1626     fGLWidget->setCursor(QCursor(Qt::ClosedHa    1675     fGLWidget->setCursor(QCursor(Qt::ClosedHandCursor));
1627                                                  1676 
1628     if (evnt->key() == Qt::Key_Down) { // rot    1677     if (evnt->key() == Qt::Key_Down) { // rotate phi
1629       rotateQtSceneToggle(0,-fRot_sens);         1678       rotateQtSceneToggle(0,-fRot_sens);
1630     }                                            1679     }
1631     else if (evnt->key() == Qt::Key_Up) { //     1680     else if (evnt->key() == Qt::Key_Up) { // rotate phi
1632       rotateQtSceneToggle(0,fRot_sens);          1681       rotateQtSceneToggle(0,fRot_sens);
1633     }                                            1682     }
1634     if (evnt->key() == Qt::Key_Left) { // rot    1683     if (evnt->key() == Qt::Key_Left) { // rotate theta
1635       rotateQtSceneToggle(fRot_sens,0);          1684       rotateQtSceneToggle(fRot_sens,0);
1636     }                                            1685     }
1637     else if (evnt->key() == Qt::Key_Right) {     1686     else if (evnt->key() == Qt::Key_Right) { // rotate theta
1638       rotateQtSceneToggle(-fRot_sens,0);         1687       rotateQtSceneToggle(-fRot_sens,0);
1639     }                                            1688     }
1640                                                  1689 
1641     // Rotatio +/-                               1690     // Rotatio +/-
1642     if (evnt->key() == Qt::Key_Plus) {           1691     if (evnt->key() == Qt::Key_Plus) {
1643       fRot_sens = fRot_sens/0.7;                 1692       fRot_sens = fRot_sens/0.7;
1644       G4cout << "Auto-rotation set to : " <<     1693       G4cout << "Auto-rotation set to : " << fRot_sens << G4endl;
1645     }                                            1694     }
1646     else if (evnt->key() == Qt::Key_Minus) {     1695     else if (evnt->key() == Qt::Key_Minus) {
1647       fRot_sens = fRot_sens*0.7;                 1696       fRot_sens = fRot_sens*0.7;
1648       G4cout << "Auto-rotation set to : " <<     1697       G4cout << "Auto-rotation set to : " << fRot_sens << G4endl;
1649     }                                            1698     }
1650                                                  1699 
1651     // Control Modifier OR Command on MAC        1700     // Control Modifier OR Command on MAC
1652   }                                              1701   }
1653   if ((fControlKeyPress)) {                      1702   if ((fControlKeyPress)) {
1654     if (evnt->key() == Qt::Key_Plus) {           1703     if (evnt->key() == Qt::Key_Plus) {
1655       fVP.SetZoomFactor(fVP.GetZoomFactor()*( << 1704       fVP.SetZoomFactor(fVP.GetZoomFactor()*(1+fDeltaZoom)); 
1656       updateQWidget();                           1705       updateQWidget();
1657     }                                            1706     }
1658     else if (evnt->key() == Qt::Key_Minus) {     1707     else if (evnt->key() == Qt::Key_Minus) {
1659       fVP.SetZoomFactor(fVP.GetZoomFactor()*( << 1708       fVP.SetZoomFactor(fVP.GetZoomFactor()*(1-fDeltaZoom)); 
1660       updateQWidget();                           1709       updateQWidget();
1661     }                                            1710     }
1662   }                                           << 1711   }  
1663                                               << 1712   
1664   fHoldKeyEvent = false;                         1713   fHoldKeyEvent = false;
1665 }                                                1714 }
1666                                                  1715 
1667                                                  1716 
1668 void G4OpenGLQtViewer::G4keyReleaseEvent (QKe    1717 void G4OpenGLQtViewer::G4keyReleaseEvent (QKeyEvent *)
1669 {                                                1718 {
1670   fGLWidget->setCursor(QCursor(Qt::ArrowCurso    1719   fGLWidget->setCursor(QCursor(Qt::ArrowCursor));
1671 }                                                1720 }
1672                                                  1721 
1673                                                  1722 
1674 void  G4OpenGLQtViewer::updateKeyModifierStat    1723 void  G4OpenGLQtViewer::updateKeyModifierState(const Qt::KeyboardModifiers& modifier) {
1675   // Check Qt Versions for META Keys             1724   // Check Qt Versions for META Keys
1676                                               << 1725     
1677   fNoKeyPress = true;                            1726   fNoKeyPress = true;
1678   fAltKeyPress = false;                          1727   fAltKeyPress = false;
1679   fShiftKeyPress = false;                        1728   fShiftKeyPress = false;
1680   fControlKeyPress = false;                      1729   fControlKeyPress = false;
1681                                               << 1730   
1682   if (modifier & Qt::AltModifier ) {             1731   if (modifier & Qt::AltModifier ) {
1683     fAltKeyPress = true;                         1732     fAltKeyPress = true;
1684     fNoKeyPress = false;                         1733     fNoKeyPress = false;
1685   }                                              1734   }
1686   if (modifier & Qt::ShiftModifier ) {           1735   if (modifier & Qt::ShiftModifier ) {
1687     fShiftKeyPress = true;                       1736     fShiftKeyPress = true;
1688     fNoKeyPress = false;                         1737     fNoKeyPress = false;
1689   }                                              1738   }
1690   if (modifier & Qt::ControlModifier ) {         1739   if (modifier & Qt::ControlModifier ) {
1691     fControlKeyPress = true;                     1740     fControlKeyPress = true;
1692     fNoKeyPress = false;                         1741     fNoKeyPress = false;
1693   }                                              1742   }
1694 }                                                1743 }
1695                                                  1744 
1696                                                  1745 
1697 /** Stop the video. Check all parameters and     1746 /** Stop the video. Check all parameters and enable encoder button if all is ok.
1698  */                                              1747  */
1699 void G4OpenGLQtViewer::stopVideo() {             1748 void G4OpenGLQtViewer::stopVideo() {
1700                                                  1749 
1701   // if encoder parameter is wrong, display p    1750   // if encoder parameter is wrong, display parameters dialog and return
1702   if (!fMovieParametersDialog) {                 1751   if (!fMovieParametersDialog) {
1703     showMovieParametersDialog();                 1752     showMovieParametersDialog();
1704   }                                              1753   }
1705   setRecordingStatus(STOP);                      1754   setRecordingStatus(STOP);
1706                                                  1755 
1707   if (fRecordFrameNumber >0) {                   1756   if (fRecordFrameNumber >0) {
1708     // check parameters if they were modified    1757     // check parameters if they were modified (Re APPLY them...)
1709     if (!(fMovieParametersDialog->checkEncode    1758     if (!(fMovieParametersDialog->checkEncoderSwParameters())) {
1710       setRecordingStatus(BAD_ENCODER);           1759       setRecordingStatus(BAD_ENCODER);
1711     }  else if (!(fMovieParametersDialog->che    1760     }  else if (!(fMovieParametersDialog->checkSaveFileNameParameters())) {
1712       setRecordingStatus(BAD_OUTPUT);            1761       setRecordingStatus(BAD_OUTPUT);
1713     }                                            1762     }
1714   } else {                                       1763   } else {
1715     resetRecording();                            1764     resetRecording();
1716     setRecordingInfos("No frame to encode.");    1765     setRecordingInfos("No frame to encode.");
1717   }                                              1766   }
1718 }                                                1767 }
1719                                                  1768 
1720 /** Stop the video. Check all parameters and     1769 /** Stop the video. Check all parameters and enable encoder button if all is ok.
1721  */                                              1770  */
1722 void G4OpenGLQtViewer::saveVideo() {             1771 void G4OpenGLQtViewer::saveVideo() {
1723                                                  1772 
1724   // if encoder parameter is wrong, display p    1773   // if encoder parameter is wrong, display parameters dialog and return
1725   if (!fMovieParametersDialog) {                 1774   if (!fMovieParametersDialog) {
1726     showMovieParametersDialog();                 1775     showMovieParametersDialog();
1727   }                                              1776   }
1728                                                  1777 
1729   fMovieParametersDialog->checkEncoderSwParam    1778   fMovieParametersDialog->checkEncoderSwParameters();
1730   fMovieParametersDialog->checkSaveFileNamePa    1779   fMovieParametersDialog->checkSaveFileNameParameters();
1731                                               << 1780   
1732   if (fRecordingStep == STOP) {                  1781   if (fRecordingStep == STOP) {
1733     setRecordingStatus(SAVE);                    1782     setRecordingStatus(SAVE);
1734     generateMpegEncoderParameters();             1783     generateMpegEncoderParameters();
1735     encodeVideo();                               1784     encodeVideo();
1736   }                                              1785   }
1737 }                                                1786 }
1738                                                  1787 
1739                                                  1788 
1740 /** Start/Pause the video..                      1789 /** Start/Pause the video..
1741  */                                              1790  */
1742 void G4OpenGLQtViewer::startPauseVideo() {       1791 void G4OpenGLQtViewer::startPauseVideo() {
1743                                               << 1792    
1744   // first time, if temp parameter is wrong,     1793   // first time, if temp parameter is wrong, display parameters dialog and return
1745                                                  1794 
1746   if ( fRecordingStep == WAIT) {                 1795   if ( fRecordingStep == WAIT) {
1747     if ( fRecordFrameNumber == 0) {              1796     if ( fRecordFrameNumber == 0) {
1748       if (getTempFolderPath() == "") { // BAD    1797       if (getTempFolderPath() == "") { // BAD_OUTPUT
1749         showMovieParametersDialog();             1798         showMovieParametersDialog();
1750         setRecordingInfos("You should specifi    1799         setRecordingInfos("You should specified the temp folder in order to make movie");
1751         return;                                  1800         return;
1752       } else  {                                  1801       } else  {
1753         // remove temp folder if it was creat    1802         // remove temp folder if it was create
1754         QString tmp = removeTempFolder();        1803         QString tmp = removeTempFolder();
1755         if (tmp !="") {                          1804         if (tmp !="") {
1756           setRecordingInfos(tmp);                1805           setRecordingInfos(tmp);
1757           return;                                1806           return;
1758         }                                        1807         }
1759         tmp = createTempFolder();                1808         tmp = createTempFolder();
1760         if (tmp != "") {                         1809         if (tmp != "") {
1761           setRecordingInfos("Can't create tem    1810           setRecordingInfos("Can't create temp folder."+tmp);
1762           return;                                1811           return;
1763         }                                        1812         }
1764       }                                          1813       }
1765     }                                            1814     }
1766   }                                              1815   }
1767   if (fRecordingStep == WAIT) {                  1816   if (fRecordingStep == WAIT) {
1768     setRecordingStatus(START);                << 1817     setRecordingStatus(START); 
1769   } else if (fRecordingStep == START) {          1818   } else if (fRecordingStep == START) {
1770     setRecordingStatus(PAUSE);                   1819     setRecordingStatus(PAUSE);
1771   } else if (fRecordingStep == PAUSE) {          1820   } else if (fRecordingStep == PAUSE) {
1772     setRecordingStatus(CONTINUE);                1821     setRecordingStatus(CONTINUE);
1773   } else if (fRecordingStep == CONTINUE) {       1822   } else if (fRecordingStep == CONTINUE) {
1774     setRecordingStatus(PAUSE);                   1823     setRecordingStatus(PAUSE);
1775   }                                              1824   }
1776 }                                                1825 }
1777                                                  1826 
1778 void G4OpenGLQtViewer::setRecordingStatus(REC    1827 void G4OpenGLQtViewer::setRecordingStatus(RECORDING_STEP step) {
1779                                                  1828 
1780   fRecordingStep = step;                         1829   fRecordingStep = step;
1781   displayRecordingStatus();                      1830   displayRecordingStatus();
1782 }                                                1831 }
1783                                                  1832 
1784                                                  1833 
1785 void G4OpenGLQtViewer::displayRecordingStatus    1834 void G4OpenGLQtViewer::displayRecordingStatus() {
1786                                               << 1835   
1787   QString txtStatus = "";                        1836   QString txtStatus = "";
1788   if (fRecordingStep == WAIT) {                  1837   if (fRecordingStep == WAIT) {
1789     txtStatus  = "Waiting to start...";          1838     txtStatus  = "Waiting to start...";
1790     fRecordFrameNumber = 0; // reset the fram    1839     fRecordFrameNumber = 0; // reset the frame number
1791   } else if (fRecordingStep == START) {          1840   } else if (fRecordingStep == START) {
1792     txtStatus  = "Start Recording...";           1841     txtStatus  = "Start Recording...";
1793   } else if (fRecordingStep == PAUSE) {          1842   } else if (fRecordingStep == PAUSE) {
1794     txtStatus  = "Pause Recording...";           1843     txtStatus  = "Pause Recording...";
1795   } else if (fRecordingStep == CONTINUE) {       1844   } else if (fRecordingStep == CONTINUE) {
1796     txtStatus  = "Continue Recording...";        1845     txtStatus  = "Continue Recording...";
1797   } else if (fRecordingStep == STOP) {           1846   } else if (fRecordingStep == STOP) {
1798     txtStatus  = "Stop Recording...";            1847     txtStatus  = "Stop Recording...";
1799   } else if (fRecordingStep == READY_TO_ENCOD    1848   } else if (fRecordingStep == READY_TO_ENCODE) {
1800     txtStatus  = "Ready to Encode...";           1849     txtStatus  = "Ready to Encode...";
1801   } else if (fRecordingStep == ENCODING) {       1850   } else if (fRecordingStep == ENCODING) {
1802     txtStatus  = "Encoding...";                  1851     txtStatus  = "Encoding...";
1803   } else if (fRecordingStep == FAILED) {         1852   } else if (fRecordingStep == FAILED) {
1804     txtStatus  = "Failed to encode...";          1853     txtStatus  = "Failed to encode...";
1805   } else if ((fRecordingStep == BAD_ENCODER)     1854   } else if ((fRecordingStep == BAD_ENCODER)
1806              || (fRecordingStep == BAD_OUTPUT    1855              || (fRecordingStep == BAD_OUTPUT)
1807              || (fRecordingStep == BAD_TMP))     1856              || (fRecordingStep == BAD_TMP)) {
1808     txtStatus  = "Correct above errors first"    1857     txtStatus  = "Correct above errors first";
1809   } else if (fRecordingStep == SUCCESS) {        1858   } else if (fRecordingStep == SUCCESS) {
1810     txtStatus  = "File encoded successfully";    1859     txtStatus  = "File encoded successfully";
1811   } else {                                       1860   } else {
1812   }                                              1861   }
1813                                                  1862 
1814   if (fMovieParametersDialog) {                  1863   if (fMovieParametersDialog) {
1815     fMovieParametersDialog->setRecordingStatu    1864     fMovieParametersDialog->setRecordingStatus(txtStatus);
1816   } else {                                       1865   } else {
1817     G4cout << txtStatus.toStdString().c_str()    1866     G4cout << txtStatus.toStdString().c_str() << G4endl;
1818   }                                              1867   }
1819   setRecordingInfos("");                         1868   setRecordingInfos("");
1820 }                                                1869 }
1821                                                  1870 
1822                                                  1871 
1823 void G4OpenGLQtViewer::setRecordingInfos(cons    1872 void G4OpenGLQtViewer::setRecordingInfos(const QString& txt) {
1824   if (fMovieParametersDialog) {                  1873   if (fMovieParametersDialog) {
1825     fMovieParametersDialog->setRecordingInfos    1874     fMovieParametersDialog->setRecordingInfos(txt);
1826   } else {                                       1875   } else {
1827     G4cout << txt.toStdString().c_str() << G4    1876     G4cout << txt.toStdString().c_str() << G4endl;
1828   }                                              1877   }
1829 }                                                1878 }
1830                                                  1879 
1831 /** Init the movie parameters. Temp dir and e    1880 /** Init the movie parameters. Temp dir and encoder path
1832  */                                              1881  */
1833 void G4OpenGLQtViewer::initMovieParameters()     1882 void G4OpenGLQtViewer::initMovieParameters() {
1834   //init encoder                                 1883   //init encoder
1835                                               << 1884   
1836   //look for encoderPath                         1885   //look for encoderPath
1837   fProcess = new QProcess();                     1886   fProcess = new QProcess();
1838                                               << 1887      
1839   QObject ::connect(fProcess,SIGNAL(finished     1888   QObject ::connect(fProcess,SIGNAL(finished ( int)),
1840                     this,SLOT(processLookForF    1889                     this,SLOT(processLookForFinished()));
1841   fProcess->setProcessChannelMode(QProcess::M    1890   fProcess->setProcessChannelMode(QProcess::MergedChannels);
1842 #if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0)) << 
1843   fProcess->start ("which ppmtompeg");           1891   fProcess->start ("which ppmtompeg");
1844 #else                                         << 1892   
1845   fProcess->start ("which ppmtompeg", QString << 
1846 #endif                                        << 
1847 }                                                1893 }
1848                                                  1894 
1849 /** @return encoder path or "" if it does not    1895 /** @return encoder path or "" if it does not exist
1850  */                                              1896  */
1851 QString G4OpenGLQtViewer::getEncoderPath() {     1897 QString G4OpenGLQtViewer::getEncoderPath() {
1852   return fEncoderPath;                           1898   return fEncoderPath;
1853 }                                                1899 }
1854                                               << 1900  
1855                                                  1901 
1856 /**                                              1902 /**
1857  * set the new encoder path                      1903  * set the new encoder path
1858  * @return "" if correct. The error otherwise    1904  * @return "" if correct. The error otherwise
1859  */                                              1905  */
1860 QString G4OpenGLQtViewer::setEncoderPath(QStr    1906 QString G4OpenGLQtViewer::setEncoderPath(QString path) {
1861   if (path == "") {                              1907   if (path == "") {
1862     return "ppmtompeg is needed to encode in     1908     return "ppmtompeg is needed to encode in video format. It is available here: http://netpbm.sourceforge.net ";
1863   }                                              1909   }
1864                                                  1910 
1865   path =  QDir::cleanPath(path);                 1911   path =  QDir::cleanPath(path);
1866   QFileInfo *f = new QFileInfo(path);            1912   QFileInfo *f = new QFileInfo(path);
1867   if (!f->exists()) {                            1913   if (!f->exists()) {
1868     return "File does not exist";                1914     return "File does not exist";
1869   } else if (f->isDir()) {                       1915   } else if (f->isDir()) {
1870     return "This is a directory";                1916     return "This is a directory";
1871   } else if (!f->isExecutable()) {               1917   } else if (!f->isExecutable()) {
1872     return "File exist but is not executable"    1918     return "File exist but is not executable";
1873   } else if (!f->isFile()) {                     1919   } else if (!f->isFile()) {
1874     return "This is not a file";                 1920     return "This is not a file";
1875   }                                              1921   }
1876   fEncoderPath = path;                           1922   fEncoderPath = path;
1877                                                  1923 
1878   if (fRecordingStep == BAD_ENCODER) {           1924   if (fRecordingStep == BAD_ENCODER) {
1879     setRecordingStatus(STOP);                    1925     setRecordingStatus(STOP);
1880   }                                           << 1926   } 
1881   return "";                                     1927   return "";
1882 }                                                1928 }
1883                                                  1929 
1884                                                  1930 
1885 bool G4OpenGLQtViewer::isRecording(){            1931 bool G4OpenGLQtViewer::isRecording(){
1886   if ((fRecordingStep == START) || (fRecordin    1932   if ((fRecordingStep == START) || (fRecordingStep == CONTINUE)) {
1887     return true;                                 1933     return true;
1888   }                                              1934   }
1889   return false;                                  1935   return false;
1890 }                                                1936 }
1891                                                  1937 
1892 bool G4OpenGLQtViewer::isPaused(){               1938 bool G4OpenGLQtViewer::isPaused(){
1893   if (fRecordingStep == PAUSE) {                 1939   if (fRecordingStep == PAUSE) {
1894     return true;                                 1940     return true;
1895   }                                              1941   }
1896   return false;                                  1942   return false;
1897 }                                                1943 }
1898                                                  1944 
1899 bool G4OpenGLQtViewer::isEncoding(){             1945 bool G4OpenGLQtViewer::isEncoding(){
1900   if (fRecordingStep == ENCODING) {              1946   if (fRecordingStep == ENCODING) {
1901     return true;                                 1947     return true;
1902   }                                              1948   }
1903   return false;                                  1949   return false;
1904 }                                                1950 }
1905                                                  1951 
1906 bool G4OpenGLQtViewer::isWaiting(){              1952 bool G4OpenGLQtViewer::isWaiting(){
1907   if (fRecordingStep == WAIT) {                  1953   if (fRecordingStep == WAIT) {
1908     return true;                                 1954     return true;
1909   }                                              1955   }
1910   return false;                                  1956   return false;
1911 }                                                1957 }
1912                                                  1958 
1913 bool G4OpenGLQtViewer::isStopped(){              1959 bool G4OpenGLQtViewer::isStopped(){
1914   if (fRecordingStep == STOP) {                  1960   if (fRecordingStep == STOP) {
1915     return true;                                 1961     return true;
1916   }                                              1962   }
1917   return false;                                  1963   return false;
1918 }                                                1964 }
1919                                                  1965 
1920 bool G4OpenGLQtViewer::isFailed(){               1966 bool G4OpenGLQtViewer::isFailed(){
1921   if (fRecordingStep == FAILED) {                1967   if (fRecordingStep == FAILED) {
1922     return true;                                 1968     return true;
1923   }                                              1969   }
1924   return false;                                  1970   return false;
1925 }                                                1971 }
1926                                                  1972 
1927 bool G4OpenGLQtViewer::isSuccess(){              1973 bool G4OpenGLQtViewer::isSuccess(){
1928   if (fRecordingStep == SUCCESS) {               1974   if (fRecordingStep == SUCCESS) {
1929     return true;                                 1975     return true;
1930   }                                              1976   }
1931   return false;                                  1977   return false;
1932 }                                                1978 }
1933                                                  1979 
1934 bool G4OpenGLQtViewer::isBadEncoder(){           1980 bool G4OpenGLQtViewer::isBadEncoder(){
1935   if (fRecordingStep == BAD_ENCODER) {           1981   if (fRecordingStep == BAD_ENCODER) {
1936     return true;                                 1982     return true;
1937   }                                              1983   }
1938   return false;                                  1984   return false;
1939 }                                                1985 }
1940 bool G4OpenGLQtViewer::isBadTmp(){               1986 bool G4OpenGLQtViewer::isBadTmp(){
1941   if (fRecordingStep == BAD_TMP) {               1987   if (fRecordingStep == BAD_TMP) {
1942     return true;                                 1988     return true;
1943   }                                              1989   }
1944   return false;                                  1990   return false;
1945 }                                                1991 }
1946 bool G4OpenGLQtViewer::isBadOutput(){            1992 bool G4OpenGLQtViewer::isBadOutput(){
1947   if (fRecordingStep == BAD_OUTPUT) {            1993   if (fRecordingStep == BAD_OUTPUT) {
1948     return true;                                 1994     return true;
1949   }                                              1995   }
1950   return false;                                  1996   return false;
1951 }                                                1997 }
1952                                                  1998 
1953 void G4OpenGLQtViewer::setBadEncoder(){          1999 void G4OpenGLQtViewer::setBadEncoder(){
1954   fRecordingStep = BAD_ENCODER;                  2000   fRecordingStep = BAD_ENCODER;
1955   displayRecordingStatus();                      2001   displayRecordingStatus();
1956 }                                                2002 }
1957 void G4OpenGLQtViewer::setBadTmp(){              2003 void G4OpenGLQtViewer::setBadTmp(){
1958   fRecordingStep = BAD_TMP;                      2004   fRecordingStep = BAD_TMP;
1959   displayRecordingStatus();                      2005   displayRecordingStatus();
1960 }                                                2006 }
1961 void G4OpenGLQtViewer::setBadOutput(){           2007 void G4OpenGLQtViewer::setBadOutput(){
1962   fRecordingStep = BAD_OUTPUT;                   2008   fRecordingStep = BAD_OUTPUT;
1963   displayRecordingStatus();                      2009   displayRecordingStatus();
1964 }                                                2010 }
1965                                                  2011 
1966 void G4OpenGLQtViewer::setWaiting(){             2012 void G4OpenGLQtViewer::setWaiting(){
1967   fRecordingStep = WAIT;                         2013   fRecordingStep = WAIT;
1968   displayRecordingStatus();                      2014   displayRecordingStatus();
1969 }                                                2015 }
1970                                                  2016 
1971                                                  2017 
1972 bool G4OpenGLQtViewer::isReadyToEncode(){        2018 bool G4OpenGLQtViewer::isReadyToEncode(){
1973   if (fRecordingStep == READY_TO_ENCODE) {       2019   if (fRecordingStep == READY_TO_ENCODE) {
1974     return true;                                 2020     return true;
1975   }                                              2021   }
1976   return false;                                  2022   return false;
1977 }                                                2023 }
1978                                                  2024 
1979 void G4OpenGLQtViewer::resetRecording() {        2025 void G4OpenGLQtViewer::resetRecording() {
1980   setRecordingStatus(WAIT);                      2026   setRecordingStatus(WAIT);
1981 }                                                2027 }
1982                                                  2028 
1983 /**                                              2029 /**
1984  * set the temp folder path                      2030  * set the temp folder path
1985  * @return "" if correct. The error otherwise    2031  * @return "" if correct. The error otherwise
1986  */                                              2032  */
1987 QString G4OpenGLQtViewer::setTempFolderPath(Q    2033 QString G4OpenGLQtViewer::setTempFolderPath(QString path) {
1988                                                  2034 
1989   if (path == "") {                              2035   if (path == "") {
1990     return "Path does not exist";                2036     return "Path does not exist";
1991   }                                              2037   }
1992   path =  QDir::cleanPath(path);                 2038   path =  QDir::cleanPath(path);
1993   QFileInfo *d = new QFileInfo(path);            2039   QFileInfo *d = new QFileInfo(path);
1994   if (!d->exists()) {                            2040   if (!d->exists()) {
1995     return "Path does not exist";                2041     return "Path does not exist";
1996   } else if (!d->isDir()) {                      2042   } else if (!d->isDir()) {
1997     return "This is not a directory";            2043     return "This is not a directory";
1998   } else if (!d->isReadable()) {                 2044   } else if (!d->isReadable()) {
1999     return path +" is read protected";           2045     return path +" is read protected";
2000   } else if (!d->isWritable()) {                 2046   } else if (!d->isWritable()) {
2001     return path +" is write protected";          2047     return path +" is write protected";
2002   }                                              2048   }
2003                                               << 2049   
2004   if (fRecordingStep == BAD_TMP) {               2050   if (fRecordingStep == BAD_TMP) {
2005     setRecordingStatus(WAIT);                 << 2051     setRecordingStatus(WAIT); 
2006   }                                              2052   }
2007   fTempFolderPath = path;                        2053   fTempFolderPath = path;
2008   return "";                                     2054   return "";
2009 }                                                2055 }
2010                                                  2056 
2011 /** @return the temp folder path or "" if it     2057 /** @return the temp folder path or "" if it does not exist
2012  */                                              2058  */
2013 QString G4OpenGLQtViewer::getTempFolderPath()    2059 QString G4OpenGLQtViewer::getTempFolderPath() {
2014   return fTempFolderPath;                        2060   return fTempFolderPath;
2015 }                                                2061 }
2016                                               << 2062  
2017 /**                                              2063 /**
2018  * set the save file name path                   2064  * set the save file name path
2019  * @return "" if correct. The error otherwise    2065  * @return "" if correct. The error otherwise
2020  */                                              2066  */
2021 QString G4OpenGLQtViewer::setSaveFileName(QSt    2067 QString G4OpenGLQtViewer::setSaveFileName(QString path) {
2022                                                  2068 
2023   if (path == "") {                              2069   if (path == "") {
2024     return "Path does not exist";                2070     return "Path does not exist";
2025   }                                              2071   }
2026                                               << 2072   
2027   QFileInfo *file = new QFileInfo(path);         2073   QFileInfo *file = new QFileInfo(path);
2028   QDir dir = file->dir();                        2074   QDir dir = file->dir();
2029   path =  QDir::cleanPath(path);                 2075   path =  QDir::cleanPath(path);
2030   if (file->exists()) {                          2076   if (file->exists()) {
2031     return "File already exist, please choose    2077     return "File already exist, please choose a new one";
2032   } else if (!dir.exists()) {                    2078   } else if (!dir.exists()) {
2033     return "Dir does not exist";                 2079     return "Dir does not exist";
2034   } else if (!dir.isReadable()) {                2080   } else if (!dir.isReadable()) {
2035     return path +" is read protected";           2081     return path +" is read protected";
2036   }                                              2082   }
2037                                               << 2083   
2038   if (fRecordingStep == BAD_OUTPUT) {            2084   if (fRecordingStep == BAD_OUTPUT) {
2039     setRecordingStatus(STOP);                 << 2085     setRecordingStatus(STOP); 
2040   }                                              2086   }
2041   fSaveFileName = path;                          2087   fSaveFileName = path;
2042   return "";                                     2088   return "";
2043 }                                                2089 }
2044                                                  2090 
2045 /** @return the save file path                   2091 /** @return the save file path
2046  */                                              2092  */
2047 QString G4OpenGLQtViewer::getSaveFileName() {    2093 QString G4OpenGLQtViewer::getSaveFileName() {
2048   return fSaveFileName ;                         2094   return fSaveFileName ;
2049 }                                                2095 }
2050                                                  2096 
2051 /** Create a Qt_temp folder in the temp folde    2097 /** Create a Qt_temp folder in the temp folder given
2052  * The temp folder will be like this /tmp/QtM    2098  * The temp folder will be like this /tmp/QtMovie_12-02-2008_12_12_58/
2053  * @return "" if success. Error message if no    2099  * @return "" if success. Error message if not.
2054  */                                              2100  */
2055 QString G4OpenGLQtViewer::createTempFolder()     2101 QString G4OpenGLQtViewer::createTempFolder() {
2056   fMovieTempFolderPath = "";                     2102   fMovieTempFolderPath = "";
2057   //check                                        2103   //check
2058   QString tmp = setTempFolderPath(fTempFolder    2104   QString tmp = setTempFolderPath(fTempFolderPath);
2059   if (tmp != "") {                               2105   if (tmp != "") {
2060     return tmp;                                  2106     return tmp;
2061   }                                              2107   }
2062   QString sep = QString(QDir::separator());      2108   QString sep = QString(QDir::separator());
2063   QString path = sep+"QtMovie_"+QDateTime::cu << 2109   QString path = sep+"QtMovie_"+QDateTime::currentDateTime ().toString("dd-MM-yyyy_hh-mm-ss")+sep; 
2064   QDir *d = new QDir(QDir::cleanPath(fTempFol    2110   QDir *d = new QDir(QDir::cleanPath(fTempFolderPath));
2065   // check if it is already present              2111   // check if it is already present
2066   if (d->exists(path)) {                         2112   if (d->exists(path)) {
2067     return "Folder "+path+" already exists.Pl    2113     return "Folder "+path+" already exists.Please remove it first";
2068   }                                              2114   }
2069   if (d->mkdir(fTempFolderPath+path)) {          2115   if (d->mkdir(fTempFolderPath+path)) {
2070     fMovieTempFolderPath = fTempFolderPath+pa    2116     fMovieTempFolderPath = fTempFolderPath+path;
2071     return "";                                   2117     return "";
2072   }                                              2118   }
2073   return "Can't create "+fTempFolderPath+path    2119   return "Can't create "+fTempFolderPath+path;
2074 }                                                2120 }
2075                                                  2121 
2076 /** Remove the Qt_temp folder in the temp fol    2122 /** Remove the Qt_temp folder in the temp folder
2077  */                                              2123  */
2078 QString G4OpenGLQtViewer::removeTempFolder()     2124 QString G4OpenGLQtViewer::removeTempFolder() {
2079   // remove files in Qt_temp folder              2125   // remove files in Qt_temp folder
2080   if (fMovieTempFolderPath == "") {              2126   if (fMovieTempFolderPath == "") {
2081     return "";                                   2127     return "";
2082   }                                              2128   }
2083   QDir *d = new QDir(QDir::cleanPath(fMovieTe    2129   QDir *d = new QDir(QDir::cleanPath(fMovieTempFolderPath));
2084   if (!d->exists()) {                            2130   if (!d->exists()) {
2085     return "";  // already remove                2131     return "";  // already remove
2086   }                                              2132   }
2087                                                  2133 
2088   d->setFilter( QDir::Files );                   2134   d->setFilter( QDir::Files );
2089   QStringList subDirList = d->entryList();       2135   QStringList subDirList = d->entryList();
2090   int res = true;                                2136   int res = true;
2091   QString error = "";                            2137   QString error = "";
2092   for (QStringList::ConstIterator it = subDir    2138   for (QStringList::ConstIterator it = subDirList.begin() ;(it != subDirList.end()) ; it++) {
2093     const QString currentFile = *it;             2139     const QString currentFile = *it;
2094     if (!d->remove(currentFile)) {               2140     if (!d->remove(currentFile)) {
2095       res = false;                               2141       res = false;
2096       QString file = fMovieTempFolderPath+cur    2142       QString file = fMovieTempFolderPath+currentFile;
2097       error +="Removing file failed : "+file;    2143       error +="Removing file failed : "+file;
2098     } else {                                     2144     } else {
2099     }                                            2145     }
2100   }                                              2146   }
2101   if (res) {                                     2147   if (res) {
2102     if (d->rmdir(fMovieTempFolderPath)) {        2148     if (d->rmdir(fMovieTempFolderPath)) {
2103       fMovieTempFolderPath = "";                 2149       fMovieTempFolderPath = "";
2104       return "";                                 2150       return "";
2105     } else {                                     2151     } else {
2106       return "Dir "+fMovieTempFolderPath+" sh    2152       return "Dir "+fMovieTempFolderPath+" should be empty, but could not remove it";
2107     }                                            2153     }
2108                                                  2154 
2109   }                                              2155   }
2110   return "Could not remove "+fMovieTempFolder    2156   return "Could not remove "+fMovieTempFolderPath+" because of the following errors :"+error;
2111 }                                                2157 }
2112                                                  2158 
2113 /**                                           << 2159 /** 
2114   Export image. Try to get the format accordi    2160   Export image. Try to get the format according to the file extention.
2115   If not present, the last one choosen by /vi    2161   If not present, the last one choosen by /vis/ogl/set/exportFormat
2116   If not, will take the default format : eps     2162   If not, will take the default format : eps
2117   Best format actually available is pdf (vect    2163   Best format actually available is pdf (vectored and allow transparency)
2118   If name is not set, it will take the defaul    2164   If name is not set, it will take the default name value given by /vis/ogl/set/printFilename
2119  */                                              2165  */
2120 bool G4OpenGLQtViewer::exportImage(std::strin    2166 bool G4OpenGLQtViewer::exportImage(std::string name, int width, int height) {
2121                                                  2167 
2122   auto* qGLW = dynamic_cast<G4QGLWidgetType*> << 2168   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
2123   if (! qGLW) {                                  2169   if (! qGLW) {
2124     return false;                                2170     return false;
2125   }                                              2171   }
2126   // If there is already an extention            2172   // If there is already an extention
2127   bool increaseFileNumber = true;                2173   bool increaseFileNumber = true;
2128   // if                                          2174   // if
2129   if (name.size() != name.substr(name.find_la    2175   if (name.size() != name.substr(name.find_last_of(".") + 1).size()) {
2130     increaseFileNumber = false;                  2176     increaseFileNumber = false;
2131   }                                              2177   }
2132   if (! setExportFilename(name,increaseFileNu    2178   if (! setExportFilename(name,increaseFileNumber)) {
2133     return false;                                2179     return false;
2134   }                                              2180   }
2135   if ((width !=-1) && (height != -1)) {          2181   if ((width !=-1) && (height != -1)) {
2136     setExportSize(width, height);                2182     setExportSize(width, height);
2137   }                                              2183   }
2138   // first, try to do it with generic functio    2184   // first, try to do it with generic function
2139   if (G4OpenGLViewer::exportImage(name, width    2185   if (G4OpenGLViewer::exportImage(name, width, height)) {
2140     return true;                                 2186     return true;
2141                                                  2187 
2142   // Then try Qt saving functions                2188   // Then try Qt saving functions
2143   } else {                                       2189   } else {
2144     QImage image;                                2190     QImage image;
2145 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))  << 
2146     image = qGLW->grabFrameBuffer();             2191     image = qGLW->grabFrameBuffer();
2147 #else                                         << 
2148     image = qGLW->grabFramebuffer();          << 
2149 #endif                                        << 
2150                                                  2192 
2151     bool res = image.save(QString(getRealPrin    2193     bool res = image.save(QString(getRealPrintFilename().c_str()),0,fLastExportSliderValue);
2152                                               << 2194     
2153     if (!res) {                                  2195     if (!res) {
2154       G4cerr << "Error saving file... " << ge    2196       G4cerr << "Error saving file... " << getRealPrintFilename().c_str() << G4endl;
2155       return false;                              2197       return false;
2156     } else {                                     2198     } else {
2157       G4cout << "File " << getRealPrintFilena    2199       G4cout << "File " << getRealPrintFilename().c_str() << " size: " << fGLWidget->width() << "x" << fGLWidget->height() << " has been saved " << G4endl;
2158       fExportFilenameIndex++;                    2200       fExportFilenameIndex++;
2159     }                                            2201     }
2160   }                                              2202   }
2161   return true;                                   2203   return true;
2162 }                                                2204 }
2163                                                  2205 
2164 bool G4OpenGLQtViewer::generateMpegEncoderPar    2206 bool G4OpenGLQtViewer::generateMpegEncoderParameters () {
2165                                                  2207 
2166   // save the parameter file                     2208   // save the parameter file
2167   FILE* fp;                                      2209   FILE* fp;
2168   fp = fopen (QString(fMovieTempFolderPath+fP    2210   fp = fopen (QString(fMovieTempFolderPath+fParameterFileName).toStdString().c_str(), "w");
2169                                                  2211 
2170   if (fp == NULL) {                              2212   if (fp == NULL) {
2171     setRecordingInfos("Generation of paramete    2213     setRecordingInfos("Generation of parameter file failed");
2172     return false;                                2214     return false;
2173   }                                              2215   }
2174                                                  2216 
2175   fprintf (fp,"# Pattern affects speed, quali    2217   fprintf (fp,"# Pattern affects speed, quality and compression. See the User's Guide\n");
2176   fprintf (fp,"# for more info.\n");             2218   fprintf (fp,"# for more info.\n");
2177   fprintf (fp,"\n");                             2219   fprintf (fp,"\n");
2178   fprintf (fp,"PATTERN    I\n");                 2220   fprintf (fp,"PATTERN    I\n");
2179   fprintf (fp,"OUTPUT   %s\n",getSaveFileName    2221   fprintf (fp,"OUTPUT   %s\n",getSaveFileName().toStdString().c_str());
2180   fprintf (fp,"\n");                             2222   fprintf (fp,"\n");
2181   fprintf (fp,"# You must specify the type of    2223   fprintf (fp,"# You must specify the type of the input files.  The choices are:\n");
2182   fprintf (fp,"#    YUV, PPM, JMOVIE, Y, JPEG    2224   fprintf (fp,"#    YUV, PPM, JMOVIE, Y, JPEG, PNM\n");
2183   fprintf (fp,"#  (must be upper case)\n");      2225   fprintf (fp,"#  (must be upper case)\n");
2184   fprintf (fp,"#\n");                            2226   fprintf (fp,"#\n");
2185   fprintf (fp,"BASE_FILE_FORMAT PPM\n");         2227   fprintf (fp,"BASE_FILE_FORMAT PPM\n");
2186   fprintf (fp,"\n");                             2228   fprintf (fp,"\n");
2187   fprintf (fp,"\n");                             2229   fprintf (fp,"\n");
2188   fprintf (fp,"# If you are using YUV, there     2230   fprintf (fp,"# If you are using YUV, there are different supported file formats.\n");
2189   fprintf (fp,"# EYUV or UCB are the same as     2231   fprintf (fp,"# EYUV or UCB are the same as previous versions of this encoder.\n");
2190   fprintf (fp,"# (All the Y's, then U's then     2232   fprintf (fp,"# (All the Y's, then U's then V's, in 4:2:0 subsampling.)\n");
2191   fprintf (fp,"# Other formats, such as Abeka    2233   fprintf (fp,"# Other formats, such as Abekas, Phillips, or a general format are\n");
2192   fprintf (fp,"# permissible, the general for    2234   fprintf (fp,"# permissible, the general format is a string of Y's, U's, and V's\n");
2193   fprintf (fp,"# to specify the file order.\n    2235   fprintf (fp,"# to specify the file order.\n");
2194   fprintf (fp,"\n");                             2236   fprintf (fp,"\n");
2195   fprintf (fp,"INPUT_FORMAT UCB\n");             2237   fprintf (fp,"INPUT_FORMAT UCB\n");
2196   fprintf (fp,"\n");                             2238   fprintf (fp,"\n");
2197   fprintf (fp,"# the conversion statement\n")    2239   fprintf (fp,"# the conversion statement\n");
2198   fprintf (fp,"#\n");                            2240   fprintf (fp,"#\n");
2199   fprintf (fp,"# Each occurrence of '*' will     2241   fprintf (fp,"# Each occurrence of '*' will be replaced by the input file\n");
2200   fprintf (fp,"#\n");                            2242   fprintf (fp,"#\n");
2201   fprintf (fp,"# e.g., if you have a bunch of    2243   fprintf (fp,"# e.g., if you have a bunch of GIF files, then this might be:\n");
2202   fprintf (fp,"#  INPUT_CONVERT giftoppm *\n"    2244   fprintf (fp,"#  INPUT_CONVERT giftoppm *\n");
2203   fprintf (fp,"#\n");                            2245   fprintf (fp,"#\n");
2204   fprintf (fp,"# e.g., if you have a bunch of    2246   fprintf (fp,"# e.g., if you have a bunch of files like a.Y a.U a.V, etc., then:\n");
2205   fprintf (fp,"#  INPUT_CONVERT cat *.Y *.U *    2247   fprintf (fp,"#  INPUT_CONVERT cat *.Y *.U *.V\n");
2206   fprintf (fp,"#\n");                            2248   fprintf (fp,"#\n");
2207   fprintf (fp,"# e.g., if you are grabbing fr    2249   fprintf (fp,"# e.g., if you are grabbing from laser disc you might have something like\n");
2208   fprintf (fp,"#  INPUT_CONVERT goto frame *;    2250   fprintf (fp,"#  INPUT_CONVERT goto frame *; grabppm\n");
2209   fprintf (fp,"# 'INPUT_CONVERT *' means the     2251   fprintf (fp,"# 'INPUT_CONVERT *' means the files are already in the base file format\n");
2210   fprintf (fp,"#\n");                            2252   fprintf (fp,"#\n");
2211   fprintf (fp,"INPUT_CONVERT  * \n");            2253   fprintf (fp,"INPUT_CONVERT  * \n");
2212   fprintf (fp,"\n");                             2254   fprintf (fp,"\n");
2213   fprintf (fp,"# number of frames in a GOP.\n    2255   fprintf (fp,"# number of frames in a GOP.\n");
2214   fprintf (fp,"#\n");                            2256   fprintf (fp,"#\n");
2215   fprintf (fp,"# since each GOP must have at     2257   fprintf (fp,"# since each GOP must have at least one I-frame, the encoder will find the\n");
2216   fprintf (fp,"# the first I-frame after GOP_    2258   fprintf (fp,"# the first I-frame after GOP_SIZE frames to start the next GOP\n");
2217   fprintf (fp,"#\n");                            2259   fprintf (fp,"#\n");
2218   fprintf (fp,"# later, will add more flexibl    2260   fprintf (fp,"# later, will add more flexible GOP signalling\n");
2219   fprintf (fp,"#\n");                            2261   fprintf (fp,"#\n");
2220   fprintf (fp,"GOP_SIZE 1\n");                   2262   fprintf (fp,"GOP_SIZE 1\n");
2221   fprintf (fp,"\n");                             2263   fprintf (fp,"\n");
2222   fprintf (fp,"# number of slices in a frame\    2264   fprintf (fp,"# number of slices in a frame\n");
2223   fprintf (fp,"#\n");                            2265   fprintf (fp,"#\n");
2224   fprintf (fp,"# 1 is a good number.  another    2266   fprintf (fp,"# 1 is a good number.  another possibility is the number of macroblock rows\n");
2225   fprintf (fp,"# (which is the height divided    2267   fprintf (fp,"# (which is the height divided by 16)\n");
2226   fprintf (fp,"#\n");                            2268   fprintf (fp,"#\n");
2227   fprintf (fp,"SLICES_PER_FRAME 1\n");           2269   fprintf (fp,"SLICES_PER_FRAME 1\n");
2228   fprintf (fp,"PIXEL HALF");                     2270   fprintf (fp,"PIXEL HALF");
2229   fprintf (fp,"\n");                             2271   fprintf (fp,"\n");
2230   fprintf (fp,"# directory to get all input f    2272   fprintf (fp,"# directory to get all input files from (makes this file easier to read)\n");
2231   fprintf (fp,"INPUT_DIR  %s\n",fMovieTempFol    2273   fprintf (fp,"INPUT_DIR  %s\n",fMovieTempFolderPath.toStdString().c_str());
2232   fprintf (fp,"\n");                             2274   fprintf (fp,"\n");
2233   fprintf (fp,"# There are a bunch of ways to    2275   fprintf (fp,"# There are a bunch of ways to specify the input files.\n");
2234   fprintf (fp,"# from a simple one-per-line l    2276   fprintf (fp,"# from a simple one-per-line listing, to the following \n");
2235   fprintf (fp,"# way of numbering them.  See     2277   fprintf (fp,"# way of numbering them.  See the manual for more information.\n");
2236   fprintf (fp,"INPUT\n");                        2278   fprintf (fp,"INPUT\n");
2237   fprintf (fp,"# '*' is replaced by the numbe    2279   fprintf (fp,"# '*' is replaced by the numbers 01, 02, 03, 04\n");
2238   fprintf (fp,"# if I instead do [01-11], it     2280   fprintf (fp,"# if I instead do [01-11], it would be 01, 02, ..., 09, 10, 11\n");
2239   fprintf (fp,"# if I instead do [1-11], it w    2281   fprintf (fp,"# if I instead do [1-11], it would be 1, 2, 3, ..., 9, 10, 11\n");
2240   fprintf (fp,"# if I instead do [1-11+3], it    2282   fprintf (fp,"# if I instead do [1-11+3], it would be 1, 4, 7, 10\n");
2241   fprintf (fp,"# the program assumes none of     2283   fprintf (fp,"# the program assumes none of your input files has a name ending in ']'\n");
2242   fprintf (fp,"# if you do, too bad!!!\n");      2284   fprintf (fp,"# if you do, too bad!!!\n");
2243   fprintf (fp,"#\n");                            2285   fprintf (fp,"#\n");
2244   fprintf (fp,"#\n");                            2286   fprintf (fp,"#\n");
2245   fprintf (fp,"Test*.ppm  [0-%d]\n",fRecordFr    2287   fprintf (fp,"Test*.ppm  [0-%d]\n",fRecordFrameNumber-1);
2246   fprintf (fp,"# can have more files here if     2288   fprintf (fp,"# can have more files here if you want...there is no limit on the number\n");
2247   fprintf (fp,"# of files\n");                   2289   fprintf (fp,"# of files\n");
2248   fprintf (fp,"END_INPUT\n");                    2290   fprintf (fp,"END_INPUT\n");
2249   fprintf (fp,"\n");                             2291   fprintf (fp,"\n");
2250   fprintf (fp,"\n");                             2292   fprintf (fp,"\n");
2251   fprintf (fp,"\n");                             2293   fprintf (fp,"\n");
2252   fprintf (fp,"# Many of the remaining option    2294   fprintf (fp,"# Many of the remaining options have to do with the motion search and qscale\n");
2253   fprintf (fp,"\n");                             2295   fprintf (fp,"\n");
2254   fprintf (fp,"# FULL or HALF -- must be uppe    2296   fprintf (fp,"# FULL or HALF -- must be upper case\n");
2255   fprintf (fp,"# Should be FULL for computer     2297   fprintf (fp,"# Should be FULL for computer generated images\n");
2256   fprintf (fp,"PIXEL    FULL\n");                2298   fprintf (fp,"PIXEL    FULL\n");
2257   fprintf (fp,"\n");                             2299   fprintf (fp,"\n");
2258   fprintf (fp,"# means +/- this many pixels f    2300   fprintf (fp,"# means +/- this many pixels for both P and B frame searches\n");
2259   fprintf (fp,"# specify two numbers if you w    2301   fprintf (fp,"# specify two numbers if you wish to serc different ranges in the two.\n");
2260   fprintf (fp,"RANGE    10\n");                  2302   fprintf (fp,"RANGE    10\n");
2261   fprintf (fp,"\n");                             2303   fprintf (fp,"\n");
2262   fprintf (fp,"# The two search algorithm par    2304   fprintf (fp,"# The two search algorithm parameters below mostly affect speed,\n");
2263   fprintf (fp,"# with some affect on compress    2305   fprintf (fp,"# with some affect on compression and almost none on quality.\n");
2264   fprintf (fp,"\n");                             2306   fprintf (fp,"\n");
2265   fprintf (fp,"# this must be one of {EXHAUST    2307   fprintf (fp,"# this must be one of {EXHAUSTIVE, SUBSAMPLE, LOGARITHMIC}\n");
2266   fprintf (fp,"PSEARCH_ALG  LOGARITHMIC\n");     2308   fprintf (fp,"PSEARCH_ALG  LOGARITHMIC\n");
2267   fprintf (fp,"\n");                             2309   fprintf (fp,"\n");
2268   fprintf (fp,"# this must be one of {SIMPLE,    2310   fprintf (fp,"# this must be one of {SIMPLE, CROSS2, EXHAUSTIVE}\n");
2269   fprintf (fp,"#\n");                            2311   fprintf (fp,"#\n");
2270   fprintf (fp,"# note that EXHAUSTIVE is real    2312   fprintf (fp,"# note that EXHAUSTIVE is really, really, really slow\n");
2271   fprintf (fp,"#\n");                            2313   fprintf (fp,"#\n");
2272   fprintf (fp,"BSEARCH_ALG  SIMPLE\n");          2314   fprintf (fp,"BSEARCH_ALG  SIMPLE\n");
2273   fprintf (fp,"\n");                             2315   fprintf (fp,"\n");
2274   fprintf (fp,"#\n");                            2316   fprintf (fp,"#\n");
2275   fprintf (fp,"# these specify the q-scale fo    2317   fprintf (fp,"# these specify the q-scale for I, P, and B frames\n");
2276   fprintf (fp,"# (values must be between 1 an    2318   fprintf (fp,"# (values must be between 1 and 31)\n");
2277   fprintf (fp,"# These are the Qscale values     2319   fprintf (fp,"# These are the Qscale values for the entire frame in variable bit-rate\n");
2278   fprintf (fp,"# mode, and starting points (b    2320   fprintf (fp,"# mode, and starting points (but not important) for constant bit rate\n");
2279   fprintf (fp,"#\n");                            2321   fprintf (fp,"#\n");
2280   fprintf (fp,"\n");                             2322   fprintf (fp,"\n");
2281   fprintf (fp,"# Qscale (Quantization scale)     2323   fprintf (fp,"# Qscale (Quantization scale) affects quality and compression,\n");
2282   fprintf (fp,"# but has very little effect o    2324   fprintf (fp,"# but has very little effect on speed.\n");
2283   fprintf (fp,"\n");                             2325   fprintf (fp,"\n");
2284   fprintf (fp,"IQSCALE    4\n");                 2326   fprintf (fp,"IQSCALE    4\n");
2285   fprintf (fp,"PQSCALE    5\n");                 2327   fprintf (fp,"PQSCALE    5\n");
2286   fprintf (fp,"BQSCALE    12\n");                2328   fprintf (fp,"BQSCALE    12\n");
2287   fprintf (fp,"\n");                             2329   fprintf (fp,"\n");
2288   fprintf (fp,"# this must be ORIGINAL or DEC    2330   fprintf (fp,"# this must be ORIGINAL or DECODED\n");
2289   fprintf (fp,"REFERENCE_FRAME  ORIGINAL\n");    2331   fprintf (fp,"REFERENCE_FRAME  ORIGINAL\n");
2290   fprintf (fp,"\n");                             2332   fprintf (fp,"\n");
2291   fprintf (fp,"# for parallel parameters see  << 2333   fprintf (fp,"# for parallel parameters see parallel.param in the exmaples subdirectory\n");
2292   fprintf (fp,"\n");                             2334   fprintf (fp,"\n");
2293   fprintf (fp,"# if you want constant bit-rat    2335   fprintf (fp,"# if you want constant bit-rate mode, specify it as follows (number is bits/sec):\n");
2294   fprintf (fp,"#BIT_RATE  1000000\n");           2336   fprintf (fp,"#BIT_RATE  1000000\n");
2295   fprintf (fp,"\n");                             2337   fprintf (fp,"\n");
2296   fprintf (fp,"# To specify the buffer size (    2338   fprintf (fp,"# To specify the buffer size (327680 is default, measused in bits, for 16bit words)\n");
2297   fprintf (fp,"BUFFER_SIZE 327680\n");           2339   fprintf (fp,"BUFFER_SIZE 327680\n");
2298   fprintf (fp,"\n");                             2340   fprintf (fp,"\n");
2299   fprintf (fp,"# The frame rate is the number    2341   fprintf (fp,"# The frame rate is the number of frames/second (legal values:\n");
2300   fprintf (fp,"# 23.976, 24, 25, 29.97, 30, 5    2342   fprintf (fp,"# 23.976, 24, 25, 29.97, 30, 50 ,59.94, 60\n");
2301   fprintf (fp,"FRAME_RATE 30\n");                2343   fprintf (fp,"FRAME_RATE 30\n");
2302   fprintf (fp,"\n");                             2344   fprintf (fp,"\n");
2303   fprintf (fp,"# There are many more options,    2345   fprintf (fp,"# There are many more options, see the users manual for examples....\n");
2304   fprintf (fp,"# ASPECT_RATIO, USER_DATA, GAM    2346   fprintf (fp,"# ASPECT_RATIO, USER_DATA, GAMMA, IQTABLE, etc.\n");
2305   fprintf (fp,"\n");                             2347   fprintf (fp,"\n");
2306   fprintf (fp,"\n");                             2348   fprintf (fp,"\n");
2307   fclose (fp);                                   2349   fclose (fp);
2308                                                  2350 
2309   setRecordingInfos("Parameter file "+fParame    2351   setRecordingInfos("Parameter file "+fParameterFileName+" generated in "+fMovieTempFolderPath);
2310   setRecordingStatus(READY_TO_ENCODE);           2352   setRecordingStatus(READY_TO_ENCODE);
2311   return true;                                   2353   return true;
2312 }                                                2354 }
2313                                                  2355 
2314 void G4OpenGLQtViewer::encodeVideo()             2356 void G4OpenGLQtViewer::encodeVideo()
2315 {                                                2357 {
2316   if ((getEncoderPath() != "") && (getSaveFil    2358   if ((getEncoderPath() != "") && (getSaveFileName() != "")) {
2317     setRecordingStatus(ENCODING);                2359     setRecordingStatus(ENCODING);
2318                                               << 2360     
2319     fProcess = new QProcess();                   2361     fProcess = new QProcess();
                                                   >> 2362 #if QT_VERSION > 0x040100
2320     QObject ::connect(fProcess,SIGNAL(finishe    2363     QObject ::connect(fProcess,SIGNAL(finished ( int,QProcess::ExitStatus)),
2321                       this,SLOT(processEncode    2364                       this,SLOT(processEncodeFinished()));
2322     QObject ::connect(fProcess,SIGNAL(readyRe    2365     QObject ::connect(fProcess,SIGNAL(readyReadStandardOutput ()),
2323                       this,SLOT(processEncode    2366                       this,SLOT(processEncodeStdout()));
2324 #if (QT_VERSION < QT_VERSION_CHECK(5, 10, 0)) << 2367 #else
                                                   >> 2368     QObject ::connect(fProcess,SIGNAL(finished ( int)),
                                                   >> 2369                       this,SLOT(processEncodeFinished()));
                                                   >> 2370     QObject ::connect(fProcess,SIGNAL(readyReadStandardOutput ()),
                                                   >> 2371                       this,SLOT(processEncodeStdout()));
                                                   >> 2372 #endif
                                                   >> 2373 #if QT_VERSION < 0x050a00
2325     fProcess->setReadChannelMode(QProcess::Me    2374     fProcess->setReadChannelMode(QProcess::MergedChannels);
2326 #else                                            2375 #else
2327     fProcess->setProcessChannelMode(QProcess:    2376     fProcess->setProcessChannelMode(QProcess::MergedChannels);
2328 #endif                                           2377 #endif
2329     fProcess->start (fEncoderPath, QStringLis    2378     fProcess->start (fEncoderPath, QStringList(fMovieTempFolderPath+fParameterFileName));
2330   }                                              2379   }
2331 }                                                2380 }
2332                                                  2381 
2333                                                  2382 
2334 // FIXME : does not work on Qt3                  2383 // FIXME : does not work on Qt3
2335 void G4OpenGLQtViewer::processEncodeStdout()     2384 void G4OpenGLQtViewer::processEncodeStdout()
2336 {                                                2385 {
2337   QString tmp = fProcess->readAllStandardOutp    2386   QString tmp = fProcess->readAllStandardOutput ().data();
2338   auto start = tmp.lastIndexOf("ESTIMATED TIM << 2387   int start = tmp.lastIndexOf("ESTIMATED TIME");
2339   tmp = tmp.mid(start,tmp.indexOf("\n",start)    2388   tmp = tmp.mid(start,tmp.indexOf("\n",start)-start);
2340   setRecordingInfos(tmp);                        2389   setRecordingInfos(tmp);
2341 }                                                2390 }
2342                                                  2391 
2343                                                  2392 
2344 void G4OpenGLQtViewer::processEncodeFinished(    2393 void G4OpenGLQtViewer::processEncodeFinished()
2345 {                                                2394 {
2346                                                  2395 
2347   QString txt = "";                              2396   QString txt = "";
2348   txt = getProcessErrorMsg();                    2397   txt = getProcessErrorMsg();
2349   if (txt == "") {                               2398   if (txt == "") {
2350     setRecordingStatus(SUCCESS);                 2399     setRecordingStatus(SUCCESS);
2351   } else {                                       2400   } else {
2352     setRecordingStatus(FAILED);                  2401     setRecordingStatus(FAILED);
2353   }                                              2402   }
2354   //  setRecordingInfos(txt+removeTempFolder(    2403   //  setRecordingInfos(txt+removeTempFolder());
2355 }                                                2404 }
2356                                                  2405 
2357                                                  2406 
2358 void G4OpenGLQtViewer::processLookForFinished << 2407 void G4OpenGLQtViewer::processLookForFinished() 
2359 {                                                2408 {
2360                                                  2409 
2361   QString txt = getProcessErrorMsg();            2410   QString txt = getProcessErrorMsg();
2362   if (txt != "") {                               2411   if (txt != "") {
2363     fEncoderPath = "";                           2412     fEncoderPath = "";
2364   } else {                                       2413   } else {
2365     fEncoderPath = QString(fProcess->readAllS    2414     fEncoderPath = QString(fProcess->readAllStandardOutput ().data()).trimmed();
2366     // if not found, return "not found"          2415     // if not found, return "not found"
2367     if (fEncoderPath.contains(" ")) {            2416     if (fEncoderPath.contains(" ")) {
2368       fEncoderPath = "";                         2417       fEncoderPath = "";
2369     } else if (!fEncoderPath.contains("ppmtom    2418     } else if (!fEncoderPath.contains("ppmtompeg")) {
2370       fEncoderPath = "";                         2419       fEncoderPath = "";
2371     }                                            2420     }
2372     setEncoderPath(fEncoderPath);                2421     setEncoderPath(fEncoderPath);
2373   }                                              2422   }
2374   // init temp folder                            2423   // init temp folder
2375   setTempFolderPath(QDir::temp ().absolutePat    2424   setTempFolderPath(QDir::temp ().absolutePath ());
2376 }                                                2425 }
2377                                                  2426 
2378                                                  2427 
2379 QString G4OpenGLQtViewer::getProcessErrorMsg(    2428 QString G4OpenGLQtViewer::getProcessErrorMsg()
2380 {                                                2429 {
2381   QString txt = "";                              2430   QString txt = "";
2382   if (fProcess->exitCode() != 0) {               2431   if (fProcess->exitCode() != 0) {
2383     switch (fProcess->error()) {                 2432     switch (fProcess->error()) {
2384     case QProcess::FailedToStart:                2433     case QProcess::FailedToStart:
2385       txt = "The process failed to start. Eit    2434       txt = "The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program.\n";
2386       break;                                     2435       break;
2387     case QProcess::Crashed:                      2436     case QProcess::Crashed:
2388       txt = "The process crashed some time af    2437       txt = "The process crashed some time after starting successfully.\n";
2389       break;                                     2438       break;
2390     case QProcess::Timedout:                     2439     case QProcess::Timedout:
2391       txt = "The last waitFor...() function t    2440       txt = "The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.\n";
2392       break;                                     2441       break;
2393     case QProcess::WriteError:                   2442     case QProcess::WriteError:
2394       txt = "An error occurred when attemptin    2443       txt = "An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.\n";
2395       break;                                     2444       break;
2396     case QProcess::ReadError:                    2445     case QProcess::ReadError:
2397       txt = "An error occurred when attemptin    2446       txt = "An error occurred when attempting to read from the process. For example, the process may not be running.\n";
2398       break;                                     2447       break;
2399     case QProcess::UnknownError:                 2448     case QProcess::UnknownError:
2400       txt = "An unknown error occurred. This     2449       txt = "An unknown error occurred. This is the default return value of error().\n";
2401       break;                                     2450       break;
2402     }                                            2451     }
2403   }                                              2452   }
2404   return txt;                                    2453   return txt;
2405 }                                                2454 }
2406                                                  2455 
2407                                                  2456 
2408                                                  2457 
2409                                                  2458 
2410 QWidget *G4OpenGLQtViewer::getParentWidget()  << 2459 QWidget *G4OpenGLQtViewer::getParentWidget() 
2411 {                                                2460 {
2412   // launch Qt if not                            2461   // launch Qt if not
2413   G4Qt* interactorManager = G4Qt::getInstance    2462   G4Qt* interactorManager = G4Qt::getInstance ();
2414                                               << 2463   // G4UImanager* UI = 
                                                   >> 2464   // G4UImanager::GetUIpointer();
                                                   >> 2465   
2415   bool found = false;                            2466   bool found = false;
2416   QDialog* dialog = NULL;                        2467   QDialog* dialog = NULL;
2417   // create window                               2468   // create window
2418   if (((QApplication*)interactorManager->GetM    2469   if (((QApplication*)interactorManager->GetMainInteractor())) {
2419     // look for the main window                  2470     // look for the main window
2420     QWidgetList wl = QApplication::allWidgets    2471     QWidgetList wl = QApplication::allWidgets();
2421     QWidget *widget = NULL;                      2472     QWidget *widget = NULL;
2422     for (int i=0; i < wl.size(); i++) {          2473     for (int i=0; i < wl.size(); i++) {
2423       widget = wl.at(i);                         2474       widget = wl.at(i);
2424       if ((found== false) && (widget->inherit    2475       if ((found== false) && (widget->inherits("QMainWindow"))) {
2425         dialog = new QDialog(widget,Qt::Windo    2476         dialog = new QDialog(widget,Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
2426         found = true;                            2477         found = true;
2427       }                                          2478       }
2428     }                                            2479     }
2429                                               << 2480     
2430     if (found==false) {                          2481     if (found==false) {
2431       dialog = new QDialog();                    2482       dialog = new QDialog();
2432     }                                            2483     }
2433   } else {                                       2484   } else {
2434     dialog= new QDialog();                       2485     dialog= new QDialog();
2435   }                                              2486   }
2436   if (found) {                                   2487   if (found) {
2437     return dialog;                               2488     return dialog;
2438   } else {                                       2489   } else {
2439     return NULL;                                 2490     return NULL;
2440   }                                              2491   }
2441 }                                                2492 }
2442                                                  2493 
2443                                                  2494 
2444 void G4OpenGLQtViewer::createSceneTreeWidget(    2495 void G4OpenGLQtViewer::createSceneTreeWidget() {
2445   fUISceneTreeWidget = fUiQt->GetSceneTreeWid    2496   fUISceneTreeWidget = fUiQt->GetSceneTreeWidget();
2446                                               << 2497   
2447   if (!fUISceneTreeWidget) {                     2498   if (!fUISceneTreeWidget) {
2448     return;                                      2499     return;
2449   }                                              2500   }
2450                                               << 2501   
2451   // do not remove previous widgets, hide the    2502   // do not remove previous widgets, hide them!
2452   QLayoutItem * wItem;                           2503   QLayoutItem * wItem;
2453   bool found = false;                            2504   bool found = false;
2454   if (fUISceneTreeWidget->layout()->count() )    2505   if (fUISceneTreeWidget->layout()->count() ) {
2455     for(int idx = 0; idx < fUISceneTreeWidget    2506     for(int idx = 0; idx < fUISceneTreeWidget->layout()->count(); idx++){
2456       wItem = fUISceneTreeWidget->layout()->i    2507       wItem = fUISceneTreeWidget->layout()->itemAt(idx);
2457       if (fSceneTreeWidget) {                    2508       if (fSceneTreeWidget) {
2458         if(dynamic_cast<QWidget *>(wItem->wid    2509         if(dynamic_cast<QWidget *>(wItem->widget())) {
2459           if (wItem->widget()->windowTitle()     2510           if (wItem->widget()->windowTitle() == fSceneTreeWidget->windowTitle()) {
2460             wItem->widget()->show();             2511             wItem->widget()->show();
2461             found = true;                        2512             found = true;
2462           } else {                               2513           } else {
2463             wItem->widget()->hide();             2514             wItem->widget()->hide();
2464           }                                      2515           }
2465         }                                        2516         }
2466       } else {                                   2517       } else {
2467 //        wItem->widget()->hide();            << 2518         wItem->widget()->hide();
2468       }                                          2519       }
2469     }                                            2520     }
2470   }                                              2521   }
2471                                                  2522 
2472   if (!found) {                                  2523   if (!found) {
2473     // initialize scene tree / viewer propert    2524     // initialize scene tree / viewer properties / picking
2474     fSceneTreeWidget = new QWidget();            2525     fSceneTreeWidget = new QWidget();
2475     QVBoxLayout* layoutSceneTree = new QVBoxL    2526     QVBoxLayout* layoutSceneTree = new QVBoxLayout();
2476     fSceneTreeWidget->setStyleSheet ("padding    2527     fSceneTreeWidget->setStyleSheet ("padding: 0px ");
2477                                               << 2528     
2478     fSceneTreeWidget->setLayout(layoutSceneTr    2529     fSceneTreeWidget->setLayout(layoutSceneTree);
2479     fSceneTreeWidget->layout()->setContentsMa    2530     fSceneTreeWidget->layout()->setContentsMargins(5,5,5,5);
2480     fSceneTreeWidget->setWindowTitle(QString(    2531     fSceneTreeWidget->setWindowTitle(QString(GetName().data()));
2481                                                  2532 
2482     if (fUISceneTreeWidget != NULL) {            2533     if (fUISceneTreeWidget != NULL) {
2483 //      fUISceneTreeWidget->layout()->addWidg << 2534       fUISceneTreeWidget->layout()->addWidget(fSceneTreeWidget);
2484     }                                            2535     }
2485                                               << 2536     
2486     // not available for Immediate mode          2537     // not available for Immediate mode
2487     if (dynamic_cast<G4OpenGLStoredQtViewer*>    2538     if (dynamic_cast<G4OpenGLStoredQtViewer*> (this)) {
2488       createSceneTreeComponent();                2539       createSceneTreeComponent();
2489     }                                            2540     }
2490   }                                              2541   }
2491 }                                                2542 }
2492                                                  2543 
2493                                                  2544 
2494 void G4OpenGLQtViewer::createSceneTreeCompone    2545 void G4OpenGLQtViewer::createSceneTreeComponent(){
2495                                               << 2546   
2496   QLayout* vLayout = fSceneTreeWidget->layout    2547   QLayout* vLayout = fSceneTreeWidget->layout();
2497                                               << 2548   
2498   // Search line                                 2549   // Search line
2499   QWidget* coutButtonWidget = new QWidget();     2550   QWidget* coutButtonWidget = new QWidget();
2500   QHBoxLayout* layoutCoutTBButtons = new QHBo    2551   QHBoxLayout* layoutCoutTBButtons = new QHBoxLayout();
2501                                                  2552 
2502   fFilterOutput = new QLineEdit();               2553   fFilterOutput = new QLineEdit();
2503   fFilterOutput->setToolTip("Filter output by    2554   fFilterOutput->setToolTip("Filter output by...");
2504   fFilterOutput->setStyleSheet ("padding: 0px    2555   fFilterOutput->setStyleSheet ("padding: 0px ");
2505                                                  2556 
2506   QPixmap* searchIcon = fUiQt->getSearchIcon(    2557   QPixmap* searchIcon = fUiQt->getSearchIcon();
                                                   >> 2558 #if QT_VERSION > 0x050100
2507   fFilterOutput->addAction(*searchIcon,QLineE    2559   fFilterOutput->addAction(*searchIcon,QLineEdit::TrailingPosition);
2508   fFilterOutput->setStyleSheet ("border-radiu    2560   fFilterOutput->setStyleSheet ("border-radius:7px;");
                                                   >> 2561 #else
                                                   >> 2562   QPushButton *coutTBFilterButton = new QPushButton();
                                                   >> 2563   coutTBFilterButton->setIcon(*searchIcon);
                                                   >> 2564   coutTBFilterButton->setStyleSheet ("padding-left: 0px; border:0px;");
                                                   >> 2565   fFilterOutput->setStyleSheet ("padding-right: 0px;");
                                                   >> 2566 #endif
2509   layoutCoutTBButtons->addWidget(fFilterOutpu    2567   layoutCoutTBButtons->addWidget(fFilterOutput);
                                                   >> 2568   
                                                   >> 2569 #if QT_VERSION <= 0x050100
                                                   >> 2570   layoutCoutTBButtons->addWidget(coutTBFilterButton);
                                                   >> 2571 #endif
2510                                                  2572 
2511   coutButtonWidget->setLayout(layoutCoutTBBut    2573   coutButtonWidget->setLayout(layoutCoutTBButtons);
2512   vLayout->addWidget(coutButtonWidget);          2574   vLayout->addWidget(coutButtonWidget);
2513                                               << 2575   
2514   // reduce margins                              2576   // reduce margins
2515   vLayout->setContentsMargins(0,0,0,0);          2577   vLayout->setContentsMargins(0,0,0,0);
2516                                                  2578 
2517                                                  2579 
2518   fSceneTreeComponentTreeWidget = new QTreeWi    2580   fSceneTreeComponentTreeWidget = new QTreeWidget();
2519   fSceneTreeComponentTreeWidget->setSelection    2581   fSceneTreeComponentTreeWidget->setSelectionMode(QAbstractItemView::SingleSelection);
2520   fSceneTreeComponentTreeWidget->setHeaderLab    2582   fSceneTreeComponentTreeWidget->setHeaderLabel ("Scene tree : "+QString(GetName().data()));
2521   fSceneTreeComponentTreeWidget->setColumnHid    2583   fSceneTreeComponentTreeWidget->setColumnHidden (1,true);  // copy number
2522   fSceneTreeComponentTreeWidget->setColumnHid    2584   fSceneTreeComponentTreeWidget->setColumnHidden (2,true);  // PO index
2523   fSceneTreeComponentTreeWidget->setColumnHid    2585   fSceneTreeComponentTreeWidget->setColumnHidden (3,true);  // Informations
2524   //   data(0) : POindex                         2586   //   data(0) : POindex
2525   //   data(1) : copy number                     2587   //   data(1) : copy number
2526   //   data(2) : g4color                         2588   //   data(2) : g4color
2527                                                  2589 
2528   vLayout->addWidget(fSceneTreeComponentTreeW    2590   vLayout->addWidget(fSceneTreeComponentTreeWidget);
2529                                                  2591 
2530   connect(fSceneTreeComponentTreeWidget,SIGNA    2592   connect(fSceneTreeComponentTreeWidget,SIGNAL(itemChanged(QTreeWidgetItem*, int)),SLOT(sceneTreeComponentItemChanged(QTreeWidgetItem*, int)));
2531   connect(fSceneTreeComponentTreeWidget,SIGNA    2593   connect(fSceneTreeComponentTreeWidget,SIGNAL(itemSelectionChanged ()),SLOT(sceneTreeComponentSelected()));
2532   connect(fSceneTreeComponentTreeWidget,SIGNA    2594   connect(fSceneTreeComponentTreeWidget,SIGNAL(itemDoubleClicked ( QTreeWidgetItem*, int)),SLOT(changeColorAndTransparency( QTreeWidgetItem*, int)));
2533                                                  2595 
2534                                               << 2596   
2535   // Depth slider                                2597   // Depth slider
2536   QWidget *helpWidget = new QWidget();           2598   QWidget *helpWidget = new QWidget();
2537   QHBoxLayout *helpLayout = new QHBoxLayout()    2599   QHBoxLayout *helpLayout = new QHBoxLayout();
2538                                                  2600 
2539   QWidget* depthWidget = new QWidget();          2601   QWidget* depthWidget = new QWidget();
2540   QWidget *showBox = new QWidget(depthWidget)    2602   QWidget *showBox = new QWidget(depthWidget);
2541   QHBoxLayout *showBoxLayout = new QHBoxLayou    2603   QHBoxLayout *showBoxLayout = new QHBoxLayout();
2542                                                  2604 
2543   // reduce margins                              2605   // reduce margins
2544   showBoxLayout->setContentsMargins(5,5,5,5);    2606   showBoxLayout->setContentsMargins(5,5,5,5);
2545                                                  2607 
2546   QLabel *zero = new QLabel();                   2608   QLabel *zero = new QLabel();
2547   zero->setText("Show all");                  << 2609   zero->setText("Show all");          
2548   QLabel *one = new QLabel();                    2610   QLabel *one = new QLabel();
2549   one->setText("Hide all");                      2611   one->setText("Hide all");
2550   fSceneTreeDepthSlider = new QSlider ( Qt::H    2612   fSceneTreeDepthSlider = new QSlider ( Qt::Horizontal);
2551   fSceneTreeDepthSlider->setMaximum (1000);      2613   fSceneTreeDepthSlider->setMaximum (1000);
2552   fSceneTreeDepthSlider->setMinimum (0);         2614   fSceneTreeDepthSlider->setMinimum (0);
2553   fSceneTreeDepthSlider->setTickPosition(QSli    2615   fSceneTreeDepthSlider->setTickPosition(QSlider::TicksAbove);
2554   // set a minimum size                          2616   // set a minimum size
2555   fSceneTreeDepthSlider->setMinimumWidth (40)    2617   fSceneTreeDepthSlider->setMinimumWidth (40);
2556                                                  2618 
2557   showBoxLayout->addWidget(zero);                2619   showBoxLayout->addWidget(zero);
2558   showBoxLayout->addWidget(fSceneTreeDepthSli    2620   showBoxLayout->addWidget(fSceneTreeDepthSlider);
2559   showBoxLayout->addWidget(one);                 2621   showBoxLayout->addWidget(one);
2560                                                  2622 
2561   showBox->setLayout(showBoxLayout);             2623   showBox->setLayout(showBoxLayout);
2562                                                  2624 
2563   helpLayout->addWidget(showBox);                2625   helpLayout->addWidget(showBox);
2564   helpWidget->setLayout(helpLayout);             2626   helpWidget->setLayout(helpLayout);
2565   helpLayout->setContentsMargins(0,0,0,0);       2627   helpLayout->setContentsMargins(0,0,0,0);
2566                                                  2628 
2567   vLayout->addWidget(helpWidget);                2629   vLayout->addWidget(helpWidget);
2568                                               << 2630   
2569   connect( fSceneTreeDepthSlider, SIGNAL( val    2631   connect( fSceneTreeDepthSlider, SIGNAL( valueChanged(int) ), this, SLOT( changeDepthInSceneTree(int) ) );
2570   connect( fFilterOutput, SIGNAL( textEdited     2632   connect( fFilterOutput, SIGNAL( textEdited ( const QString &) ), this, SLOT(changeSearchSelection()));
2571   fTreeItemModels.clear();                       2633   fTreeItemModels.clear();
2572                                               << 2634   
2573   fPVRootNodeCreate = false;                     2635   fPVRootNodeCreate = false;
2574                                               << 2636   
2575   fMaxPOindexInserted = -1;                      2637   fMaxPOindexInserted = -1;
2576                                               << 2638   
2577                                                  2639 
2578 }                                                2640 }
2579                                                  2641 
2580                                                  2642 
2581 void G4OpenGLQtViewer::createViewerProperties    2643 void G4OpenGLQtViewer::createViewerPropertiesWidget() {
2582                                               << 2644   
2583   // Get the pointer to the Viewer Properties    2645   // Get the pointer to the Viewer Properties widget
2584   fUIViewerPropertiesWidget = fUiQt->GetViewe    2646   fUIViewerPropertiesWidget = fUiQt->GetViewerPropertiesWidget();
2585                                                  2647 
2586   if (!fUIViewerPropertiesWidget) {              2648   if (!fUIViewerPropertiesWidget) {
2587     return;                                      2649     return;
2588   }                                              2650   }
2589                                                  2651 
2590   // remove previous widgets                     2652   // remove previous widgets
2591   QLayoutItem * wItem;                           2653   QLayoutItem * wItem;
2592   if (fUIViewerPropertiesWidget->layout()->co    2654   if (fUIViewerPropertiesWidget->layout()->count()) {
2593     while ((wItem = fUIViewerPropertiesWidget    2655     while ((wItem = fUIViewerPropertiesWidget->layout()->takeAt(0)) != 0) {
2594       delete wItem->widget();                    2656       delete wItem->widget();
2595       delete wItem;                              2657       delete wItem;
2596     }                                            2658     }
2597   }                                              2659   }
2598                                                  2660 
2599   // add properties                              2661   // add properties
2600   QGroupBox *groupBox = new QGroupBox();         2662   QGroupBox *groupBox = new QGroupBox();
2601   groupBox->setTitle(GetName().data());          2663   groupBox->setTitle(GetName().data());
2602   QVBoxLayout *vbox = new QVBoxLayout;           2664   QVBoxLayout *vbox = new QVBoxLayout;
2603                                               << 2665   
2604   // add properties content                      2666   // add properties content
2605   fViewerPropertiesTableWidget = new QTableWi    2667   fViewerPropertiesTableWidget = new QTableWidget();
2606                                                  2668 
2607   QSizePolicy vPolicy = fViewerPropertiesTabl    2669   QSizePolicy vPolicy = fViewerPropertiesTableWidget->sizePolicy();
2608   vPolicy.setVerticalStretch(4);                 2670   vPolicy.setVerticalStretch(4);
2609                                               << 2671   
2610   vbox->addWidget(fViewerPropertiesTableWidge    2672   vbox->addWidget(fViewerPropertiesTableWidget);
2611   groupBox->setLayout(vbox);                     2673   groupBox->setLayout(vbox);
2612   fUIViewerPropertiesWidget->layout()->addWid    2674   fUIViewerPropertiesWidget->layout()->addWidget(groupBox);
2613                                                  2675 
2614   connect(fViewerPropertiesTableWidget, SIGNA    2676   connect(fViewerPropertiesTableWidget, SIGNAL(itemChanged(QTableWidgetItem*)),this, SLOT(tableWidgetViewerSetItemChanged(QTableWidgetItem *)));
2615                                               << 2677   
2616   updateViewerPropertiesTableWidget();           2678   updateViewerPropertiesTableWidget();
2617                                                  2679 
2618   QDialog* dial = static_cast<QDialog*> (fUIV    2680   QDialog* dial = static_cast<QDialog*> (fUIViewerPropertiesWidget->parent());
2619   if (dial) {                                    2681   if (dial) {
2620     // change name                               2682     // change name
2621     dial->setWindowTitle(QString("Viewer prop    2683     dial->setWindowTitle(QString("Viewer properties - ")+GetName());
2622   }                                              2684   }
2623 }                                                2685 }
2624                                                  2686 
2625                                                  2687 
2626 void G4OpenGLQtViewer::createPickInfosWidget(    2688 void G4OpenGLQtViewer::createPickInfosWidget(){
2627                                               << 2689   
2628   // Get the pointer to the Pick infos widget    2690   // Get the pointer to the Pick infos widget
2629   fUIPickInfosWidget = fUiQt->GetPickInfosWid    2691   fUIPickInfosWidget = fUiQt->GetPickInfosWidget();
2630                                               << 2692   
2631   if (!fUIPickInfosWidget) {                     2693   if (!fUIPickInfosWidget) {
2632     return;                                      2694     return;
2633   }                                              2695   }
2634                                               << 2696   
2635   // remove previous widgets                     2697   // remove previous widgets
2636   QLayoutItem * wItem;                           2698   QLayoutItem * wItem;
2637   if (fUIPickInfosWidget->layout()->count())     2699   if (fUIPickInfosWidget->layout()->count()) {
2638     while ((wItem = fUIPickInfosWidget->layou    2700     while ((wItem = fUIPickInfosWidget->layout()->takeAt(0)) != 0) {
2639       delete wItem->widget();                    2701       delete wItem->widget();
2640       delete wItem;                              2702       delete wItem;
2641     }                                            2703     }
2642   }                                              2704   }
2643                                               << 2705   
2644   QGroupBox *groupBox = new QGroupBox("");       2706   QGroupBox *groupBox = new QGroupBox("");
2645   QVBoxLayout *vbox = new QVBoxLayout;           2707   QVBoxLayout *vbox = new QVBoxLayout;
2646                                                  2708 
2647   // add picking infos                           2709   // add picking infos
2648   QWidget *pickingInfoWidget = new QWidget();    2710   QWidget *pickingInfoWidget = new QWidget();
2649   QHBoxLayout *pickingInfoLayout = new QHBoxL    2711   QHBoxLayout *pickingInfoLayout = new QHBoxLayout();
2650                                               << 2712   
2651   pickingInfoWidget->setStyleSheet ("padding-    2713   pickingInfoWidget->setStyleSheet ("padding-left: 0px; border:0px;");
2652   pickingInfoWidget->setLayout(pickingInfoLay    2714   pickingInfoWidget->setLayout(pickingInfoLayout);
2653                                               << 2715   
2654   vbox->addWidget(pickingInfoWidget);            2716   vbox->addWidget(pickingInfoWidget);
2655   // add picking content                         2717   // add picking content
2656                                               << 2718   
2657   fPickInfosScrollArea = new QScrollArea();      2719   fPickInfosScrollArea = new QScrollArea();
2658   fPickInfosScrollArea->setWidgetResizable(tr    2720   fPickInfosScrollArea->setWidgetResizable(true);
2659                                                  2721 
2660                                               << 2722   
2661   fPickInfosWidget = new QWidget();              2723   fPickInfosWidget = new QWidget();
2662   fPickInfosWidget->setStyleSheet ("padding:     2724   fPickInfosWidget->setStyleSheet ("padding: 0px ");
2663                                               << 2725   
2664   QVBoxLayout* vLayout = new QVBoxLayout();      2726   QVBoxLayout* vLayout = new QVBoxLayout();
2665   fPickInfosWidget->setLayout (vLayout);         2727   fPickInfosWidget->setLayout (vLayout);
2666   fPickInfosScrollArea->setWidget(fPickInfosW    2728   fPickInfosScrollArea->setWidget(fPickInfosWidget);
2667                                               << 2729   
2668   QSizePolicy vPolicy = fPickInfosWidget->siz    2730   QSizePolicy vPolicy = fPickInfosWidget->sizePolicy();
2669   vPolicy.setVerticalStretch(4);                 2731   vPolicy.setVerticalStretch(4);
2670   vbox->addWidget(fPickInfosScrollArea);         2732   vbox->addWidget(fPickInfosScrollArea);
2671   pickingInfoLayout->setContentsMargins(0,0,0    2733   pickingInfoLayout->setContentsMargins(0,0,0,0);
2672   vLayout->setContentsMargins(0,0,0,0);          2734   vLayout->setContentsMargins(0,0,0,0);
2673   vbox->setContentsMargins(1,1,1,1);             2735   vbox->setContentsMargins(1,1,1,1);
2674                                                  2736 
2675   groupBox->setLayout(vbox);                     2737   groupBox->setLayout(vbox);
2676   fUIPickInfosWidget->layout()->addWidget(gro    2738   fUIPickInfosWidget->layout()->addWidget(groupBox);
2677                                               << 2739   
2678   updatePickInfosWidget(fLastPickPoint.x(),fL    2740   updatePickInfosWidget(fLastPickPoint.x(),fLastPickPoint.y());
2679 }                                                2741 }
2680                                                  2742 
2681                                                  2743 
2682 // set the component to check/unchecked, also    2744 // set the component to check/unchecked, also go into its child
2683 // and set the same status to all his childs     2745 // and set the same status to all his childs
2684 void G4OpenGLQtViewer::setCheckComponent(QTre    2746 void G4OpenGLQtViewer::setCheckComponent(QTreeWidgetItem* item,bool check)
2685 {                                                2747 {
2686   if (item) {                                    2748   if (item) {
2687                                                  2749 
2688     const PVPath& fullPath = fTreeItemModels[    2750     const PVPath& fullPath = fTreeItemModels[item->data(0,Qt::UserRole).toInt()];
2689     // If a physical volume                      2751     // If a physical volume
2690     if (fullPath.size() > 0) {                   2752     if (fullPath.size() > 0) {
2691       SetTouchable(fullPath);                    2753       SetTouchable(fullPath);
2692       TouchableSetVisibility(fullPath, check)    2754       TouchableSetVisibility(fullPath, check);
2693       fMouseOnSceneTree = true;                  2755       fMouseOnSceneTree = true;
2694     }                                            2756     }
2695   }                                              2757   }
2696                                                  2758 
2697   if (item != NULL) {                            2759   if (item != NULL) {
2698     if (check) {                                 2760     if (check) {
2699       item->setCheckState(0,Qt::Checked);        2761       item->setCheckState(0,Qt::Checked);
2700     } else {                                     2762     } else {
2701       item->setCheckState(0,Qt::Unchecked);      2763       item->setCheckState(0,Qt::Unchecked);
2702     }                                            2764     }
2703     updatePositivePoIndexSceneTreeWidgetQuick    2765     updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
2704     int nChildCount = item->childCount();        2766     int nChildCount = item->childCount();
2705     for (int i = 0; i < nChildCount; i++) {      2767     for (int i = 0; i < nChildCount; i++) {
2706       setCheckComponent(item->child(i),check)    2768       setCheckComponent(item->child(i),check);
2707     }                                            2769     }
2708   }                                              2770   }
2709 }                                                2771 }
2710                                                  2772 
2711 #if QT_VERSION < 0x060000                     << 
2712 #else                                         << 
2713 //G.Barrand : from stackoverflow "How to rend << 
2714 static void transform_point(GLdouble out[4],  << 
2715 {                                             << 
2716 #define M(row,col)  m[col*4+row]              << 
2717     out[0] =                                  << 
2718         M(0, 0) * in[0] + M(0, 1) * in[1] + M << 
2719     out[1] =                                  << 
2720         M(1, 0) * in[0] + M(1, 1) * in[1] + M << 
2721     out[2] =                                  << 
2722         M(2, 0) * in[0] + M(2, 1) * in[1] + M << 
2723     out[3] =                                  << 
2724         M(3, 0) * in[0] + M(3, 1) * in[1] + M << 
2725 #undef M                                      << 
2726 }                                             << 
2727 inline GLint project_point(GLdouble objx, GLd << 
2728     const GLdouble model[16], const GLdouble  << 
2729     const GLint viewport[4],                  << 
2730     GLdouble * winx, GLdouble * winy, GLdoubl << 
2731 {                                             << 
2732     GLdouble in[4], out[4];                   << 
2733                                               << 
2734     in[0] = objx;                             << 
2735     in[1] = objy;                             << 
2736     in[2] = objz;                             << 
2737     in[3] = 1.0;                              << 
2738     transform_point(out, model, in);          << 
2739     transform_point(in, proj, out);           << 
2740                                               << 
2741     if (in[3] == 0.0)                         << 
2742         return GL_FALSE;                      << 
2743                                               << 
2744     in[0] /= in[3];                           << 
2745     in[1] /= in[3];                           << 
2746     in[2] /= in[3];                           << 
2747                                               << 
2748     *winx = viewport[0] + (1 + in[0]) * viewp << 
2749     *winy = viewport[1] + (1 + in[1]) * viewp << 
2750                                               << 
2751     *winz = (1 + in[2]) / 2;                  << 
2752     return GL_TRUE;                           << 
2753 }                                             << 
2754 static void render_text(QOpenGLWidget& widget << 
2755                  double world_x, double world << 
2756                  double offset_x, double offs << 
2757                  const QFont& font,           << 
2758                  const QColor& color,         << 
2759                  const char* text)            << 
2760 {                                             << 
2761     GLdouble model[4][4];                     << 
2762     glGetDoublev(GL_MODELVIEW_MATRIX, &model[ << 
2763     GLdouble proj[4][4];                      << 
2764     glGetDoublev(GL_PROJECTION_MATRIX, &proj[ << 
2765     GLint view[4];                            << 
2766     glGetIntegerv(GL_VIEWPORT, &view[0]);     << 
2767                                               << 
2768     GLdouble textPosX = 0, textPosY = 0, text << 
2769     project_point(world_x, world_y, world_z,  << 
2770                   &model[0][0], &proj[0][0],  << 
2771                   &textPosX, &textPosY, &text << 
2772                                               << 
2773     textPosX /= GLdouble(widget.devicePixelRa << 
2774     textPosY /= GLdouble(widget.devicePixelRa << 
2775                                               << 
2776     textPosY = GLdouble(widget.height()) - te << 
2777                                               << 
2778     textPosX += offset_x;                     << 
2779     textPosY += offset_y;                     << 
2780                                               << 
2781     GLboolean GL_BLEND_enabled = glIsEnabled( << 
2782                                               << 
2783     QPainter painter(&widget);                << 
2784     painter.setPen(color);                    << 
2785     painter.setFont(font);                    << 
2786     painter.setRenderHints(QPainter::Antialia << 
2787     painter.drawText(textPosX, textPosY, text << 
2788     painter.end();                            << 
2789                                               << 
2790     if(GL_BLEND_enabled==GL_TRUE) {           << 
2791       ::glEnable(GL_BLEND);                   << 
2792       ::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINU << 
2793     }                                         << 
2794 }                                             << 
2795 #endif                                        << 
2796                                                  2773 
2797 void G4OpenGLQtViewer::DrawText(const G4Text&    2774 void G4OpenGLQtViewer::DrawText(const G4Text& g4text)
2798 {                                                2775 {
2799   auto* qGLW = dynamic_cast<G4QGLWidgetType*> << 2776   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
2800   if (! qGLW) {                                  2777   if (! qGLW) {
2801     return;                                      2778     return;
2802   }                                              2779   }
2803   if (isGl2psWriting()) {                        2780   if (isGl2psWriting()) {
2804                                                  2781 
2805     G4OpenGLViewer::DrawText(g4text);            2782     G4OpenGLViewer::DrawText(g4text);
2806                                                  2783 
2807   } else {                                       2784   } else {
2808                                                  2785 
2809     if (!fGLWidget) return;                      2786     if (!fGLWidget) return;
2810                                                  2787 
2811     if (!G4Threading::IsMasterThread()) retur << 2788 #ifdef G4MULTITHREADED
                                                   >> 2789     if (G4Threading::G4GetThreadId() != G4Threading::MASTER_ID) return;
                                                   >> 2790 #endif
2812                                                  2791 
2813     G4VSceneHandler::MarkerSizeType sizeType;    2792     G4VSceneHandler::MarkerSizeType sizeType;
2814     G4double size = fSceneHandler.GetMarkerSi    2793     G4double size = fSceneHandler.GetMarkerSize(g4text,sizeType);
2815                                                  2794 
2816     QFont font = QFont();                        2795     QFont font = QFont();
2817     font.setPointSizeF(size);                    2796     font.setPointSizeF(size);
2818                                                  2797 
2819     const G4Colour& c = fSceneHandler.GetText    2798     const G4Colour& c = fSceneHandler.GetTextColour(g4text);
2820                                               << 2799     glColor4d(c.GetRed(),c.GetGreen(),c.GetBlue(),c.GetAlpha());
                                                   >> 2800     
2821     G4Point3D position = g4text.GetPosition()    2801     G4Point3D position = g4text.GetPosition();
2822                                                  2802 
2823     const G4String& textString = g4text.GetTe    2803     const G4String& textString = g4text.GetText();
2824     const char* textCString = textString.c_st    2804     const char* textCString = textString.c_str();
                                                   >> 2805   
                                                   >> 2806     glRasterPos3d(position.x(),position.y(),position.z());
2825                                                  2807 
2826     // Calculate move for centre and right ad    2808     // Calculate move for centre and right adjustment
2827     QFontMetrics f(font);                     << 2809     QFontMetrics* f = new QFontMetrics (font);
2828     G4double span = f.boundingRect(textCStrin << 2810 #if QT_VERSION > 0x050110
2829                                               << 2811     G4double span = f->boundingRect(textCString[0]).width();
2830     G4double xmove = 0.;                      << 2812 #else
2831     G4double ymove = 0.;                      << 2813     G4double span = f->width(textCString);
2832                                               << 2814 #endif
                                                   >> 2815     G4double xmove = 0., ymove = 0.;
2833     switch (g4text.GetLayout()) {                2816     switch (g4text.GetLayout()) {
2834     case G4Text::left: break;                    2817     case G4Text::left: break;
2835     case G4Text::centre: xmove -= span / 2.;     2818     case G4Text::centre: xmove -= span / 2.; break;
2836     case G4Text::right: xmove -= span;           2819     case G4Text::right: xmove -= span;
2837     }                                            2820     }
2838                                               << 2821     
2839     //Add offsets                                2822     //Add offsets
2840     xmove += g4text.GetXOffset();                2823     xmove += g4text.GetXOffset();
2841     ymove += g4text.GetYOffset();                2824     ymove += g4text.GetYOffset();
2842                                                  2825 
2843 #if QT_VERSION < 0x060000                     << 
2844     glColor4d(c.GetRed(),c.GetGreen(),c.GetBl << 
2845     glRasterPos3d(position.x(),position.y(),p << 
2846     // xmove, ymove in pixels - or are they?  << 
2847 #ifdef __APPLE__                              << 
2848     const G4double fudgeFactor = 2.;          << 
2849 #else                                         << 
2850     const G4double fudgeFactor = 1.;          << 
2851 #endif                                        << 
2852     xmove *= fudgeFactor;                     << 
2853     ymove *= fudgeFactor;                     << 
2854     qGLW->renderText                             2826     qGLW->renderText
2855       ((position.x()+(2*xmove)/getWinWidth())    2827       ((position.x()+(2*xmove)/getWinWidth()),
2856        (position.y()+(2*ymove)/getWinHeight()    2828        (position.y()+(2*ymove)/getWinHeight()),
2857        position.z(),                             2829        position.z(),
2858        textCString,                              2830        textCString,
2859        font);                                    2831        font);
2860 #else                                         << 2832     
2861     QColor color((int)(c.GetRed()*255),       << 
2862                  (int)(c.GetGreen()*255),     << 
2863                  (int)(c.GetBlue()*255),      << 
2864                  (int)(c.GetAlpha()*255));    << 
2865     render_text(*qGLW,                        << 
2866                 position.x(),position.y(),pos << 
2867                 xmove,ymove,                  << 
2868                 font,color,textCString);      << 
2869 #endif                                        << 
2870   }                                              2833   }
2871 }                                                2834 }
2872                                                  2835 
2873                                                  2836 
2874 void G4OpenGLQtViewer::ResetView () {            2837 void G4OpenGLQtViewer::ResetView () {
2875   G4OpenGLViewer::ResetView();                   2838   G4OpenGLViewer::ResetView();
2876   fDeltaDepth = 0.01;                            2839   fDeltaDepth = 0.01;
2877   fDeltaZoom = 0.05;                             2840   fDeltaZoom = 0.05;
2878 }                                                2841 }
2879                                                  2842 
2880                                                  2843 
2881                                                  2844 
2882                                                  2845 
2883 void G4OpenGLQtViewer::addPVSceneTreeElement(    2846 void G4OpenGLQtViewer::addPVSceneTreeElement(const G4String& model, G4PhysicalVolumeModel* pPVModel, int currentPOIndex) {
2884                                                  2847 
2885   const QString& modelShortName = getModelSho    2848   const QString& modelShortName = getModelShortName(model);
2886                                                  2849 
2887   if (modelShortName == "") {                    2850   if (modelShortName == "") {
2888     return ;                                     2851     return ;
2889   }                                              2852   }
2890   // try to init it                              2853   // try to init it
2891   if (fSceneTreeComponentTreeWidget == NULL)     2854   if (fSceneTreeComponentTreeWidget == NULL) {
2892     createSceneTreeComponent();                  2855     createSceneTreeComponent();
2893   }                                              2856   }
2894                                                  2857 
2895   // if no UI                                    2858   // if no UI
2896   if (fSceneTreeComponentTreeWidget == NULL)     2859   if (fSceneTreeComponentTreeWidget == NULL) {
2897     return;                                      2860     return;
2898   }                                              2861   }
2899                                                  2862 
2900   fSceneTreeComponentTreeWidget->blockSignals    2863   fSceneTreeComponentTreeWidget->blockSignals(true);
2901                                                  2864 
2902   // Create the "volume" node if not             2865   // Create the "volume" node if not
2903   //  if (fSceneTreeComponentTreeWidget->topL    2866   //  if (fSceneTreeComponentTreeWidget->topLevelItemCount () == 0) {
2904   if (!fPVRootNodeCreate) {                      2867   if (!fPVRootNodeCreate) {
2905     const G4Colour& color = fSceneHandler.Get    2868     const G4Colour& color = fSceneHandler.GetColour();
2906                                               << 2869     
2907     fModelShortNameItem = createTreeWidgetIte    2870     fModelShortNameItem = createTreeWidgetItem(pPVModel->GetFullPVPath(),
2908                                                  2871                                                modelShortName,
2909                                                  2872                                                0, // currentPVCopyNb
2910                                                  2873                                                -1, // currentPVPOIndex
2911                                                  2874                                                "",
2912                                                  2875                                                Qt::Checked,
2913                                                  2876                                                NULL,
2914                                                  2877                                                color);
2915     fPVRootNodeCreate = true;                    2878     fPVRootNodeCreate = true;
2916   }                                              2879   }
2917                                                  2880 
2918   bool added = parseAndInsertInSceneTree(fMod    2881   bool added = parseAndInsertInSceneTree(fModelShortNameItem,pPVModel,0,modelShortName,0,currentPOIndex);
2919   if (!added) {                                  2882   if (!added) {
2920   }                                              2883   }
2921                                               << 2884   
2922   fSceneTreeComponentTreeWidget->blockSignals    2885   fSceneTreeComponentTreeWidget->blockSignals(false);
2923                                               << 2886   
2924 }                                                2887 }
2925                                                  2888 
2926                                                  2889 
2927 /**                                              2890 /**
2928    if treeNode is NULL, then add this treeNod    2891    if treeNode is NULL, then add this treeNode to the TreeWidget
2929    @return the inserted item                     2892    @return the inserted item
2930 */                                               2893 */
2931 QTreeWidgetItem* G4OpenGLQtViewer::createTree    2894 QTreeWidgetItem* G4OpenGLQtViewer::createTreeWidgetItem(
2932  const PVPath& fullPath                          2895  const PVPath& fullPath
2933  ,const QString& name                            2896  ,const QString& name
2934  ,int copyNb                                     2897  ,int copyNb
2935  ,int POIndex                                    2898  ,int POIndex
2936  ,const QString& logicalName                     2899  ,const QString& logicalName
2937  ,Qt::CheckState state                           2900  ,Qt::CheckState state
2938  ,QTreeWidgetItem * parentTreeNode               2901  ,QTreeWidgetItem * parentTreeNode
2939  ,const G4Colour& color                          2902  ,const G4Colour& color
2940 ) {                                              2903 ) {
2941                                                  2904 
2942   // Set depth                                   2905   // Set depth
2943   if (fullPath.size() > fSceneTreeDepth) {       2906   if (fullPath.size() > fSceneTreeDepth) {
2944     fSceneTreeDepth = (unsigned int)fullPath. << 2907     fSceneTreeDepth = fullPath.size();
2945     // Change slider value                       2908     // Change slider value
2946     if (fSceneTreeDepthSlider) {                 2909     if (fSceneTreeDepthSlider) {
2947       fSceneTreeDepthSlider->setTickInterval(    2910       fSceneTreeDepthSlider->setTickInterval(1000/(fSceneTreeDepth+1));
2948     }                                            2911     }
2949   }                                              2912   }
2950   QTreeWidgetItem * newItem = NULL;              2913   QTreeWidgetItem * newItem = NULL;
2951   if (parentTreeNode == NULL) {                  2914   if (parentTreeNode == NULL) {
2952     newItem = new QTreeWidgetItem();             2915     newItem = new QTreeWidgetItem();
2953     fSceneTreeComponentTreeWidget->addTopLeve    2916     fSceneTreeComponentTreeWidget->addTopLevelItem(newItem);
2954   } else {                                       2917   } else {
2955     newItem = new QTreeWidgetItem(parentTreeN    2918     newItem = new QTreeWidgetItem(parentTreeNode);
2956     fSceneTreeComponentTreeWidget->addTopLeve    2919     fSceneTreeComponentTreeWidget->addTopLevelItem(parentTreeNode);
2957   }                                              2920   }
2958                                                  2921 
2959                                                  2922 
2960   newItem->setText(0,name);                      2923   newItem->setText(0,name);
2961   newItem->setData(1,Qt::UserRole,copyNb);       2924   newItem->setData(1,Qt::UserRole,copyNb);
2962   newItem->setText(2,QString::number(POIndex)    2925   newItem->setText(2,QString::number(POIndex));
2963   newItem->setData(0, Qt::UserRole, POIndex);    2926   newItem->setData(0, Qt::UserRole, POIndex);
2964   newItem->setText(3,logicalName);               2927   newItem->setText(3,logicalName);
2965   newItem->setFlags(newItem->flags()|Qt::Item    2928   newItem->setFlags(newItem->flags()|Qt::ItemIsUserCheckable);
2966   newItem->setCheckState(0,state);               2929   newItem->setCheckState(0,state);
2967   newItem->setExpanded(true);                    2930   newItem->setExpanded(true);
2968   updatePositivePoIndexSceneTreeWidgetQuickMa    2931   updatePositivePoIndexSceneTreeWidgetQuickMap(POIndex,newItem);
2969                                                  2932 
2970   changeQColorForTreeWidgetItem(newItem,QColo    2933   changeQColorForTreeWidgetItem(newItem,QColor((int)(color.GetRed()*255),
2971                                                  2934                                                (int)(color.GetGreen()*255),
2972                                                  2935                                                (int)(color.GetBlue()*255),
2973                                                  2936                                                (int)(color.GetAlpha()*255)));
2974                                                  2937 
2975   // If invisible                                2938   // If invisible
2976   if ((state == Qt::Unchecked) && (POIndex ==    2939   if ((state == Qt::Unchecked) && (POIndex == -1)) {
2977     newItem->setForeground (0, QBrush( Qt::gr    2940     newItem->setForeground (0, QBrush( Qt::gray) );
2978                                               << 2941     
2979     // Set a tootip                              2942     // Set a tootip
2980     newItem->setToolTip (0,QString(              2943     newItem->setToolTip (0,QString(
2981                                    "This node    2944                                    "This node exists in the geometry but has not been\n")+
2982                          "drawn, perhaps beca    2945                          "drawn, perhaps because it has been set invisible. It \n"+
2983                          "cannot be made visi    2946                          "cannot be made visible with a click on the button.\n"+
2984                          "To see it, change t    2947                          "To see it, change the visibility, for example, with \n"+
2985                          "/vis/geometry/set/v    2948                          "/vis/geometry/set/visibility " + logicalName + " 0 true\n"+
2986                          "and rebuild the vie    2949                          "and rebuild the view with /vis/viewer/rebuild.\n"+
2987                          "Click here will onl    2950                          "Click here will only show/hide all child components");
2988   } else {                                       2951   } else {
2989     // Set a tootip                              2952     // Set a tootip
2990     newItem->setToolTip (0,QString("double-cl    2953     newItem->setToolTip (0,QString("double-click to change the color"));
2991   }                                              2954   }
2992                                                  2955 
2993   // special case: if alpha=0, it is a totall    2956   // special case: if alpha=0, it is a totally transparent objet,
2994   // then, do not redraw it                      2957   // then, do not redraw it
2995   if (color.GetAlpha() == 0) {                   2958   if (color.GetAlpha() == 0) {
2996     state = Qt::Unchecked;                       2959     state = Qt::Unchecked;
2997     newItem->setCheckState(0,state);             2960     newItem->setCheckState(0,state);
2998     updatePositivePoIndexSceneTreeWidgetQuick    2961     updatePositivePoIndexSceneTreeWidgetQuickMap(POIndex,newItem);
2999   }                                              2962   }
3000                                                  2963 
3001   fTreeItemModels.insert(std::pair <int, PVPa    2964   fTreeItemModels.insert(std::pair <int, PVPath > (POIndex,fullPath) );
3002                                                  2965 
3003   // Check last status of this item and chang << 2966   // Check last status of this item and change if necessary 
3004   // open/close/hidden/visible/selected          2967   // open/close/hidden/visible/selected
3005   changeOpenCloseVisibleHiddenSelectedColorSc    2968   changeOpenCloseVisibleHiddenSelectedColorSceneTreeElement(newItem);
3006   return newItem;                                2969   return newItem;
3007 }                                                2970 }
3008                                                  2971 
3009                                                  2972 
3010 //                                               2973 //
3011 //   Recursive function.                         2974 //   Recursive function.
3012 //   Try to insert the given item :              2975 //   Try to insert the given item :
3013 //   - If not present and last item of the pa    2976 //   - If not present and last item of the path: insert it and mark it CHECK
3014 //   - If not present and NOT last item of th    2977 //   - If not present and NOT last item of the path: insert it and mark it UNCHECKED
3015 //   - If already present and name/PO/Transfo    2978 //   - If already present and name/PO/Transformation identical, then it is a transparent
3016 //     object : Change the PO number and tran    2979 //     object : Change the PO number and transparency
3017 //   - If already present and PO different, t    2980 //   - If already present and PO different, then it is an unvisible item : Have to
3018 //     set it visible                            2981 //     set it visible
3019 //   - else : Create a new element               2982 //   - else : Create a new element
3020 //   @return true if inserted, false if alrea    2983 //   @return true if inserted, false if already present
3021 //                                               2984 //
3022 bool G4OpenGLQtViewer::parseAndInsertInSceneT    2985 bool G4OpenGLQtViewer::parseAndInsertInSceneTree(
3023  QTreeWidgetItem * parentItem                    2986  QTreeWidgetItem * parentItem
3024  ,G4PhysicalVolumeModel* pPVModel                2987  ,G4PhysicalVolumeModel* pPVModel
3025  ,unsigned int fullPathIndex                     2988  ,unsigned int fullPathIndex
3026  ,const QString& parentRoot                      2989  ,const QString& parentRoot
3027  ,unsigned int currentIndexInTreeSceneHandler    2990  ,unsigned int currentIndexInTreeSceneHandler
3028  ,int currentPVPOIndex                           2991  ,int currentPVPOIndex
3029 ) {                                              2992 ) {
3030                                                  2993 
3031   if (parentItem == NULL) {                      2994   if (parentItem == NULL) {
3032     return false;                                2995     return false;
3033   }                                              2996   }
3034                                                  2997 
3035   const PVPath& fullPath = pPVModel->GetFullP    2998   const PVPath& fullPath = pPVModel->GetFullPVPath();
3036                                                  2999 
3037   std::ostringstream oss;                        3000   std::ostringstream oss;
3038   oss << fullPath.at(fullPathIndex).GetCopyNo    3001   oss << fullPath.at(fullPathIndex).GetCopyNo();
3039   std::string currentPVName = G4String(fullPa    3002   std::string currentPVName = G4String(fullPath.at(fullPathIndex).GetPhysicalVolume()->GetName()+" ["+oss.str()+"]").data();
3040                                                  3003 
3041   int currentPVCopyNb = fullPath.at(fullPathI    3004   int currentPVCopyNb = fullPath.at(fullPathIndex).GetCopyNo();
3042                                                  3005 
3043   const G4Colour& color = fSceneHandler.GetCo    3006   const G4Colour& color = fSceneHandler.GetColour();
3044                                                  3007 
3045   // look in all children in order to get if     3008   // look in all children in order to get if their is already a
3046   // child corresponding:                        3009   // child corresponding:
3047   // - if so, go into this child                 3010   // - if so, go into this child
3048   // - if not : create it as invisible           3011   // - if not : create it as invisible
3049                                                  3012 
3050   // Realy quick check if the POindex is alre    3013   // Realy quick check if the POindex is already there
3051   QTreeWidgetItem* subItem = NULL;               3014   QTreeWidgetItem* subItem = NULL;
3052   QList<QTreeWidgetItem *> parentItemList;       3015   QList<QTreeWidgetItem *> parentItemList;
3053                                               << 3016   
3054                                               << 3017     
3055   // first of all, very quick check if it was    3018   // first of all, very quick check if it was not the same as last one
3056                                                  3019 
3057   // Check only if it is a transparent object    3020   // Check only if it is a transparent object
3058   // If it is the last item and it is not tra << 3021   // If it is the last item and it is not transparent -> nothing to look for, 
3059   // simply add it.                              3022   // simply add it.
3060   if ((currentIndexInTreeSceneHandler == (ful    3023   if ((currentIndexInTreeSceneHandler == (fullPath.size()-1)) && ((color.GetAlpha() == 1.))) {
3061   } else {                                       3024   } else {
3062     QString lookForString = QString(currentPV    3025     QString lookForString = QString(currentPVName.c_str());
3063     for (int i = 0;i < parentItem->childCount    3026     for (int i = 0;i < parentItem->childCount(); i++ ) {
3064       if (parentItem->child(i)->text(0) == lo    3027       if (parentItem->child(i)->text(0) == lookForString) {
3065         parentItemList.push_back(parentItem->    3028         parentItemList.push_back(parentItem->child(i));
3066       }                                          3029       }
3067     }                                            3030     }
3068   }                                              3031   }
3069                                               << 3032    
3070   for (int i = 0; i < parentItemList.size();     3033   for (int i = 0; i < parentItemList.size(); ++i) {
3071     const std::string& parentItemName = paren    3034     const std::string& parentItemName = parentItemList.at(i)->text(0).toStdString();
3072     int parentItemCopyNb = parentItemList.at(    3035     int parentItemCopyNb = parentItemList.at(i)->data(1,Qt::UserRole).toInt();
3073     int parentItemPOIndex = parentItemList.at    3036     int parentItemPOIndex = parentItemList.at(i)->data(0,Qt::UserRole).toInt();
3074                                               << 3037         
3075     // if already inside                         3038     // if already inside
3076     // -> return true                            3039     // -> return true
3077     // special case, do not have to deal with    3040     // special case, do not have to deal with hierarchy except for PhysicalVolume
3078                                                  3041 
3079                                               << 3042     
3080     /* Physical Volume AND copy number equal     3043     /* Physical Volume AND copy number equal AND  name equal */
3081     if (((parentRoot == fTouchableVolumes) &&    3044     if (((parentRoot == fTouchableVolumes) &&  (currentPVCopyNb == parentItemCopyNb)
3082          && (currentPVName == parentItemName)    3045          && (currentPVName == parentItemName))        ||
3083         /* NOT a Physical Volume AND  copy nu    3046         /* NOT a Physical Volume AND  copy number equal */
3084         ((parentRoot != fTouchableVolumes) && << 3047         ((parentRoot != fTouchableVolumes) && (currentPVCopyNb == parentItemCopyNb) 
3085          /*AND  name equal AND  PO index equa    3048          /*AND  name equal AND  PO index equal*/
3086          && (currentPVName == parentItemName)    3049          && (currentPVName == parentItemName) && (currentPVPOIndex == parentItemPOIndex) )) {
3087                                               << 3050       
3088       // then check for the Transform3D          3051       // then check for the Transform3D
3089       bool sameTransform = true;                 3052       bool sameTransform = true;
3090       if (parentItemPOIndex >= 0) {              3053       if (parentItemPOIndex >= 0) {
3091         const PVPath& fullPathTmp = fTreeItem    3054         const PVPath& fullPathTmp = fTreeItemModels[parentItemPOIndex];
3092         if (fullPathTmp.size() > 0) {            3055         if (fullPathTmp.size() > 0) {
3093           if (fullPathTmp.at(fullPathTmp.size    3056           if (fullPathTmp.at(fullPathTmp.size()-1).GetTransform () == pPVModel->GetTransformation ()) {
3094             sameTransform = true;                3057             sameTransform = true;
3095           } else {                               3058           } else {
3096             sameTransform = false;               3059             sameTransform = false;
3097           }                                      3060           }
3098         }                                        3061         }
3099       }                                          3062       }
3100                                                  3063 
3101       // Same transformation, then try to cha    3064       // Same transformation, then try to change the PO index
3102       if (sameTransform == true) {               3065       if (sameTransform == true) {
3103         // already exist in the tree, is it a    3066         // already exist in the tree, is it a transparent object ?
3104         // If so, then have to change the PO     3067         // If so, then have to change the PO index ONLY if it is the last
3105         // and then change the state ONLY if     3068         // and then change the state ONLY if POIndex has change
3106         // If not, then go deaper                3069         // If not, then go deaper
3107                                               << 3070         
3108         // last element                          3071         // last element
3109         if (currentIndexInTreeSceneHandler ==    3072         if (currentIndexInTreeSceneHandler == (fullPath.size()-1)) {
3110                                               << 3073           
3111           parentItemList.at(i)->setText(2,QSt    3074           parentItemList.at(i)->setText(2,QString::number(currentPVPOIndex));
3112           parentItemList.at(i)->setData(0, Qt    3075           parentItemList.at(i)->setData(0, Qt::UserRole,currentPVPOIndex);
3113                                               << 3076           
3114           fTreeItemModels.insert(std::pair <i    3077           fTreeItemModels.insert(std::pair <int, PVPath >(currentPVPOIndex,fullPath) );
3115                                               << 3078           
3116           // Then remove tooltip and special     3079           // Then remove tooltip and special font
3117           QFont f = QFont();                     3080           QFont f = QFont();
3118           parentItemList.at(i)->setFont (0,f)    3081           parentItemList.at(i)->setFont (0,f);
3119                                               << 3082           
3120           // set foreground                      3083           // set foreground
3121           parentItemList.at(i)->setForeground    3084           parentItemList.at(i)->setForeground (0,QBrush());
3122                                               << 3085           
3123           // Set a tootip                        3086           // Set a tootip
3124           parentItemList.at(i)->setToolTip (0    3087           parentItemList.at(i)->setToolTip (0,"");
3125                                               << 3088           
3126           changeQColorForTreeWidgetItem(paren    3089           changeQColorForTreeWidgetItem(parentItemList.at(i),QColor((int)(color.GetRed()*255),
3127                                                  3090                                                                     (int)(color.GetGreen()*255),
3128                                                  3091                                                                     (int)(color.GetBlue()*255),
3129                                                  3092                                                                     (int)(color.GetAlpha()*255)));
3130                                               << 3093           
3131           // set check only if there is somet    3094           // set check only if there is something to display
3132           if (color.GetAlpha() > 0) {            3095           if (color.GetAlpha() > 0) {
3133             parentItemList.at(i)->setCheckSta    3096             parentItemList.at(i)->setCheckState(0,Qt::Checked);
3134             updatePositivePoIndexSceneTreeWid    3097             updatePositivePoIndexSceneTreeWidgetQuickMap(currentPVPOIndex,parentItemList.at(i));
3135           }                                      3098           }
3136           return false;                          3099           return false;
3137         } else {                                 3100         } else {
3138           subItem = parentItemList.at(i);     << 3101           subItem = parentItemList.at(i);        
3139         }                                        3102         }
3140                                               << 3103         
3141         // Exists but not the end of path, th    3104         // Exists but not the end of path, then forget get it
3142       } else if (currentIndexInTreeSceneHandl    3105       } else if (currentIndexInTreeSceneHandler < (fullPath.size()-1))  {
3143         subItem = parentItemList.at(i);          3106         subItem = parentItemList.at(i);
3144       }                                          3107       }
3145     }                                            3108     }
3146                                                  3109 
3147   } // end for                                   3110   } // end for
3148                                               << 3111   
3149   // if it the last, then add it and set it c    3112   // if it the last, then add it and set it checked
3150   if (currentIndexInTreeSceneHandler == (full    3113   if (currentIndexInTreeSceneHandler == (fullPath.size()-1)) {
3151     /* subItem =*/ createTreeWidgetItem(fullP    3114     /* subItem =*/ createTreeWidgetItem(fullPath,
3152                                    QString(cu    3115                                    QString(currentPVName.c_str()),
3153                                    currentPVC    3116                                    currentPVCopyNb,
3154                                    currentPVP    3117                                    currentPVPOIndex,
3155                                    QString(fu    3118                                    QString(fullPath.at(fullPathIndex).GetPhysicalVolume()->GetLogicalVolume()->GetName().data()),
3156                                    Qt::Checke    3119                                    Qt::Checked,
3157                                    parentItem    3120                                    parentItem,
3158                                    color);       3121                                    color);
3159                                                  3122 
3160     if (currentPVPOIndex > fMaxPOindexInserte    3123     if (currentPVPOIndex > fMaxPOindexInserted) {
3161       fMaxPOindexInserted = currentPVPOIndex;    3124       fMaxPOindexInserted = currentPVPOIndex;
3162     }                                            3125     }
3163                                                  3126 
3164   } else {                                       3127   } else {
3165                                               << 3128     
3166     // if no child found, then this child is     3129     // if no child found, then this child is create and marked as invisible, then go inside
3167     if (subItem == NULL) {                       3130     if (subItem == NULL) {
3168                                               << 3131       
3169       if (currentIndexInTreeSceneHandler < (f    3132       if (currentIndexInTreeSceneHandler < (fullPath.size()-1))  {
3170         subItem = createTreeWidgetItem(fullPa    3133         subItem = createTreeWidgetItem(fullPath,
3171                                        QStrin    3134                                        QString(currentPVName.c_str()),
3172                                        curren    3135                                        currentPVCopyNb,
3173                                        -1,       3136                                        -1,
3174                                        QStrin    3137                                        QString(fullPath.at(fullPathIndex).GetPhysicalVolume()->GetLogicalVolume()->GetName().data()),
3175                                        Qt::Un    3138                                        Qt::Unchecked,
3176                                        parent    3139                                        parentItem,
3177                                        color)    3140                                        color);
3178       }                                          3141       }
3179     }                                            3142     }
3180                                               << 3143     
3181     return parseAndInsertInSceneTree(subItem,    3144     return parseAndInsertInSceneTree(subItem,pPVModel,fullPathIndex+1,parentRoot,currentIndexInTreeSceneHandler+1,currentPVPOIndex);
3182   }                                              3145   }
3183   return true;                                   3146   return true;
3184 }                                                3147 }
3185                                                  3148 
3186                                                  3149 
3187 void G4OpenGLQtViewer::changeOpenCloseVisible    3150 void G4OpenGLQtViewer::changeOpenCloseVisibleHiddenSelectedColorSceneTreeElement(
3188  QTreeWidgetItem* subItem                        3151  QTreeWidgetItem* subItem
3189 )                                                3152 )
3190 {                                                3153 {
3191   // Check if object with the same POIndex is    3154   // Check if object with the same POIndex is the same in old tree
3192   QTreeWidgetItem* oldItem = NULL;               3155   QTreeWidgetItem* oldItem = NULL;
3193                                                  3156 
3194   QTreeWidgetItem* foundItem = getOldTreeWidg    3157   QTreeWidgetItem* foundItem = getOldTreeWidgetItem(subItem->data(0,Qt::UserRole).toInt());
3195                                                  3158 
3196   if (foundItem != NULL) {                       3159   if (foundItem != NULL) {
3197     if (isSameSceneTreeElement(foundItem,subI    3160     if (isSameSceneTreeElement(foundItem,subItem)) {
3198       oldItem = foundItem;                       3161       oldItem = foundItem;
3199     }                                            3162     }
3200   }                                              3163   }
3201   if (foundItem == NULL) {  // PO should have    3164   if (foundItem == NULL) {  // PO should have change, parse all
3202                                                  3165 
3203     // POindex > 0                               3166     // POindex > 0
3204     std::map <int, QTreeWidgetItem*>::const_i    3167     std::map <int, QTreeWidgetItem*>::const_iterator i;
3205     i = fOldPositivePoIndexSceneTreeWidgetQui << 3168     i = fOldPositivePoIndexSceneTreeWidgetQuickMap.begin();
3206     while (i != fOldPositivePoIndexSceneTreeW << 3169     while (i != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3207       if (isSameSceneTreeElement(i->second,su    3170       if (isSameSceneTreeElement(i->second,subItem)) {
3208         oldItem = i->second;                     3171         oldItem = i->second;
3209         i = fOldPositivePoIndexSceneTreeWidge << 3172         i = fOldPositivePoIndexSceneTreeWidgetQuickMap.end();
3210       } else {                                   3173       } else {
3211         ++i;                                  << 3174         i++;
3212       }                                          3175       }
3213     }                                            3176     }
3214     // POindex == 0 ?                            3177     // POindex == 0 ?
3215     if (oldItem == NULL) {                       3178     if (oldItem == NULL) {
3216       std::size_t a = 0;                      << 3179       unsigned int a = 0;
3217       while (a < fOldNullPoIndexSceneTreeWidg    3180       while (a < fOldNullPoIndexSceneTreeWidgetQuickVector.size()) {
3218         if (isSameSceneTreeElement(fOldNullPo    3181         if (isSameSceneTreeElement(fOldNullPoIndexSceneTreeWidgetQuickVector[a],subItem)) {
3219           oldItem = fOldNullPoIndexSceneTreeW    3182           oldItem = fOldNullPoIndexSceneTreeWidgetQuickVector[a];
3220           a = fOldNullPoIndexSceneTreeWidgetQ    3183           a = fOldNullPoIndexSceneTreeWidgetQuickVector.size();
3221         } else {                                 3184         } else {
3222           ++a;                                << 3185           a++;
3223         }                                        3186         }
3224       }                                          3187       }
3225     }                                            3188     }
3226   }                                              3189   }
3227                                                  3190 
3228   // if found : retore old state                 3191   // if found : retore old state
3229   if (oldItem != NULL) {                         3192   if (oldItem != NULL) {
3230     subItem->setFlags(oldItem->flags());   //    3193     subItem->setFlags(oldItem->flags());   // flags
3231     subItem->setCheckState(0,oldItem->checkSt    3194     subItem->setCheckState(0,oldItem->checkState(0)); // check state
3232     subItem->setSelected(oldItem->isSelected(    3195     subItem->setSelected(oldItem->isSelected());  // selected
3233     subItem->setExpanded(oldItem->isExpanded     3196     subItem->setExpanded(oldItem->isExpanded ());  // expand
3234                                                  3197 
3235     // change color                              3198     // change color
3236     // when we call this function, the color     3199     // when we call this function, the color in the item is the one of vis Attr
3237                                                  3200 
3238     std::map <int, QTreeWidgetItem* >::iterat    3201     std::map <int, QTreeWidgetItem* >::iterator it;
3239                                               << 3202     
3240     // getOldPO                                  3203     // getOldPO
3241     int oldPOIndex = oldItem->data(0,Qt::User    3204     int oldPOIndex = oldItem->data(0,Qt::UserRole).toInt();
3242     it = fOldPositivePoIndexSceneTreeWidgetQu    3205     it = fOldPositivePoIndexSceneTreeWidgetQuickMap.find(oldPOIndex);
3243     QColor color;                                3206     QColor color;
3244                                                  3207 
3245     // get old Vis Attr Color                    3208     // get old Vis Attr Color
3246     std::map <int, QColor >::iterator itVis;     3209     std::map <int, QColor >::iterator itVis;
3247     itVis = fOldVisAttrColorMap.find(oldPOInd    3210     itVis = fOldVisAttrColorMap.find(oldPOIndex);
3248                                                  3211 
3249     QColor oldVisAttrColor;                      3212     QColor oldVisAttrColor;
3250     const QColor& newVisAttrColor = subItem->    3213     const QColor& newVisAttrColor = subItem->data(2,Qt::UserRole).value<QColor>();
3251                                                  3214 
3252     bool visAttrChange = false;                  3215     bool visAttrChange = false;
3253     // if old vis attr color found               3216     // if old vis attr color found
3254     if (itVis != fOldVisAttrColorMap.end()) {    3217     if (itVis != fOldVisAttrColorMap.end()) {
3255       oldVisAttrColor = itVis->second;           3218       oldVisAttrColor = itVis->second;
3256       if (oldVisAttrColor != newVisAttrColor)    3219       if (oldVisAttrColor != newVisAttrColor) {
3257         visAttrChange = true;                    3220         visAttrChange = true;
3258       }                                          3221       }
3259     } else {                                     3222     } else {
3260       visAttrChange = true;                      3223       visAttrChange = true;
3261     }                                            3224     }
3262                                               << 3225     
3263     if (visAttrChange) {                         3226     if (visAttrChange) {
3264       fOldVisAttrColorMap.insert(std::pair <i    3227       fOldVisAttrColorMap.insert(std::pair <int, QColor > (subItem->data(0,Qt::UserRole).toInt(),newVisAttrColor) );
3265                                                  3228 
3266     } else { // if no changes, get old PO val    3229     } else { // if no changes, get old PO value
3267       // if old PO found                         3230       // if old PO found
3268       if (it != fOldPositivePoIndexSceneTreeW    3231       if (it != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3269         color = (it->second)->data(2,Qt::User << 3232         color = (it->second)->data(2,Qt::UserRole).value<QColor>(); 
3270       } else {                                   3233       } else {
3271         color = oldItem->data(2,Qt::UserRole) << 3234         color = oldItem->data(2,Qt::UserRole).value<QColor>(); 
3272       }                                          3235       }
3273       changeQColorForTreeWidgetItem(subItem,c    3236       changeQColorForTreeWidgetItem(subItem,color);
3274     }                                            3237     }
3275   }                                              3238   }
3276                                                  3239 
3277   return;                                        3240   return;
3278 }                                                3241 }
3279                                                  3242 
3280                                                  3243 
3281                                                  3244 
3282 // Check if both items are identical.            3245 // Check if both items are identical.
3283 // For that, check name, copy number, transfo    3246 // For that, check name, copy number, transformation
3284 // special case for "non Touchables", do not     3247 // special case for "non Touchables", do not check the PO index, check only the name
3285 bool G4OpenGLQtViewer::isSameSceneTreeElement    3248 bool G4OpenGLQtViewer::isSameSceneTreeElement(
3286  QTreeWidgetItem* parentOldItem                  3249  QTreeWidgetItem* parentOldItem
3287  ,QTreeWidgetItem* parentNewItem                 3250  ,QTreeWidgetItem* parentNewItem
3288 ) {                                              3251 ) {
3289                                                  3252 
3290   int newPO = -1;                                3253   int newPO = -1;
3291   int oldPO = -1;                                3254   int oldPO = -1;
3292                                               << 3255   
3293   int newCpNumber = -1;                          3256   int newCpNumber = -1;
3294   int oldCpNumber = -1;                          3257   int oldCpNumber = -1;
3295                                                  3258 
3296   bool firstWhile = true;                        3259   bool firstWhile = true;
3297                                                  3260 
3298   while ((parentOldItem != NULL) && (parentNe    3261   while ((parentOldItem != NULL) && (parentNewItem != NULL)) {
3299                                                  3262 
3300     // check transform, optimize getting data    3263     // check transform, optimize getting data(..,..) that consume lot of time
3301     if (!firstWhile) {                           3264     if (!firstWhile) {
3302       oldPO = parentOldItem->data(0,Qt::UserR    3265       oldPO = parentOldItem->data(0,Qt::UserRole).toInt();
3303       newPO = parentNewItem->data(0,Qt::UserR    3266       newPO = parentNewItem->data(0,Qt::UserRole).toInt();
3304     }                                            3267     }
3305     firstWhile = false;                          3268     firstWhile = false;
3306                                               << 3269     
3307     if ((oldPO >= 0) &&                          3270     if ((oldPO >= 0) &&
3308         (newPO >= 0)) {                          3271         (newPO >= 0)) {
3309       const PVPath& oldFullPath = fOldTreeIte    3272       const PVPath& oldFullPath = fOldTreeItemModels[oldPO];
3310       const PVPath& newFullPath = fTreeItemMo    3273       const PVPath& newFullPath = fTreeItemModels[newPO];
3311       if ((oldFullPath.size() > 0) &&            3274       if ((oldFullPath.size() > 0) &&
3312           (newFullPath.size() > 0)) {            3275           (newFullPath.size() > 0)) {
3313         if (oldFullPath.size() != newFullPath    3276         if (oldFullPath.size() != newFullPath.size()) {
3314           return false;                          3277           return false;
3315         }                                        3278         }
3316         if (oldFullPath.at(oldFullPath.size()    3279         if (oldFullPath.at(oldFullPath.size()-1).GetTransform () == newFullPath.at(newFullPath.size()-1).GetTransform ()) {
3317           newCpNumber = newFullPath.at(newFul    3280           newCpNumber = newFullPath.at(newFullPath.size()-1).GetCopyNo();
3318           oldCpNumber = oldFullPath.at(oldFul    3281           oldCpNumber = oldFullPath.at(oldFullPath.size()-1).GetCopyNo();
3319           // ok                                  3282           // ok
3320         } else {                                 3283         } else {
3321           return false;                          3284           return false;
3322         }                                        3285         }
3323       }                                          3286       }
3324     }                                            3287     }
3325                                               << 3288     
3326     // Check copy Number                         3289     // Check copy Number
3327     if (oldCpNumber == -1) {                     3290     if (oldCpNumber == -1) {
3328       oldCpNumber = parentOldItem->data(1,Qt:    3291       oldCpNumber = parentOldItem->data(1,Qt::UserRole).toInt();
3329     }                                            3292     }
3330     if (newCpNumber == -1) {                     3293     if (newCpNumber == -1) {
3331       newCpNumber = parentNewItem->data(1,Qt:    3294       newCpNumber = parentNewItem->data(1,Qt::UserRole).toInt();
3332     }                                            3295     }
3333     if ((oldCpNumber != newCpNumber) ||          3296     if ((oldCpNumber != newCpNumber) ||
3334         // Check name                            3297         // Check name
3335         (parentOldItem->text(0) != parentNewI << 3298         (parentOldItem->text(0) != parentNewItem->text(0)) ) { 
3336       // try to optimize                         3299       // try to optimize
3337       return false;                           << 3300       return false;  
3338     } else if ((parentOldItem->text(0) != par    3301     } else if ((parentOldItem->text(0) != parentNewItem->text(0)) || // Logical Name
3339                (parentOldItem->text(3) != par    3302                (parentOldItem->text(3) != parentNewItem->text(3))) {   // Check logical name
3340       return false;                              3303       return false;
3341     } else {                                     3304     } else {
3342       parentOldItem = parentOldItem->parent()    3305       parentOldItem = parentOldItem->parent();
3343       parentNewItem = parentNewItem->parent()    3306       parentNewItem = parentNewItem->parent();
3344     }                                            3307     }
3345   } // end while                                 3308   } // end while
3346                                                  3309 
3347   return true;                                   3310   return true;
3348 }                                                3311 }
3349                                                  3312 
3350                                                  3313 
3351 void G4OpenGLQtViewer::addNonPVSceneTreeEleme    3314 void G4OpenGLQtViewer::addNonPVSceneTreeElement(
3352  const G4String& model                           3315  const G4String& model
3353  ,int currentPOIndex                             3316  ,int currentPOIndex
3354  ,const std::string& modelDescription            3317  ,const std::string& modelDescription
3355  ,const G4Visible& visible                       3318  ,const G4Visible& visible
3356 ) {                                              3319 ) {
3357                                                  3320 
3358   QString modelShortName = getModelShortName(    3321   QString modelShortName = getModelShortName(model);
3359   G4Colour color;                                3322   G4Colour color;
3360                                                  3323 
3361   // Special case for text                       3324   // Special case for text
3362   try {                                          3325   try {
3363     const G4Text& g4Text = dynamic_cast<const    3326     const G4Text& g4Text = dynamic_cast<const G4Text&>(visible);
3364     color = fSceneHandler.GetTextColour(g4Tex    3327     color = fSceneHandler.GetTextColour(g4Text);
3365   }                                              3328   }
3366   catch (const std::bad_cast&) {                 3329   catch (const std::bad_cast&) {
3367     color = fSceneHandler.GetColour();           3330     color = fSceneHandler.GetColour();
3368   }                                              3331   }
3369                                               << 
3370   // Special case for marker                  << 
3371   try {                                       << 
3372     const G4VMarker& g4Marker = dynamic_cast< << 
3373     if (g4Marker.GetInfo() != "") {           << 
3374       modelShortName = g4Marker.GetInfo();    << 
3375     }                                         << 
3376   }                                           << 
3377   catch (const std::bad_cast&) {}             << 
3378                                               << 
3379   if (modelShortName == "") {                    3332   if (modelShortName == "") {
3380     return ;                                     3333     return ;
3381   }                                              3334   }
3382   // try to init it                              3335   // try to init it
3383   if (fSceneTreeComponentTreeWidget == NULL)     3336   if (fSceneTreeComponentTreeWidget == NULL) {
3384     createSceneTreeComponent();                  3337     createSceneTreeComponent();
3385   }                                              3338   }
3386                                                  3339 
3387   // if no UI                                    3340   // if no UI
3388   if (fSceneTreeComponentTreeWidget == NULL)     3341   if (fSceneTreeComponentTreeWidget == NULL) {
3389     return;                                      3342     return;
3390   }                                              3343   }
3391                                                  3344 
3392   fSceneTreeComponentTreeWidget->blockSignals    3345   fSceneTreeComponentTreeWidget->blockSignals(true);
3393                                                  3346 
3394   // Create the "Model" node if not              3347   // Create the "Model" node if not
3395                                                  3348 
3396   QList<QTreeWidgetItem *> resItem;              3349   QList<QTreeWidgetItem *> resItem;
3397   resItem =  fSceneTreeComponentTreeWidget->f    3350   resItem =  fSceneTreeComponentTreeWidget->findItems (modelShortName, Qt::MatchExactly, 0 );
3398   QTreeWidgetItem * currentItem = NULL;          3351   QTreeWidgetItem * currentItem = NULL;
3399   const PVPath tmpFullPath;                      3352   const PVPath tmpFullPath;
3400                                                  3353 
3401   if (resItem.empty()) {                         3354   if (resItem.empty()) {
3402     currentItem = createTreeWidgetItem(tmpFul    3355     currentItem = createTreeWidgetItem(tmpFullPath,
3403                                        modelS    3356                                        modelShortName,
3404                                        0, //     3357                                        0, // currentPVCopyNb
3405                                        -1, //    3358                                        -1, // currentPVPOIndex
3406                                        "",       3359                                        "",
3407                                        Qt::Ch    3360                                        Qt::Checked,
3408                                        NULL,     3361                                        NULL,
3409                                        color)    3362                                        color);
3410   } else {                                       3363   } else {
3411     currentItem = resItem.first();               3364     currentItem = resItem.first();
3412   }                                              3365   }
3413                                                  3366 
3414   // Is this volume already in the tree AND P    3367   // Is this volume already in the tree AND PO is not the same?
3415   const QList<QTreeWidgetItem *>&                3368   const QList<QTreeWidgetItem *>&
3416   resItems =  fSceneTreeComponentTreeWidget->    3369   resItems =  fSceneTreeComponentTreeWidget->findItems (QString(modelDescription.c_str()), Qt::MatchFixedString| Qt::MatchCaseSensitive|Qt::MatchRecursive, 0 );
3417                                               << 3370   
3418   bool alreadyPresent = false;                   3371   bool alreadyPresent = false;
3419   for (int i = 0; i < resItems.size(); ++i) {    3372   for (int i = 0; i < resItems.size(); ++i) {
3420     if (currentPOIndex == resItems.at(i)->dat    3373     if (currentPOIndex == resItems.at(i)->data(0,Qt::UserRole).toInt()) {
3421       alreadyPresent = true;                     3374       alreadyPresent = true;
3422     }                                            3375     }
3423   }                                              3376   }
3424   if (!alreadyPresent) {                         3377   if (!alreadyPresent) {
3425     createTreeWidgetItem(tmpFullPath,            3378     createTreeWidgetItem(tmpFullPath,
3426                          modelShortName,      << 3379                          QString(modelDescription.c_str()),
3427                          0, // currentPVCopyN    3380                          0, // currentPVCopyNb
3428                          currentPOIndex,         3381                          currentPOIndex,
3429                          "",                     3382                          "",
3430                          Qt::Checked,            3383                          Qt::Checked,
3431                          currentItem,            3384                          currentItem,
3432                          color);                 3385                          color);
3433   }                                              3386   }
3434   fSceneTreeComponentTreeWidget->blockSignals    3387   fSceneTreeComponentTreeWidget->blockSignals(false);
3435                                               << 3388   
3436 }                                                3389 }
3437                                                  3390 
3438                                                  3391 
3439 /**                                              3392 /**
3440    Get the short name for a given label          3393    Get the short name for a given label
3441 */                                               3394 */
3442 QString G4OpenGLQtViewer::getModelShortName(c    3395 QString G4OpenGLQtViewer::getModelShortName(const G4String& model) {
3443                                                  3396 
3444   QString modelShortName = model.data();         3397   QString modelShortName = model.data();
3445   if (modelShortName.mid(0,modelShortName.ind    3398   if (modelShortName.mid(0,modelShortName.indexOf(" ")) == "G4PhysicalVolumeModel") {
3446     modelShortName = fTouchableVolumes;          3399     modelShortName = fTouchableVolumes;
3447   } else {                                       3400   } else {
3448     if (modelShortName.mid(0,2) == "G4") {       3401     if (modelShortName.mid(0,2) == "G4") {
3449       modelShortName = modelShortName.mid(2);    3402       modelShortName = modelShortName.mid(2);
3450     }                                            3403     }
3451     if (modelShortName.indexOf("Model") != -1    3404     if (modelShortName.indexOf("Model") != -1) {
3452       modelShortName = modelShortName.mid(0,m    3405       modelShortName = modelShortName.mid(0,modelShortName.indexOf("Model"));
3453     }                                            3406     }
3454   }                                              3407   }
3455   return modelShortName;                         3408   return modelShortName;
3456 }                                                3409 }
3457                                                  3410 
3458                                                  3411 
3459                                                  3412 
3460 bool G4OpenGLQtViewer::isTouchableVisible(int    3413 bool G4OpenGLQtViewer::isTouchableVisible(int POindex){
3461                                                  3414 
3462   // If no scene tree (Immediate viewer)         3415   // If no scene tree (Immediate viewer)
3463   if (fSceneTreeComponentTreeWidget == NULL)     3416   if (fSceneTreeComponentTreeWidget == NULL) {
3464     return false;                                3417     return false;
3465   }                                              3418   }
3466                                               << 3419   
3467   // should be the next one                      3420   // should be the next one
3468   // Prevent to get out the std::map             3421   // Prevent to get out the std::map
3469   if (fLastSceneTreeWidgetAskForIterator != f    3422   if (fLastSceneTreeWidgetAskForIterator != fLastSceneTreeWidgetAskForIteratorEnd) {
3470     fLastSceneTreeWidgetAskForIterator++;        3423     fLastSceneTreeWidgetAskForIterator++;
3471   }                                              3424   }
3472   QTreeWidgetItem* item = getTreeWidgetItem(P    3425   QTreeWidgetItem* item = getTreeWidgetItem(POindex);
3473                                               << 3426   
3474   if (item != NULL) {                            3427   if (item != NULL) {
3475     if ( item->checkState(0) == Qt::Checked)     3428     if ( item->checkState(0) == Qt::Checked) {
3476       return true;                               3429       return true;
3477     }                                            3430     }
3478   }                                           << 3431   }  
3479   return false;                                  3432   return false;
3480 }                                                3433 }
3481                                                  3434 
3482                                                  3435 
3483 bool G4OpenGLQtViewer::parseAndCheckVisibilit    3436 bool G4OpenGLQtViewer::parseAndCheckVisibility(QTreeWidgetItem * treeNode,int POindex){
3484   bool isFound = false;                          3437   bool isFound = false;
3485   for (int i = 0; i < treeNode->childCount()     3438   for (int i = 0; i < treeNode->childCount() ; ++i) {
3486                                                  3439 
3487     if (treeNode->child(i)->data(0,Qt::UserRo    3440     if (treeNode->child(i)->data(0,Qt::UserRole).toInt() == POindex) {
3488       if (treeNode->child(i)->checkState(0) =    3441       if (treeNode->child(i)->checkState(0) == Qt::Checked) {
3489         return true;                             3442         return true;
3490       }                                          3443       }
3491     }                                            3444     }
3492     isFound = parseAndCheckVisibility(treeNod    3445     isFound = parseAndCheckVisibility(treeNode->child(i),POindex);
3493     if (isFound) {                               3446     if (isFound) {
3494       return true;                               3447       return true;
3495     }                                            3448     }
3496   } // end for                                   3449   } // end for
3497   return false;                                  3450   return false;
3498 }                                                3451 }
3499                                                  3452 
3500                                                  3453 
3501 std::string G4OpenGLQtViewer::parseSceneTreeA    3454 std::string G4OpenGLQtViewer::parseSceneTreeAndSaveState(){
3502   std::string commandLine = "";                  3455   std::string commandLine = "";
3503   for (int b=0;b<fSceneTreeComponentTreeWidge    3456   for (int b=0;b<fSceneTreeComponentTreeWidget->topLevelItemCount();b++) {
3504     commandLine += parseSceneTreeElementAndSa    3457     commandLine += parseSceneTreeElementAndSaveState(fSceneTreeComponentTreeWidget->topLevelItem(b),1)+"\n";
3505   }                                              3458   }
3506   if (commandLine != "") {                       3459   if (commandLine != "") {
3507     commandLine = std::string("# Disable auto    3460     commandLine = std::string("# Disable auto refresh and quieten vis messages whilst scene and\n") +
3508     "# trajectories are established:\n" +        3461     "# trajectories are established:\n" +
3509     "/vis/viewer/set/autoRefresh false\n" +      3462     "/vis/viewer/set/autoRefresh false\n" +
3510     "/vis/verbose errors" +                      3463     "/vis/verbose errors" +
3511     commandLine +                                3464     commandLine +
3512     "# Re-establish auto refreshing and verbo    3465     "# Re-establish auto refreshing and verbosity:\n" +
3513     "/vis/viewer/set/autoRefresh true\n" +       3466     "/vis/viewer/set/autoRefresh true\n" +
3514     "/vis/verbose confirmations\n";              3467     "/vis/verbose confirmations\n";
3515   }                                              3468   }
3516   return commandLine;                            3469   return commandLine;
3517 }                                                3470 }
3518                                                  3471 
3519                                                  3472 
3520 std::string G4OpenGLQtViewer::parseSceneTreeE    3473 std::string G4OpenGLQtViewer::parseSceneTreeElementAndSaveState(QTreeWidgetItem* item, unsigned int level){
3521   // parse current item                          3474   // parse current item
3522   std::string str( level, ' ' );                 3475   std::string str( level, ' ' );
3523   std::string commandLine = "\n#"+ str + "PV     3476   std::string commandLine = "\n#"+ str + "PV Name: " + item->text(0).toStdString();
3524                                                  3477 
3525   if (item->text(3) != "") {                     3478   if (item->text(3) != "") {
3526     commandLine += " LV Name: "+item->text(3)    3479     commandLine += " LV Name: "+item->text(3).toStdString()+"\n";
3527     // save check state                          3480     // save check state
3528     commandLine += "/vis/geometry/set/visibil    3481     commandLine += "/vis/geometry/set/visibility " + item->text(3).toStdString() + " ! "; // let default value for depth
3529     if (item->checkState(0) == Qt::Checked) {    3482     if (item->checkState(0) == Qt::Checked) {
3530       commandLine += "1";                        3483       commandLine += "1";
3531     }                                            3484     }
3532     if (item->checkState(0) == Qt::Unchecked)    3485     if (item->checkState(0) == Qt::Unchecked) {
3533       commandLine += "0";                        3486       commandLine += "0";
3534     }                                            3487     }
3535     commandLine +="\n";                          3488     commandLine +="\n";
3536                                               << 3489     
3537     // save color                                3490     // save color
3538     const QColor& c = item->data(2,Qt::UserRo    3491     const QColor& c = item->data(2,Qt::UserRole).value<QColor>();
3539     std::stringstream red;                       3492     std::stringstream red;
3540     red << ((double)c.red())/255;                3493     red << ((double)c.red())/255;
3541     std::stringstream green;                     3494     std::stringstream green;
3542     green << (double)c.green()/255;              3495     green << (double)c.green()/255;
3543     std::stringstream blue;                      3496     std::stringstream blue;
3544     blue << ((double)c.blue())/255;              3497     blue << ((double)c.blue())/255;
3545     std::stringstream alpha;                     3498     std::stringstream alpha;
3546     alpha << ((double)c.alpha())/255;            3499     alpha << ((double)c.alpha())/255;
3547                                               << 3500     
3548     commandLine += "/vis/geometry/set/colour     3501     commandLine += "/vis/geometry/set/colour " + item->text(3).toStdString() + " ! " + red.str() + " " + green.str() + " " + blue.str() + " " + alpha.str()+"\n";
3549                                                  3502 
3550   } else {                                       3503   } else {
3551     commandLine += "\n";                         3504     commandLine += "\n";
3552   }                                              3505   }
3553                                                  3506 
3554   // parse childs                                3507   // parse childs
3555   for (int b=0;b< item->childCount();b++) {      3508   for (int b=0;b< item->childCount();b++) {
3556     commandLine += parseSceneTreeElementAndSa    3509     commandLine += parseSceneTreeElementAndSaveState(item->child(b),level+1);
3557   }                                              3510   }
3558                                               << 3511   
3559   return commandLine;                            3512   return commandLine;
3560 }                                                3513 }
3561                                                  3514 
3562                                                  3515 
3563 void G4OpenGLQtViewer::sceneTreeComponentItem    3516 void G4OpenGLQtViewer::sceneTreeComponentItemChanged(QTreeWidgetItem* item, int) {
3564                                                  3517 
3565   if (fCheckSceneTreeComponentSignalLock == f    3518   if (fCheckSceneTreeComponentSignalLock == false) {
3566     fCheckSceneTreeComponentSignalLock = true    3519     fCheckSceneTreeComponentSignalLock = true;
3567     G4bool checked = false;                      3520     G4bool checked = false;
3568     if (item->checkState(0) == Qt::Checked) {    3521     if (item->checkState(0) == Qt::Checked) {
3569       checked = true;                            3522       checked = true;
3570     }                                            3523     }
3571     setCheckComponent(item,checked);             3524     setCheckComponent(item,checked);
3572     updateQWidget();                             3525     updateQWidget();
3573                                                  3526 
3574     fCheckSceneTreeComponentSignalLock = fals    3527     fCheckSceneTreeComponentSignalLock = false;
3575   }                                              3528   }
3576 }                                                3529 }
3577                                                  3530 
3578                                                  3531 
3579 void G4OpenGLQtViewer::sceneTreeComponentSele    3532 void G4OpenGLQtViewer::sceneTreeComponentSelected() {
3580 }                                                3533 }
3581                                                  3534 
3582 void G4OpenGLQtViewer::changeDepthInSceneTree    3535 void G4OpenGLQtViewer::changeDepthInSceneTree (int val){
3583                                                  3536 
3584   // If no scene tree (Immediate viewer)         3537   // If no scene tree (Immediate viewer)
3585   if (fSceneTreeComponentTreeWidget == NULL)     3538   if (fSceneTreeComponentTreeWidget == NULL) {
3586     return;                                      3539     return;
3587   }                                              3540   }
3588                                                  3541 
3589   // max depth :   fSceneTreeDepth               3542   // max depth :   fSceneTreeDepth
3590   // val is between 0 and 1                      3543   // val is between 0 and 1
3591   // 0  .1  .2  .3  .4  .5  .6  .7  .8  .9  1    3544   // 0  .1  .2  .3  .4  .5  .6  .7  .8  .9  1
3592   // 1      1.4          2                    << 3545   // 1      1.4          2                  
3593   // 1         2         3         4             3546   // 1         2         3         4
3594                                                  3547 
3595   // Get the depth :                             3548   // Get the depth :
3596   double depth = 1 + ((double)val)/1000 * ((d    3549   double depth = 1 + ((double)val)/1000 * ((double)fSceneTreeDepth+1);
3597                                               << 3550   
3598   // lock update on scene tree items             3551   // lock update on scene tree items
3599   fCheckSceneTreeComponentSignalLock = true;     3552   fCheckSceneTreeComponentSignalLock = true;
3600                                               << 3553   
3601   // Disable redraw each time !                  3554   // Disable redraw each time !
3602   G4bool currentAutoRefresh = fVP.IsAutoRefre    3555   G4bool currentAutoRefresh = fVP.IsAutoRefresh();
3603   fVP.SetAutoRefresh(false);                     3556   fVP.SetAutoRefresh(false);
3604                                                  3557 
3605   for (int b=0;b<fSceneTreeComponentTreeWidge    3558   for (int b=0;b<fSceneTreeComponentTreeWidget->topLevelItemCount();b++) {
3606     changeDepthOnSceneTreeItem(depth,1.,fScen    3559     changeDepthOnSceneTreeItem(depth,1.,fSceneTreeComponentTreeWidget->topLevelItem(b));
3607   }                                              3560   }
3608                                                  3561 
3609   // Enable redraw !                             3562   // Enable redraw !
3610   fVP.SetAutoRefresh(currentAutoRefresh);        3563   fVP.SetAutoRefresh(currentAutoRefresh);
3611   updateQWidget();                               3564   updateQWidget();
3612                                                  3565 
3613   // unlock update on scene tree items           3566   // unlock update on scene tree items
3614   fCheckSceneTreeComponentSignalLock = false;    3567   fCheckSceneTreeComponentSignalLock = false;
3615                                                  3568 
3616 }                                                3569 }
3617                                                  3570 
3618                                                  3571 
3619 void G4OpenGLQtViewer::changeColorAndTranspar    3572 void G4OpenGLQtViewer::changeColorAndTransparency(QTreeWidgetItem* item,int) {
3620                                                  3573 
3621   if (item == NULL) {                            3574   if (item == NULL) {
3622     return;                                      3575     return;
3623   }                                              3576   }
3624   const QColor& old = QColor(item->data(2,Qt:    3577   const QColor& old = QColor(item->data(2,Qt::UserRole).value<QColor>());
3625                                                  3578 
                                                   >> 3579 #if QT_VERSION < 0x040500
                                                   >> 3580   bool a;
                                                   >> 3581   const QColor& color = QColor(QColorDialog::getRgba (old.rgba(),&a,fSceneTreeComponentTreeWidget));
                                                   >> 3582 #else
3626   const QColor& color = QColorDialog::getColo    3583   const QColor& color = QColorDialog::getColor(old,
3627                                         fScen    3584                                         fSceneTreeComponentTreeWidget,
3628                                         " Get    3585                                         " Get color and transparency",
3629                                         QColo    3586                                         QColorDialog::ShowAlphaChannel);
3630                                               << 3587 #endif
                                                   >> 3588   
3631   if (color.isValid()) {                         3589   if (color.isValid()) {
3632                                                  3590 
3633     changeColorAndTransparency(item->data(0,Q    3591     changeColorAndTransparency(item->data(0,Qt::UserRole).toInt(),
3634                                G4Colour (((G4    3592                                G4Colour (((G4double)color.red())/255,
3635                                          ((G4    3593                                          ((G4double)color.green())/255,
3636                                          ((G4    3594                                          ((G4double)color.blue())/255,
3637                                          ((G4    3595                                          ((G4double)color.alpha())/255));
3638                                                  3596 
3639     // set scene tree parameters                 3597     // set scene tree parameters
3640     changeQColorForTreeWidgetItem(item,color)    3598     changeQColorForTreeWidgetItem(item,color);
3641   }                                              3599   }
3642 }                                                3600 }
3643                                                  3601 
3644                                                  3602 
3645 void G4OpenGLQtViewer::changeColorAndTranspar    3603 void G4OpenGLQtViewer::changeColorAndTransparency(GLuint index, G4Color color) {
3646                                                  3604 
3647   // change vis attributes to set new colour     3605   // change vis attributes to set new colour
3648   G4int iPO = index;                             3606   G4int iPO = index;
3649   if (iPO >= 0 && fTreeItemModels.find(iPO) !    3607   if (iPO >= 0 && fTreeItemModels.find(iPO) != fTreeItemModels.end()) {
3650     const PVPath& fullPath = fTreeItemModels[    3608     const PVPath& fullPath = fTreeItemModels[iPO];
3651     // If a physical volume                      3609     // If a physical volume
3652     if (fullPath.size()) {                       3610     if (fullPath.size()) {
3653       SetTouchable(fullPath);                    3611       SetTouchable(fullPath);
3654       TouchableSetColour(fullPath, color);       3612       TouchableSetColour(fullPath, color);
3655       fMouseOnSceneTree = true;                  3613       fMouseOnSceneTree = true;
3656     }                                            3614     }
3657   }                                              3615   }
3658 }                                                3616 }
3659                                                  3617 
3660                                                  3618 
3661 G4Colour G4OpenGLQtViewer::getColorForPoIndex    3619 G4Colour G4OpenGLQtViewer::getColorForPoIndex(int poIndex) {
3662   // FIXME 09/2014 : Could be optimize by sea    3620   // FIXME 09/2014 : Could be optimize by searching in a tab instead of item->data
3663   QTreeWidgetItem* item = getTreeWidgetItem(p    3621   QTreeWidgetItem* item = getTreeWidgetItem(poIndex);
3664                                                  3622 
3665   if (item != NULL) {                            3623   if (item != NULL) {
3666                                               << 3624     
3667     const QColor& color = item->data(2,Qt::Us    3625     const QColor& color = item->data(2,Qt::UserRole).value<QColor>();
3668     G4Colour g4c(((G4double)color.red())/255,    3626     G4Colour g4c(((G4double)color.red())/255,
3669                  ((G4double)color.green())/25    3627                  ((G4double)color.green())/255,
3670                  ((G4double)color.blue())/255    3628                  ((G4double)color.blue())/255,
3671                  ((G4double)color.alpha())/25    3629                  ((G4double)color.alpha())/255);
3672                                                  3630 
3673     return g4c;                                  3631     return g4c;
3674   }                                              3632   }
3675   return G4Colour();                             3633   return G4Colour();
3676 }                                                3634 }
3677                                                  3635 
3678                                                  3636 
3679 const std::vector<G4ModelingParameters::VisAt    3637 const std::vector<G4ModelingParameters::VisAttributesModifier>*
3680 G4OpenGLQtViewer::GetPrivateVisAttributesModi    3638 G4OpenGLQtViewer::GetPrivateVisAttributesModifiers() const
3681 {                                                3639 {
3682   static std::vector<G4ModelingParameters::Vi    3640   static std::vector<G4ModelingParameters::VisAttributesModifier>
3683   privateVisAttributesModifiers;                 3641   privateVisAttributesModifiers;
3684                                                  3642 
3685   privateVisAttributesModifiers.clear();         3643   privateVisAttributesModifiers.clear();
3686                                                  3644 
3687 // I don't think we need this.  (JA Sep 2016)    3645 // I don't think we need this.  (JA Sep 2016).
3688 //  // For each modified touchable...            3646 //  // For each modified touchable...
3689 //  std::map<int,PVPath>::const_iterator i;      3647 //  std::map<int,PVPath>::const_iterator i;
3690 //  for (i = fTreeItemModels.begin();            3648 //  for (i = fTreeItemModels.begin();
3691 //       i != fTreeItemModels.end();             3649 //       i != fTreeItemModels.end();
3692 //       ++i) {                                  3650 //       ++i) {
3693 //                                               3651 //
3694 //    // How do I know if it's been modified     3652 //    // How do I know if it's been modified or not?
3695 //                                               3653 //
3696 //    int iPO = i->first;                        3654 //    int iPO = i->first;
3697 //    const PVPath& fullPath = i->second;        3655 //    const PVPath& fullPath = i->second;
3698 //                                               3656 //
3699 //    // If a physical volume                    3657 //    // If a physical volume
3700 //    if (fullPath.size()) {                     3658 //    if (fullPath.size()) {
3701 //                                               3659 //
3702 //      //    const G4bool& visibilityChanged    3660 //      //    const G4bool& visibilityChanged = ???
3703 //      //    const G4bool& visibility = ???     3661 //      //    const G4bool& visibility = ???
3704 //      //    const G4bool& colourChanged = ?    3662 //      //    const G4bool& colourChanged = ???
3705 //      //    const QColor& colour = ???         3663 //      //    const QColor& colour = ???
3706 //      //    G4Colour g4colour(((G4double)co    3664 //      //    G4Colour g4colour(((G4double)colour.red())/255,
3707 //      //                      ((G4double)co    3665 //      //                      ((G4double)colour.green())/255,
3708 //      //                      ((G4double)co    3666 //      //                      ((G4double)colour.blue())/255,
3709 //      //                      ((G4double)co    3667 //      //                      ((G4double)colour.alpha())/255);
3710 //      // Next 4 lines are for testing, to b    3668 //      // Next 4 lines are for testing, to be replaced by the above...
3711 //      G4bool visibilityChanged = true;         3669 //      G4bool visibilityChanged = true;
3712 //      G4bool visibility = true;                3670 //      G4bool visibility = true;
3713 //      G4bool colourChanged = true;             3671 //      G4bool colourChanged = true;
3714 //      G4Colour g4colour(G4Colour::Red());      3672 //      G4Colour g4colour(G4Colour::Red());
3715 //                                               3673 //
3716 //      // Instantiate a working copy of a G4    3674 //      // Instantiate a working copy of a G4VisAttributes object...
3717 //      G4VisAttributes workingVisAtts;          3675 //      G4VisAttributes workingVisAtts;
3718 //      // ...and use it to create vis attrib    3676 //      // ...and use it to create vis attribute modifiers...
3719 //      if (visibilityChanged) {                 3677 //      if (visibilityChanged) {
3720 //        workingVisAtts.SetVisibility(visibi    3678 //        workingVisAtts.SetVisibility(visibility);
3721 //        privateVisAttributesModifiers.push_    3679 //        privateVisAttributesModifiers.push_back
3722 //        (G4ModelingParameters::VisAttribute    3680 //        (G4ModelingParameters::VisAttributesModifier
3723 //         (workingVisAtts,                      3681 //         (workingVisAtts,
3724 //          G4ModelingParameters::VASVisibili    3682 //          G4ModelingParameters::VASVisibility,
3725 //          fullPath));                          3683 //          fullPath));
3726 //      }                                        3684 //      }
3727 //      if (colourChanged) {                     3685 //      if (colourChanged) {
3728 //        workingVisAtts.SetColour(g4colour);    3686 //        workingVisAtts.SetColour(g4colour);
3729 //        privateVisAttributesModifiers.push_    3687 //        privateVisAttributesModifiers.push_back
3730 //        (G4ModelingParameters::VisAttribute    3688 //        (G4ModelingParameters::VisAttributesModifier
3731 //         (workingVisAtts,                      3689 //         (workingVisAtts,
3732 //          G4ModelingParameters::VASColour,     3690 //          G4ModelingParameters::VASColour,
3733 //          fullPath));                          3691 //          fullPath));
3734 //      }                                        3692 //      }
3735 //    }                                          3693 //    }
3736 //  }                                            3694 //  }
3737                                                  3695 
3738   return &privateVisAttributesModifiers;         3696   return &privateVisAttributesModifiers;
3739 }                                                3697 }
3740                                                  3698 
3741                                                  3699 
3742 void G4OpenGLQtViewer::changeSearchSelection(    3700 void G4OpenGLQtViewer::changeSearchSelection()
3743 {                                                3701 {
3744   const QString& searchText = fFilterOutput->    3702   const QString& searchText = fFilterOutput->text();
3745   if (fSceneTreeComponentTreeWidget == NULL)     3703   if (fSceneTreeComponentTreeWidget == NULL) {
3746     return;                                      3704     return;
3747   }                                              3705   }
3748                                                  3706 
3749   // unselect all                                3707   // unselect all
3750   for (int a=0; a<fSceneTreeComponentTreeWidg    3708   for (int a=0; a<fSceneTreeComponentTreeWidget->topLevelItemCount(); a++) {
3751     fSceneTreeComponentTreeWidget->topLevelIt    3709     fSceneTreeComponentTreeWidget->topLevelItem(a)->setExpanded(false);
3752     fSceneTreeComponentTreeWidget->topLevelIt    3710     fSceneTreeComponentTreeWidget->topLevelItem(a)->setSelected(false);
3753     clearSceneTreeSelection(fSceneTreeCompone    3711     clearSceneTreeSelection(fSceneTreeComponentTreeWidget->topLevelItem(a));
3754   }                                              3712   }
3755                                                  3713 
3756   QList<QTreeWidgetItem *> itemList = fSceneT    3714   QList<QTreeWidgetItem *> itemList = fSceneTreeComponentTreeWidget->findItems (searchText,Qt::MatchContains | Qt::MatchRecursive,0);
3757                                                  3715 
3758   for (int i = 0; i < itemList.size(); ++i) {    3716   for (int i = 0; i < itemList.size(); ++i) {
3759     QTreeWidgetItem* expandParentItem = itemL    3717     QTreeWidgetItem* expandParentItem = itemList.at(i);
3760     while (expandParentItem->parent() != NULL    3718     while (expandParentItem->parent() != NULL) {
3761       expandParentItem->parent()->setExpanded    3719       expandParentItem->parent()->setExpanded(true);
3762       expandParentItem = expandParentItem->pa    3720       expandParentItem = expandParentItem->parent();
3763     }                                            3721     }
3764     itemList.at(i)->setSelected(true);           3722     itemList.at(i)->setSelected(true);
3765   }                                           << 3723   }    
3766                                                  3724 
3767 }                                                3725 }
3768                                                  3726 
3769                                                  3727 
3770 void G4OpenGLQtViewer::clearSceneTreeSelectio    3728 void G4OpenGLQtViewer::clearSceneTreeSelection(QTreeWidgetItem* item) {
3771   for (int a=0; a<item->childCount(); a++) {     3729   for (int a=0; a<item->childCount(); a++) {
3772     item->child(a)->setSelected(false);          3730     item->child(a)->setSelected(false);
3773     item->child(a)->setExpanded(false);          3731     item->child(a)->setExpanded(false);
3774     clearSceneTreeSelection(item->child(a));     3732     clearSceneTreeSelection(item->child(a));
3775   }                                              3733   }
3776                                                  3734 
3777 }                                                3735 }
3778                                                  3736 
3779                                                  3737 
3780 bool G4OpenGLQtViewer::isPVVolume(QTreeWidget    3738 bool G4OpenGLQtViewer::isPVVolume(QTreeWidgetItem* item) {
3781   QTreeWidgetItem* sParent = item;               3739   QTreeWidgetItem* sParent = item;
3782   while (sParent->parent() != NULL) {            3740   while (sParent->parent() != NULL) {
3783     sParent = sParent->parent();                 3741     sParent = sParent->parent();
3784   }                                              3742   }
3785   if (sParent->text(0) != fTouchableVolumes)     3743   if (sParent->text(0) != fTouchableVolumes) {
3786     return false;                                3744     return false;
3787   }                                              3745   }
3788   // item is the "Touchable" node                3746   // item is the "Touchable" node
3789   if (item->text(0) == fTouchableVolumes) {      3747   if (item->text(0) == fTouchableVolumes) {
3790     return false;                                3748     return false;
3791   }                                              3749   }
3792   return true;                                   3750   return true;
3793 }                                                3751 }
3794                                                  3752 
3795                                                  3753 
3796 void G4OpenGLQtViewer::changeDepthOnSceneTree    3754 void G4OpenGLQtViewer::changeDepthOnSceneTreeItem(
3797  double lookForDepth                             3755  double lookForDepth
3798  ,double currentDepth                            3756  ,double currentDepth
3799  ,QTreeWidgetItem* item                          3757  ,QTreeWidgetItem* item
3800 ) {                                              3758 ) {
3801   double transparencyLevel = 0.;                 3759   double transparencyLevel = 0.;
3802                                               << 3760   
3803   // look for a 2.2 depth and we are at level << 3761   // look for a 2.2 depth and we are at level 3 
3804   // -> Set all theses items to Opaque           3762   // -> Set all theses items to Opaque
3805   // ONLY if it is a PV volume !                 3763   // ONLY if it is a PV volume !
3806   if (isPVVolume(item)) {                        3764   if (isPVVolume(item)) {
3807     if ((lookForDepth-currentDepth) < 0) {       3765     if ((lookForDepth-currentDepth) < 0) {
3808       item->setCheckState(0,Qt::Checked);        3766       item->setCheckState(0,Qt::Checked);
3809       updatePositivePoIndexSceneTreeWidgetQui    3767       updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
3810       transparencyLevel = 1;                     3768       transparencyLevel = 1;
3811     } else if ((lookForDepth-currentDepth) >     3769     } else if ((lookForDepth-currentDepth) > 1 ){
3812       item->setCheckState(0,Qt::Unchecked);      3770       item->setCheckState(0,Qt::Unchecked);
3813       updatePositivePoIndexSceneTreeWidgetQui    3771       updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
3814       transparencyLevel = 0;                     3772       transparencyLevel = 0;
3815     } else {                                     3773     } else {
3816       item->setCheckState(0,Qt::Checked);        3774       item->setCheckState(0,Qt::Checked);
3817       updatePositivePoIndexSceneTreeWidgetQui    3775       updatePositivePoIndexSceneTreeWidgetQuickMap(item->data(0,Qt::UserRole).toInt(),item);
3818       transparencyLevel = 1-(lookForDepth-cur    3776       transparencyLevel = 1-(lookForDepth-currentDepth);
3819     }                                            3777     }
3820   }                                              3778   }
3821                                               << 3779   
3822   if (item->data(0,Qt::UserRole).toInt() >= 0    3780   if (item->data(0,Qt::UserRole).toInt() >= 0) {
3823     const G4Colour& color = getColorForPoInde    3781     const G4Colour& color = getColorForPoIndex(item->data(0,Qt::UserRole).toInt());
3824                                               << 3782     
3825     // We are less depper (ex:tree depth:2) t    3783     // We are less depper (ex:tree depth:2) than lookForDepth (ex:3.1)
3826     // -> Have to hide this level ONLY if it     3784     // -> Have to hide this level ONLY if it was not hidden before
3827                                               << 3785     
3828     // Not on a top level item case              3786     // Not on a top level item case
3829     // Do not set if it was already set          3787     // Do not set if it was already set
3830                                                  3788 
3831     // Should add them all the time in case o    3789     // Should add them all the time in case of an older command has change transparency
3832     // before. Should be checked in changeDep    3790     // before. Should be checked in changeDepthInSceneTree for duplicated commands
3833     // Do not change transparency if not visi    3791     // Do not change transparency if not visible by humain (and avoid precision value
3834     // problems..)                               3792     // problems..)
3835     if (((color.GetAlpha()-transparencyLevel)    3793     if (((color.GetAlpha()-transparencyLevel) >  0.000001) ||
3836         ((color.GetAlpha()-transparencyLevel)    3794         ((color.GetAlpha()-transparencyLevel) < -0.000001))  {
3837       if ((item->text(3) != "")) {               3795       if ((item->text(3) != "")) {
3838         // FIXME : Should not test this here     3796         // FIXME : Should not test this here because of transparent
3839         // volume that will came after and wi    3797         // volume that will came after and with a different alpha level
3840         // Good thing to do is to check and s    3798         // Good thing to do is to check and suppress doubles in changeDepthInSceneTree
3841         // and then check if last (transparen    3799         // and then check if last (transparents volumes) has to change alpha
3842                                                  3800 
3843         changeQColorForTreeWidgetItem(item,QC    3801         changeQColorForTreeWidgetItem(item,QColor((int)(color.GetRed()*255),
3844                                                  3802                                                   (int)(color.GetGreen()*255),
3845                                                  3803                                                   (int)(color.GetBlue()*255),
3846                                                  3804                                                   (int)(transparencyLevel*255)));
3847       }                                          3805       }
3848     }                                            3806     }
3849   }                                              3807   }
3850                                                  3808 
3851   for (int b=0;b< item->childCount();b++) {      3809   for (int b=0;b< item->childCount();b++) {
3852     changeDepthOnSceneTreeItem(lookForDepth,c    3810     changeDepthOnSceneTreeItem(lookForDepth,currentDepth+1,item->child(b));
3853   }                                              3811   }
3854 }                                                3812 }
3855                                                  3813 
3856                                                  3814 
3857 void G4OpenGLQtViewer::clearTreeWidget(){        3815 void G4OpenGLQtViewer::clearTreeWidget(){
3858   // be careful about calling this twice         3816   // be careful about calling this twice
3859                                                  3817 
3860   if (fSceneTreeComponentTreeWidget) {           3818   if (fSceneTreeComponentTreeWidget) {
3861                                                  3819 
3862     if (fSceneTreeComponentTreeWidget->topLev    3820     if (fSceneTreeComponentTreeWidget->topLevelItemCount () > 0) {
3863                                                  3821 
3864       fPVRootNodeCreate = false;                 3822       fPVRootNodeCreate = false;
3865                                                  3823 
3866       // reset all old                           3824       // reset all old
3867       fOldPositivePoIndexSceneTreeWidgetQuick    3825       fOldPositivePoIndexSceneTreeWidgetQuickMap.clear();
3868       fOldNullPoIndexSceneTreeWidgetQuickVect    3826       fOldNullPoIndexSceneTreeWidgetQuickVector.clear();
3869       fOldTreeItemModels.clear();                3827       fOldTreeItemModels.clear();
3870                                                  3828 
3871       // Clone everything                     << 3829       // Clone everything  
3872       for (int b =0; b <fSceneTreeComponentTr    3830       for (int b =0; b <fSceneTreeComponentTreeWidget->topLevelItemCount();b++) {
3873         // All tree widgets are in :             3831         // All tree widgets are in :
3874         // then we could get the old POindex  << 3832         // then we could get the old POindex and get 
3875         // .visible/Hidden                       3833         // .visible/Hidden
3876         // .Check/Uncheck                        3834         // .Check/Uncheck
3877         // .selected                             3835         // .selected
3878         // .colour status from std::map          3836         // .colour status from std::map
3879                                                  3837 
3880         // clone top level items                 3838         // clone top level items
3881         int poIndex = fSceneTreeComponentTree    3839         int poIndex = fSceneTreeComponentTreeWidget->topLevelItem(b)->data(0,Qt::UserRole).toInt();
3882         if (poIndex != -1) {                     3840         if (poIndex != -1) {
3883           fOldPositivePoIndexSceneTreeWidgetQ    3841           fOldPositivePoIndexSceneTreeWidgetQuickMap.insert(std::pair <int, QTreeWidgetItem*> (poIndex,cloneWidgetItem(fSceneTreeComponentTreeWidget->topLevelItem(b))));
3884         } else {                                 3842         } else {
3885           fOldNullPoIndexSceneTreeWidgetQuick    3843           fOldNullPoIndexSceneTreeWidgetQuickVector.push_back(cloneWidgetItem(fSceneTreeComponentTreeWidget->topLevelItem(b)));
3886         }                                        3844         }
3887                                                  3845 
3888         // clone leaves                          3846         // clone leaves
3889         cloneSceneTree(fSceneTreeComponentTre    3847         cloneSceneTree(fSceneTreeComponentTreeWidget->topLevelItem(b));
3890       }                                          3848       }
3891       // delete all elements                     3849       // delete all elements
3892                                                  3850 
3893       fOldTreeItemModels.insert(fTreeItemMode << 3851       fOldTreeItemModels.insert(fTreeItemModels.begin(), fTreeItemModels.end());  
3894                                                  3852 
3895       // all is copy, then clear scene tree      3853       // all is copy, then clear scene tree
3896       int tmp2 = fSceneTreeComponentTreeWidge    3854       int tmp2 = fSceneTreeComponentTreeWidget->topLevelItemCount();
3897       while (tmp2 > 0) {                         3855       while (tmp2 > 0) {
3898         delete fSceneTreeComponentTreeWidget-    3856         delete fSceneTreeComponentTreeWidget->takeTopLevelItem (0);
3899         tmp2 = fSceneTreeComponentTreeWidget-    3857         tmp2 = fSceneTreeComponentTreeWidget->topLevelItemCount();
3900       }                                          3858       }
3901       fPositivePoIndexSceneTreeWidgetQuickMap    3859       fPositivePoIndexSceneTreeWidgetQuickMap.clear();
3902                                                  3860 
3903       // put correct value in paramaters         3861       // put correct value in paramaters
3904       fOldLastSceneTreeWidgetAskForIterator =    3862       fOldLastSceneTreeWidgetAskForIterator = fOldPositivePoIndexSceneTreeWidgetQuickMap.begin();
3905       fOldLastSceneTreeWidgetAskForIteratorEn    3863       fOldLastSceneTreeWidgetAskForIteratorEnd = fOldPositivePoIndexSceneTreeWidgetQuickMap.end();
3906       fSceneTreeDepth = 1;                       3864       fSceneTreeDepth = 1;
3907       fModelShortNameItem = NULL;                3865       fModelShortNameItem = NULL;
3908       fMaxPOindexInserted = -1;                  3866       fMaxPOindexInserted = -1;
3909                                                  3867 
3910     }                                            3868     }
3911   }                                              3869   }
3912 }                                                3870 }
3913                                                  3871 
3914                                                  3872 
3915 /**                                              3873 /**
3916    Clone :                                    << 3874    Clone : 
3917    - Open/close                                  3875    - Open/close
3918    - Visible/hidden                              3876    - Visible/hidden
3919    - Selected                                    3877    - Selected
3920 */                                               3878 */
3921 QTreeWidgetItem * G4OpenGLQtViewer::cloneWidg    3879 QTreeWidgetItem * G4OpenGLQtViewer::cloneWidgetItem(QTreeWidgetItem* item) {
3922                                                  3880 
3923   QTreeWidgetItem* cloneItem = new QTreeWidge    3881   QTreeWidgetItem* cloneItem = new QTreeWidgetItem();
3924                                                  3882 
3925   // Clone what is create createTreeWidgetIte    3883   // Clone what is create createTreeWidgetItem step
3926                                                  3884 
3927   cloneItem->setText(0,item->text(0));           3885   cloneItem->setText(0,item->text(0));
3928   cloneItem->setData(1,Qt::UserRole,item->dat    3886   cloneItem->setData(1,Qt::UserRole,item->data(1,Qt::UserRole).toInt());
3929   cloneItem->setText(2,item->text(2));           3887   cloneItem->setText(2,item->text(2));
3930   cloneItem->setData(0, Qt::UserRole,item->da    3888   cloneItem->setData(0, Qt::UserRole,item->data(0,Qt::UserRole).toInt());
3931   cloneItem->setText(3,item->text(3));           3889   cloneItem->setText(3,item->text(3));
3932   cloneItem->setFlags(item->flags());            3890   cloneItem->setFlags(item->flags());
3933   cloneItem->setToolTip(0,item->toolTip(0));  << 3891   cloneItem->setToolTip(0,item->toolTip(0));        
3934   cloneItem->setCheckState(0,item->checkState    3892   cloneItem->setCheckState(0,item->checkState(0));
3935   cloneItem->setSelected(item->isSelected()); << 3893   cloneItem->setSelected(item->isSelected()); 
3936   cloneItem->setExpanded(item->isExpanded ())    3894   cloneItem->setExpanded(item->isExpanded ());
3937                                                  3895 
3938   cloneItem->setData(2,Qt::UserRole,item->dat    3896   cloneItem->setData(2,Qt::UserRole,item->data(2,Qt::UserRole).value<QColor>());
3939                                                  3897 
3940   return cloneItem;                              3898   return cloneItem;
3941 }                                                3899 }
3942                                                  3900 
3943                                                  3901 
3944 /**                                              3902 /**
3945    Clone the current tree in order to get a s    3903    Clone the current tree in order to get a snapshot of old version
3946 */                                               3904 */
3947 void G4OpenGLQtViewer::cloneSceneTree(           3905 void G4OpenGLQtViewer::cloneSceneTree(
3948  QTreeWidgetItem* rootItem                       3906  QTreeWidgetItem* rootItem
3949 ) {                                              3907 ) {
3950                                               << 3908   
3951   for (int b=0;b< rootItem->childCount();b++)    3909   for (int b=0;b< rootItem->childCount();b++) {
3952                                                  3910 
3953     QTreeWidgetItem *child = rootItem->child(    3911     QTreeWidgetItem *child = rootItem->child(b);
3954                                                  3912 
3955     // clone top level items                     3913     // clone top level items
3956     int poIndex = child->data(0,Qt::UserRole)    3914     int poIndex = child->data(0,Qt::UserRole).toInt();
3957     if (poIndex != -1) {                         3915     if (poIndex != -1) {
3958       fOldPositivePoIndexSceneTreeWidgetQuick    3916       fOldPositivePoIndexSceneTreeWidgetQuickMap.insert(std::pair <int, QTreeWidgetItem*> (poIndex,cloneWidgetItem(child)));
3959     } else {                                     3917     } else {
3960       fOldNullPoIndexSceneTreeWidgetQuickVect    3918       fOldNullPoIndexSceneTreeWidgetQuickVector.push_back(cloneWidgetItem(child));
3961     }                                            3919     }
3962     cloneSceneTree(child);                       3920     cloneSceneTree(child);
3963   }                                              3921   }
3964 }                                                3922 }
3965                                                  3923 
3966                                                  3924 
3967 /**                                              3925 /**
3968    Update the quick scene tree visibility map    3926    Update the quick scene tree visibility map (used by parseAndCheckVisibility)
3969 */                                               3927 */
3970  void G4OpenGLQtViewer::updatePositivePoIndex    3928  void G4OpenGLQtViewer::updatePositivePoIndexSceneTreeWidgetQuickMap(int POindex,QTreeWidgetItem* item) {
3971                                                  3929 
3972    // Check state                                3930    // Check state
3973    std::map <int, QTreeWidgetItem*>::iterator    3931    std::map <int, QTreeWidgetItem*>::iterator i;
3974    i = fPositivePoIndexSceneTreeWidgetQuickMa    3932    i = fPositivePoIndexSceneTreeWidgetQuickMap.find(POindex);
3975                                                  3933 
3976    if (i == fPositivePoIndexSceneTreeWidgetQu    3934    if (i == fPositivePoIndexSceneTreeWidgetQuickMap.end()) {
3977      fPositivePoIndexSceneTreeWidgetQuickMap.    3935      fPositivePoIndexSceneTreeWidgetQuickMap.insert(std::pair <int, QTreeWidgetItem*> (POindex,item) );
3978      fLastSceneTreeWidgetAskForIterator = fPo    3936      fLastSceneTreeWidgetAskForIterator = fPositivePoIndexSceneTreeWidgetQuickMap.end();
3979      fLastSceneTreeWidgetAskForIteratorEnd =     3937      fLastSceneTreeWidgetAskForIteratorEnd = fPositivePoIndexSceneTreeWidgetQuickMap.end();
3980    } else {                                      3938    } else {
3981      i->second = item;                           3939      i->second = item;
3982    }                                             3940    }
3983  }                                               3941  }
3984                                                  3942 
3985                                                  3943 
3986                                                  3944 
3987 void G4OpenGLQtViewer::changeQColorForTreeWid    3945 void G4OpenGLQtViewer::changeQColorForTreeWidgetItem(QTreeWidgetItem* item,const QColor& qc) {
3988                                                  3946 
3989   int POIndex = item->data(0,Qt::UserRole).to    3947   int POIndex = item->data(0,Qt::UserRole).toInt();
3990   updatePositivePoIndexSceneTreeWidgetQuickMa    3948   updatePositivePoIndexSceneTreeWidgetQuickMap(POIndex,item );
3991                                                  3949 
3992   QPixmap pixmap = QPixmap(QSize(16, 16));       3950   QPixmap pixmap = QPixmap(QSize(16, 16));
3993   if (item->data(0,Qt::UserRole).toInt() != -    3951   if (item->data(0,Qt::UserRole).toInt() != -1) {
3994     pixmap.fill (qc);                            3952     pixmap.fill (qc);
3995   } else {                                       3953   } else {
3996     pixmap.fill (QColor(255,255,255,255));       3954     pixmap.fill (QColor(255,255,255,255));
3997   }                                              3955   }
3998   QPainter painter(&pixmap);                     3956   QPainter painter(&pixmap);
3999   painter.setPen(Qt::black);                     3957   painter.setPen(Qt::black);
4000   painter.drawRect(0,0,15,15); // Draw contou    3958   painter.drawRect(0,0,15,15); // Draw contour
4001                                                  3959 
4002   item->setIcon(0,pixmap);                       3960   item->setIcon(0,pixmap);
4003   item->setData(2,Qt::UserRole,qc);              3961   item->setData(2,Qt::UserRole,qc);
4004 }                                                3962 }
4005                                                  3963 
4006                                                  3964 
4007                                                  3965 
4008 /**                                              3966 /**
4009    @return the corresponding item if existing    3967    @return the corresponding item if existing.
4010    Look into fPositivePoIndexSceneTreeWidgetQ    3968    Look into fPositivePoIndexSceneTreeWidgetQuickMap
4011  */                                              3969  */
4012 QTreeWidgetItem* G4OpenGLQtViewer::getTreeWid    3970 QTreeWidgetItem* G4OpenGLQtViewer::getTreeWidgetItem(int POindex){
4013                                                  3971 
4014   // -1 is not a visible item                    3972   // -1 is not a visible item
4015   if (POindex == -1) {                           3973   if (POindex == -1) {
4016     return NULL;                                 3974     return NULL;
4017   }                                              3975   }
4018                                                  3976 
4019   if (fPositivePoIndexSceneTreeWidgetQuickMap    3977   if (fPositivePoIndexSceneTreeWidgetQuickMap.size() == 0){
4020     return NULL;                                 3978     return NULL;
4021   }                                              3979   }
4022                                                  3980 
4023   if (fLastSceneTreeWidgetAskForIterator != f    3981   if (fLastSceneTreeWidgetAskForIterator != fLastSceneTreeWidgetAskForIteratorEnd) {
4024     if (POindex == fLastSceneTreeWidgetAskFor    3982     if (POindex == fLastSceneTreeWidgetAskForIterator->first) {
4025       if (fLastSceneTreeWidgetAskForIterator-    3983       if (fLastSceneTreeWidgetAskForIterator->second != NULL) {
4026         return fLastSceneTreeWidgetAskForIter    3984         return fLastSceneTreeWidgetAskForIterator->second;
4027       }                                          3985       }
4028     }                                            3986     }
4029   }                                              3987   }
4030                                               << 3988   
4031   // if not, use the "find" algorithm            3989   // if not, use the "find" algorithm
4032   fLastSceneTreeWidgetAskForIterator = fPosit    3990   fLastSceneTreeWidgetAskForIterator = fPositivePoIndexSceneTreeWidgetQuickMap.find(POindex);
4033   fLastSceneTreeWidgetAskForIteratorEnd = fPo    3991   fLastSceneTreeWidgetAskForIteratorEnd = fPositivePoIndexSceneTreeWidgetQuickMap.end();
4034                                               << 3992   
4035   if (fLastSceneTreeWidgetAskForIterator != f    3993   if (fLastSceneTreeWidgetAskForIterator != fPositivePoIndexSceneTreeWidgetQuickMap.end()) {
4036     return fLastSceneTreeWidgetAskForIterator    3994     return fLastSceneTreeWidgetAskForIterator->second;
4037   }                                              3995   }
4038   return NULL;                                   3996   return NULL;
4039 }                                                3997 }
4040                                                  3998 
4041 /**                                              3999 /**
4042    @return the corresponding item if existing    4000    @return the corresponding item if existing in the old tree
4043    Look into fOldPositivePoIndexSceneTreeWidg    4001    Look into fOldPositivePoIndexSceneTreeWidgetQuickMap
4044  */                                              4002  */
4045 QTreeWidgetItem* G4OpenGLQtViewer::getOldTree    4003 QTreeWidgetItem* G4OpenGLQtViewer::getOldTreeWidgetItem(int POindex){
4046                                                  4004 
4047                                                  4005 
4048   // -1 is not a visible item                    4006   // -1 is not a visible item
4049   if (POindex == -1) {                           4007   if (POindex == -1) {
4050     return NULL;                                 4008     return NULL;
4051   }                                              4009   }
4052                                                  4010 
4053   if (fOldPositivePoIndexSceneTreeWidgetQuick    4011   if (fOldPositivePoIndexSceneTreeWidgetQuickMap.size() == 0){
4054     return NULL;                                 4012     return NULL;
4055   }                                              4013   }
4056                                                  4014 
4057   // Should be call only once by item additio    4015   // Should be call only once by item addition
4058   // Prevent to get out the std::map             4016   // Prevent to get out the std::map
4059   if (fOldLastSceneTreeWidgetAskForIterator !    4017   if (fOldLastSceneTreeWidgetAskForIterator != fOldLastSceneTreeWidgetAskForIteratorEnd) {
4060     fOldLastSceneTreeWidgetAskForIterator++;     4018     fOldLastSceneTreeWidgetAskForIterator++;
4061   }                                              4019   }
4062                                               << 4020   
4063   if (fOldLastSceneTreeWidgetAskForIterator !    4021   if (fOldLastSceneTreeWidgetAskForIterator != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
4064     if (POindex == fOldLastSceneTreeWidgetAsk    4022     if (POindex == fOldLastSceneTreeWidgetAskForIterator->first) {
4065       if (fOldLastSceneTreeWidgetAskForIterat    4023       if (fOldLastSceneTreeWidgetAskForIterator->second != NULL) {
4066         return fOldLastSceneTreeWidgetAskForI    4024         return fOldLastSceneTreeWidgetAskForIterator->second;
4067       }                                          4025       }
4068     }                                            4026     }
4069   }                                              4027   }
4070                                               << 4028   
4071   // if not, use the "find" algorithm            4029   // if not, use the "find" algorithm
4072   fOldLastSceneTreeWidgetAskForIterator = fOl    4030   fOldLastSceneTreeWidgetAskForIterator = fOldPositivePoIndexSceneTreeWidgetQuickMap.find(POindex);
4073   fOldLastSceneTreeWidgetAskForIteratorEnd =     4031   fOldLastSceneTreeWidgetAskForIteratorEnd = fOldPositivePoIndexSceneTreeWidgetQuickMap.end();
4074                                               << 4032   
4075   if (fOldLastSceneTreeWidgetAskForIterator !    4033   if (fOldLastSceneTreeWidgetAskForIterator != fOldPositivePoIndexSceneTreeWidgetQuickMap.end()) {
4076     return fOldLastSceneTreeWidgetAskForItera    4034     return fOldLastSceneTreeWidgetAskForIterator->second;
4077   }                                              4035   }
4078   return NULL;                                   4036   return NULL;
4079 }                                                4037 }
4080                                                  4038 
4081                                                  4039 
4082                                                  4040 
4083 /**                                              4041 /**
4084    Should replace actual tree by the one in t    4042    Should replace actual tree by the one in this class
4085    and update tree                               4043    and update tree
4086 */                                               4044 */
4087 void G4OpenGLQtViewer::displaySceneTreeCompon    4045 void G4OpenGLQtViewer::displaySceneTreeComponent() {
4088   // no UI                                       4046   // no UI
4089   if (fUISceneTreeWidget == NULL) {              4047   if (fUISceneTreeWidget == NULL) {
4090     return;                                   << 4048     return; 
4091   }                                              4049   }
4092   if (fSceneTreeComponentTreeWidget == NULL)     4050   if (fSceneTreeComponentTreeWidget == NULL) {
4093     return;                                      4051     return;
4094   }                                              4052   }
4095                                                  4053 
4096   // sort tree items                             4054   // sort tree items
4097   fSceneTreeComponentTreeWidget->sortItems (0    4055   fSceneTreeComponentTreeWidget->sortItems (0, Qt::AscendingOrder );
4098                                                  4056 
4099   return;                                        4057   return;
4100 }                                                4058 }
4101                                                  4059 
4102                                                  4060 
4103 /**                                              4061 /**
4104    Update the toolbar Icons/Mouse context men    4062    Update the toolbar Icons/Mouse context menu
4105    - Change ortho/perspective                    4063    - Change ortho/perspective
4106    - Change surface style                        4064    - Change surface style
4107    - Change cursor style                         4065    - Change cursor style
4108  */                                              4066  */
4109 void G4OpenGLQtViewer::updateToolbarAndMouseC    4067 void G4OpenGLQtViewer::updateToolbarAndMouseContextMenu(){
4110    if (fBatchMode) {                             4068    if (fBatchMode) {
4111      return;                                     4069      return;
4112    }                                             4070    }
4113                                                  4071 
4114   G4ViewParameters::DrawingStyle                 4072   G4ViewParameters::DrawingStyle
4115   d_style = fVP.GetDrawingStyle();               4073   d_style = fVP.GetDrawingStyle();
4116                                               << 4074   
4117   // Surface style                               4075   // Surface style
4118   if (d_style == G4ViewParameters::wireframe)    4076   if (d_style == G4ViewParameters::wireframe) {
4119     if (fUiQt) fUiQt->SetIconWireframeSelecte    4077     if (fUiQt) fUiQt->SetIconWireframeSelected();
4120     if (fContextMenu) {                          4078     if (fContextMenu) {
4121       fDrawingWireframe->setChecked(true);       4079       fDrawingWireframe->setChecked(true);
4122       fDrawingLineRemoval->setChecked(false);    4080       fDrawingLineRemoval->setChecked(false);
4123       fDrawingSurfaceRemoval->setChecked(fals    4081       fDrawingSurfaceRemoval->setChecked(false);
4124       fDrawingLineSurfaceRemoval->setChecked(    4082       fDrawingLineSurfaceRemoval->setChecked(false);
4125     }                                         << 4083     }    
4126   } else if (d_style == G4ViewParameters::hlr    4084   } else if (d_style == G4ViewParameters::hlr) {
4127     if (fUiQt) fUiQt->SetIconHLRSelected();      4085     if (fUiQt) fUiQt->SetIconHLRSelected();
4128     if (fContextMenu) {                          4086     if (fContextMenu) {
4129       fDrawingLineRemoval->setChecked(true);     4087       fDrawingLineRemoval->setChecked(true);
4130       fDrawingWireframe->setChecked(false);      4088       fDrawingWireframe->setChecked(false);
4131       fDrawingSurfaceRemoval->setChecked(fals    4089       fDrawingSurfaceRemoval->setChecked(false);
4132       fDrawingLineSurfaceRemoval->setChecked(    4090       fDrawingLineSurfaceRemoval->setChecked(false);
4133     }                                         << 4091     }    
4134   } else if (d_style == G4ViewParameters::hsr    4092   } else if (d_style == G4ViewParameters::hsr) {
4135     if (fUiQt) fUiQt->SetIconSolidSelected();    4093     if (fUiQt) fUiQt->SetIconSolidSelected();
4136     if (fContextMenu) {                          4094     if (fContextMenu) {
4137       fDrawingSurfaceRemoval->setChecked(true    4095       fDrawingSurfaceRemoval->setChecked(true);
4138       fDrawingWireframe->setChecked(false);      4096       fDrawingWireframe->setChecked(false);
4139       fDrawingLineRemoval->setChecked(false);    4097       fDrawingLineRemoval->setChecked(false);
4140       fDrawingLineSurfaceRemoval->setChecked(    4098       fDrawingLineSurfaceRemoval->setChecked(false);
4141     }                                            4099     }
4142   } else if (d_style == G4ViewParameters::hlh    4100   } else if (d_style == G4ViewParameters::hlhsr) {
4143     if (fUiQt) fUiQt->SetIconHLHSRSelected();    4101     if (fUiQt) fUiQt->SetIconHLHSRSelected();
4144     if (fContextMenu) {                          4102     if (fContextMenu) {
4145       fDrawingLineSurfaceRemoval->setChecked(    4103       fDrawingLineSurfaceRemoval->setChecked(true);
4146       fDrawingWireframe->setChecked(false);      4104       fDrawingWireframe->setChecked(false);
4147       fDrawingLineRemoval->setChecked(false);    4105       fDrawingLineRemoval->setChecked(false);
4148       fDrawingSurfaceRemoval->setChecked(fals    4106       fDrawingSurfaceRemoval->setChecked(false);
4149       fDrawingLineSurfaceRemoval->setChecked(    4107       fDrawingLineSurfaceRemoval->setChecked(false);
4150     }                                            4108     }
4151   }                                              4109   }
4152                                               << 4110   
4153                                               << 4111   
4154   // projection style                            4112   // projection style
4155   G4double d_proj = fVP.GetFieldHalfAngle ()     4113   G4double d_proj = fVP.GetFieldHalfAngle () ;
4156   if (d_proj == 0.) { // ortho                   4114   if (d_proj == 0.) { // ortho
4157     if (fUiQt) fUiQt->SetIconOrthoSelected();    4115     if (fUiQt) fUiQt->SetIconOrthoSelected();
4158     if (fContextMenu) {                          4116     if (fContextMenu) {
4159       fProjectionOrtho->setChecked(true);        4117       fProjectionOrtho->setChecked(true);
4160       fProjectionPerspective->setChecked(fals    4118       fProjectionPerspective->setChecked(false);
4161     }                                         << 4119     }    
4162   } else {                                       4120   } else {
4163     if (fUiQt) fUiQt->SetIconPerspectiveSelec    4121     if (fUiQt) fUiQt->SetIconPerspectiveSelected();
4164       if (fContextMenu) {                        4122       if (fContextMenu) {
4165         fProjectionPerspective->setChecked(tr    4123         fProjectionPerspective->setChecked(true);
4166         fProjectionOrtho->setChecked(false);     4124         fProjectionOrtho->setChecked(false);
4167       }                                          4125       }
4168   }                                              4126   }
4169                                               << 4127   
4170                                               << 4128   
4171   // mouse style : They are controlled by UI     4129   // mouse style : They are controlled by UI !
4172   if (fUiQt && fContextMenu) {                   4130   if (fUiQt && fContextMenu) {
4173     if (fUiQt->IsIconPickSelected()) {           4131     if (fUiQt->IsIconPickSelected()) {
4174       fMousePickAction->setChecked(true);        4132       fMousePickAction->setChecked(true);
4175       fMouseZoomOutAction->setChecked(false);    4133       fMouseZoomOutAction->setChecked(false);
4176       fMouseZoomInAction->setChecked(false);     4134       fMouseZoomInAction->setChecked(false);
4177       fMouseRotateAction->setChecked(false);     4135       fMouseRotateAction->setChecked(false);
4178       fMouseMoveAction->setChecked(false);       4136       fMouseMoveAction->setChecked(false);
4179     } else if (fUiQt->IsIconZoomOutSelected()    4137     } else if (fUiQt->IsIconZoomOutSelected()) {
4180       fMouseZoomOutAction->setChecked(true);     4138       fMouseZoomOutAction->setChecked(true);
4181       fMousePickAction->setChecked(false);       4139       fMousePickAction->setChecked(false);
4182       fMouseZoomInAction->setChecked(false);     4140       fMouseZoomInAction->setChecked(false);
4183       fMouseRotateAction->setChecked(false);     4141       fMouseRotateAction->setChecked(false);
4184       fMouseMoveAction->setChecked(false);       4142       fMouseMoveAction->setChecked(false);
4185     } else if (fUiQt->IsIconZoomInSelected())    4143     } else if (fUiQt->IsIconZoomInSelected()) {
4186       fMouseZoomInAction->setChecked(true);      4144       fMouseZoomInAction->setChecked(true);
4187       fMousePickAction->setChecked(false);       4145       fMousePickAction->setChecked(false);
4188       fMouseZoomOutAction->setChecked(false);    4146       fMouseZoomOutAction->setChecked(false);
4189       fMouseRotateAction->setChecked(false);     4147       fMouseRotateAction->setChecked(false);
4190       fMouseMoveAction->setChecked(false);       4148       fMouseMoveAction->setChecked(false);
4191     } else if (fUiQt->IsIconRotateSelected())    4149     } else if (fUiQt->IsIconRotateSelected()) {
4192       fMouseRotateAction->setChecked(true);      4150       fMouseRotateAction->setChecked(true);
4193       fMousePickAction->setChecked(false);       4151       fMousePickAction->setChecked(false);
4194       fMouseZoomOutAction->setChecked(false);    4152       fMouseZoomOutAction->setChecked(false);
4195       fMouseZoomInAction->setChecked(false);     4153       fMouseZoomInAction->setChecked(false);
4196       fMouseMoveAction->setChecked(false);       4154       fMouseMoveAction->setChecked(false);
4197     } else if (fUiQt->IsIconMoveSelected()) {    4155     } else if (fUiQt->IsIconMoveSelected()) {
4198       fMouseMoveAction->setChecked(true);        4156       fMouseMoveAction->setChecked(true);
4199       fMousePickAction->setChecked(false);       4157       fMousePickAction->setChecked(false);
4200       fMouseZoomOutAction->setChecked(false);    4158       fMouseZoomOutAction->setChecked(false);
4201       fMouseZoomInAction->setChecked(false);     4159       fMouseZoomInAction->setChecked(false);
4202       fMouseRotateAction->setChecked(false);     4160       fMouseRotateAction->setChecked(false);
4203     }                                            4161     }
4204   }                                              4162   }
4205 }                                                4163 }
4206                                                  4164 
4207                                               << 
4208 /**                                              4165 /**
4209  Update the scene tree widget                    4166  Update the scene tree widget
4210  */                                              4167  */
4211 void G4OpenGLQtViewer::updateSceneTreeWidget(    4168 void G4OpenGLQtViewer::updateSceneTreeWidget() {
4212   // Ensure case where closing a UI tab close    4169   // Ensure case where closing a UI tab close the widget
4213   if (!fSceneTreeWidget) {                       4170   if (!fSceneTreeWidget) {
4214     createSceneTreeWidget();                     4171     createSceneTreeWidget();
4215   }                                              4172   }
4216 }                                                4173 }
4217                                                  4174 
4218                                                  4175 
4219   /**                                            4176   /**
4220  Update the viewer properties component widge    4177  Update the viewer properties component widget
4221  Clear it only if the number of command is le    4178  Clear it only if the number of command is less than the previous table widget row count
4222  */                                              4179  */
4223 void G4OpenGLQtViewer::updateViewerProperties    4180 void G4OpenGLQtViewer::updateViewerPropertiesTableWidget() {
4224                                               << 4181   
4225   if (!isCurrentWidget()) {                      4182   if (!isCurrentWidget()) {
4226     return;                                      4183     return;
4227   }                                              4184   }
4228                                               << 4185   
4229   // Ensure case where closing a UI tab close    4186   // Ensure case where closing a UI tab close the widget
4230   if (!fViewerPropertiesTableWidget) {           4187   if (!fViewerPropertiesTableWidget) {
4231     createViewerPropertiesWidget();              4188     createViewerPropertiesWidget();
4232   }                                              4189   }
4233   int treeWidgetInfosIgnoredCommands = 0;        4190   int treeWidgetInfosIgnoredCommands = 0;
4234   G4UImanager* UI = G4UImanager::GetUIpointer    4191   G4UImanager* UI = G4UImanager::GetUIpointer();
4235   G4UIcommandTree * commandTreeTop = UI->GetT    4192   G4UIcommandTree * commandTreeTop = UI->GetTree();
4236   G4UIcommandTree* path = commandTreeTop->Fin    4193   G4UIcommandTree* path = commandTreeTop->FindCommandTree("/vis/viewer/set/");
4237                                                  4194 
4238   if (!path) {                                   4195   if (!path) {
4239     return;                                      4196     return;
4240   }                                              4197   }
4241                                                  4198 
4242   // clear old table                             4199   // clear old table
4243   if ((path->GetCommandEntry()-fTreeWidgetInf    4200   if ((path->GetCommandEntry()-fTreeWidgetInfosIgnoredCommands) != fViewerPropertiesTableWidget->rowCount()) {
4244     fViewerPropertiesTableWidget->clear();       4201     fViewerPropertiesTableWidget->clear();
4245   }                                              4202   }
4246                                               << 4203   
4247   fViewerPropertiesTableWidget->blockSignals(    4204   fViewerPropertiesTableWidget->blockSignals(true);
4248   // TODO : Could be optimized by comparing c    4205   // TODO : Could be optimized by comparing current command to old commands. That should not change so much
4249                                                  4206 
4250   fViewerPropertiesTableWidget->setColumnCoun    4207   fViewerPropertiesTableWidget->setColumnCount (2);
4251   fViewerPropertiesTableWidget->setRowCount (    4208   fViewerPropertiesTableWidget->setRowCount (path->GetCommandEntry()-fTreeWidgetInfosIgnoredCommands);
4252   fViewerPropertiesTableWidget->setHorizontal    4209   fViewerPropertiesTableWidget->setHorizontalHeaderLabels(QStringList() << tr("Property")
4253                                                  4210                                                         << tr("Value"));
4254   fViewerPropertiesTableWidget->verticalHeade    4211   fViewerPropertiesTableWidget->verticalHeader()->setVisible(false);
4255   fViewerPropertiesTableWidget->setAlternatin    4212   fViewerPropertiesTableWidget->setAlternatingRowColors (true);
4256                                               << 4213   
4257   // For the moment, we do only command that     4214   // For the moment, we do only command that have a "set" command in UI
4258                                               << 4215   
4259   for (int a=0;a<path->GetCommandEntry();a++)    4216   for (int a=0;a<path->GetCommandEntry();a++) {
4260     G4UIcommand* commandTmp = path->GetComman    4217     G4UIcommand* commandTmp = path->GetCommand(a+1);
4261                                               << 4218   
4262     // get current parameters                    4219     // get current parameters
4263     QString params = "";                         4220     QString params = "";
4264                                               << 4221     
4265     if(commandTmp->GetCommandName() == "autoR    4222     if(commandTmp->GetCommandName() == "autoRefresh") {
4266       if (fVP.IsAutoRefresh()) {                 4223       if (fVP.IsAutoRefresh()) {
4267         params = "True";                         4224         params = "True";
4268       } else {                                   4225       } else {
4269         params = "False";                        4226         params = "False";
4270       }                                          4227       }
4271     } else if(commandTmp->GetCommandName() ==    4228     } else if(commandTmp->GetCommandName() == "auxiliaryEdge") {
4272       if (fVP.IsAuxEdgeVisible()) {              4229       if (fVP.IsAuxEdgeVisible()) {
4273         params = "True";                         4230         params = "True";
4274       } else {                                   4231       } else {
4275         params = "False";                        4232         params = "False";
4276       }                                          4233       }
4277     } else if(commandTmp->GetCommandName() ==    4234     } else if(commandTmp->GetCommandName() == "background") {
4278       params = QString().number(fVP.GetBackgr    4235       params = QString().number(fVP.GetBackgroundColour().GetRed()) + "  "+
4279       QString().number(fVP.GetBackgroundColou    4236       QString().number(fVP.GetBackgroundColour().GetGreen()) + "  "+
4280       QString().number(fVP.GetBackgroundColou    4237       QString().number(fVP.GetBackgroundColour().GetBlue()) + "  "+
4281       QString().number(fVP.GetBackgroundColou    4238       QString().number(fVP.GetBackgroundColour().GetAlpha());
4282                                               << 4239       
4283     } else if(commandTmp->GetCommandName() ==    4240     } else if(commandTmp->GetCommandName() == "culling") {
4284       params = QString().number(fVP. IsCullin    4241       params = QString().number(fVP. IsCulling ());
4285     } else if(commandTmp->GetCommandName() ==    4242     } else if(commandTmp->GetCommandName() == "cutawayMode") {
4286       if (fVP.GetCutawayMode() == G4ViewParam    4243       if (fVP.GetCutawayMode() == G4ViewParameters::cutawayUnion) {
4287         params = "union";                        4244         params = "union";
4288       } else {                                   4245       } else {
4289         params = "intersection";                 4246         params = "intersection";
4290       }                                          4247       }
4291                                                  4248 
4292     } else if(commandTmp->GetCommandName() ==    4249     } else if(commandTmp->GetCommandName() == "defaultColour") {
4293       params = QString().number(fVP.GetDefaul    4250       params = QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetRed()) + "  "+
4294       QString().number(fVP.GetDefaultVisAttri    4251       QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetGreen()) + "  "+
4295       QString().number(fVP.GetDefaultVisAttri    4252       QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetBlue()) + "  "+
4296       QString().number(fVP.GetDefaultVisAttri    4253       QString().number(fVP.GetDefaultVisAttributes()->GetColor().GetAlpha());
4297                                               << 4254       
4298     } else if(commandTmp->GetCommandName() ==    4255     } else if(commandTmp->GetCommandName() == "defaultTextColour") {
4299       params = QString().number(fVP.GetDefaul    4256       params = QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetRed()) + "  "+
4300       QString().number(fVP.GetDefaultTextVisA    4257       QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetGreen()) + "  "+
4301       QString().number(fVP.GetDefaultTextVisA    4258       QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetBlue()) + "  "+
4302       QString().number(fVP.GetDefaultTextVisA    4259       QString().number(fVP.GetDefaultTextVisAttributes()->GetColor().GetAlpha());
4303                                               << 4260       
4304     } else if(commandTmp->GetCommandName() ==    4261     } else if(commandTmp->GetCommandName() == "edge") {
4305       G4ViewParameters::DrawingStyle existing    4262       G4ViewParameters::DrawingStyle existingStyle = fVP.GetDrawingStyle();
4306       params = "False";                          4263       params = "False";
4307       if (existingStyle == G4ViewParameters::    4264       if (existingStyle == G4ViewParameters::hsr) {
4308         params = "True";                         4265         params = "True";
4309       }                                          4266       }
4310                                                  4267 
4311     } else if(commandTmp->GetCommandName() ==    4268     } else if(commandTmp->GetCommandName() == "explodeFactor") {
4312       params = QString().number(fVP.GetExplod    4269       params = QString().number(fVP.GetExplodeFactor()) +  "  " + QString(G4String(G4BestUnit(fVP.GetExplodeFactor(),"Length")).data());
4313                                                  4270 
4314     } else if(commandTmp->GetCommandName() ==    4271     } else if(commandTmp->GetCommandName() == "globalLineWidthScale") {
4315       params = QString().number(fVP.GetGlobal    4272       params = QString().number(fVP.GetGlobalLineWidthScale());
4316                                               << 4273       
4317     } else if(commandTmp->GetCommandName() ==    4274     } else if(commandTmp->GetCommandName() == "globalMarkerScale") {
4318       params = QString().number(fVP.GetGlobal    4275       params = QString().number(fVP.GetGlobalMarkerScale());
4319                                                  4276 
4320     } else if(commandTmp->GetCommandName() ==    4277     } else if(commandTmp->GetCommandName() == "hiddenEdge") {
4321       G4ViewParameters::DrawingStyle style =     4278       G4ViewParameters::DrawingStyle style = fVP.GetDrawingStyle();
4322       if ((style == G4ViewParameters::hlr) ||    4279       if ((style == G4ViewParameters::hlr) ||
4323           (style == G4ViewParameters::hlhsr))    4280           (style == G4ViewParameters::hlhsr)) {
4324         params = "True";                         4281         params = "True";
4325       } else {                                   4282       } else {
4326         params = "False";                        4283         params = "False";
4327       }                                          4284       }
4328                                                  4285 
4329     } else if(commandTmp->GetCommandName() ==    4286     } else if(commandTmp->GetCommandName() == "hiddenMarker") {
4330       if (fVP.IsMarkerNotHidden()) {             4287       if (fVP.IsMarkerNotHidden()) {
4331         params = "False";                        4288         params = "False";
4332       } else {                                   4289       } else {
4333         params = "True";                         4290         params = "True";
4334       }                                          4291       }
4335                                                  4292 
4336     } else if(commandTmp->GetCommandName() ==    4293     } else if(commandTmp->GetCommandName() == "lightsMove") {
4337       if (fVP.GetLightsMoveWithCamera()) {       4294       if (fVP.GetLightsMoveWithCamera()) {
4338         params = "camera";                       4295         params = "camera";
4339       } else {                                   4296       } else {
4340         params = "object";                       4297         params = "object";
4341       }                                          4298       }
4342     } else if(commandTmp->GetCommandName() ==    4299     } else if(commandTmp->GetCommandName() == "lightsThetaPhi") {
4343       G4Vector3D direction = fVP.GetLightpoin    4300       G4Vector3D direction = fVP.GetLightpointDirection();
4344       // degree                                  4301       // degree
4345       params = QString().number(direction.the    4302       params = QString().number(direction.theta()/CLHEP::degree)+ "  "+ QString().number(direction.phi()/CLHEP::degree)+"  deg";
4346       if (commandTmp->GetParameterEntries() =    4303       if (commandTmp->GetParameterEntries() == 3) {
4347         if (commandTmp->GetParameter(2)->GetD    4304         if (commandTmp->GetParameter(2)->GetDefaultValue() != "deg") {
4348           params = QString().number(direction    4305           params = QString().number(direction.theta())+ "  "+ QString().number(direction.phi())+" "+commandTmp->GetParameter(2)->GetDefaultValue().data();
4349         }                                        4306         }
4350       }                                          4307       }
4351     } else if(commandTmp->GetCommandName() ==    4308     } else if(commandTmp->GetCommandName() == "lightsVector") {
4352      params = QString().number(fVP.GetLightpo    4309      params = QString().number(fVP.GetLightpointDirection().x()) + "  "+
4353       QString().number(fVP.GetLightpointDirec    4310       QString().number(fVP.GetLightpointDirection().y()) + "  "+
4354       QString().number(fVP.GetLightpointDirec    4311       QString().number(fVP.GetLightpointDirection().z());
4355                                                  4312 
4356     } else if(commandTmp->GetCommandName() ==    4313     } else if(commandTmp->GetCommandName() == "lineSegmentsPerCircle") {
4357       params = QString().number(fVP.GetNoOfSi    4314       params = QString().number(fVP.GetNoOfSides());
4358                                               << 4315       
4359     } else if(commandTmp->GetCommandName() ==    4316     } else if(commandTmp->GetCommandName() == "picking") {
4360       if (fVP.IsPicking()) {                     4317       if (fVP.IsPicking()) {
4361         params = "True";                         4318         params = "True";
4362       } else {                                   4319       } else {
4363         params = "False";                        4320         params = "False";
4364       }                                          4321       }
4365                                                  4322 
4366     } else if(commandTmp->GetCommandName() ==    4323     } else if(commandTmp->GetCommandName() == "projection") {
4367       if (fVP.GetFieldHalfAngle() == 0.) {       4324       if (fVP.GetFieldHalfAngle() == 0.) {
4368         params = "orthogonal";                   4325         params = "orthogonal";
4369       } else {                                   4326       } else {
4370         params = QString("perspective ") + QS    4327         params = QString("perspective ") + QString().number(fVP.GetFieldHalfAngle()/CLHEP::degree) + " deg";
4371       }                                          4328       }
4372                                                  4329 
4373     } else if(commandTmp->GetCommandName() ==    4330     } else if(commandTmp->GetCommandName() == "rotationStyle") {
4374       if (fVP.GetRotationStyle() == G4ViewPar    4331       if (fVP.GetRotationStyle() == G4ViewParameters::constrainUpDirection) {
4375         params = "constrainUpDirection";         4332         params = "constrainUpDirection";
4376       } else {                                   4333       } else {
4377         params = "freeRotation";                 4334         params = "freeRotation";
4378       }                                          4335       }
4379                                                  4336 
4380     } else if(commandTmp->GetCommandName() ==    4337     } else if(commandTmp->GetCommandName() == "sectionPlane") {
4381       if (fVP.IsSection()) {                     4338       if (fVP.IsSection()) {
4382         params =  QString("on ") +               4339         params =  QString("on ") +
4383         G4String(G4BestUnit(fVP.GetSectionPla    4340         G4String(G4BestUnit(fVP.GetSectionPlane().point(),"Length")).data()+
4384         QString().number(fVP.GetSectionPlane(    4341         QString().number(fVP.GetSectionPlane().normal().x())
4385         + " " + QString().number(fVP.GetSecti    4342         + " " + QString().number(fVP.GetSectionPlane().normal().y())
4386         + " " + QString().number(fVP.GetSecti    4343         + " " + QString().number(fVP.GetSectionPlane().normal().z());
4387       } else {                                   4344       } else {
4388         params = "off";                          4345         params = "off";
4389       }                                          4346       }
4390                                                  4347 
4391     } else if(commandTmp->GetCommandName() ==    4348     } else if(commandTmp->GetCommandName() == "style") {
4392       if (fVP.GetDrawingStyle() == G4ViewPara    4349       if (fVP.GetDrawingStyle() == G4ViewParameters::wireframe || fVP.GetDrawingStyle() == G4ViewParameters::hlr) {
4393          params = "wireframe";                   4350          params = "wireframe";
4394       } else {                                   4351       } else {
4395         params = "surface";                      4352         params = "surface";
4396       }                                          4353       }
4397                                                  4354 
4398                                               << 4355       
4399     } else if(commandTmp->GetCommandName() ==    4356     } else if(commandTmp->GetCommandName() == "targetPoint") {
4400       G4Point3D point = fVP.GetCurrentTargetP    4357       G4Point3D point = fVP.GetCurrentTargetPoint();
4401       if (fSceneHandler.GetScene()) {            4358       if (fSceneHandler.GetScene()) {
4402         G4String b = G4BestUnit(fSceneHandler    4359         G4String b = G4BestUnit(fSceneHandler.GetScene()->GetStandardTargetPoint() + fVP.GetCurrentTargetPoint(),"Length");
4403         params = b.data();                       4360         params = b.data();
4404       }                                          4361       }
4405     } else if(commandTmp->GetCommandName() ==    4362     } else if(commandTmp->GetCommandName() == "upThetaPhi") {
4406       G4Vector3D up = fVP.GetUpVector();         4363       G4Vector3D up = fVP.GetUpVector();
4407       // degree                                  4364       // degree
4408       params = QString().number(up.theta()/CL    4365       params = QString().number(up.theta()/CLHEP::degree)+ "  "+ QString().number(up.phi()/CLHEP::degree)+"  deg";
4409       if (commandTmp->GetParameterEntries() =    4366       if (commandTmp->GetParameterEntries() == 3) {
4410         if (commandTmp->GetParameter(2)->GetD    4367         if (commandTmp->GetParameter(2)->GetDefaultValue() != "deg") {
4411           params = QString().number(up.theta(    4368           params = QString().number(up.theta())+ "  "+ QString().number(up.phi())+" "+commandTmp->GetParameter(2)->GetDefaultValue().data();
4412         }                                        4369         }
4413       }                                          4370       }
4414     } else if(commandTmp->GetCommandName() ==    4371     } else if(commandTmp->GetCommandName() == "upVector") {
4415       G4Vector3D up = fVP.GetUpVector();         4372       G4Vector3D up = fVP.GetUpVector();
4416       params = QString().number(up.x())+ "  "    4373       params = QString().number(up.x())+ "  "+ QString().number(up.y())+"  "+QString().number(up.z())+ "  ";
4417                                               << 4374       
4418     } else if(commandTmp->GetCommandName() ==    4375     } else if(commandTmp->GetCommandName() == "viewpointThetaPhi") {
4419       G4Vector3D direction = fVP.GetViewpoint    4376       G4Vector3D direction = fVP.GetViewpointDirection();
4420       // degree                                  4377       // degree
4421       params = QString().number(direction.the    4378       params = QString().number(direction.theta()/CLHEP::degree)+ "  "+ QString().number(direction.phi()/CLHEP::degree)+"  deg";
4422       if (commandTmp->GetParameterEntries() =    4379       if (commandTmp->GetParameterEntries() == 3) {
4423         if (commandTmp->GetParameter(2)->GetD    4380         if (commandTmp->GetParameter(2)->GetDefaultValue() != "deg") {
4424           params = QString().number(direction    4381           params = QString().number(direction.theta())+ "  "+ QString().number(direction.phi())+" "+commandTmp->GetParameter(2)->GetDefaultValue().data();
4425         }                                        4382         }
4426       }                                          4383       }
4427     } else if(commandTmp->GetCommandName() ==    4384     } else if(commandTmp->GetCommandName() == "viewpointVector") {
4428       G4Vector3D direction = fVP.GetViewpoint    4385       G4Vector3D direction = fVP.GetViewpointDirection();
4429       params = QString().number(direction.x()    4386       params = QString().number(direction.x())+ "  "+ QString().number(direction.y())+" "+QString().number(direction.z());
4430     } else {                                     4387     } else {
4431       // No help                                 4388       // No help
4432     }                                            4389     }
4433                                               << 4390     
4434     /* DO NOT DISPLAY COMMANDS WITHOUT ANY PA    4391     /* DO NOT DISPLAY COMMANDS WITHOUT ANY PARAMETERS SET
4435     if (params == "") {                          4392     if (params == "") {
4436       // TODO : display default parameters //    4393       // TODO : display default parameters // should not be editable ?
4437                                               << 4394       
4438       for( G4int i_thParameter=0; i_thParamet    4395       for( G4int i_thParameter=0; i_thParameter<commandTmp->GetParameterEntries(); i_thParameter++ ) {
4439         commandParam = commandTmp->GetParamet    4396         commandParam = commandTmp->GetParameter(i_thParameter);
4440                                               << 4397         
4441         if (QString(QChar(commandParam->GetPa    4398         if (QString(QChar(commandParam->GetParameterType())) == "b") {
4442           if (commandParam->GetDefaultValue()    4399           if (commandParam->GetDefaultValue().data()) {
4443             params += "True";                    4400             params += "True";
4444           } else {                               4401           } else {
4445             params += "False";                   4402             params += "False";
4446           }                                      4403           }
4447         } else {                                 4404         } else {
4448           params += QString((char*)(commandPa    4405           params += QString((char*)(commandParam->GetDefaultValue()).data());
4449         }                                        4406         }
4450         if (i_thParameter<commandTmp->GetPara    4407         if (i_thParameter<commandTmp->GetParameterEntries()-1) {
4451           params += " ";                         4408           params += " ";
4452         }                                        4409         }
4453       }                                          4410       }
4454     }                                            4411     }
4455     */                                           4412     */
4456                                               << 4413     
4457     if (params != "") {                          4414     if (params != "") {
4458                                                  4415 
4459       QTableWidgetItem *nameItem;                4416       QTableWidgetItem *nameItem;
4460       QTableWidgetItem *paramItem;               4417       QTableWidgetItem *paramItem;
4461                                               << 4418       
4462       // already present ?                       4419       // already present ?
4463       QList<QTableWidgetItem *> list = fViewe    4420       QList<QTableWidgetItem *> list = fViewerPropertiesTableWidget->findItems (commandTmp->GetCommandName().data(),Qt::MatchExactly);
4464       if (list.size() == 1) {                    4421       if (list.size() == 1) {
4465         nameItem = list.first();                 4422         nameItem = list.first();
4466         paramItem = fViewerPropertiesTableWid    4423         paramItem = fViewerPropertiesTableWidget->item(nameItem->row(),1);
4467                                               << 4424         
4468       } else {                                   4425       } else {
4469         nameItem = new QTableWidgetItem();       4426         nameItem = new QTableWidgetItem();
4470         paramItem = new QTableWidgetItem();      4427         paramItem = new QTableWidgetItem();
4471         fViewerPropertiesTableWidget->setItem    4428         fViewerPropertiesTableWidget->setItem(a-treeWidgetInfosIgnoredCommands, 0, nameItem);
4472         fViewerPropertiesTableWidget->setItem    4429         fViewerPropertiesTableWidget->setItem(a-treeWidgetInfosIgnoredCommands, 1, paramItem);
4473                                               << 4430         
4474         // Set Guidance                          4431         // Set Guidance
4475         QString guidance;                        4432         QString guidance;
4476         G4int n_guidanceEntry = (G4int)comman << 4433         G4int n_guidanceEntry = commandTmp->GetGuidanceEntries();
4477         for( G4int i_thGuidance=0; i_thGuidan    4434         for( G4int i_thGuidance=0; i_thGuidance < n_guidanceEntry; i_thGuidance++ ) {
4478           guidance += QString((char*)(command    4435           guidance += QString((char*)(commandTmp->GetGuidanceLine(i_thGuidance)).data()) + "\n";
4479         }                                        4436         }
4480                                               << 4437         
4481         nameItem->setToolTip(guidance);          4438         nameItem->setToolTip(guidance);
4482         paramItem->setToolTip(GetCommandParam    4439         paramItem->setToolTip(GetCommandParameterList(commandTmp));
4483                                               << 4440         
4484         fViewerPropertiesTableWidget->setRowH    4441         fViewerPropertiesTableWidget->setRowHeight(a-treeWidgetInfosIgnoredCommands,15);
4485       }                                          4442       }
4486                                               << 4443       
4487       // set current name and parameters         4444       // set current name and parameters
4488       nameItem->setText(commandTmp->GetComman    4445       nameItem->setText(commandTmp->GetCommandName().data());
4489       paramItem->setText(params);                4446       paramItem->setText(params);
4490                                               << 4447       
4491       nameItem->setFlags(Qt::NoItemFlags);       4448       nameItem->setFlags(Qt::NoItemFlags);
4492       nameItem->setForeground(QBrush());         4449       nameItem->setForeground(QBrush());
4493                                               << 4450       
4494     } else {                                     4451     } else {
4495       treeWidgetInfosIgnoredCommands++;          4452       treeWidgetInfosIgnoredCommands++;
4496     }                                            4453     }
4497   }                                              4454   }
4498   // remove empty content row                    4455   // remove empty content row
4499   for (int i=0; i<treeWidgetInfosIgnoredComma    4456   for (int i=0; i<treeWidgetInfosIgnoredCommands; i++) {
4500     fViewerPropertiesTableWidget->removeRow (    4457     fViewerPropertiesTableWidget->removeRow (fViewerPropertiesTableWidget->rowCount() - 1);
4501   }                                              4458   }
4502                                                  4459 
4503   // The resize should done only at creation     4460   // The resize should done only at creation
4504   if (!fViewerPropertiesTableWidgetIsInit) {     4461   if (!fViewerPropertiesTableWidgetIsInit) {
4505     fViewerPropertiesTableWidgetIsInit = true    4462     fViewerPropertiesTableWidgetIsInit = true;
4506                                               << 4463     
4507     fViewerPropertiesTableWidget->resizeColum    4464     fViewerPropertiesTableWidget->resizeColumnsToContents();
4508                                               << 4465     
4509     int x = fViewerPropertiesTableWidget->hor    4466     int x = fViewerPropertiesTableWidget->horizontalHeader()->length();
4510     int y = fViewerPropertiesTableWidget->ver    4467     int y = fViewerPropertiesTableWidget->verticalHeader()->length()+ fViewerPropertiesTableWidget->horizontalHeader()->sizeHint().height() + 2;
4511                                               << 4468     
4512     //  fViewerPropertiesTableWidget->vertica    4469     //  fViewerPropertiesTableWidget->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
4513     //  fViewerPropertiesTableWidget->horizon    4470     //  fViewerPropertiesTableWidget->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents);
4514                                               << 4471     
4515     // resize to fit content                     4472     // resize to fit content
4516     QDialog* dial = static_cast<QDialog*> (fU    4473     QDialog* dial = static_cast<QDialog*> (fUIViewerPropertiesWidget->parent());
4517     if (dial) {                                  4474     if (dial) {
4518       dial->resize(x+56,y+46); // more or les    4475       dial->resize(x+56,y+46); // more or less (margins) ...
4519     }                                            4476     }
4520   }                                              4477   }
4521   fViewerPropertiesTableWidget->blockSignals(    4478   fViewerPropertiesTableWidget->blockSignals(false);
4522                                                  4479 
4523   fTreeWidgetInfosIgnoredCommands = treeWidge    4480   fTreeWidgetInfosIgnoredCommands = treeWidgetInfosIgnoredCommands;
4524 }                                                4481 }
4525                                                  4482 
4526                                                  4483 
4527 /**                                              4484 /**
4528  Update the pick infos component widget          4485  Update the pick infos component widget
4529  */                                              4486  */
4530 void G4OpenGLQtViewer::updatePickInfosWidget(    4487 void G4OpenGLQtViewer::updatePickInfosWidget(int aX, int aY) {
4531   fLastPickPoint = QPoint(aX,aY);                4488   fLastPickPoint = QPoint(aX,aY);
4532                                               << 4489   
4533   if (!isCurrentWidget()) {                      4490   if (!isCurrentWidget()) {
4534     return;                                      4491     return;
4535   }                                              4492   }
4536   // Ensure case where closing a UI tab close    4493   // Ensure case where closing a UI tab close the widget
4537   if (!fPickInfosWidget) {                       4494   if (!fPickInfosWidget) {
4538     createPickInfosWidget();                     4495     createPickInfosWidget();
4539   }                                              4496   }
4540                                                  4497 
4541 #if QT_VERSION < 0x060000                     << 
4542 #else                                         << 
4543  {auto* qGLW = dynamic_cast<G4QGLWidgetType*> << 
4544   if (qGLW) qGLW->makeCurrent();}             << 
4545   ResizeGLView();                             << 
4546 #endif                                        << 
4547   const std::vector < G4OpenGLViewerPickMap*     4498   const std::vector < G4OpenGLViewerPickMap* > & pickMapVector = GetPickDetails(aX,aY);
4548                                               << 4499   
4549   // remove all previous widgets                 4500   // remove all previous widgets
4550   if (fPickInfosWidget) {                        4501   if (fPickInfosWidget) {
4551     QLayoutItem * wItem;                         4502     QLayoutItem * wItem;
4552     if (fPickInfosWidget->layout()->count())     4503     if (fPickInfosWidget->layout()->count()) {
4553       while ((wItem = fPickInfosWidget->layou    4504       while ((wItem = fPickInfosWidget->layout()->takeAt(0)) != 0) {
4554         delete wItem->widget();                  4505         delete wItem->widget();
4555         delete wItem;                            4506         delete wItem;
4556       }                                          4507       }
4557     }                                            4508     }
4558   } else {                                       4509   } else {
4559     // Ensure case where closing a UI tab clo    4510     // Ensure case where closing a UI tab close the widget
4560     if (!fPickInfosWidget) {                     4511     if (!fPickInfosWidget) {
4561       createPickInfosWidget();                   4512       createPickInfosWidget();
4562     }                                            4513     }
4563   }                                              4514   }
4564                                                  4515 
                                                   >> 4516   // Create a new signalMapper
                                                   >> 4517 #if QT_VERSION < 0x050600
                                                   >> 4518   delete fSignalMapperPicking;
                                                   >> 4519   fSignalMapperPicking = new QSignalMapper(this);
                                                   >> 4520 #endif
                                                   >> 4521   
4565   // parse all pick results                      4522   // parse all pick results
4566   G4int nPickedObjectsWithAttributes = 0;        4523   G4int nPickedObjectsWithAttributes = 0;
4567   for (unsigned int a=0; a< pickMapVector.siz    4524   for (unsigned int a=0; a< pickMapVector.size(); a++) {
4568     const auto& pickMap = pickMapVector[a];      4525     const auto& pickMap = pickMapVector[a];
4569     // Add a box inside the pick viewer box      4526     // Add a box inside the pick viewer box
4570     std::ostringstream label;                    4527     std::ostringstream label;
4571     std::ostringstream content;                  4528     std::ostringstream content;
4572     std::string txt = pickMap->getAttributes(    4529     std::string txt = pickMap->getAttributes()[0].data();
4573     if (pickMapVector[a]->getAttributes().siz    4530     if (pickMapVector[a]->getAttributes().size()) {
4574       ++nPickedObjectsWithAttributes;            4531       ++nPickedObjectsWithAttributes;
4575                                                  4532 
4576       std::size_t pos1 = txt.find(':');          4533       std::size_t pos1 = txt.find(':');
4577       std::string storeKey = txt.substr(0,pos    4534       std::string storeKey = txt.substr(0,pos1);
4578                                                  4535 
4579       if (storeKey == "G4PhysicalVolumeModel"    4536       if (storeKey == "G4PhysicalVolumeModel") {
4580                                                  4537 
4581         label << "Volume:";                      4538         label << "Volume:";
4582         std::size_t pos2 = txt.find(':',pos1+    4539         std::size_t pos2 = txt.find(':',pos1+1);
4583         std::size_t pos3 = txt.find('\n',pos2    4540         std::size_t pos3 = txt.find('\n',pos2+1);
4584         label << txt.substr(pos2+1,pos3-pos2-    4541         label << txt.substr(pos2+1,pos3-pos2-1);
4585                                                  4542 
4586       } else if (storeKey == "G4TrajectoriesM    4543       } else if (storeKey == "G4TrajectoriesModel") {
4587                                                  4544 
4588         label << "Trajectory:";                  4545         label << "Trajectory:";
4589         std::size_t pos2 = txt.find(':',pos1+    4546         std::size_t pos2 = txt.find(':',pos1+1);
4590         std::size_t pos3 = txt.find('\n',pos2    4547         std::size_t pos3 = txt.find('\n',pos2+1);
4591         label << " Run:" << txt.substr(pos2+1    4548         label << " Run:" << txt.substr(pos2+1,pos3-pos2-1);
4592         std::size_t pos4 = txt.find(':',pos3+    4549         std::size_t pos4 = txt.find(':',pos3+1);
4593         std::size_t pos5 = txt.find('\n',pos4    4550         std::size_t pos5 = txt.find('\n',pos4+1);
4594         label << ", Event:" << txt.substr(pos    4551         label << ", Event:" << txt.substr(pos4+1,pos5-pos4-1);
4595                                                  4552 
4596       } else {                                   4553       } else {
4597                                                  4554 
4598         label << "Hit number:" << a << ", Pic    4555         label << "Hit number:" << a << ", PickName: " << pickMap->getPickName();
4599                                                  4556 
4600       }                                          4557       }
4601                                                  4558 
4602       // Accumulate all content with the same    4559       // Accumulate all content with the same pickname
4603       content << pickMap->print().data();        4560       content << pickMap->print().data();
4604       G4int thisPickName = pickMap->getPickNa    4561       G4int thisPickName = pickMap->getPickName();
4605       while (++a < pickMapVector.size()) {       4562       while (++a < pickMapVector.size()) {
4606         const auto& a_pickMap = pickMapVector    4563         const auto& a_pickMap = pickMapVector[a];
4607         if (a_pickMap->getPickName() == thisP    4564         if (a_pickMap->getPickName() == thisPickName) {
4608           content << a_pickMap->print().data(    4565           content << a_pickMap->print().data();
4609         } else {                                 4566         } else {
4610           a--;                                   4567           a--;
4611           break;                                 4568           break;
4612         }                                        4569         }
4613       }                                          4570       }
4614                                                  4571 
4615       QPushButton* pickCoutButton = new QPush    4572       QPushButton* pickCoutButton = new QPushButton(label.str().c_str());
4616       pickCoutButton->setStyleSheet ("text-al    4573       pickCoutButton->setStyleSheet ("text-align: left; padding: 1px; border: 0px;");
4617       pickCoutButton->setIcon(*fTreeIconClose    4574       pickCoutButton->setIcon(*fTreeIconClosed);
4618       fPickInfosWidget->layout()->addWidget(p    4575       fPickInfosWidget->layout()->addWidget(pickCoutButton);
4619                                                  4576 
4620       QStringList newStr;                        4577       QStringList newStr;
4621                                                  4578 
4622       // Add to stringList                       4579       // Add to stringList
4623       newStr = QStringList(QString(content.st    4580       newStr = QStringList(QString(content.str().c_str()).trimmed());
4624                                                  4581 
4625       QTextEdit* ed = new QTextEdit();           4582       QTextEdit* ed = new QTextEdit();
4626       ed->setReadOnly(true);                     4583       ed->setReadOnly(true);
4627       fPickInfosWidget->layout()->addWidget(e    4584       fPickInfosWidget->layout()->addWidget(ed);
4628       ed->setVisible((false));                   4585       ed->setVisible((false));
4629       ed->append(newStr.join(""));               4586       ed->append(newStr.join(""));
4630                                                  4587 
                                                   >> 4588 #if QT_VERSION < 0x050600
                                                   >> 4589       connect(pickCoutButton, SIGNAL(clicked()), fSignalMapperPicking, SLOT(map()));
                                                   >> 4590       fSignalMapperPicking->setMapping(pickCoutButton,fPickInfosWidget->layout()->count()-1);
                                                   >> 4591 #else
4631       std::cout << pickCoutButton->text().toS    4592       std::cout << pickCoutButton->text().toStdString() << " "<< fPickInfosWidget->layout()->count()-1<< std::endl;
4632       int tmp = fPickInfosWidget->layout()->c    4593       int tmp = fPickInfosWidget->layout()->count()-1;
4633       connect(pickCoutButton, &QPushButton::c << 4594       connect(pickCoutButton, &QPushButton::clicked , [=](){ this->toggleSceneTreeComponentPickingCout(tmp);});
                                                   >> 4595 #endif
4634     }                                            4596     }
4635   }                                              4597   }
4636                                               << 4598 #if QT_VERSION < 0x050600
                                                   >> 4599   connect(fSignalMapperPicking, SIGNAL(mapped(int)),this, SLOT(toggleSceneTreeComponentPickingCout(int)));
                                                   >> 4600 #endif
                                                   >> 4601   
4637   // add a label to push everything up!          4602   // add a label to push everything up!
4638   QLabel * pushUp = new QLabel("");              4603   QLabel * pushUp = new QLabel("");
4639   QSizePolicy vPolicy = QSizePolicy(QSizePoli    4604   QSizePolicy vPolicy = QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
4640   vPolicy.setVerticalStretch(10);                4605   vPolicy.setVerticalStretch(10);
4641   pushUp->setSizePolicy(vPolicy);                4606   pushUp->setSizePolicy(vPolicy);
4642   fPickInfosWidget->layout()->addWidget(pushU    4607   fPickInfosWidget->layout()->addWidget(pushUp);
4643                                               << 4608   
4644   // highlight the first one :                   4609   // highlight the first one :
4645                                               << 4610   
4646   // first un-highlight the last selected        4611   // first un-highlight the last selected
4647   changeColorAndTransparency(fLastHighlightNa    4612   changeColorAndTransparency(fLastHighlightName,fLastHighlightColor);
4648                                               << 4613   
4649   if (pickMapVector.size() > 0 ) {               4614   if (pickMapVector.size() > 0 ) {
4650     // get the new one                           4615     // get the new one
4651     fLastHighlightName = pickMapVector[0]->ge    4616     fLastHighlightName = pickMapVector[0]->getPickName();
4652     fLastHighlightColor = getColorForPoIndex(    4617     fLastHighlightColor = getColorForPoIndex(fLastHighlightName);
4653     // set the new one                           4618     // set the new one
4654     changeColorAndTransparency(fLastHighlight    4619     changeColorAndTransparency(fLastHighlightName,G4Color(1,1,1,1));
4655                                               << 4620     
4656     updateQWidget();                             4621     updateQWidget();
4657   }                                              4622   }
4658   QDialog* dial = static_cast<QDialog*> (fUIP    4623   QDialog* dial = static_cast<QDialog*> (fUIPickInfosWidget->parent());
4659   if (dial) {                                    4624   if (dial) {
4660     // change name                               4625     // change name
4661     std::ostringstream oss;                      4626     std::ostringstream oss;
4662     if (nPickedObjectsWithAttributes == 0) {     4627     if (nPickedObjectsWithAttributes == 0) {
4663       oss << "No object";                        4628       oss << "No object";
4664     } else if (nPickedObjectsWithAttributes =    4629     } else if (nPickedObjectsWithAttributes == 1) {
4665       oss << "1 object";                         4630       oss << "1 object";
4666     } else {                                     4631     } else {
4667       oss << nPickedObjectsWithAttributes <<     4632       oss << nPickedObjectsWithAttributes << " objects";
4668     }                                            4633     }
4669     oss << " selected - " << GetName();          4634     oss << " selected - " << GetName();
4670     dial->setWindowTitle(oss.str().c_str());     4635     dial->setWindowTitle(oss.str().c_str());
4671   }                                              4636   }
4672   // set picking cout visible                    4637   // set picking cout visible
4673   fPickInfosScrollArea->setVisible(true);        4638   fPickInfosScrollArea->setVisible(true);
4674 }                                                4639 }
4675                                                  4640 
4676                                                  4641 
4677 void G4OpenGLQtViewer::toggleSceneTreeCompone    4642 void G4OpenGLQtViewer::toggleSceneTreeComponentPickingCout(int pickItem) {
4678                                                  4643 
4679   QWidget* w;                                    4644   QWidget* w;
4680   // close other items, it could take too muc    4645   // close other items, it could take too much space
4681                                               << 4646   
4682   for (int a=0; a<fPickInfosWidget->layout()-    4647   for (int a=0; a<fPickInfosWidget->layout()->count(); a++) {
4683     w = fPickInfosWidget->layout()->itemAt(a)    4648     w = fPickInfosWidget->layout()->itemAt(a)->widget();
4684     QTextEdit* ed = dynamic_cast<QTextEdit*>(    4649     QTextEdit* ed = dynamic_cast<QTextEdit*>(w);
4685     QPushButton* button;                         4650     QPushButton* button;
4686     if (ed) {                                    4651     if (ed) {
4687       if (a == pickItem) {                       4652       if (a == pickItem) {
4688         w->setVisible(!w->isVisible());          4653         w->setVisible(!w->isVisible());
4689       } else {                                   4654       } else {
4690         w->setVisible(false);                    4655         w->setVisible(false);
4691       }                                          4656       }
4692       if (a >= 1) {                              4657       if (a >= 1) {
4693         button = dynamic_cast<QPushButton*>(f    4658         button = dynamic_cast<QPushButton*>(fPickInfosWidget->layout()->itemAt(a-1)->widget());
4694         if (button) {                            4659         if (button) {
4695           if (button->isVisible()) {             4660           if (button->isVisible()) {
4696             button->setIcon(*fTreeIconOpen);     4661             button->setIcon(*fTreeIconOpen);
4697           } else {                               4662           } else {
4698             button->setIcon(*fTreeIconClosed)    4663             button->setIcon(*fTreeIconClosed);
4699           }                                      4664           }
4700         }                                        4665         }
4701       }                                          4666       }
4702     }                                            4667     }
4703   }                                              4668   }
4704 }                                                4669 }
4705                                                  4670 
4706                                                  4671 
4707 void G4OpenGLQtViewer::currentTabActivated(in    4672 void G4OpenGLQtViewer::currentTabActivated(int currentTab) {
4708   if (fUiQt->GetViewerTabWidget()->tabText(cu << 4673   if (fUiQt->GetViewerTabWidget()->tabText(currentTab) == GetName())  {
4709     createViewerPropertiesWidget();              4674     createViewerPropertiesWidget();
4710 //    createPickInfosWidget();  // Causes a / << 4675     createPickInfosWidget();
4711 //    createSceneTreeWidget();  // ...this ol << 4676     createSceneTreeWidget();
4712   }                                              4677   }
4713 }                                                4678 }
4714                                                  4679 
4715                                                  4680 
4716 void G4OpenGLQtViewer::tableWidgetViewerSetIt    4681 void G4OpenGLQtViewer::tableWidgetViewerSetItemChanged(QTableWidgetItem * item) {
4717   G4UImanager* UI = G4UImanager::GetUIpointer    4682   G4UImanager* UI = G4UImanager::GetUIpointer();
4718   if(UI != NULL)  {                              4683   if(UI != NULL)  {
4719     QTableWidgetItem* previous = fViewerPrope    4684     QTableWidgetItem* previous = fViewerPropertiesTableWidget->item(fViewerPropertiesTableWidget->row(item),0);
4720     if (previous) {                              4685     if (previous) {
4721       fViewerPropertiesTableWidget->blockSign    4686       fViewerPropertiesTableWidget->blockSignals(true);
4722       UI->ApplyCommand((std::string("/vis/vie    4687       UI->ApplyCommand((std::string("/vis/viewer/set/")
4723                         + previous->text().to    4688                         + previous->text().toStdString()
4724                         + " "                    4689                         + " "
4725                         + item->text().toStdS    4690                         + item->text().toStdString()).c_str());
4726       fViewerPropertiesTableWidget->blockSign    4691       fViewerPropertiesTableWidget->blockSignals(false);
4727     }                                            4692     }
4728   }                                              4693   }
4729 }                                                4694 }
4730                                                  4695 
4731 bool G4OpenGLQtViewer::isCurrentWidget(){        4696 bool G4OpenGLQtViewer::isCurrentWidget(){
4732   G4Qt* interactorManager = G4Qt::getInstance    4697   G4Qt* interactorManager = G4Qt::getInstance ();
4733   if (!interactorManager->IsExternalApp()) {     4698   if (!interactorManager->IsExternalApp()) {
4734                                                  4699 
4735     // Prevent from repainting a hidden tab (    4700     // Prevent from repainting a hidden tab (the current tab name has to be the one of th GL viewer)
4736     if ( GetName() != fUiQt->GetViewerTabWidg    4701     if ( GetName() != fUiQt->GetViewerTabWidget()->tabText(fUiQt->GetViewerTabWidget()->currentIndex()).toStdString().c_str()) {
4737       return false;                              4702       return false;
4738     }                                            4703     }
4739   }                                              4704   }
4740   return true;                                   4705   return true;
4741 }                                                4706 }
4742                                                  4707 
4743 /**   Build the parameter list parameters in     4708 /**   Build the parameter list parameters in a QString<br>
4744  Reimplement partialy the G4UIparameter.cc       4709  Reimplement partialy the G4UIparameter.cc
4745  @param aCommand : command to list parameters    4710  @param aCommand : command to list parameters
4746  @see G4UIparameter::List()                      4711  @see G4UIparameter::List()
4747  @see G4UIcommand::List()                        4712  @see G4UIcommand::List()
4748  @return the command list parameters, or "" i    4713  @return the command list parameters, or "" if nothing
4749  */                                              4714  */
4750 QString G4OpenGLQtViewer::GetCommandParameter    4715 QString G4OpenGLQtViewer::GetCommandParameterList (
4751                                   const G4UIc    4716                                   const G4UIcommand *aCommand
4752                                   )              4717                                   )
4753 {                                                4718 {
4754   G4int n_parameterEntry = (G4int)aCommand->G << 4719   G4int n_parameterEntry = aCommand->GetParameterEntries();
4755   QString txt;                                   4720   QString txt;
4756                                               << 4721   
4757   if( n_parameterEntry > 0 ) {                   4722   if( n_parameterEntry > 0 ) {
4758     G4UIparameter *param;                        4723     G4UIparameter *param;
4759                                               << 4724     
4760     // Re-implementation of G4UIparameter.cc     4725     // Re-implementation of G4UIparameter.cc
4761                                               << 4726     
4762     for( G4int i_thParameter=0; i_thParameter    4727     for( G4int i_thParameter=0; i_thParameter<n_parameterEntry; i_thParameter++ ) {
4763       param = aCommand->GetParameter(i_thPara    4728       param = aCommand->GetParameter(i_thParameter);
4764       txt += "\nParameter : " + QString((char    4729       txt += "\nParameter : " + QString((char*)(param->GetParameterName()).data()) + "\n";
4765       if( ! param->GetParameterGuidance().emp << 4730       if( ! param->GetParameterGuidance().isNull() )
4766         txt += QString((char*)(param->GetPara    4731         txt += QString((char*)(param->GetParameterGuidance()).data())+ "\n" ;
4767       txt += " Parameter type  : " + QString(    4732       txt += " Parameter type  : " + QString(QChar(param->GetParameterType())) + "\n";
4768       if(param->IsOmittable()){                  4733       if(param->IsOmittable()){
4769         txt += " Omittable       : True\n";      4734         txt += " Omittable       : True\n";
4770       } else {                                   4735       } else {
4771         txt += " Omittable       : False\n";     4736         txt += " Omittable       : False\n";
4772       }                                          4737       }
4773       if( param->GetCurrentAsDefault() ) {       4738       if( param->GetCurrentAsDefault() ) {
4774         txt += " Default value   : taken from    4739         txt += " Default value   : taken from the current value\n";
4775       } else if( ! param->GetDefaultValue().e << 4740       } else if( ! param->GetDefaultValue().isNull() ) {
4776         txt += " Default value   : " + QStrin    4741         txt += " Default value   : " + QString((char*)(param->GetDefaultValue()).data())+ "\n";
4777       }                                          4742       }
4778       if( ! param->GetParameterRange().empty( << 4743       if( ! param->GetParameterRange().isNull() ) {
4779         txt += " Parameter range : " + QStrin    4744         txt += " Parameter range : " + QString((char*)(param->GetParameterRange()).data())+ "\n";
4780       }                                          4745       }
4781       if( ! param->GetParameterCandidates().e << 4746       if( ! param->GetParameterCandidates().isNull() ) {
4782         txt += " Candidates      : " + QStrin    4747         txt += " Candidates      : " + QString((char*)(param->GetParameterCandidates()).data())+ "\n";
4783       }                                          4748       }
4784     }                                            4749     }
4785   }                                              4750   }
4786   return txt;                                    4751   return txt;
4787 }                                                4752 }
4788                                                  4753 
4789 #ifdef G4MULTITHREADED                           4754 #ifdef G4MULTITHREADED
4790                                                  4755 
4791 namespace {                                   << 
4792   G4Mutex visSubThreadMutex = G4MUTEX_INITIAL << 
4793   G4Condition waitForVisSubThreadInitialized  << 
4794   G4bool visSubThreadEstablished = false;     << 
4795   G4bool qObjectsSwitched = false;            << 
4796   G4QGLWidgetType* qGLWidget = nullptr;       << 
4797 }                                             << 
4798                                               << 
4799 void G4OpenGLQtViewer::DoneWithMasterThread()    4756 void G4OpenGLQtViewer::DoneWithMasterThread()
4800 {                                                4757 {
4801   // Called by Main Thread !                     4758   // Called by Main Thread !
4802                                               << 4759   
4803   // Initialise and check qGLWidget - no need << 4760   // Useful to avoid two vis thread at the same time
4804   qGLWidget = dynamic_cast<G4QGLWidgetType*>( << 4761   //G4MUTEXLOCK(&mWaitForVisSubThreadQtOpenGLContextInitialized);
4805   if (qGLWidget == nullptr) return;           << 4762   if(!lWaitForVisSubThreadQtOpenGLContextInitialized->owns_lock())
4806                                               << 4763       lWaitForVisSubThreadQtOpenGLContextInitialized->lock();
4807   // Done with master thread                  << 
4808   qGLWidget->doneCurrent();                   << 
4809                                               << 
4810   // Set current QThread for the way back     << 
4811   fQGLContextMainThread = QThread::currentThr << 
4812 }                                             << 
4813                                               << 
4814 void G4OpenGLQtViewer::MovingToVisSubThread() << 
4815 {                                             << 
4816   // Still on master thread but vis thread ha << 
4817                                               << 
4818   if (qGLWidget == nullptr) return;           << 
4819                                               << 
4820   // Wait until SwitchToVisSubThread has foun << 
4821   {                                           << 
4822   G4AutoLock lock(&visSubThreadMutex);        << 
4823   G4CONDITIONWAITLAMBDA(&waitForVisSubThreadI << 
4824   }                                           << 
4825                                               << 
4826   // Move stuff to sub-thread                 << 
4827   if(qGLWidget->context()) qGLWidget->context << 
4828                                               << 
4829   // Inform sub-thread                        << 
4830   G4AutoLock lock(&visSubThreadMutex);        << 
4831   qObjectsSwitched = true;                    << 
4832   lock.unlock();                              << 
4833   G4CONDITIONBROADCAST(&waitForVisSubThreadIn << 
4834 }                                                4764 }
4835                                                  4765 
4836 void G4OpenGLQtViewer::SwitchToVisSubThread()    4766 void G4OpenGLQtViewer::SwitchToVisSubThread()
4837 {                                                4767 {
4838   // Called by VisSub Thread !                   4768   // Called by VisSub Thread !
4839                                                  4769 
4840   if (qGLWidget == nullptr) return;           << 4770   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
4841                                               << 4771   if (! qGLW) {
4842   // Set the current QThread to its static va << 4772     return;
4843   fQGLContextVisSubThread = QThread::currentT << 
4844                                               << 
4845   // Let MovingToVisSubThread know we have th << 
4846   {                                           << 
4847   G4AutoLock lock(&visSubThreadMutex);        << 
4848   visSubThreadEstablished = true;             << 
4849   G4CONDITIONBROADCAST(&waitForVisSubThreadIn << 
4850   }                                           << 
4851                                               << 
4852   // Wait until MovingToVisSubThread has move << 
4853   {                                           << 
4854   G4AutoLock lock(&visSubThreadMutex);        << 
4855   G4CONDITIONWAITLAMBDA(&waitForVisSubThreadI << 
4856   }                                              4773   }
                                                   >> 4774   
                                                   >> 4775   // Set the current QThread to its static variable
                                                   >> 4776   SetQGLContextVisSubThread(QThread::currentThread());
                                                   >> 4777   
                                                   >> 4778   // - Wait for the vis thread to set its QThread
                                                   >> 4779   G4CONDITIONBROADCAST(&c1_VisSubThreadQtOpenGLContextInitialized);
                                                   >> 4780   // a condition without a locked mutex is an undefined behavior.
                                                   >> 4781   // we check if the mutex owns the lock, and if not, we lock it
                                                   >> 4782   if(!lWaitForVisSubThreadQtOpenGLContextMoved->owns_lock())
                                                   >> 4783       lWaitForVisSubThreadQtOpenGLContextMoved->lock();
                                                   >> 4784 
                                                   >> 4785   // Unlock the vis thread if it is Qt Viewer
                                                   >> 4786   G4CONDITIONWAIT(&c2_VisSubThreadQtOpenGLContextMoved,
                                                   >> 4787                   lWaitForVisSubThreadQtOpenGLContextMoved);
4857                                                  4788 
4858   // make context current                        4789   // make context current
4859   qGLWidget->makeCurrent();                   << 4790   qGLW->makeCurrent();
4860 }                                                4791 }
4861                                                  4792 
4862 void G4OpenGLQtViewer::DoneWithVisSubThread()    4793 void G4OpenGLQtViewer::DoneWithVisSubThread()
4863 {                                                4794 {
4864   // Called by vis sub thread                    4795   // Called by vis sub thread
4865                                               << 4796   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
4866   if (qGLWidget == nullptr) return;           << 4797   if (! qGLW) {
                                                   >> 4798     return;
                                                   >> 4799   }
4867                                                  4800 
4868   // finish with this vis sub thread context     4801   // finish with this vis sub thread context
4869   qGLWidget->doneCurrent();                   << 4802   qGLW->doneCurrent();
4870                                                  4803 
4871   // and move stuff back to the main thread   << 4804 #if QT_VERSION > 0x050000
4872   if(qGLWidget->context()) qGLWidget->context << 4805   // and move it back to the main thread
                                                   >> 4806   qGLW->context()->moveToThread(fQGLContextMainThread);
                                                   >> 4807 #endif
4873 }                                                4808 }
4874                                                  4809 
4875 void G4OpenGLQtViewer::SwitchToMasterThread()    4810 void G4OpenGLQtViewer::SwitchToMasterThread()
4876 {                                                4811 {
4877   // Called by master Thread !                << 4812   // Called by VisSub Thread !
4878                                                  4813 
4879   if (qGLWidget == nullptr) return;           << 4814   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
                                                   >> 4815   if (! qGLW) {
                                                   >> 4816     return;
                                                   >> 4817   }
4880                                                  4818 
4881   qGLWidget->makeCurrent();                   << 4819   // Useful to avoid two vis thread at the same time
                                                   >> 4820   //G4MUTEXUNLOCK(&mWaitForVisSubThreadQtOpenGLContextInitialized);
                                                   >> 4821   if(lWaitForVisSubThreadQtOpenGLContextInitialized->owns_lock())
                                                   >> 4822       lWaitForVisSubThreadQtOpenGLContextInitialized->unlock();
4882                                                  4823 
4883   visSubThreadEstablished = false;            << 4824   qGLW->makeCurrent();
4884   qObjectsSwitched = false;                   << 4825 }
                                                   >> 4826 
                                                   >> 4827 
                                                   >> 4828 void G4OpenGLQtViewer::MovingToVisSubThread(){
                                                   >> 4829   // Called by Main Thread !
                                                   >> 4830 
                                                   >> 4831   QGLWidget* qGLW = dynamic_cast<QGLWidget*> (fGLWidget) ;
                                                   >> 4832   if (! qGLW) {
                                                   >> 4833     return;
                                                   >> 4834   }
                                                   >> 4835 
                                                   >> 4836   // a condition without a locked mutex is an undefined behavior.
                                                   >> 4837   // we check if the mutex owns the lock, and if not, we lock it
                                                   >> 4838   if(!lWaitForVisSubThreadQtOpenGLContextInitialized->owns_lock())
                                                   >> 4839       lWaitForVisSubThreadQtOpenGLContextInitialized->lock();
                                                   >> 4840 
                                                   >> 4841   // - Wait for the vis sub thread to set its QThread
                                                   >> 4842   G4CONDITIONWAIT(&c1_VisSubThreadQtOpenGLContextInitialized,
                                                   >> 4843                   lWaitForVisSubThreadQtOpenGLContextInitialized);
                                                   >> 4844 
                                                   >> 4845   // Set current QThread for the way back
                                                   >> 4846   SetQGLContextMainThread(QThread::currentThread());
                                                   >> 4847   
                                                   >> 4848   // finish with this main thread context
                                                   >> 4849   qGLW->doneCurrent();
                                                   >> 4850 #if QT_VERSION > 0x050000
                                                   >> 4851   qGLW->context()->moveToThread(fQGLContextVisSubThread);
                                                   >> 4852 #endif
                                                   >> 4853   
                                                   >> 4854   G4CONDITIONBROADCAST(&c2_VisSubThreadQtOpenGLContextMoved);
4885 }                                                4855 }
4886                                                  4856 
4887 #endif                                           4857 #endif
4888                                                  4858 
4889                                                  4859 
4890 /*                                               4860 /*
4891                                               << 4861   
4892 void MultiLayer::exportToSVG(const QString& f    4862 void MultiLayer::exportToSVG(const QString& fname)
4893 {                                                4863 {
4894 QPicture picture;                                4864 QPicture picture;
4895 QPainter p(&picture);                            4865 QPainter p(&picture);
4896 for (int i=0;i<(int)graphsList->count();i++)     4866 for (int i=0;i<(int)graphsList->count();i++)
4897 {                                                4867 {
4898 Graph *gr=(Graph *)graphsList->at(i);            4868 Graph *gr=(Graph *)graphsList->at(i);
4899 Plot *myPlot= (Plot *)gr->plotWidget();          4869 Plot *myPlot= (Plot *)gr->plotWidget();
4900                                               << 4870       
4901 QPoint pos=gr->pos();                            4871 QPoint pos=gr->pos();
4902                                               << 4872       
4903 int width=int(myPlot->frameGeometry().width()    4873 int width=int(myPlot->frameGeometry().width());
4904 int height=int(myPlot->frameGeometry().height    4874 int height=int(myPlot->frameGeometry().height());
4905                                               << 4875       
4906 myPlot->print(&p, QRect(pos,QSize(width,heigh    4876 myPlot->print(&p, QRect(pos,QSize(width,height)));
4907 }                                                4877 }
4908                                               << 4878   
4909 p.end();                                         4879 p.end();
4910 picture.save(fname, "svg");                      4880 picture.save(fname, "svg");
4911 }                                                4881 }
4912 */                                               4882 */
                                                   >> 4883 #endif
4913                                                  4884