]> SALOME platform Git repositories - modules/visu.git/blob - src/VISUGUI/VisuGUI_TimeAnimation.cxx
Salome HOME
IPAL9285,9292,9314
[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
13 #include "VisuGUI.h"
14 #include "VisuGUI_Tools.h"
15 #include "VisuGUI_DeformedShapeDlg.h"
16 #include "VisuGUI_CutPlanesDlg.h"
17 #include "VisuGUI_Plot3DDlg.h"
18 #include "VisuGUI_VectorsDlg.h"
19 #include "VisuGUI_IsoSurfacesDlg.h"
20 #include "VisuGUI_StreamLinesDlg.h"
21
22 #include "VISU_TimeAnimation.h"
23
24 #include "VISU_ScalarMap_i.hh"
25 #include "VISU_IsoSurfaces_i.hh"
26 #include "VISU_DeformedShape_i.hh"
27 #include "VISU_CutPlanes_i.hh"
28 #include "VISU_Plot3D_i.hh"
29 #include "VISU_CutLines_i.hh"
30 #include "VISU_Vectors_i.hh"
31 #include "VISU_StreamLines_i.hh"
32
33 #include "VISU_ViewManager_i.hh"
34
35 #include "VISU_ScalarBarActor.hxx"
36 #include "VISU_Actor.h"
37
38 #include "SalomeApp_Study.h"
39 #include "SalomeApp_Application.h"
40
41 #include "SVTK_ViewWindow.h"
42
43 #include "SUIT_OverrideCursor.h"
44 #include "SUIT_MessageBox.h"
45 #include "SUIT_Desktop.h"
46 #include "SUIT_FileDlg.h"
47
48 #include <vtkRenderer.h>
49
50 #include <qhbox.h>
51 #include <qgrid.h>
52 #include <qlayout.h>
53 #include <qslider.h>
54 #include <qthread.h>
55 #include <qlistbox.h>
56 #include <qwt_wheel.h>
57 #include <qhgroupbox.h>
58 #include <qlcdnumber.h>
59 #include <qvgroupbox.h>
60
61 #define  MAXVAL 1e10
62
63 ArrangeDlg::ArrangeDlg(QWidget* theParent, VISU_TimeAnimation* theAnimator)
64   : QDialog(theParent, "ArrangeDlg", true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
65     myAnimator(theAnimator), myViewWindow(theAnimator->getViewer())
66 {
67   myCurrent = 0;
68   init();
69   QStringList aFieldNames;
70   // Find names of fields
71   for (int i = 0; i < theAnimator->getNbFields(); i++) {
72     aFieldNames.append(VISU::getValue(theAnimator->getFieldData(i).myField, "myName"));
73     Offset aOffs;
74     aOffs.myOffset[0] = myAnimator->getFieldData(i).myOffset[0];
75     aOffs.myOffset[1] = myAnimator->getFieldData(i).myOffset[1];
76     aOffs.myOffset[2] = myAnimator->getFieldData(i).myOffset[2];
77     myOffsets.append(aOffs);
78   }
79   myFieldLst->insertStringList(aFieldNames);
80   myFieldLst->setSelected(0, true);
81 }
82
83 ArrangeDlg::ArrangeDlg(QWidget* theParent, SVTK_ViewWindow* theViewWindow)
84   : QDialog(theParent, "ArrangeDlg", true, WStyle_Customize |
85             WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
86     myAnimator(0), myViewWindow(theViewWindow)
87 {
88   myCurrent = 0;
89   init();
90   QStringList aPrsNames;
91   vtkActor* anActor;
92   vtkActorCollection *anActColl = myViewWindow->getRenderer()->GetActors();
93   for (anActColl->InitTraversal(); (anActor = anActColl->GetNextActor()) != NULL;) {
94     VISU_Actor* anVISUActor = dynamic_cast<VISU_Actor*>(anActor);
95     if (anVISUActor)
96       if (anVISUActor->GetVisibility() != 0) {
97         VISU::Prs3d_i* aPrs = anVISUActor->GetParent()->GetPrs3d();
98         if (aPrs) {
99           if (!myPrsMap.contains(aPrs)) {
100             SALOMEDS::SObject_var aSObject = aPrs->GetSObject();
101             if(!aSObject->_is_nil()){
102               SALOMEDS::GenericAttribute_var anAttr;
103               if (aSObject->FindAttribute(anAttr, "AttributeName")) {
104                 SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr);
105                 string aNam = aName->Value();
106                 QString strIn(aNam.c_str());
107                 aPrsNames.append(strIn);
108                 myPrsMap[aPrs] = myOffsets.count();
109                 Offset aOffs;
110                 anVISUActor->GetPosition(aOffs.myOffset);
111                 myOffsets.append(aOffs);
112               }
113             }
114           }
115         }
116       }
117   }
118   myFieldLst->insertStringList(aPrsNames);
119   myFieldLst->setSelected(0, true);
120 }
121
122 void ArrangeDlg::init()
123 {
124   setCaption("Arrange Presentations");
125   setSizeGripEnabled( TRUE );
126
127   QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 6);
128   aMainLayout->setSpacing(5);
129
130   QButtonGroup* aBtnGrp = new QButtonGroup(2, Qt::Horizontal, this);
131   aBtnGrp->setExclusive(true);
132   aMainLayout->addWidget(aBtnGrp);
133
134   QRadioButton* aAutoBtn = new QRadioButton("Auto", aBtnGrp);
135   aBtnGrp->insert(aAutoBtn, AutoMode);
136
137   QRadioButton* aManualBtn = new QRadioButton("Manual", aBtnGrp);
138   aBtnGrp->insert(aManualBtn, ManualMode);
139   aBtnGrp->setButton(AutoMode);
140
141   myStackWgt = new QWidgetStack(this);
142   aMainLayout->addWidget(myStackWgt);
143
144   //  AUTO Pane
145   QVBox* aAutoPane = new QVBox(myStackWgt);
146   aAutoPane->setSpacing(5);
147   // Axis Group
148   myAxisGrp = new QButtonGroup(3, Qt::Horizontal,"Axis", aAutoPane);
149
150   QRadioButton* aXBtn = new QRadioButton("X",myAxisGrp );
151   myAxisGrp->insert(aXBtn, XAxis);
152
153   QRadioButton* aYBtn = new QRadioButton("Y",myAxisGrp );
154   myAxisGrp->insert(aYBtn, YAxis);
155
156   QRadioButton* aZBtn = new QRadioButton("Z",myAxisGrp );
157   myAxisGrp->insert(aZBtn, ZAxis);
158
159   myAxisGrp->setButton(XAxis);
160
161   //Distance Input
162   QHBox* aDistPane = new QHBox(aAutoPane);
163   aDistPane->setSpacing(5);
164   new QLabel("Relative Distance", aDistPane);
165   myDistVal = new QtxDblSpinBox (-10,10, 0.5, aDistPane);
166   myDistVal->setValue(1);
167
168   myStackWgt->addWidget(aAutoPane, AutoMode);
169
170   // Manual Pane
171   QHBox* aManualPane = new QHBox(myStackWgt);
172   aManualPane->setSpacing(10);
173
174   myFieldLst = new QListBox(aManualPane);
175   connect( myFieldLst, SIGNAL( highlighted(int) ),
176            this, SLOT( onFieldChange(int) ) );
177
178   QGrid* aCoordPane = new QGrid(2, aManualPane);
179   aCoordPane->setSpacing(5);
180
181   new QLabel("X", aCoordPane);
182   myCoord[0] = new QtxDblSpinBox(aCoordPane);
183   myCoord[0]->setRange(-MAXVAL, MAXVAL);
184
185   new QLabel("Y", aCoordPane);
186   myCoord[1] = new QtxDblSpinBox(aCoordPane);
187   myCoord[1]->setRange(-MAXVAL, MAXVAL);
188
189   new QLabel("Z", aCoordPane);
190   myCoord[2] = new QtxDblSpinBox(aCoordPane);
191   myCoord[2]->setRange(-MAXVAL, MAXVAL);
192
193   myStackWgt->addWidget(aManualPane, ManualMode);
194
195   myStackWgt->raiseWidget(AutoMode);
196
197   connect(aBtnGrp, SIGNAL(clicked(int)), myStackWgt, SLOT(raiseWidget(int)) );
198
199   SUIT_Study* aSUITStudy = myViewWindow->getViewManager()->study();
200   SalomeApp_Study* anAppStudy = dynamic_cast<SalomeApp_Study*>(aSUITStudy);
201   _PTR(Study) aCStudy = VISU::GetCStudy(anAppStudy);
202   if (!myAnimator && !aCStudy->GetProperties()->IsLocked()) {
203     mySaveChk = new QCheckBox ("Save to presentation", this);
204     mySaveChk->setChecked(false);
205     aMainLayout->addWidget(mySaveChk);
206   } else {
207     mySaveChk = 0;
208   }
209
210   // Common buttons ===========================================================
211   QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" );
212   GroupButtons->setColumnLayout(0, Qt::Vertical );
213   GroupButtons->layout()->setSpacing( 0 );
214   GroupButtons->layout()->setMargin( 0 );
215   QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() );
216   GroupButtonsLayout->setAlignment( Qt::AlignTop );
217   GroupButtonsLayout->setSpacing( 6 );
218   GroupButtonsLayout->setMargin( 11 );
219
220   QPushButton* buttonOk = new QPushButton( tr( "&OK" ), GroupButtons, "buttonOk" );
221   buttonOk->setAutoDefault( TRUE );
222   buttonOk->setDefault( TRUE );
223   GroupButtonsLayout->addWidget( buttonOk, 0, 0 );
224   GroupButtonsLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 );
225
226   QPushButton* buttonCancel = new QPushButton( tr( "&Cancel" ) , GroupButtons, "buttonCancel" );
227   buttonCancel->setAutoDefault( TRUE );
228   GroupButtonsLayout->addWidget( buttonCancel, 0, 2 );
229
230   aMainLayout->addWidget( GroupButtons );
231
232   connect( buttonOk,     SIGNAL( clicked() ),      this, SLOT( accept() ) );
233   connect( buttonCancel, SIGNAL( clicked() ),      this, SLOT( reject() ) );
234 }
235
236 void ArrangeDlg::accept()
237 {
238   if (myAnimator) {
239     acceptAnimation();
240   } else {
241     acceptViewWindow();
242   }
243   QDialog::accept();
244 }
245
246 void ArrangeDlg::onFieldChange(int theCurrent)
247 {
248   if (myCurrent != theCurrent) {
249     Offset& aOffs = myOffsets[myCurrent];
250     aOffs.myOffset[0] = myCoord[0]->value();
251     aOffs.myOffset[1] = myCoord[1]->value();
252     aOffs.myOffset[2] = myCoord[2]->value();
253   }
254   myCurrent = theCurrent;
255   const Offset& aNewOffs = myOffsets[myCurrent];
256   myCoord[0]->setValue(aNewOffs.myOffset[0]);
257   myCoord[1]->setValue(aNewOffs.myOffset[1]);
258   myCoord[2]->setValue(aNewOffs.myOffset[2]);
259 }
260
261 void ArrangeDlg::acceptAnimation()
262 {
263   if (getMode() == ManualMode) {
264     // Save from GUI
265     Offset& aOffs = myOffsets[myCurrent];
266     aOffs.myOffset[0] = myCoord[0]->value();
267     aOffs.myOffset[1] = myCoord[1]->value();
268     aOffs.myOffset[2] = myCoord[2]->value();
269
270     for (int i = 0; i < myAnimator->getNbFields(); i++) {
271       Offset aOffs = myOffsets[i];
272       myAnimator->getFieldData(i).myOffset[0] = aOffs.myOffset[0];
273       myAnimator->getFieldData(i).myOffset[1] = aOffs.myOffset[1];
274       myAnimator->getFieldData(i).myOffset[2] = aOffs.myOffset[2];
275     }
276   } else {
277     QApplication::setOverrideCursor( Qt::waitCursor );
278     FieldData& aData = myAnimator->getFieldData(0);
279     if (aData.myPrs.empty())
280       myAnimator->generatePresentations(0);
281     VISU_Actor* aActor = aActor = aData.myPrs[0]->CreateActor();
282     float aBounds[6];
283     aActor->GetBounds(aBounds);
284     aActor->Delete();
285     float aDist = 0;
286     int aAxis = getAxis();
287     switch (aAxis) {
288     case XAxis:
289       aDist = fabs(aBounds[1] - aBounds[0]);
290       break;
291     case YAxis:
292       aDist = fabs(aBounds[3] - aBounds[2]);
293       break;
294     case ZAxis:
295       aDist = fabs(aBounds[5] - aBounds[4]);
296     }
297     aDist = aDist*getDistance();
298     for (int i = 0; i < myAnimator->getNbFields(); i++) {
299       myAnimator->getFieldData(i).myOffset[0] = 0;
300       myAnimator->getFieldData(i).myOffset[1] = 0;
301       myAnimator->getFieldData(i).myOffset[2] = 0;
302       myAnimator->getFieldData(i).myOffset[aAxis] = aDist * i;
303     }
304
305     QApplication::restoreOverrideCursor();
306   }
307 }
308
309 void ArrangeDlg::acceptViewWindow()
310 {
311   if (getMode() == ManualMode) {
312     // Save from GUI
313     Offset& aOffs = myOffsets[myCurrent];
314     aOffs.myOffset[0] = myCoord[0]->value();
315     aOffs.myOffset[1] = myCoord[1]->value();
316     aOffs.myOffset[2] = myCoord[2]->value();
317
318     QMap<VISU::Prs3d_i*, int>::Iterator it;
319     for (it = myPrsMap.begin(); it != myPrsMap.end(); ++it) {
320       VISU::Prs3d_i* aPrs = it.key();
321       Offset& aOffs = myOffsets[it.data()];
322       if (VISU_Actor* anActor = VISU::GetActor(aPrs, myViewWindow)) anActor->SetPosition(aOffs.myOffset);
323       if (mySaveChk)
324         if (mySaveChk->isChecked())
325           aPrs->SetOffset(aOffs.myOffset);
326     }
327   } else {
328     float aDist = 0;
329     float aShift = 0;
330     float aPrevDist = 0;
331     //    bool aInit = true;
332     int i;
333     QMap<VISU::Prs3d_i*, int>::Iterator it;
334     for (it = myPrsMap.begin(), i = 0; it != myPrsMap.end(); ++it, i++) {
335       VISU::Prs3d_i* aPrs = it.key();
336       if (VISU_Actor* aActor = VISU::GetActor(aPrs, myViewWindow)){
337         int aAxis = getAxis();
338         //      if (aInit) {
339         float aBounds[6];
340         aActor->GetBounds(aBounds);
341         switch (aAxis) {
342         case XAxis:
343           aDist = fabs(aBounds[1] - aBounds[0]);
344           break;
345         case YAxis:
346           aDist = fabs(aBounds[3] - aBounds[2]);
347           break;
348         case ZAxis:
349           aDist = fabs(aBounds[5] - aBounds[4]);
350         }
351         //        aInit = false;
352         //      }
353         float aOffset[3];
354         aOffset[0] = aOffset[1] = aOffset[2] = 0;
355
356         aShift = (i == 0)? 0 : aShift + (aDist + aPrevDist) * getDistance() / 2;
357
358         aOffset[aAxis] = aShift;
359         aActor->SetPosition(aOffset);
360         if (mySaveChk)
361           if (mySaveChk->isChecked())
362             aPrs->SetOffset(aOffset);
363         aPrevDist = aDist;
364       }
365     }
366   }
367   myViewWindow->getRenderer()->ResetCameraClippingRange();
368   myViewWindow->Repaint();
369 }
370
371
372 //*****************************************************************************************************
373 //*****************************************************************************************************
374 //*****************************************************************************************************
375 SetupDlg::SetupDlg (VisuGUI* theModule, VISU_TimeAnimation* theAnimator)
376      : QDialog(VISU::GetDesktop(theModule), "SetupDlg", true, WStyle_Customize |
377                WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
378        myModule(theModule)
379 {
380   setCaption("Setup Animation");
381   setSizeGripEnabled( TRUE );
382   myAnimator = theAnimator;
383
384   QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 6);
385   aMainLayout->setSpacing(5);
386
387
388   QFrame* aRangeGrp = new QFrame(this);
389   QGridLayout* aRangeLayout = new QGridLayout( aRangeGrp );
390   aRangeLayout->setSpacing( 6 );
391   aRangeLayout->setMargin( 11 );
392   aRangeGrp->setFrameStyle(QFrame::Box | QFrame::Raised);
393
394   myUseRangeChk = new QCheckBox("Use range of time stamps", aRangeGrp);
395   aRangeLayout->addMultiCellWidget(myUseRangeChk, 0, 0, 0, 3);
396   myUseRangeChk->setChecked(myAnimator->isRangeDefined());
397
398   QLabel* aMinLbl = new QLabel("From", aRangeGrp);
399   aMinLbl->setEnabled(myUseRangeChk->isChecked());
400   aRangeLayout->addWidget(aMinLbl, 1, 0);
401   double aStep = (myAnimator->getMaxTime() - myAnimator->getMinTime())/(theAnimator->getFieldData(0).myNbTimes - 1);
402   myMinVal = new QtxDblSpinBox( myAnimator->getMinTime(), myAnimator->getMaxTime(), aStep, aRangeGrp );
403   myMinVal->setEnabled(myUseRangeChk->isChecked());
404   if (myUseRangeChk->isChecked())
405     myMinVal->setValue( myAnimator->getMinRange() );
406   else
407     myMinVal->setValue( myAnimator->getMinTime() );
408
409   connect(myMinVal, SIGNAL( valueChanged(double)),
410           this, SLOT( onMinValue(double) ));
411   aRangeLayout->addWidget(myMinVal, 1, 1);
412
413   QLabel* aMaxLbl = new QLabel("To", aRangeGrp);
414   aMaxLbl->setEnabled(myUseRangeChk->isChecked());
415   aRangeLayout->addWidget(aMaxLbl, 1, 2);
416   myMaxVal = new QtxDblSpinBox( myAnimator->getMinTime(), myAnimator->getMaxTime(), aStep, aRangeGrp );
417   myMaxVal->setEnabled(myUseRangeChk->isChecked());
418   if (myUseRangeChk->isChecked())
419     myMaxVal->setValue( myAnimator->getMaxRange() );
420   else
421     myMaxVal->setValue( myAnimator->getMaxTime() );
422
423   connect(myMaxVal, SIGNAL( valueChanged(double)),
424           this, SLOT( onMaxValue(double) ));
425   aRangeLayout->addWidget(myMaxVal, 1, 3);
426
427   connect(myUseRangeChk, SIGNAL( toggled(bool)),
428           aMinLbl, SLOT( setEnabled(bool) ));
429   connect(myUseRangeChk, SIGNAL( toggled(bool)),
430           aMaxLbl, SLOT( setEnabled(bool) ));
431   connect(myUseRangeChk, SIGNAL( toggled(bool)),
432           this, SLOT( onRangeCheck(bool) ));
433
434   aMainLayout->addWidget(aRangeGrp);
435
436
437   QHBox* aPropFrame = new QHBox(this);
438   aPropFrame->setSpacing(5);
439
440   QVGroupBox* aNamesBox = new QVGroupBox("Fields",aPropFrame);
441   myFieldLst = new QListBox(aNamesBox);
442   QStringList aFieldNames;
443   // Find names of fields
444   for (int i = 0; i < theAnimator->getNbFields(); i++) {
445     _PTR(SObject) aSO = theAnimator->getFieldData(i).myField;
446     aFieldNames.append(VISU::getValue(aSO, "myName"));
447   }
448   myFieldLst->insertStringList(aFieldNames);
449   myFieldLst->setSelected(0, true);
450   connect( myFieldLst, SIGNAL( highlighted(int) ),
451            this, SLOT( onFieldChange(int) ) );
452
453
454   QVBox* aSetupBox = new QVBox(aPropFrame);
455   aSetupBox->setSpacing(5);
456
457   QVGroupBox* aPropBox = new QVGroupBox("Properties", aSetupBox);
458   //QVGroupBox* aPropBox = new QVGroupBox("Properties", aPropFrame);
459   myTypeCombo = new QComboBox(aPropBox);
460   connect( myTypeCombo, SIGNAL( activated(int) ),
461            this, SLOT( onTypeChanged(int) ) );
462
463   //  QPushButton* aBarBtn = new QPushButton("Scalar Bar...", aPropBox);
464   //connect( aBarBtn, SIGNAL( clicked() ),
465   //       this, SLOT( onScalarBarDlg() ) );
466
467   myPropBtn = new QPushButton("Properties...", aPropBox);
468   //  myPropBtn->setEnabled(theAnimator->getFieldData(0).myPrsType != VISU::TSCALARMAP);
469   connect( myPropBtn, SIGNAL( clicked() ),
470            this, SLOT( onPreferencesDlg() ) );
471
472   if (myAnimator->getNbFields() > 1) {
473     myArrangeBtn = new QPushButton("Arrange...", aSetupBox);
474     connect( myArrangeBtn, SIGNAL( clicked() ), this, SLOT( onArrangeDlg() ) );
475   }
476   onFieldChange(0);
477   aMainLayout->addWidget(aPropFrame);
478
479   QHBox* aBtnBox = new QHBox(this);
480   QHBoxLayout* aBtnLayout = new QHBoxLayout(aBtnBox->layout());
481   aBtnLayout->addStretch();
482
483   QPushButton* aCloseBtn = new QPushButton(tr("BUT_OK"), aBtnBox);
484   connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(close()));
485
486   aMainLayout->addWidget(aBtnBox);
487 }
488
489 //************************************************************************
490 enum PrsComboItem {
491   TSCALARMAP_ITEM     = 0, // VISU::TSCALARMAP
492   TISOSURFACE_ITEM    = 1, // VISU::TISOSURFACE
493   TCUTPLANES_ITEM     = 2, // VISU::TCUTPLANES
494   TPLOT3D_ITEM        = 3, // VISU::TPLOT3D
495   TDEFORMEDSHAPE_ITEM = 4, // VISU::TDEFORMEDSHAPE
496   TVECTORS_ITEM       = 5, // VISU::TVECTORS
497   TSTREAMLINES_ITEM   = 6  // VISU::TSTREAMLINES
498 };
499
500 //************************************************************************
501 void SetupDlg::onFieldChange (int theIndex)
502 {
503   FieldData& aData = myAnimator->getFieldData(theIndex);
504   myTypeCombo->clear();
505   // ATTENTION: append items in the same order like it is done in the PrsComboItem enumeration
506   myTypeCombo->insertItem("Scalar Map");   // item 0
507   myTypeCombo->insertItem("Iso Surfaces"); // item 1
508   myTypeCombo->insertItem("Cut Planes");   // item 2
509   myTypeCombo->insertItem("Plot 3D");      // item 3
510
511   _PTR(SObject) aSObject = aData.myField;
512   long aNumComp = VISU::getValue(aSObject, "myNumComponent").toLong();
513   if (aNumComp > 1) {
514     myTypeCombo->insertItem("Deformed Shape"); // item 4
515     myTypeCombo->insertItem("Vectors");        // item 5
516     myTypeCombo->insertItem("Stream Lines");   // item 6
517   }
518   switch (aData.myPrsType) {
519   case VISU::TSCALARMAP: //Scalar Map
520     myTypeCombo->setCurrentItem(TSCALARMAP_ITEM);
521     break;
522   case VISU::TISOSURFACE: //Iso Surfaces
523     myTypeCombo->setCurrentItem(TISOSURFACE_ITEM);
524     break;
525   case VISU::TCUTPLANES: //Cut Planes
526     myTypeCombo->setCurrentItem(TCUTPLANES_ITEM);
527     break;
528   case VISU::TPLOT3D: //Plot 3D
529     myTypeCombo->setCurrentItem(TPLOT3D_ITEM);
530     break;
531   case VISU::TDEFORMEDSHAPE: //Deformed Shape
532     myTypeCombo->setCurrentItem(TDEFORMEDSHAPE_ITEM);
533     break;
534   case VISU::TVECTORS: //Vectors
535     myTypeCombo->setCurrentItem(TVECTORS_ITEM);
536     break;
537   case VISU::TSTREAMLINES: //Stream Lines
538     myTypeCombo->setCurrentItem(TSTREAMLINES_ITEM);
539     aData.myPrsType = VISU::TSTREAMLINES;
540     break;
541   }
542   //myPropBtn->setEnabled(aData.myPrsType != VISU::TSCALARMAP);
543 }
544
545 //************************************************************************
546 void SetupDlg::onTypeChanged (int theIndex)
547 {
548   FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
549   switch (theIndex) {
550   case TSCALARMAP_ITEM: //Scalar Map
551     aData.myPrsType = VISU::TSCALARMAP;
552     break;
553   case TISOSURFACE_ITEM: //Iso Surfaces
554     aData.myPrsType = VISU::TISOSURFACE;
555     break;
556   case TCUTPLANES_ITEM: //Cut Planes
557     aData.myPrsType = VISU::TCUTPLANES;
558     break;
559   case TPLOT3D_ITEM: //Plot 3D
560     aData.myPrsType = VISU::TPLOT3D;
561     break;
562   case TDEFORMEDSHAPE_ITEM: //Deformed Shape
563     aData.myPrsType = VISU::TDEFORMEDSHAPE;
564     break;
565   case TVECTORS_ITEM: //Vectors
566     aData.myPrsType = VISU::TVECTORS;
567     break;
568   case TSTREAMLINES_ITEM: //Stream Lines
569     aData.myPrsType = VISU::TSTREAMLINES;
570     break;
571   }
572   myAnimator->clearData(aData);
573   //myPropBtn->setEnabled(aData.myPrsType != VISU::TSCALARMAP);
574   //myAnimator->generatePresentations(myFieldLst->currentItem());
575 }
576
577 //************************************************************************
578 /*void SetupDlg::onScalarBarDlg() {
579   QApplication::setOverrideCursor( Qt::waitCursor );
580   FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
581   if (aData.myPrs == 0)
582     myAnimator->generatePresentations(myFieldLst->currentItem());
583   QApplication::restoreOverrideCursor();
584
585   VisuGUI_ScalarBarDlg* aScalarBarDlg = new VisuGUI_ScalarBarDlg();
586   aScalarBarDlg->initFromPrsObject(aData.myPrs[0]);
587   if (aScalarBarDlg->exec()) {
588     for (int i = 0; i < aData.myNbFrames; i++)
589       aScalarBarDlg->storeToPrsObject(aData.myPrs[i]);
590   }
591 }
592 */
593
594 //************************************************************************
595 void SetupDlg::onPreferencesDlg()
596 {
597   MESSAGE("SetupDlg::onPreferencesDlg() is not implemented");
598   SUIT_OverrideCursor c;
599   FieldData& aData = myAnimator->getFieldData(myFieldLst->currentItem());
600   if (aData.myPrs.empty())
601     myAnimator->generatePresentations(myFieldLst->currentItem());
602
603 // BUG VISU5725 : Compatibility gcc 2.95
604 // #define EDITPRS(TYPE, DLG) \
605 //     { \
606 //       DLG* aDlg = new DLG(); \
607 //       aDlg->initFromPrsObject(dynamic_cast<TYPE*>(aData.myPrs.at(0))); \
608 //       if (aDlg->exec()) { \
609 //      for (int i = 0; i < aData.myNbFrames; i++) \
610 //        aDlg->storeToPrsObject(dynamic_cast<TYPE*>(aData.myPrs.at(i))); \
611 //       } \
612 //       delete aDlg; \
613 //     }
614
615
616 #define EDITPRS(TYPE, DLG) {\
617         DLG* aDlg = new DLG (myModule);\
618         aDlg->initFromPrsObject(dynamic_cast<TYPE*>(aData.myPrs[0]));\
619         if (aDlg->exec())\
620         { \
621          for (int i = 0; i < aData.myNbFrames; i++)\
622           aDlg->storeToPrsObject(dynamic_cast<TYPE*>(aData.myPrs[i]));\
623         } \
624         delete aDlg;}
625
626   switch (myTypeCombo->currentItem()) {
627   case TSCALARMAP_ITEM: //Scalar Map
628     c.suspend();
629     EDITPRS(VISU::ScalarMap_i, VisuGUI_ScalarBarDlg);
630     break;
631   case TISOSURFACE_ITEM: //Iso Surfaces
632     c.suspend();
633     EDITPRS(VISU::IsoSurfaces_i, VisuGUI_IsoSurfacesDlg);
634     break;
635   case TCUTPLANES_ITEM: //Cut Planes
636     //    EDITPRS(VISU::CutPlanes_i, VisuGUI_CutPlanesDlg);
637     {
638       c.suspend();
639       VisuGUI_CutPlanesDlg* aDlg = new VisuGUI_CutPlanesDlg(false, true);
640       //_CS_PhB :operator [] .at      aDlg->initFromPrsObject(dynamic_cast<VISU::CutPlanes_i*>(aData.myPrs.at(0)));
641       aDlg->initFromPrsObject(dynamic_cast<VISU::CutPlanes_i*>(aData.myPrs[0]));
642
643       if (aDlg->exec()) {
644         for (int i = 0; i < aData.myNbFrames; i++)
645       //_CS_PhB:operator [] .at   aDlg->storeToPrsObject(dynamic_cast<VISU::CutPlanes_i*>(aData.myPrs.at(i)));
646           aDlg->storeToPrsObject(dynamic_cast<VISU::CutPlanes_i*>(aData.myPrs[i]));
647       }
648       delete aDlg;
649     }
650     break;
651   case TPLOT3D_ITEM: //Plot 3D
652     c.suspend();
653     EDITPRS(VISU::Plot3D_i, VisuGUI_Plot3DDlg);
654     break;
655   case TDEFORMEDSHAPE_ITEM: //Deformed Shape
656     c.suspend();
657     EDITPRS(VISU::DeformedShape_i, VisuGUI_DeformedShapeDlg);
658     break;
659   case TVECTORS_ITEM: //Vectors
660     c.suspend();
661     EDITPRS(VISU::Vectors_i, VisuGUI_VectorsDlg);
662     break;
663   case TSTREAMLINES_ITEM: //Stream Lines
664     c.suspend();
665     EDITPRS(VISU::StreamLines_i, VisuGUI_StreamLinesDlg);
666     break;
667   }
668 #undef EDITPRS
669 }
670
671
672 //************************************************************************
673 void SetupDlg::onArrangeDlg()
674 {
675   ArrangeDlg aDlg(this, myAnimator);
676   aDlg.exec();
677 }
678
679 //************************************************************************
680 void SetupDlg::onRangeCheck (bool theCheck)
681 {
682   for (int i = 0; i < myAnimator->getNbFields(); i++)
683     myAnimator->clearData(myAnimator->getFieldData(i));
684
685   myMinVal->setEnabled(theCheck);
686   myMaxVal->setEnabled(theCheck);
687
688   if (!theCheck)
689     myAnimator->setAnimationRange(0, 0);
690   else {
691     //    if (myMinVal->value() < myMaxVal->value())
692     myAnimator->setAnimationRange(myMinVal->value(), myMaxVal->value());
693 //     else if (myMinVal->value() > myMaxVal->value())
694 //       myAnimator->setAnimationRange(myMaxVal->value(), myMinVal->value());
695 //     else // equal case
696 //       myAnimator->setAnimationRange(0, 0);
697   }
698 }
699
700 //************************************************************************
701 void SetupDlg::onMinValue (double theVal)
702 {
703   if (theVal > myAnimator->getMaxRange()) {
704     myMinVal->setValue( myAnimator->getMinTime() );
705     myMinVal->setFocus();
706     return;
707   }
708   for (int i = 0; i < myAnimator->getNbFields(); i++)
709     myAnimator->clearData(myAnimator->getFieldData(i));
710   myAnimator->setAnimationRange(theVal, myAnimator->getMaxRange());
711 }
712
713 //************************************************************************
714 void SetupDlg::onMaxValue (double theVal)
715 {
716   if (theVal < myAnimator->getMinRange()) {
717     myMaxVal->setValue( myAnimator->getMaxTime() );
718     myMaxVal->setFocus();
719     return;
720   }
721   for (int i = 0; i < myAnimator->getNbFields(); i++)
722     myAnimator->clearData(myAnimator->getFieldData(i));
723   myAnimator->setAnimationRange(myAnimator->getMinRange(), theVal);
724 }
725
726 static const char * firstIco[] = {
727 "18 10 2 1",
728 "       g None",
729 ".      g #000000",
730 "         .     .  ",
731 "  ..    ..    ..  ",
732 "  ..   ...   ...  ",
733 "  ..  ....  ....  ",
734 "  .. ..... .....  ",
735 "  .. ..... .....  ",
736 "  ..  ....  ....  ",
737 "  ..   ...   ...  ",
738 "  ..    ..    ..  ",
739 "         .     .  "};
740
741
742 static const char * lastIco[] = {
743 "18 10 2 1",
744 "       g None",
745 ".      g #000000",
746 "  .     .         ",
747 "  ..    ..    ..  ",
748 "  ...   ...   ..  ",
749 "  ....  ....  ..  ",
750 "  ..... ..... ..  ",
751 "  ..... ..... ..  ",
752 "  ....  ....  ..  ",
753 "  ...   ...   ..  ",
754 "  ..    ..    ..  ",
755 "  .     .         "};
756
757
758 static const char * leftIco[] = {
759 "11 10 2 1",
760 "       g None",
761 ".      g #000000",
762 "    .     .",
763 "   ..    ..",
764 "  ...   ...",
765 " ....  ....",
766 "..... .....",
767 "..... .....",
768 " ....  ....",
769 "  ...   ...",
770 "   ..    ..",
771 "    .     ."};
772
773 static const char * playIco[] = {
774 "14 14 2 1",
775 "       g None",
776 ".      g #000000",
777 "              ",
778 "              ",
779 "  ..          ",
780 "  ....        ",
781 "  ......      ",
782 "  ........    ",
783 "  ..........  ",
784 "  ..........  ",
785 "  ........    ",
786 "  ......      ",
787 "  ....        ",
788 "  ..          ",
789 "              ",
790 "              "};
791
792 static QPixmap MYplayPixmap(playIco);
793
794
795 static const char * rightIco[] = {
796 "11 10 2 1",
797 "       g None",
798 ".      g #000000",
799 ".     .    ",
800 "..    ..   ",
801 "...   ...  ",
802 "....  .... ",
803 "..... .....",
804 "..... .....",
805 "....  .... ",
806 "...   ...  ",
807 "..    ..   ",
808 ".     .    "};
809
810
811 static const char * pauseIco[] = {
812 "14 14 2 1",
813 "       g None",
814 ".      g #000000",
815 "              ",
816 "              ",
817 "   ..    ..   ",
818 "   ..    ..   ",
819 "   ..    ..   ",
820 "   ..    ..   ",
821 "   ..    ..   ",
822 "   ..    ..   ",
823 "   ..    ..   ",
824 "   ..    ..   ",
825 "   ..    ..   ",
826 "   ..    ..   ",
827 "              ",
828 "              "};
829
830 static QPixmap MYpausePixmap(pauseIco);
831
832
833 VisuGUI_TimeAnimationDlg::VisuGUI_TimeAnimationDlg (VisuGUI* theModule, _PTR(Study) theStudy)
834      : QDialog(VISU::GetDesktop(theModule), "VisuGUI_TimeAnimationDlg", false, WStyle_Customize |
835                WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose)
836 {
837   setCaption("Animation");
838   setSizeGripEnabled( TRUE );
839   myModule = theModule;
840   myStudy = theStudy;
841   isClosing = false;
842
843   //myAnimator = new VISU_TimeAnimation (VISU::GetDSStudy(theStudy));
844   myAnimator = new VISU_TimeAnimation (theStudy);
845   myAnimator->setSpeed(1);
846   myAnimator->setViewer(VISU::GetViewWindow());
847   connect(myAnimator, SIGNAL(frameChanged(long, double)), this, SLOT(onExecution(long, double)));
848   connect(myAnimator, SIGNAL(stopped()),                  this, SLOT(onStop()));
849
850   QVBoxLayout* aMainLayout = new QVBoxLayout(this, 7, 6);
851   aMainLayout->setSpacing(5);
852
853   mySetupBtn = new QPushButton("Setup Animation...", this);
854   connect( mySetupBtn, SIGNAL( clicked() ),
855            this, SLOT( onSetupDlg() ) );
856   aMainLayout->addWidget(mySetupBtn);
857
858   myGenBtn = new QPushButton("Generate frames", this);
859   connect( myGenBtn, SIGNAL( clicked() ),
860            this, SLOT( createFrames() ) );
861   aMainLayout->addWidget(myGenBtn);
862
863   myPlayFrame = new QFrame(this);
864   myPlayFrame->setFrameStyle(QFrame::WinPanel | QFrame::Sunken);
865   myPlayFrame->setLineWidth( 1 );
866
867
868   // --- Play controls ---
869   QGridLayout* TopLayout = new QGridLayout( myPlayFrame );
870   TopLayout->setSpacing( 6 );
871   TopLayout->setMargin( 11 );
872
873   myTimeLbl = new QLabel("0", myPlayFrame);
874   TopLayout->addMultiCellWidget(myTimeLbl, 0, 0, 0, 2, Qt::AlignHCenter);
875
876   mySlider = new QSlider(Qt::Horizontal, myPlayFrame);
877   mySlider->setMinValue(0);
878   mySlider->setMaxValue(3);
879   mySlider->setTickInterval(1);
880   //mySlider->setTickmarks(QSlider::Below);
881   mySlider->setTracking(false);
882   connect( mySlider, SIGNAL( valueChanged(int) ),
883            this, SLOT( onWindowChanged(int) ) );
884   TopLayout->addMultiCellWidget(mySlider, 1, 1, 0, 2);
885
886   myPlayBtn = new QToolButton(myPlayFrame);
887   myPlayBtn->setIconSet(MYplayPixmap);
888   myPlayBtn->setToggleButton(true);
889   connect( myPlayBtn, SIGNAL( clicked() ),
890            this, SLOT( onPlayPressed() ) );
891   TopLayout->addMultiCellWidget(myPlayBtn, 2, 2, 0, 1);
892
893   QToolButton* aBackBtn = new QToolButton(myPlayFrame);
894   aBackBtn->setIconSet(QPixmap(leftIco));
895   connect( aBackBtn, SIGNAL( clicked() ),
896            this, SLOT( onBackPressed() ) );
897   TopLayout->addWidget(aBackBtn, 3, 0);
898
899   QToolButton* aForvardBtn = new QToolButton(myPlayFrame);
900   aForvardBtn->setIconSet(QPixmap(rightIco));
901   connect( aForvardBtn, SIGNAL( clicked() ),
902            this, SLOT( onForvardPressed() ) );
903   TopLayout->addWidget(aForvardBtn, 3, 1);
904
905   QToolButton* aFirstBtn = new QToolButton(myPlayFrame);
906   aFirstBtn->setIconSet(QPixmap(firstIco));
907   connect( aFirstBtn, SIGNAL( clicked() ),
908            this, SLOT( onFirstPressed() ) );
909   TopLayout->addWidget(aFirstBtn, 4, 0);
910
911   QToolButton* aLastBtn = new QToolButton(myPlayFrame);
912   aLastBtn->setIconSet(QPixmap(lastIco));
913   connect( aLastBtn, SIGNAL( clicked() ),
914            this, SLOT( onLastPressed() ) );
915   TopLayout->addWidget(aLastBtn, 4, 1);
916
917   QLabel* aSpeedLbl = new QLabel("Speed", myPlayFrame);
918   TopLayout->addWidget(aSpeedLbl, 4, 2, Qt::AlignRight);
919
920   QLCDNumber* aSpeedNum  = new QLCDNumber( 2, myPlayFrame );
921   aSpeedNum->setSegmentStyle(QLCDNumber::Flat);
922   aSpeedNum->display(1);
923   TopLayout->addWidget(aSpeedNum, 4, 3);
924
925   QwtWheel* aWheel = new QwtWheel(myPlayFrame);
926   aWheel->setOrientation(Qt::Vertical);
927   aWheel->setRange(1, 99, 1);
928   connect( aWheel, SIGNAL(valueChanged(double)),
929            aSpeedNum, SLOT(display(double)) );
930   connect( aWheel, SIGNAL(valueChanged(double)),
931            this, SLOT(onSpeedChange(double)) );
932   TopLayout->addMultiCellWidget(aWheel, 1, 3, 3, 3, Qt::AlignRight);
933
934   QCheckBox* aCycleCheck = new QCheckBox("Cycled animation",myPlayFrame);
935   aCycleCheck->setChecked(myAnimator->isCycling());
936   connect(aCycleCheck, SIGNAL(toggled(bool)), myAnimator, SLOT(setCyclingSlot(bool)));
937   TopLayout->addMultiCellWidget(aCycleCheck, 5, 5, 0, 3);
938
939   QCheckBox* aPropCheck = new QCheckBox("Use proportional timing",myPlayFrame);
940   aPropCheck->setChecked(myAnimator->isProportional());
941   connect(aPropCheck, SIGNAL(toggled(bool)), myAnimator, SLOT(setProportionalSlot(bool)));
942   TopLayout->addMultiCellWidget(aPropCheck, 6, 6, 0, 3);
943
944   QGroupBox* aSaveBox = new QGroupBox( "Saving", myPlayFrame );
945   aSaveBox->setColumnLayout(0, Qt::Horizontal );
946   QGridLayout* aSaveLay = new QGridLayout(aSaveBox->layout());
947   aSaveLay->setSpacing( 5 );
948   aSaveLay->setMargin( 5 );
949
950   mySaveCheck = new QCheckBox("Save pictures to directory", aSaveBox);
951   aSaveLay->addMultiCellWidget(mySaveCheck, 0, 0, 0, 2);
952   connect(mySaveCheck, SIGNAL( toggled(bool)),
953           aWheel, SLOT( setDisabled(bool) ));
954
955   QLabel* aPathLbl = new QLabel("Path:", aSaveBox);
956   aPathLbl->setEnabled(false);
957   connect(mySaveCheck, SIGNAL( toggled(bool)),
958           aPathLbl, SLOT( setEnabled(bool) ));
959   aSaveLay->addWidget(aPathLbl, 1, 0);
960
961   myPathEdit = new QLineEdit(aSaveBox);
962   myPathEdit->setEnabled(false);
963   connect(mySaveCheck, SIGNAL( toggled(bool)),
964           myPathEdit, SLOT( setEnabled(bool) ));
965   aSaveLay->addWidget(myPathEdit, 1, 1);
966
967   QPushButton* aBrowseBtn = new QPushButton("Browse...", aSaveBox);
968   aBrowseBtn->setEnabled(false);
969   connect(mySaveCheck, SIGNAL( toggled(bool)),
970           aBrowseBtn, SLOT( setEnabled(bool) ));
971   connect(aBrowseBtn, SIGNAL( clicked()),
972           this, SLOT( onBrowse() ));
973   mySaveCheck->setChecked(false);
974   aSaveLay->addWidget(aBrowseBtn, 1, 2);
975
976   TopLayout->addMultiCellWidget(aSaveBox, 7, 7, 0, 3);
977
978   aMainLayout->addWidget(myPlayFrame);
979
980   QHBox* aPublishBox = new QHBox(this);
981   aPublishBox->setSpacing(5);
982
983   myPublishBtn = new QPushButton("Publish to study", aPublishBox);
984   connect(myPublishBtn, SIGNAL(clicked()), this, SLOT(publishToStudy()));
985
986   mySaveBtn = new QPushButton("Save Animation", aPublishBox);
987   mySaveBtn->setEnabled(myAnimator->isSavedInStudy());
988   connect(mySaveBtn, SIGNAL(clicked()), this, SLOT(saveToStudy()));
989
990   aMainLayout->addWidget(aPublishBox);
991
992
993   QHBox* aBtnBox = new QHBox(this);
994   QHBoxLayout* aBtnLayout = new QHBoxLayout(aBtnBox->layout());
995   aBtnLayout->addStretch();
996
997   QPushButton* aCloseBtn = new QPushButton(tr("BUT_CLOSE"), aBtnBox);
998   connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(close()));
999
1000   aMainLayout->addWidget(aBtnBox);
1001
1002   myPlayFrame->setEnabled(false);
1003 }
1004
1005 //************************************************************************
1006 VisuGUI_TimeAnimationDlg::~VisuGUI_TimeAnimationDlg()
1007 {
1008   delete myAnimator;
1009 }
1010
1011 //************************************************************************
1012 void VisuGUI_TimeAnimationDlg::onTypeChange (int index)
1013 {
1014   stopAnimation();
1015   myPropBtn->setEnabled(index != 0);
1016
1017   clearView();
1018   myPlayFrame->setEnabled(false);
1019 }
1020
1021 //************************************************************************
1022 void VisuGUI_TimeAnimationDlg::addField (_PTR(SObject) theSObject)
1023 {
1024   myPlayFrame->setEnabled(false);
1025   myAnimator->addField(VISU::GetSObject(theSObject));
1026 }
1027
1028 //************************************************************************
1029 void VisuGUI_TimeAnimationDlg::createFrames()
1030 {
1031   stopAnimation();
1032   SUIT_OverrideCursor c;
1033
1034   for (int i = 0; i < myAnimator->getNbFields(); i++) {
1035     if (myAnimator->getFieldData(i).myPrs.empty())
1036       myAnimator->generatePresentations(i);
1037   }
1038   if (myAnimator->getNbFrames() == 0) {
1039     myPlayFrame->setEnabled(false);
1040     c.suspend();
1041     SUIT_MessageBox::warn1(this,
1042                            tr("ERROR"),
1043                            tr("MSG_NO_ANIMATIONDATA"),
1044                            tr("&OK"));
1045     return;
1046   }
1047   mySlider->setMaxValue(myAnimator->getNbFrames()-1);
1048   myPlayFrame->setEnabled(true);
1049   if (!myAnimator->generateFrames()) {
1050     c.suspend();
1051     //myPlayFrame->setEnabled(false);
1052     SUIT_MessageBox::warn1(this,
1053                            tr("ERROR"),
1054                            myAnimator->getLastErrorMsg(),
1055                            tr("&OK"));
1056     return;
1057   }
1058   //myPlayFrame->setEnabled(true);
1059 }
1060
1061 //************************************************************************
1062 void VisuGUI_TimeAnimationDlg::onPlayPressed()
1063 {
1064   if (myPlayBtn->isOn() && (!myAnimator->running())) {
1065     myPlayBtn->setIconSet(MYpausePixmap);
1066     if (mySaveCheck->isChecked())
1067       myAnimator->dumpTo(myPathEdit->text());
1068     else
1069       myAnimator->dumpTo("");
1070     mySetupBtn->setEnabled(false);
1071     myGenBtn->setEnabled(false);
1072     myAnimator->startAnimation();
1073   } else {
1074     myPlayBtn->setIconSet(MYplayPixmap);
1075     myAnimator->stopAnimation();
1076     mySetupBtn->setEnabled(true);
1077     myGenBtn->setEnabled(true);
1078   }
1079 }
1080
1081 //************************************************************************
1082 void VisuGUI_TimeAnimationDlg::onBackPressed()
1083 {
1084   //stopAnimation();
1085   myAnimator->prevFrame();
1086 }
1087
1088 //************************************************************************
1089 void VisuGUI_TimeAnimationDlg::onForvardPressed()
1090 {
1091   myAnimator->nextFrame();
1092 }
1093
1094 //************************************************************************
1095 void VisuGUI_TimeAnimationDlg::onLastPressed()
1096 {
1097   myAnimator->lastFrame();
1098 }
1099
1100 //************************************************************************
1101 void VisuGUI_TimeAnimationDlg::onFirstPressed()
1102 {
1103   myAnimator->firstFrame();
1104 }
1105
1106 //************************************************************************
1107 void VisuGUI_TimeAnimationDlg::clearView()
1108 {
1109   myAnimator->clearView();
1110 }
1111
1112 //************************************************************************
1113 void VisuGUI_TimeAnimationDlg::closeEvent (QCloseEvent* theEvent)
1114 {
1115   myAnimator->stopAnimation();
1116   myAnimator->wait(500);
1117   if (myAnimator->running() && (! myAnimator->finished())) {
1118     isClosing = true;
1119     myEvent = theEvent;
1120   } else {
1121     QDialog::closeEvent(theEvent);
1122   }
1123 }
1124
1125 //************************************************************************
1126 void VisuGUI_TimeAnimationDlg::onWindowChanged (int index)
1127 {
1128   if (myAnimator->isRunning()) return;
1129   myAnimator->gotoFrame(index);
1130 }
1131
1132 //************************************************************************
1133 void VisuGUI_TimeAnimationDlg::onSpeedChange (double theSpeed)
1134 {
1135   myAnimator->setSpeed((int)theSpeed);
1136 }
1137
1138 //************************************************************************
1139 void VisuGUI_TimeAnimationDlg::stopAnimation()
1140 {
1141   myAnimator->stopAnimation();
1142   myPlayBtn->setOn(false);
1143   myPlayBtn->setIconSet(MYplayPixmap);
1144   mySetupBtn->setEnabled(true);
1145   myGenBtn->setEnabled(true);
1146 }
1147
1148 //************************************************************************
1149 void VisuGUI_TimeAnimationDlg::onExecution (long theNewFrame, double theTime)
1150 {
1151   myTimeLbl->setText(QString("%1").arg(theTime));
1152   mySlider->setValue(theNewFrame);
1153 }
1154
1155 //************************************************************************
1156 void VisuGUI_TimeAnimationDlg::onSetupDlg()
1157 {
1158   if (myAnimator->getNbFrames() > 0) myAnimator->firstFrame();
1159   SetupDlg* aDlg = new SetupDlg (myModule, myAnimator);
1160   aDlg->exec();
1161   myPlayFrame->setEnabled(false);
1162   delete aDlg;
1163 }
1164
1165 //************************************************************************
1166 void VisuGUI_TimeAnimationDlg::onBrowse()
1167 {
1168   QString aPath = SUIT_FileDlg::getExistingDirectory(this, "/","Select path");
1169   if (!aPath.isEmpty())
1170     myPathEdit->setText(aPath);
1171 }
1172
1173 //************************************************************************
1174 void VisuGUI_TimeAnimationDlg::onStop()
1175 {
1176   if (isClosing) {
1177     QDialog::closeEvent(myEvent);
1178   } else {
1179     myPlayBtn->setOn(false);
1180     myPlayBtn->setIconSet(MYplayPixmap);
1181     mySetupBtn->setEnabled(true);
1182     myGenBtn->setEnabled(true);
1183   }
1184 }
1185
1186 //************************************************************************
1187 void VisuGUI_TimeAnimationDlg::saveToStudy()
1188 {
1189   myAnimator->saveAnimation();
1190   myModule->updateObjBrowser( true );
1191 }
1192
1193 //************************************************************************
1194 void VisuGUI_TimeAnimationDlg::publishToStudy()
1195 {
1196   myAnimator->publishInStudy();
1197   myModule->updateObjBrowser( true );
1198   mySaveBtn->setEnabled(myAnimator->isSavedInStudy());
1199 }
1200
1201 //************************************************************************
1202 void VisuGUI_TimeAnimationDlg::restoreFromStudy(_PTR(SObject) theAnimation)
1203 {
1204   myAnimator->restoreFromStudy(theAnimation);
1205   mySaveBtn->setEnabled(myAnimator->isSavedInStudy());
1206 }