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