Salome HOME
sources v1.2
[modules/visu.git] / src / VISUGUI / VisuGUI_TimeAnimation.cxx
1 //  VISU VISUGUI : GUI of VISU component
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : VisuGUI_TimeAnimation.cxx
8 //  Author : Vitaly SMETANNIKOV
9 //  Module : VISU
10
11 #include "VisuGUI_TimeAnimation.h"
12 #include "VisuGUI.h"
13
14 #include <qlayout.h>
15 #include <qhbox.h>
16 #include <qhgroupbox.h>
17 #include <qmessagebox.h>
18 #include <qwt_wheel.h>
19 #include <qlcdnumber.h>
20 #include <qlistbox.h>
21 #include <qvgroupbox.h>
22 #include <qthread.h> 
23
24 #include "QAD_Application.h"
25 #include "QAD_Desktop.h"
26 #include "QAD_FileDlg.h"
27
28 #include "VTKViewer_ViewFrame.h"
29 #include "VISU_ScalarBarActor.hxx"
30
31 #include "VisuGUI_MagnitudeDlg.h"
32 #include "VisuGUI_CutPlanesDlg.h"
33 #include "VisuGUI_VectorsDlg.h"
34 #include "VisuGUI_IsoSurfacesDlg.h"
35 #include "VisuGUI_StreamLinesDlg.h"
36 #include "VISU_TimeAnimation.h"
37
38 static double MAXVALUE = 1.0E+300;
39
40
41
42 SetupDlg::SetupDlg(QWidget* theParent, VISU_TimeAnimation* theAnimator) 
43   : QDialog( theParent, "SetupDlg", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )  
44 {
45   setCaption("Setup Animation");
46   setSizeGripEnabled( TRUE );
47   myAnimator = theAnimator;
48   
49   QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 6);
50   aMainLayout->setSpacing(5);
51
52
53   QFrame* aRangeGrp = new QFrame(this);
54   QGridLayout* aRangeLayout = new QGridLayout( aRangeGrp ); 
55   aRangeLayout->setSpacing( 6 );
56   aRangeLayout->setMargin( 11 );
57   aRangeGrp->setFrameStyle(QFrame::Box | QFrame::Raised);
58
59   myUseRangeChk = new QCheckBox("Use range of time stamps", aRangeGrp);
60   aRangeLayout->addMultiCellWidget(myUseRangeChk, 0, 0, 0, 3);
61   myUseRangeChk->setChecked(myAnimator->isRangeDefined());
62   
63   QLabel* aMinLbl = new QLabel("From", aRangeGrp);
64   aMinLbl->setEnabled(myUseRangeChk->isChecked());
65   aRangeLayout->addWidget(aMinLbl, 1, 0);
66   double aStep = (myAnimator->getMaxTime() - myAnimator->getMinTime())/(theAnimator->getFieldData(0).myNbTimes - 1);
67   myMinVal = new QAD_SpinBoxDbl(aRangeGrp, myAnimator->getMinTime(), myAnimator->getMaxTime(), aStep );
68   myMinVal->setEnabled(myUseRangeChk->isChecked());
69   if (myUseRangeChk->isChecked())
70     myMinVal->setValue( myAnimator->getMinRange() );
71   else
72     myMinVal->setValue( myAnimator->getMinTime() );
73     
74   connect(myMinVal, SIGNAL( valueChanged(double)),
75           this, SLOT( onMinValue(double) ));
76   aRangeLayout->addWidget(myMinVal, 1, 1);
77
78   QLabel* aMaxLbl = new QLabel("To", aRangeGrp);
79   aMaxLbl->setEnabled(myUseRangeChk->isChecked());
80   aRangeLayout->addWidget(aMaxLbl, 1, 2);
81   myMaxVal = new QAD_SpinBoxDbl(aRangeGrp, myAnimator->getMinTime(), myAnimator->getMaxTime(), aStep );
82   myMaxVal->setEnabled(myUseRangeChk->isChecked());
83   if (myUseRangeChk->isChecked())
84     myMaxVal->setValue( myAnimator->getMaxRange() );
85   else
86     myMaxVal->setValue( myAnimator->getMaxTime() );
87
88   connect(myMaxVal, SIGNAL( valueChanged(double)),
89           this, SLOT( onMaxValue(double) ));
90   aRangeLayout->addWidget(myMaxVal, 1, 3);
91   
92   connect(myUseRangeChk, SIGNAL( toggled(bool)),
93           aMinLbl, SLOT( setEnabled(bool) ));
94   connect(myUseRangeChk, SIGNAL( toggled(bool)),
95           aMaxLbl, SLOT( setEnabled(bool) ));
96   connect(myUseRangeChk, SIGNAL( toggled(bool)),
97           this, SLOT( onRangeCheck(bool) ));
98
99   aMainLayout->addWidget(aRangeGrp);
100
101   
102   QHBox* aPropFrame = new QHBox(this);
103   aPropFrame->setSpacing(5);
104   
105   QVGroupBox* aNamesBox = new QVGroupBox("Fields",aPropFrame);  
106   myFieldLst = new QListBox(aNamesBox);
107   QStringList aFieldNames;
108   // Find names of fields
109   for (int i = 0; i < theAnimator->getNbFields(); i++) {
110     aFieldNames.append(VisuGUI::getValue(theAnimator->getFieldData(i).myField, "myName"));
111   }
112   myFieldLst->insertStringList(aFieldNames);
113   myFieldLst->setSelected(0, true);
114   connect( myFieldLst, SIGNAL( highlighted(int) ), 
115            this, SLOT( onFieldChange(int) ) );
116
117   
118   QVGroupBox* aPropBox = new QVGroupBox("Properties", aPropFrame);  
119   myTypeCombo = new QComboBox(aPropBox);
120   connect( myTypeCombo, SIGNAL( activated(int) ), 
121            this, SLOT( onTypeChanged(int) ) );
122   
123   QPushButton* aBarBtn = new QPushButton("Scalar Bar...", aPropBox);
124   connect( aBarBtn, SIGNAL( clicked() ), 
125            this, SLOT( onScalarBarDlg() ) );
126  
127   myPropBtn = new QPushButton("Properties...", aPropBox);
128   myPropBtn->setEnabled(theAnimator->getFieldData(0).myPrsType != VISU::TSCALARMAP);
129   connect( myPropBtn, SIGNAL( clicked() ), 
130            this, SLOT( onPreferencesDlg() ) );
131
132   onFieldChange(0);
133   aMainLayout->addWidget(aPropFrame);
134   
135   QHBox* aBtnBox = new QHBox(this);
136   QHBoxLayout* aBtnLayout = new QHBoxLayout(aBtnBox->layout()); 
137   aBtnLayout->addStretch();
138   
139   QPushButton* aCloseBtn = new QPushButton(tr("BUT_CLOSE"), aBtnBox);
140   connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(close()));
141   
142   aMainLayout->addWidget(aBtnBox);
143 }
144
145
146 //************************************************************************
147 void SetupDlg::onFieldChange(int theIndex) {
148   FieldData& aData = myAnimator->getFieldData(theIndex);
149   myTypeCombo->clear();
150   myTypeCombo->insertItem("Scalar Map");
151   myTypeCombo->insertItem("Iso Surfaces");
152   myTypeCombo->insertItem("Cut Planes");
153
154   SALOMEDS::SObject_var aSObject = aData.myField;
155   long aNumComp = VisuGUI::getValue(aSObject, "myNumComponent").toLong();
156   if (aNumComp > 1) {
157     myTypeCombo->insertItem("Deformed Shape");
158     myTypeCombo->insertItem("Vectors");
159     myTypeCombo->insertItem("Stream Lines");
160   }
161   switch (aData.myPrsType) {
162   case VISU::TSCALARMAP: //Scalar Map
163     myTypeCombo->setCurrentItem(0);
164     break;
165   case VISU::TISOSURFACE: //Iso Surfaces
166     myTypeCombo->setCurrentItem(1);
167     break;
168   case VISU::TCUTPLANES: //Cut Planes
169     myTypeCombo->setCurrentItem(2);
170     break;
171   case VISU::TDEFORMEDSHAPE: //Deformed Shape
172     myTypeCombo->setCurrentItem(3);
173     break;
174   case VISU::TVECTORS: //Vectors
175     myTypeCombo->setCurrentItem(4);
176     break;
177   case VISU::TSTREAMLINES: //Stream Lines
178     myTypeCombo->setCurrentItem(5);
179     aData.myPrsType = VISU::TSTREAMLINES;
180     break;
181   }  
182   myPropBtn->setEnabled(aData.myPrsType != VISU::TSCALARMAP);
183 }
184
185 //************************************************************************
186 void SetupDlg::onTypeChanged(int theIndex) {
187   FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
188   switch (theIndex) {
189   case 0: //Scalar Map
190     aData.myPrsType = VISU::TSCALARMAP;
191     break;
192   case 1: //Iso Surfaces
193     aData.myPrsType = VISU::TISOSURFACE;
194     break;
195   case 2: //Cut Planes
196     aData.myPrsType = VISU::TCUTPLANES;
197     break;
198   case 3: //Deformed Shape
199     aData.myPrsType = VISU::TDEFORMEDSHAPE;
200     break;
201   case 4: //Vectors
202     aData.myPrsType = VISU::TVECTORS;
203     break;
204   case 5: //Stream Lines
205     aData.myPrsType = VISU::TSTREAMLINES;
206     break;
207   }
208   myAnimator->clearData(aData);
209   myPropBtn->setEnabled(aData.myPrsType != VISU::TSCALARMAP);
210   //myAnimator->generatePresentations(myFieldLst->currentItem());
211 }
212
213
214 //************************************************************************
215 void SetupDlg::onScalarBarDlg() {
216   QApplication::setOverrideCursor( Qt::waitCursor );
217   FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
218   if (aData.myPrs == 0) 
219     myAnimator->generatePresentations(myFieldLst->currentItem());
220   QApplication::restoreOverrideCursor();
221
222   VisuGUI_ScalarBarDlg* aScalarBarDlg = new VisuGUI_ScalarBarDlg();
223   aScalarBarDlg->initFromPrsObject(aData.myPrs[0]);
224   if (aScalarBarDlg->exec()) {
225     for (int i = 0; i < aData.myNbFrames; i++)
226       aScalarBarDlg->storeToPrsObject(aData.myPrs[i]);
227   }
228 }
229
230 //************************************************************************
231 void SetupDlg::onPreferencesDlg() {
232   QApplication::setOverrideCursor( Qt::waitCursor );
233   FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
234   if (aData.myPrs == 0)
235     myAnimator->generatePresentations(myFieldLst->currentItem());
236   QApplication::restoreOverrideCursor();
237
238   switch (myTypeCombo->currentItem()) {
239   case 1: //Iso Surfaces
240     {
241       VisuGUI_IsoSurfacesDlg* aDlg = new VisuGUI_IsoSurfacesDlg();
242       aDlg->initFromPrsObject(dynamic_cast<VISU::IsoSurfaces_i*>(aData.myPrs[0]));
243       if (aDlg->exec()) {
244         for (int i = 0; i < aData.myNbFrames; i++)
245           aDlg->storeToPrsObject(dynamic_cast<VISU::IsoSurfaces_i*>(aData.myPrs[i]));
246       }
247     }
248     break;
249   case 2: //Cut Planes
250     {
251       VisuGUI_CutPlanesDlg* aDlg = new VisuGUI_CutPlanesDlg();
252       aDlg->initFromPrsObject(dynamic_cast<VISU::CutPlanes_i*>(aData.myPrs[0]));
253       if (aDlg->exec()) {
254         for (int i = 0; i < aData.myNbFrames; i++)
255           aDlg->storeToPrsObject(dynamic_cast<VISU::CutPlanes_i*>(aData.myPrs[i]));
256       }
257     }
258     break;
259   case 3: //Deformed Shape
260     {
261       VisuGUI_MagnitudeDlg* aDlg = new VisuGUI_MagnitudeDlg();
262       aDlg->initFromPrsObject(dynamic_cast<VISU::DeformedShape_i*>(aData.myPrs[0]));      
263       if (aDlg->exec()) {
264         for (int i = 0; i < aData.myNbFrames; i++)
265           aDlg->storeToPrsObject(dynamic_cast<VISU::DeformedShape_i*>(aData.myPrs[i]));
266       }
267     }
268     break;
269   case 4: //Vectors
270     {
271       VisuGUI_VectorsDlg* aDlg = new VisuGUI_VectorsDlg();
272       aDlg->initFromPrsObject(dynamic_cast<VISU::Vectors_i*>(aData.myPrs[0]));
273       if (aDlg->exec()) {
274         for (int i = 0; i < aData.myNbFrames; i++)
275           aDlg->storeToPrsObject(dynamic_cast<VISU::Vectors_i*>(aData.myPrs[i]));
276       }
277     }
278     break;
279   case 5: //Stream Lines
280     {
281       VisuGUI_StreamLinesDlg* aDlg = new VisuGUI_StreamLinesDlg();
282       aDlg->initFromPrsObject(dynamic_cast<VISU::StreamLines_i*>(aData.myPrs[0]));
283       if (aDlg->exec()) {
284         for (int i = 0; i < aData.myNbFrames; i++)
285           aDlg->storeToPrsObject(dynamic_cast<VISU::StreamLines_i*>(aData.myPrs[i]));
286       }
287     }
288     break;
289   }
290 }
291
292 //************************************************************************
293 void SetupDlg::onRangeCheck(bool theCheck) {
294   for (int i = 0; i < myAnimator->getNbFields(); i++) 
295     myAnimator->clearData(myAnimator->getFieldData(i));
296
297   myMinVal->setEnabled(theCheck);
298   myMaxVal->setEnabled(theCheck);
299
300   if (!theCheck)
301     myAnimator->setAnimationRange(0, 0);
302   else {
303     //    if (myMinVal->value() < myMaxVal->value())
304     myAnimator->setAnimationRange(myMinVal->value(), myMaxVal->value());    
305 //     else if (myMinVal->value() > myMaxVal->value())
306 //       myAnimator->setAnimationRange(myMaxVal->value(), myMinVal->value());
307 //     else // equal case
308 //       myAnimator->setAnimationRange(0, 0);
309   }
310 }
311
312 //************************************************************************
313 void SetupDlg::onMinValue(double theVal) {
314   if (theVal > myAnimator->getMaxRange()) {
315     myMinVal->setValue( myAnimator->getMinTime() );
316     myMinVal->setFocus();
317     return;
318   }
319   for (int i = 0; i < myAnimator->getNbFields(); i++) 
320     myAnimator->clearData(myAnimator->getFieldData(i));
321   myAnimator->setAnimationRange(theVal, myAnimator->getMaxRange());
322 }
323
324 //************************************************************************
325 void SetupDlg::onMaxValue(double theVal) {
326   if (theVal < myAnimator->getMinRange()) {
327     myMaxVal->setValue( myAnimator->getMaxTime() );
328     myMaxVal->setFocus();
329     return;
330   }
331   for (int i = 0; i < myAnimator->getNbFields(); i++) 
332     myAnimator->clearData(myAnimator->getFieldData(i));
333   myAnimator->setAnimationRange(myAnimator->getMinRange(), theVal);
334 }
335
336
337 static const char * firstIco[] = {
338 "18 10 2 1",
339 "       g None",
340 ".      g #000000",
341 "         .     .  ",
342 "  ..    ..    ..  ",
343 "  ..   ...   ...  ",
344 "  ..  ....  ....  ",
345 "  .. ..... .....  ",
346 "  .. ..... .....  ",
347 "  ..  ....  ....  ",
348 "  ..   ...   ...  ",
349 "  ..    ..    ..  ",
350 "         .     .  "};
351
352
353 static const char * lastIco[] = {
354 "18 10 2 1",
355 "       g None",
356 ".      g #000000",
357 "  .     .         ",
358 "  ..    ..    ..  ",
359 "  ...   ...   ..  ",
360 "  ....  ....  ..  ",
361 "  ..... ..... ..  ",
362 "  ..... ..... ..  ",
363 "  ....  ....  ..  ",
364 "  ...   ...   ..  ",
365 "  ..    ..    ..  ",
366 "  .     .         "};
367
368
369 static const char * leftIco[] = {
370 "11 10 2 1",
371 "       g None",
372 ".      g #000000",
373 "    .     .",
374 "   ..    ..",
375 "  ...   ...",
376 " ....  ....",
377 "..... .....",
378 "..... .....",
379 " ....  ....",
380 "  ...   ...",
381 "   ..    ..",
382 "    .     ."};
383
384 static const char * playIco[] = {
385 "14 14 2 1",
386 "       g None",
387 ".      g #000000",
388 "              ",
389 "              ",
390 "  ..          ",
391 "  ....        ",
392 "  ......      ",
393 "  ........    ",
394 "  ..........  ",
395 "  ..........  ",
396 "  ........    ",
397 "  ......      ",
398 "  ....        ",
399 "  ..          ",
400 "              ",
401 "              "};
402
403 static QPixmap MYplayPixmap(playIco);
404
405
406
407 static const char * rightIco[] = {
408 "11 10 2 1",
409 "       g None",
410 ".      g #000000",
411 ".     .    ",
412 "..    ..   ",
413 "...   ...  ",
414 "....  .... ",
415 "..... .....",
416 "..... .....",
417 "....  .... ",
418 "...   ...  ",
419 "..    ..   ",
420 ".     .    "};
421
422
423 static const char * pauseIco[] = {
424 "14 14 2 1",
425 "       g None",
426 ".      g #000000",
427 "              ",
428 "              ",
429 "   ..    ..   ",
430 "   ..    ..   ",
431 "   ..    ..   ",
432 "   ..    ..   ",
433 "   ..    ..   ",
434 "   ..    ..   ",
435 "   ..    ..   ",
436 "   ..    ..   ",
437 "   ..    ..   ",
438 "   ..    ..   ",
439 "              ",
440 "              "};
441
442 static QPixmap MYpausePixmap(pauseIco);
443
444
445 VisuGUI_TimeAnimationDlg::VisuGUI_TimeAnimationDlg(SALOMEDS::Study_var theStudy) 
446   : QDialog( QAD_Application::getDesktop(), "VisuGUI_TimeAnimationDlg", false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose)
447 {
448   setCaption("Animation");
449   setSizeGripEnabled( TRUE );
450   myStudy = theStudy;
451   isClosing = false;
452
453   myAnimator = new VISU_TimeAnimation(theStudy);
454   myAnimator->setSpeed(1);
455   myAnimator->setViewer(VisuGUI::GetVtkViewFrame());
456   connect( myAnimator, SIGNAL( frameChanged(long, double) ), 
457            this, SLOT( onExecution(long, double) ) );
458   connect( myAnimator, SIGNAL( stopped() ), 
459            this, SLOT( onStop() ) );
460
461   QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 6);
462   aMainLayout->setSpacing(5);
463
464   mySetupBtn = new QPushButton("Setup Animation...", this);
465   connect( mySetupBtn, SIGNAL( clicked() ), 
466            this, SLOT( onSetupDlg() ) );
467   aMainLayout->addWidget(mySetupBtn);  
468   
469   myGenBtn = new QPushButton("Generate frames", this);
470   connect( myGenBtn, SIGNAL( clicked() ), 
471            this, SLOT( createFrames() ) );
472   aMainLayout->addWidget(myGenBtn);
473
474   myPlayFrame = new QFrame(this);
475   myPlayFrame->setFrameStyle(QFrame::WinPanel | QFrame::Sunken);
476   myPlayFrame->setLineWidth( 1 );
477  
478
479   // --- Play controls ---
480   QGridLayout* TopLayout = new QGridLayout( myPlayFrame ); 
481   TopLayout->setSpacing( 6 );
482   TopLayout->setMargin( 11 );
483
484   myTimeLbl = new QLabel("0", myPlayFrame);
485   TopLayout->addMultiCellWidget(myTimeLbl, 0, 0, 0, 2, Qt::AlignHCenter);
486
487   mySlider = new QSlider(Qt::Horizontal, myPlayFrame);
488   mySlider->setMinValue(0);
489   mySlider->setMaxValue(3);
490   mySlider->setTickInterval(1);
491   //mySlider->setTickmarks(QSlider::Below);
492   mySlider->setTracking(false);
493   connect( mySlider, SIGNAL( valueChanged(int) ), 
494            this, SLOT( onFrameChanged(int) ) );
495   TopLayout->addMultiCellWidget(mySlider, 1, 1, 0, 2);
496
497   myPlayBtn = new QToolButton(myPlayFrame);
498   myPlayBtn->setIconSet(MYplayPixmap);
499   myPlayBtn->setToggleButton(true);
500   connect( myPlayBtn, SIGNAL( clicked() ), 
501            this, SLOT( onPlayPressed() ) );
502   TopLayout->addMultiCellWidget(myPlayBtn, 2, 2, 0, 1);
503
504   QToolButton* aBackBtn = new QToolButton(myPlayFrame);
505   aBackBtn->setIconSet(QPixmap(leftIco));
506   connect( aBackBtn, SIGNAL( clicked() ), 
507            this, SLOT( onBackPressed() ) );
508   TopLayout->addWidget(aBackBtn, 3, 0);
509
510   QToolButton* aForvardBtn = new QToolButton(myPlayFrame);
511   aForvardBtn->setIconSet(QPixmap(rightIco));
512   connect( aForvardBtn, SIGNAL( clicked() ), 
513            this, SLOT( onForvardPressed() ) );
514   TopLayout->addWidget(aForvardBtn, 3, 1);
515
516   QToolButton* aFirstBtn = new QToolButton(myPlayFrame);
517   aFirstBtn->setIconSet(QPixmap(firstIco));
518   connect( aFirstBtn, SIGNAL( clicked() ), 
519            this, SLOT( onFirstPressed() ) );
520   TopLayout->addWidget(aFirstBtn, 4, 0);
521   
522   QToolButton* aLastBtn = new QToolButton(myPlayFrame);
523   aLastBtn->setIconSet(QPixmap(lastIco));
524   connect( aLastBtn, SIGNAL( clicked() ), 
525            this, SLOT( onLastPressed() ) );
526   TopLayout->addWidget(aLastBtn, 4, 1);
527   
528   QLabel* aSpeedLbl = new QLabel("Speed", myPlayFrame);
529   TopLayout->addWidget(aSpeedLbl, 4, 2, Qt::AlignRight);
530
531   QLCDNumber* aSpeedNum  = new QLCDNumber( 2, myPlayFrame );
532   aSpeedNum->setSegmentStyle(QLCDNumber::Flat);
533   aSpeedNum->display(1);
534   TopLayout->addWidget(aSpeedNum, 4, 3);
535
536   QwtWheel* aWheel = new QwtWheel(myPlayFrame);
537   aWheel->setOrientation(Qt::Vertical);
538   aWheel->setRange(1, 99, 1);
539   connect( aWheel, SIGNAL(valueChanged(double)), 
540            aSpeedNum, SLOT(display(double)) );
541   connect( aWheel, SIGNAL(valueChanged(double)), 
542            this, SLOT(onSpeedChange(double)) );
543   TopLayout->addMultiCellWidget(aWheel, 1, 3, 3, 3, Qt::AlignRight);
544
545   QCheckBox* aCycleCheck = new QCheckBox("Cycled animation",myPlayFrame);
546   aCycleCheck->setChecked(myAnimator->isCycling());
547   connect(aCycleCheck, SIGNAL(toggled(bool)), myAnimator, SLOT(setCyclingSlot(bool)));
548   TopLayout->addMultiCellWidget(aCycleCheck, 5, 5, 0, 3);
549
550   QCheckBox* aPropCheck = new QCheckBox("Use proportional timing",myPlayFrame);
551   aPropCheck->setChecked(myAnimator->isProportional());
552   connect(aPropCheck, SIGNAL(toggled(bool)), myAnimator, SLOT(setProportionalSlot(bool)));
553   TopLayout->addMultiCellWidget(aPropCheck, 6, 6, 0, 3);
554
555   QGroupBox* aSaveBox = new QGroupBox( "Saving", myPlayFrame );
556   aSaveBox->setColumnLayout(0, Qt::Horizontal );
557   QGridLayout* aSaveLay = new QGridLayout(aSaveBox->layout());
558   aSaveLay->setSpacing( 5 );
559   aSaveLay->setMargin( 5 );
560
561   mySaveCheck = new QCheckBox("Save pictures to directory", aSaveBox);
562   aSaveLay->addMultiCellWidget(mySaveCheck, 0, 0, 0, 2);
563
564   QLabel* aPathLbl = new QLabel("Path:", aSaveBox);
565   aPathLbl->setEnabled(false);
566   connect(mySaveCheck, SIGNAL( toggled(bool)),
567           aPathLbl, SLOT( setEnabled(bool) ));
568   aSaveLay->addWidget(aPathLbl, 1, 0);
569   
570   myPathEdit = new QLineEdit(aSaveBox);
571   myPathEdit->setEnabled(false);
572   connect(mySaveCheck, SIGNAL( toggled(bool)),
573           myPathEdit, SLOT( setEnabled(bool) ));
574   aSaveLay->addWidget(myPathEdit, 1, 1);
575
576   QPushButton* aBrowseBtn = new QPushButton("Browse...", aSaveBox);
577   aBrowseBtn->setEnabled(false);
578   connect(mySaveCheck, SIGNAL( toggled(bool)),
579           aBrowseBtn, SLOT( setEnabled(bool) ));
580   connect(aBrowseBtn, SIGNAL( clicked()),
581           this, SLOT( onBrowse() ));
582   mySaveCheck->setChecked(false);
583   aSaveLay->addWidget(aBrowseBtn, 1, 2);
584
585   TopLayout->addMultiCellWidget(aSaveBox, 7, 7, 0, 3);
586
587   aMainLayout->addWidget(myPlayFrame);
588
589   QHBox* aBtnBox = new QHBox(this);
590   QHBoxLayout* aBtnLayout = new QHBoxLayout(aBtnBox->layout()); 
591   aBtnLayout->addStretch();
592
593   QPushButton* aCloseBtn = new QPushButton(tr("BUT_CLOSE"), aBtnBox);
594   connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(close()));
595   
596   aMainLayout->addWidget(aBtnBox);
597
598   myPlayFrame->setEnabled(false);
599 }
600
601
602 //************************************************************************
603 VisuGUI_TimeAnimationDlg::~VisuGUI_TimeAnimationDlg() {
604   delete myAnimator;
605 }
606
607
608 //************************************************************************
609 void VisuGUI_TimeAnimationDlg::onTypeChange(int index) {
610   stopAnimation();
611   myPropBtn->setEnabled(index != 0);
612   
613   clearView();
614   myPlayFrame->setEnabled(false);
615 }
616
617
618 //************************************************************************
619 void  VisuGUI_TimeAnimationDlg::addField(SALOMEDS::SObject_var theSObject) {
620   myPlayFrame->setEnabled(false);
621   myAnimator->addField(theSObject);
622 }
623
624
625
626 //************************************************************************
627 void VisuGUI_TimeAnimationDlg::createFrames() {
628   stopAnimation();
629   QApplication::setOverrideCursor( Qt::waitCursor );
630
631   for (int i = 0; i < myAnimator->getNbFields(); i++) {
632     if (myAnimator->getFieldData(i).myPrs == 0) 
633       myAnimator->generatePresentations(i);
634   }
635   mySlider->setMaxValue(myAnimator->getNbFrames()-1);
636   myPlayFrame->setEnabled(true);
637   if (!myAnimator->generateFrames()) {
638     QApplication::restoreOverrideCursor();
639     //myPlayFrame->setEnabled(false);
640     QMessageBox::warning(QAD_Application::getDesktop(), tr("ERROR"), myAnimator->getLastErrorMsg()); 
641     return;
642   }
643   //myPlayFrame->setEnabled(true);
644   QApplication::restoreOverrideCursor();
645 }
646  
647   
648
649 //************************************************************************
650 void VisuGUI_TimeAnimationDlg::onPlayPressed() {
651   if (myPlayBtn->isOn()) {
652     myPlayBtn->setIconSet(MYpausePixmap);
653     if (mySaveCheck->isChecked())
654       myAnimator->dumpTo(myPathEdit->text());
655     else
656       myAnimator->dumpTo("");
657     mySetupBtn->setEnabled(false);
658     myGenBtn->setEnabled(false);
659     myAnimator->startAnimation();
660   } else {
661     myPlayBtn->setIconSet(MYplayPixmap);
662     myAnimator->stopAnimation();
663     mySetupBtn->setEnabled(true);
664     myGenBtn->setEnabled(true);
665   }
666 }
667
668 //************************************************************************
669 void VisuGUI_TimeAnimationDlg::onBackPressed() {
670   //stopAnimation();
671   myAnimator->prevFrame();
672 }
673
674
675 //************************************************************************
676 void VisuGUI_TimeAnimationDlg::onForvardPressed() {
677   myAnimator->nextFrame();
678 }
679
680
681 //************************************************************************
682 void VisuGUI_TimeAnimationDlg::onLastPressed() {
683   myAnimator->lastFrame();
684 }
685
686
687 //************************************************************************
688 void VisuGUI_TimeAnimationDlg::onFirstPressed() {
689   myAnimator->firstFrame();
690 }
691
692
693
694 //************************************************************************
695 void VisuGUI_TimeAnimationDlg::clearView() {
696   myAnimator->clearView();
697 }
698
699
700 //************************************************************************
701 void VisuGUI_TimeAnimationDlg::closeEvent(QCloseEvent* theEvent) {
702   myAnimator->stopAnimation();
703   if (myAnimator->running() && (! myAnimator->finished())) {
704     isClosing = true;
705     myEvent = theEvent;
706   } else {
707     QDialog::closeEvent(theEvent);
708   }
709 }
710
711
712 //************************************************************************
713 void VisuGUI_TimeAnimationDlg::onFrameChanged(int index) {
714   if (myAnimator->isRunning()) return;
715   myAnimator->gotoFrame(index);
716 }
717
718
719 //************************************************************************
720 void VisuGUI_TimeAnimationDlg::onSpeedChange(double theSpeed) {
721   myAnimator->setSpeed((int)theSpeed);
722 }
723     
724
725 //************************************************************************
726 void VisuGUI_TimeAnimationDlg::stopAnimation() {
727   myAnimator->stopAnimation();
728   myPlayBtn->setOn(false);
729   myPlayBtn->setIconSet(MYplayPixmap);
730   mySetupBtn->setEnabled(true);
731   myGenBtn->setEnabled(true);
732 }
733
734 //************************************************************************
735 void VisuGUI_TimeAnimationDlg::onExecution(long theNewFrame, double theTime) {
736   myTimeLbl->setText(QString("%1").arg(theTime));
737   mySlider->setValue(theNewFrame);
738 }
739
740
741 //************************************************************************
742 void VisuGUI_TimeAnimationDlg::onSetupDlg() {
743   SetupDlg* aDlg = new SetupDlg(this, myAnimator);
744   aDlg->exec();
745   myPlayFrame->setEnabled(false);
746   delete aDlg;
747 }
748
749 //************************************************************************
750 void VisuGUI_TimeAnimationDlg::onBrowse() {
751   myPathEdit->setText(QAD_FileDlg::getExistingDirectory(this, "/","Select path"));
752 }
753
754
755 //************************************************************************
756 void VisuGUI_TimeAnimationDlg::onStop() {
757   if (isClosing) {
758     QDialog::closeEvent(myEvent);
759   } else {
760     myPlayBtn->setOn(false);
761     myPlayBtn->setIconSet(MYplayPixmap);
762     mySetupBtn->setEnabled(true);
763     myGenBtn->setEnabled(true);
764   }
765 }