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