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.4.p2)


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