Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/visualization/OpenGL/src/G4OpenGLQtMovieDialog.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 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 //
 27 //
 28 //
 29 
 30 #include "G4OpenGLQtViewer.hh" // should be first in case we include
 31                                // some boost SIGNAL/SLOT library
 32 #include "G4OpenGLQtMovieDialog.hh"
 33 
 34 #include <qpushbutton.h>
 35 #include <qpalette.h>
 36 #include <qlabel.h>
 37 #include <qgroupbox.h>
 38 #include <qlayout.h>
 39 #include <qlineedit.h>
 40 #include <qfiledialog.h>
 41 #include <qprocess.h>
 42 
 43 #ifndef G4GMAKE
 44 #include "moc_G4OpenGLQtMovieDialog.cpp"
 45 #endif
 46 
 47 // +---------------------------------------+
 48 // +        Path for encoder               +
 49 // +  _______                              +
 50 // + | select| ____________________        +
 51 // +  -------                              +
 52 // +        Temp path                      +
 53 // +  _______                              +
 54 // + | select| ____________________        +
 55 // +  -------                              +
 56 // +                                       +
 57 // + max number of frames  ________        +
 58 // + ....                                  +
 59 // +                                       +
 60 // +     Label : X frames Saves/Encoding   +
 61 // +         Cancel        Encode          +
 62 // +---------------------------------------+
 63 
 64 G4OpenGLQtMovieDialog::G4OpenGLQtMovieDialog(
 65  G4OpenGLQtViewer* parentViewer,
 66  QWidget* parentw
 67 )
 68   : QDialog( parentw ),
 69     fParentViewer(parentViewer)
 70 {
 71   setModal(false);
 72   setWindowTitle( tr( " Save as movie" ));
 73 
 74 
 75   // global layout
 76   QVBoxLayout* globalVLayout = new QVBoxLayout(this);
 77   globalVLayout->setContentsMargins(10,10,10,10);
 78   globalVLayout->setSpacing(10);
 79 
 80   // Encoder group box
 81   QGroupBox *encoderGroupBox = new QGroupBox(tr("Encoder path"),this);
 82   QVBoxLayout *encoderVGroupBoxLayout = new QVBoxLayout(encoderGroupBox);
 83 
 84   // Encoder Path
 85   QWidget *encoderHBox = new QWidget(encoderGroupBox);
 86   QHBoxLayout *encoderHBoxLayout = new QHBoxLayout(encoderHBox);
 87   fEncoderPath = new QLineEdit("",encoderHBox);
 88 
 89   QPushButton *encoderButton = new QPushButton(tr("..."),encoderHBox);
 90   encoderButton->setMaximumWidth (30);
 91 
 92   fEncoderStatus = new QLabel(encoderGroupBox);
 93 
 94   fEncoderStatus->setWordWrap(true);
 95   encoderVGroupBoxLayout->setContentsMargins(15,15,15,15);
 96 
 97   fEncoderStatus->setText("");
 98 
 99   encoderHBoxLayout->addWidget(fEncoderPath);
100   encoderHBoxLayout->addWidget(encoderButton);
101   encoderVGroupBoxLayout->addWidget(encoderHBox);
102   encoderVGroupBoxLayout->addWidget(fEncoderStatus);
103 
104   encoderGroupBox->setLayout(encoderVGroupBoxLayout);
105   globalVLayout->addWidget(encoderGroupBox);
106 
107   connect( encoderButton, SIGNAL( clicked( ) ), this, SLOT(selectEncoderPathAction() ) );
108 
109 
110   // temp folder group box
111   QGroupBox *tempFolderGroupBox = new QGroupBox(tr("Temporary folder path"),this);
112   QVBoxLayout *tempFolderVGroupBoxLayout = new QVBoxLayout(tempFolderGroupBox);
113 
114   // temp folder Path
115   QWidget *tempFolderHBox = new QWidget(tempFolderGroupBox);
116   QHBoxLayout *tempFolderHBoxLayout = new QHBoxLayout(tempFolderHBox);
117 
118   fTempFolderPath = new QLineEdit("",tempFolderHBox);
119 
120   QPushButton *tempButton = new QPushButton(tr("..."),tempFolderHBox);
121   tempButton->setMaximumWidth (30);
122 
123   fTempFolderStatus = new QLabel(tempFolderGroupBox);
124   fTempFolderStatus->setWordWrap(true);
125   tempFolderVGroupBoxLayout->setContentsMargins(15,15,15,15);
126   fTempFolderStatus->setText("");
127 
128   tempFolderHBoxLayout->addWidget(fTempFolderPath);
129   tempFolderHBoxLayout->addWidget(tempButton);
130   tempFolderVGroupBoxLayout->addWidget(tempFolderHBox);
131   tempFolderVGroupBoxLayout->addWidget(fTempFolderStatus);
132 
133   tempFolderGroupBox->setLayout(tempFolderVGroupBoxLayout);
134   globalVLayout->addWidget(tempFolderGroupBox);
135 
136   connect( tempButton, SIGNAL( clicked( ) ), this, SLOT(selectTempPathAction() ) );
137 
138 
139 
140 
141   // save file group box
142   QGroupBox *saveFileGroupBox = new QGroupBox(tr("Save as"),this);
143   QVBoxLayout *saveFileVGroupBoxLayout = new QVBoxLayout(saveFileGroupBox);
144 
145   // save file
146   QWidget *saveFileHBox = new QWidget(saveFileGroupBox);
147   QHBoxLayout *saveFileHBoxLayout = new QHBoxLayout(saveFileHBox);
148 
149   fSaveFileName = new QLineEdit("G4Movie.mpeg",saveFileHBox);
150 
151   QPushButton *saveButton = new QPushButton(tr("..."),saveFileHBox);
152   saveButton->setMaximumWidth (30);
153 
154   fSaveFileStatus = new QLabel(saveFileGroupBox);
155   fSaveFileStatus->setWordWrap(true);
156   saveFileVGroupBoxLayout->setContentsMargins(15,15,15,15);
157   fSaveFileStatus->setText("");
158 
159   saveFileHBoxLayout->addWidget(fSaveFileName);
160   saveFileHBoxLayout->addWidget(saveButton);
161   saveFileVGroupBoxLayout->addWidget(saveFileHBox);
162   saveFileVGroupBoxLayout->addWidget(fSaveFileStatus);
163 
164   saveFileGroupBox->setLayout(saveFileVGroupBoxLayout);
165   globalVLayout->addWidget(saveFileGroupBox);
166 
167   connect( saveButton, SIGNAL( clicked( ) ), this, SLOT(selectSaveFileNameAction() ) );
168 
169 
170 
171   // label
172 
173   QLabel *infoLabel = new QLabel("  Press SPACE to Start/Pause video recording \n  Press RETURN to Stop video recording",this);
174 
175   // global status
176   QGroupBox *statusGroupBox = new QGroupBox(tr("Status"),this);
177   QVBoxLayout *statusVGroupBoxLayout = new QVBoxLayout(statusGroupBox);
178 
179   fRecordingStatus = new QLabel(statusGroupBox);
180   statusVGroupBoxLayout->setContentsMargins(15,15,15,15);
181   fRecordingStatus->setWordWrap(true);
182   QPalette mypalette( fRecordingStatus->palette() );
183   mypalette.setColor( QPalette::Text, Qt::green);
184   fRecordingStatus->setPalette(mypalette);
185 
186   fRecordingInfos = new QLabel(statusGroupBox);
187   fRecordingInfos->setWordWrap(true);
188   setRecordingInfos("");
189 
190   statusVGroupBoxLayout->addWidget(fRecordingStatus);
191   statusVGroupBoxLayout->addWidget(fRecordingInfos);
192 
193   statusGroupBox->setLayout(statusVGroupBoxLayout);
194   globalVLayout->addWidget(infoLabel);
195   globalVLayout->addWidget(statusGroupBox);
196 
197   // buttons
198   QWidget *buttonBox = new QWidget(this);
199 
200   QHBoxLayout *buttonBoxLayout = new QHBoxLayout(buttonBox);
201 
202   QPushButton *buttonReset = new QPushButton( tr( "&Reset" ),buttonBox );
203   buttonReset->setAutoDefault( TRUE );
204   buttonBoxLayout->addWidget(buttonReset);
205 
206   fButtonStartPause = new QPushButton( tr( "  &Start " ),buttonBox );
207   fButtonStartPause->setEnabled(true);
208   fButtonStartPause->setAutoDefault( TRUE );
209   buttonBoxLayout->addWidget(fButtonStartPause);
210 
211   fButtonStopFinishClose = new QPushButton( tr( "&Stop" ),buttonBox );
212   fButtonStopFinishClose->setEnabled(false);
213   fButtonStopFinishClose->setAutoDefault( TRUE );
214   buttonBoxLayout->addWidget(fButtonStopFinishClose);
215 
216   fButtonSave = new QPushButton( tr( "&Save" ),buttonBox );
217   fButtonSave->setEnabled(false);
218   fButtonSave->setAutoDefault( TRUE );
219   buttonBoxLayout->addWidget(fButtonSave);
220 
221   QPushButton *buttonCancel = new QPushButton( tr( "&Cancel" ),buttonBox );
222   buttonCancel->setAutoDefault( TRUE );
223   buttonBoxLayout->addWidget(buttonCancel);
224 
225   buttonBox->setLayout(buttonBoxLayout);
226   globalVLayout->addWidget(buttonBox);
227 
228 
229 
230   setLayout(globalVLayout);
231 
232   // signals and slots connections
233   connect( fButtonStartPause, SIGNAL( clicked() ), fParentViewer, SLOT(    startPauseVideo() ) );
234   connect( buttonReset, SIGNAL( clicked() ), this, SLOT( resetRecording() ) );
235   connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
236   connect( fButtonStopFinishClose, SIGNAL( clicked() ), this, SLOT( stopFinishClose() ) );
237   connect( fButtonSave, SIGNAL( clicked() ), this, SLOT( save() ) );
238 
239   // fill
240   setRecordingStatus("");
241   fEncoderPath->setText(fParentViewer->getEncoderPath());
242   fTempFolderPath->setText(fParentViewer->getTempFolderPath());
243 
244   // connect line edit signals
245   connect (fEncoderPath,SIGNAL(textChanged ( const QString&)),this,SLOT(checkEncoderSwParameters()));
246   connect (fTempFolderPath,SIGNAL(textChanged ( const QString&)),this,SLOT(checkTempFolderParameters()));
247   connect (fSaveFileName,SIGNAL(textChanged ( const QString&)),this,SLOT(checkSaveFileNameParameters()));
248 
249   connect (fEncoderPath,SIGNAL(editingFinished ()),this,SLOT(checkEncoderSwParameters()));
250   connect (fTempFolderPath,SIGNAL(editingFinished ()),this,SLOT(checkTempFolderParameters()));
251   connect (fSaveFileName,SIGNAL(editingFinished ()),this,SLOT(checkSaveFileNameParameters()));
252 
253 }
254 
255 
256 
257 G4OpenGLQtMovieDialog::~G4OpenGLQtMovieDialog()
258 {
259 }
260 
261 void G4OpenGLQtMovieDialog::selectEncoderPathAction()
262 {
263   QString nomFich =  QFileDialog::getOpenFileName ( this,
264                                                     "Select your encoder",
265                                                     tr("Select your encoder ..."));
266 
267 
268   if (nomFich == "") {
269     return;
270   }
271   fEncoderPath->setText(nomFich);
272   checkEncoderSwParameters();
273  }
274 
275 
276 void G4OpenGLQtMovieDialog::selectTempPathAction()
277 {
278   QString nomFich =  QFileDialog::getExistingDirectory ( this,
279                                                     "Select temporary folder",
280                                                     tr("Select temporary folder ..."));
281 
282   if (nomFich == "") {
283     return;
284   }
285   fTempFolderPath->setText(nomFich);
286   checkTempFolderParameters();
287  }
288 
289 
290 void G4OpenGLQtMovieDialog::selectSaveFileNameAction()
291 {
292   QString nomFich =  QFileDialog::getSaveFileName ( this,
293                                                     "Select saved file",
294                                                     tr("Select saved file ..."));
295 
296   if (nomFich == "") {
297     return;
298   }
299   fSaveFileName->setText(nomFich);
300   checkSaveFileNameParameters();
301  }
302 
303 
304 void G4OpenGLQtMovieDialog::stopFinishClose() {
305   fParentViewer->stopVideo();
306 }
307 
308 void G4OpenGLQtMovieDialog::save() {
309   if (((fParentViewer->isPaused()) || fParentViewer->isRecording() || fParentViewer->isStopped())) {
310     fParentViewer->saveVideo();
311   }
312 }
313 
314   /**
315  * If one of parameter is incorrect, put it in red and don't valid it
316  * If valid, save it
317  */
318 bool G4OpenGLQtMovieDialog::checkEncoderSwParameters() {
319 
320   bool status = true;
321   QPalette mypalette( fEncoderPath->palette() );
322 
323   QString temp = fParentViewer->setEncoderPath(fEncoderPath->text());
324   setRecordingInfos("");
325   fEncoderStatus->setText(temp);
326   if (temp != "") {
327     mypalette.setColor( QPalette::Base, Qt::red);
328     if (fParentViewer->isReadyToEncode()) {
329       setRecordingInfos("No valid encode defined, screen capture had been saved in the temp folder in ppm format.\nPlease define a encoder and clic on Apply button");
330   }
331     status = false;
332   } else {
333     mypalette.setColor( QPalette::Base, Qt::white);
334     fEncoderPath->setText(fParentViewer->getEncoderPath());
335   }
336   fEncoderPath->setPalette(mypalette);
337   return status;
338 }
339 
340 
341 /**
342  * If one of parameter is incorrect, put it in red and don't valid it
343  * If valid, save it
344  */
345 bool G4OpenGLQtMovieDialog::checkTempFolderParameters() {
346 
347   bool status = true;
348   QPalette mypalette( fTempFolderPath->palette() );
349 
350   QString temp = fParentViewer->setTempFolderPath(fTempFolderPath->text());
351   fTempFolderStatus->setText(temp);
352   if (temp != "") {
353     mypalette.setColor( QPalette::Base, Qt::red);
354     status = false;
355   } else {
356     mypalette.setColor( QPalette::Base, Qt::white);
357     fTempFolderPath->setText(fParentViewer->getTempFolderPath());
358   }
359   fTempFolderPath->setPalette(mypalette);
360   return status;
361 }
362 
363 
364 /**
365  * If one of parameter is incorrect, put it in red and don't valid it
366  * If valid, save it
367  */
368 bool G4OpenGLQtMovieDialog::checkSaveFileNameParameters() {
369 
370   bool status = true;
371   QPalette mypalette( fSaveFileName->palette() );
372 
373   QString temp = fParentViewer->setSaveFileName(fSaveFileName->text());
374   fSaveFileStatus->setText(temp);
375   if (temp != "") {
376     mypalette.setColor( QPalette::Base, Qt::red);
377     status = false;
378   } else {
379     mypalette.setColor( QPalette::Base, Qt::white);
380     fSaveFileName->setText(fParentViewer->getSaveFileName());
381   }
382   fSaveFileName->setPalette(mypalette);
383   return status;
384 }
385 
386 
387 void G4OpenGLQtMovieDialog::resetRecording() {
388   fParentViewer->resetRecording();
389 }
390 
391 
392 void G4OpenGLQtMovieDialog::setRecordingStatus(QString txt) {
393   fRecordingStatus->setText(txt);
394   if (fParentViewer->isWaiting()) {
395     fButtonStartPause->setText("  &Start ");
396     fButtonStartPause->setEnabled(true);
397     fButtonStopFinishClose->setEnabled(false);
398     fButtonSave->setEnabled(false);
399 
400   } else if (fParentViewer->isPaused()) {
401 
402     fButtonStartPause->setText("  &Continue ");
403     fButtonStartPause->setEnabled(true);
404     fButtonStopFinishClose->setEnabled(true);
405     fButtonSave->setEnabled(false);
406 
407   } else if (fParentViewer->isRecording()) {
408 
409     fButtonStartPause->setText("  &Pause ");
410     fButtonStartPause->setEnabled(true);
411     fButtonStopFinishClose->setEnabled(true);
412     fButtonSave->setEnabled(false);
413 
414   } else if (fParentViewer->isBadOutput()) {
415 
416     fButtonStartPause->setText("  &Start ");
417     fButtonStartPause->setEnabled(true);
418     fButtonStopFinishClose->setEnabled(false);
419     fButtonSave->setEnabled(false);
420 
421   } else if (fParentViewer->isBadTmp()) {
422 
423     fButtonStartPause->setText("  &Start ");
424     fButtonStartPause->setEnabled(false);
425     fButtonStopFinishClose->setEnabled(false);
426     fButtonSave->setEnabled(false);
427 
428   } else if (fParentViewer->isBadEncoder()) {
429 
430     fButtonStartPause->setText("  &Start ");
431     fButtonStartPause->setEnabled(true);
432     fButtonStopFinishClose->setEnabled(false);
433     fButtonSave->setEnabled(false);
434 
435   } else if (fParentViewer->isSuccess()) {
436 
437     fButtonStartPause->setText("  &Start ");
438     fButtonStartPause->setEnabled(false);
439     fButtonStopFinishClose->setEnabled(false);
440     fButtonSave->setEnabled(false);
441 
442   } else if (fParentViewer->isFailed()) {
443 
444     fButtonStartPause->setText("  &Start ");
445     fButtonStartPause->setEnabled(false);
446     fButtonStopFinishClose->setEnabled(false);
447     fButtonSave->setEnabled(false);
448 
449   } else if (fParentViewer->isStopped()) {
450 
451     fButtonStartPause->setText("  &Start ");
452     fButtonStartPause->setEnabled(false);
453     fButtonStopFinishClose->setEnabled(false);
454     fButtonSave->setEnabled(true);
455   }
456 }
457 
458 
459 void G4OpenGLQtMovieDialog::setRecordingInfos(QString txt) {
460   fRecordingInfos->setText(txt);
461 }
462 
463 
464 void G4OpenGLQtMovieDialog::enabledApplyButton() {
465   fButtonStartPause->setEnabled(true);
466 }
467