]> SALOME platform Git repositories - modules/multipr.git/commitdiff
Salome HOME
Implement saving progress bar corresponding to Client-Server architecture.
authorjfa <jfa@opencascade.com>
Mon, 23 Jul 2007 06:03:24 +0000 (06:03 +0000)
committerjfa <jfa@opencascade.com>
Mon, 23 Jul 2007 06:03:24 +0000 (06:03 +0000)
idl/MULTIPR.idl
src/MULTIPR/MULTIPR_i.cxx
src/MULTIPR/MULTIPR_i.hxx
src/MULTIPRGUI/MULTIPR_GUI.cxx
src/MULTIPRGUI/MULTIPR_GUI.h
src/MULTIPRGUI/MULTIPR_GUI_Dlg.cxx

index c4d9511fc5b3376bb28eb5c6784e252c46b78775..ba9828d8b198ca928f2ecfc50e6a1c3778898ed8 100644 (file)
@@ -187,6 +187,17 @@ interface MULTIPR_Obj : SALOME::GenericObj
         */
        void save(in string path)
                raises (SALOME::SALOME_Exception);
+       
+       /*!
+        * Check save progress.
+        * \return current save progress in percents.
+        */
+       long getSaveProgress();
+       
+       /*!
+        * Reset save progress to zero.
+        */
+       void resetSaveProgress();
 
 }; // interface MULTIPR_Obj
 
index cfc9ddbf768d0a5ba3b367feab4915d3d28d6ae3..442fb71b2c2b0c08e462c731c9216fb57a1b49e3 100644 (file)
@@ -767,6 +767,15 @@ void MULTIPR_Obj_i::save(const char* pPath)
   MULTIPR::TPythonDump(_engine) << this << ".save(\"" << pPath << "\")";
 }
 
+CORBA::Long MULTIPR_Obj_i::getSaveProgress()
+{
+  return mObj->getProgress();
+}
+
+void MULTIPR_Obj_i::resetSaveProgress()
+{
+  mObj->resetProgress();
+}
 
 //-----------------------------------------------------------------------------
 // savePersistent and setEngine (for Persistence & Dump Python)
index fc3ff821c041ff3f781e5742626ba1cdea038efd..e0b7e3a513e4b325b3bf5d861d827fff3636dc10 100644 (file)
@@ -259,6 +259,17 @@ public:
     void save(const char* pPath)
         throw (SALOME::SALOME_Exception);
 
+    /**
+     * Check save progress.
+     * \return current save progress in percents.
+     */
+    CORBA::Long getSaveProgress();
+
+    /**
+     * Reset save progress to zero.
+     */
+    void resetSaveProgress();
+
     //---------------------------------------------------------------------
     // Persistence and Dump Python
     //---------------------------------------------------------------------
index b5bb2864ce6dde013b5ccd970c965a6490a0a8ec..56755cdafbf601c5e020e39c48df8274c8f7f7ec 100644 (file)
@@ -41,6 +41,8 @@
 #include <SALOME_LifeCycleCORBA.hxx>
 #include <SALOMEDS_Study.hxx>
 
+#include <SALOME_Event.hxx>
+
 #include <QtxPopupMgr.h>
 
 // QT Includes
@@ -62,7 +64,8 @@
 #include <qpixmap.h>
 #include <qmessagebox.h>
 #include <qaction.h>
-
+#include <qtimer.h>
+#include <qthread.h>
 
 #include <stdexcept>
 
@@ -73,13 +76,70 @@ using namespace std;
 // Global variable
 //*****************************************************************************
 
-namespace multipr
+//namespace multipr
+//{
+//    // progress callback used by the MULTIPR library
+//    extern MULTIPR_ProgressCallback*  gProgressCallback;
+//    extern MULTIPR_EmptyMeshCallback* gEmptyMeshCallback;
+//}
+class MULTIPR_GUI_FinishSaveEvent: public SALOME_Event
 {
-    // progress callback used by the MULTIPR library
-    extern MULTIPR_ProgressCallback*  gProgressCallback;
-    extern MULTIPR_EmptyMeshCallback* gEmptyMeshCallback;
-}
+  SalomeApp_Application* myApp;
+  bool myIsError;
+public:
+  MULTIPR_GUI_FinishSaveEvent (SalomeApp_Application* theApp,
+                               bool theIsError)
+    : myApp(theApp),
+      myIsError(theIsError)
+  {}
+  virtual void Execute()
+  {
+    if (myIsError) {
+      SUIT_MessageBox::error1(myApp->desktop(),
+                              "Save distributed MED file error", 
+                              "Error while writing distributed MED file", 
+                              myApp->tr("MULTIPR_BUT_OK"));
+    }
+    else {
+      myApp->updateObjectBrowser();
+    }
+    QApplication::restoreOverrideCursor();
+  }
+};
+
+class MULTIPR_GUI_SaveThread : public QThread
+{
+public:
+  MULTIPR_GUI_SaveThread (MULTIPR_GUI* pModule,
+                          MULTIPR_ORB::MULTIPR_Obj_ptr pObj,
+                          QString pPath)
+    : mModule(pModule)
+  {
+    mObj = MULTIPR_ORB::MULTIPR_Obj::_duplicate(pObj);
+    mPath = pPath;
+  }
+  virtual void run();
 
+private:
+  MULTIPR_GUI* mModule;
+  MULTIPR_ORB::MULTIPR_Obj_ptr mObj;
+  QString mPath;
+};
+
+void MULTIPR_GUI_SaveThread::run()
+{
+  try
+  {
+    mObj->save(mPath);
+  }
+  catch(...)
+  {
+    ProcessVoidEvent(new MULTIPR_GUI_FinishSaveEvent(mModule->getApp(), true));
+    return;
+  }
+
+  ProcessVoidEvent(new MULTIPR_GUI_FinishSaveEvent(mModule->getApp(), false));
+}
 
 //*****************************************************************************
 // Global function
@@ -119,10 +179,14 @@ MULTIPR_ORB::MULTIPR_Gen_ptr GetMultiprGen (const CAM_Module* theModule)
 // Class MULTIPR_GUI implementation
 //*****************************************************************************
 
-MULTIPR_GUI::MULTIPR_GUI() : SalomeApp_Module("MULTIPR")
+MULTIPR_GUI::MULTIPR_GUI()
+  : SalomeApp_Module("MULTIPR"),
+    mMULTIPRObj(NULL),
+    mMEDFileName(""),
+    mProgress(NULL)
 {
-    mMEDFileName = "";
-    mMULTIPRObj = NULL;
+  mTimer = new QTimer (this);
+  connect(mTimer, SIGNAL(timeout()), this, SLOT(timerDone()));
 }
 
 
@@ -269,11 +333,13 @@ void MULTIPR_GUI::initialize(CAM_Application* app)
     //-------------------------------------------------------------------------
     // set progress dialog
     //-------------------------------------------------------------------------
-    MULTIPR_GUI_ProgressCallbackDlg* progressDlg = new MULTIPR_GUI_ProgressCallbackDlg(application()->desktop());
-    multipr::gProgressCallback = progressDlg;
+    //MULTIPR_GUI_ProgressCallbackDlg* progressDlg =
+    //  new MULTIPR_GUI_ProgressCallbackDlg(application()->desktop());
+    //multipr::gProgressCallback = progressDlg;
     
-    MULTIPR_GUI_EmptyMeshCallbackDlg* emptyMeshDlg = new MULTIPR_GUI_EmptyMeshCallbackDlg(application()->desktop());
-    multipr::gEmptyMeshCallback = emptyMeshDlg;
+    //MULTIPR_GUI_EmptyMeshCallbackDlg* emptyMeshDlg =
+    //  new MULTIPR_GUI_EmptyMeshCallbackDlg(application()->desktop());
+    //multipr::gEmptyMeshCallback = emptyMeshDlg;
 }
 
 
@@ -527,16 +593,16 @@ void MULTIPR_GUI::OnRemove()
     }
 
     QApplication::setOverrideCursor(Qt::waitCursor);
-    
+
     try
     {
-        for (QStringList::const_iterator it = mSelectedParts.begin(), last = mSelectedParts.end(); it != last; it++)
-        {
-            const QString& partName = (*it);
-            cout << "Remove " << partName.latin1() << endl;
-            mMULTIPRObj->removeParts(partName.latin1());
-        }
-        
+      QStringList::const_iterator it = mSelectedParts.begin(), last = mSelectedParts.end();
+      for (; it != last; it++)
+      {
+        const QString& partName = (*it);
+        cout << "Remove " << partName.latin1() << endl;
+        mMULTIPRObj->removeParts(partName.latin1());
+      }
     }
     catch(...)
     {
@@ -546,59 +612,67 @@ void MULTIPR_GUI::OnRemove()
             "Error while removing selected part(s)", 
             tr("MULTIPR_BUT_OK") );
     }
-    
+
     QApplication::restoreOverrideCursor();
-    
+
     getApp()->updateObjectBrowser();
 }
 
 
 void MULTIPR_GUI::OnSave()
 {
-    // check if MULTIPRObj exists
-    if (mMULTIPRObj == NULL)
-    {
-        return;
-    }
-    
-    SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg(
-        this->application()->desktop(), 
-        true, 
-        tr("") );
-        
-    fd->setCaption(tr("Save distributed MED file - Destination directory"));
-    fd->setMode(QFileDialog::DirectoryOnly);
-    
-    if (fd->exec() == QDialog::Rejected)
-    {
-        delete fd;
-        return;
-    }
-    
-    QFileInfo aFileInfo(fd->selectedFile());
+  // check if MULTIPRObj exists
+  if (mMULTIPRObj == NULL)
+  {
+    return;
+  }
+
+  SalomeApp_CheckFileDlg* fd =
+    new SalomeApp_CheckFileDlg(this->application()->desktop(), 
+                               true, 
+                               tr(""));
+
+  fd->setCaption(tr("Save distributed MED file - Destination directory"));
+  fd->setMode(QFileDialog::DirectoryOnly);
+
+  if (fd->exec() == QDialog::Rejected)
+  {
     delete fd;
-        
-    QString path = aFileInfo.filePath();
-    
-    QApplication::setOverrideCursor(Qt::waitCursor);
-    
-    try
-    {
-        mMULTIPRObj->save(path);
-        getApp()->updateObjectBrowser();
-    }
-    catch(...)
-    {
-        SUIT_MessageBox::error1( 
-            getApp()->desktop(),
-            "Save distributed MED file error", 
-            "Error while writing distributed MED file", 
-            tr("MULTIPR_BUT_OK") );
-    }
-    
-    QApplication::restoreOverrideCursor();
+    return;
+  }
+
+  QFileInfo aFileInfo(fd->selectedFile());
+  delete fd;
+
+  QApplication::setOverrideCursor(Qt::waitCursor);
+
+  QString path = aFileInfo.filePath();
+  mMULTIPRObj->resetSaveProgress();
+
+  MULTIPR_GUI_SaveThread* a = new MULTIPR_GUI_SaveThread (this, mMULTIPRObj, path);
+  a->start();
+
+  // save progress
+  //mProgress = new MULTIPR_GUI_ProgressCallbackDlg (getApp()->desktop());
+  //mProgress->start("Save mesh", 100);
+  if (mProgress == NULL)
+    mProgress = new QProgressDialog ("Save mesh", "Cancel", /*totalSteps*/100, getApp()->desktop());
+  //mProgress->setProgress(0);
+  //mProgress->init(100);
+  mTimer->start(500); // 0.5 seconds timer
 }
 
+void MULTIPR_GUI::timerDone()
+{
+  int progress = mMULTIPRObj->getSaveProgress();
+  if (mProgress != NULL) {
+    mProgress->setProgress(progress);
+
+    if (progress >= 100) {
+      mTimer->stop();
+    }
+  }
+}
 
 
 void MULTIPR_GUI::retrieveSelectedParts()
@@ -644,7 +718,8 @@ bool MULTIPR_GUI::removeLowerResolution()
     // for each selected part, check if there are lower resolution
     // and then propose to remove them before performing new process
     QStringList partNameLowerResolution;
-    for (QStringList::const_iterator it = mSelectedParts.begin(), last = mSelectedParts.end(); it != last; it++)
+    for (QStringList::const_iterator it = mSelectedParts.begin(), last = mSelectedParts.end();
+         it != last; it++)
     {
         const QString& partName = (*it);
         QString partNameLow = partName + "_LOW";
@@ -681,7 +756,8 @@ bool MULTIPR_GUI::removeLowerResolution()
         
         try
         {
-            for (QStringList::const_iterator it = partNameLowerResolution.begin(), last = partNameLowerResolution.end(); it != last; it++)
+            for (QStringList::const_iterator it = partNameLowerResolution.begin(),
+                   last = partNameLowerResolution.end(); it != last; it++)
             {
                 const QString& partName = (*it);
                 cout << "Remove " << partName.latin1() << endl;
@@ -711,8 +787,8 @@ bool MULTIPR_GUI::removeLowerResolution()
 // Super class Data Object implementation
 //*****************************************************************************
 
-MULTIPR_GUI_DataObject::MULTIPR_GUI_DataObject(SUIT_DataObject* parent, const char* name) : 
-    LightApp_DataObject(parent),
+MULTIPR_GUI_DataObject::MULTIPR_GUI_DataObject (SUIT_DataObject* parent, const char* name)
+  : LightApp_DataObject(parent),
     CAM_DataObject(parent)
 {
     mName = name;
@@ -756,8 +832,10 @@ QString MULTIPR_GUI_DataObject::toolTip() const
 // Class Data Object Module implementation
 //*****************************************************************************
 
-MULTIPR_GUI_DataObject_Module::MULTIPR_GUI_DataObject_Module(CAM_DataModel* dm, SUIT_DataObject* parent, const char* name) : 
-    MULTIPR_GUI_DataObject(parent, name),
+MULTIPR_GUI_DataObject_Module::MULTIPR_GUI_DataObject_Module (CAM_DataModel* dm,
+                                                              SUIT_DataObject* parent,
+                                                              const char* name)
+  : MULTIPR_GUI_DataObject(parent, name),
     LightApp_ModuleObject(dm, parent),
     CAM_DataObject(parent)
 {
@@ -799,8 +877,8 @@ QString MULTIPR_GUI_DataObject_Module::toolTip() const
 // Class Data Object Mesh implementation
 //*****************************************************************************
 
-MULTIPR_GUI_DataObject_Mesh::MULTIPR_GUI_DataObject_Mesh(SUIT_DataObject* parent, const char* name) : 
-    MULTIPR_GUI_DataObject(parent, name),
+MULTIPR_GUI_DataObject_Mesh::MULTIPR_GUI_DataObject_Mesh (SUIT_DataObject* parent, const char* name)
+  : MULTIPR_GUI_DataObject(parent, name),
     CAM_DataObject(parent)
 {
     // do nothing!
@@ -835,8 +913,9 @@ QString MULTIPR_GUI_DataObject_Mesh::toolTip() const
 // Class Data Object Part implementation
 //*****************************************************************************
 
-MULTIPR_GUI_DataObject_Part::MULTIPR_GUI_DataObject_Part(SUIT_DataObject* parent, const char* name, const char* info) : 
-    MULTIPR_GUI_DataObject(parent, name),
+MULTIPR_GUI_DataObject_Part::MULTIPR_GUI_DataObject_Part (SUIT_DataObject* parent,
+                                                          const char* name, const char* info)
+  : MULTIPR_GUI_DataObject(parent, name),
     CAM_DataObject(parent)
 {
     mMeshName    = "";
@@ -898,8 +977,9 @@ QString MULTIPR_GUI_DataObject_Part::toolTip() const
 // Class Data Object Resolution implementation
 //*****************************************************************************
 
-MULTIPR_GUI_DataObject_Resolution::MULTIPR_GUI_DataObject_Resolution(SUIT_DataObject* parent, const char* name, const char* info) : 
-    MULTIPR_GUI_DataObject_Part(parent, name, info),
+MULTIPR_GUI_DataObject_Resolution::MULTIPR_GUI_DataObject_Resolution (SUIT_DataObject* parent,
+                                                                      const char* name, const char* info)
+  : MULTIPR_GUI_DataObject_Part(parent, name, info),
     CAM_DataObject(parent)
 {
     // do nothing!
@@ -977,7 +1057,6 @@ void MULTIPR_GUI_DataModel::update (LightApp_DataObject*, LightApp_Study* theStu
 
 void MULTIPR_GUI_DataModel::build()
 {
-  cout << endl << " *** !!! MULTIPR_GUI_DataModel::build()" << endl << endl;
 }
 
 void MULTIPR_GUI_DataModel::buildAll (LightApp_Study* theStudy)
index e3ff9b6c5e9b45ae5efd535b1fba1a6d3415e390..6bcaeafe7e457fa14761d402b0dd04959a92084a 100644 (file)
@@ -48,6 +48,9 @@ class QLineEdit;
 class QSpinBox;
 class QPushButton;
 
+class QTimer;
+//class MULTIPR_GUI_ProgressCallbackDlg;
+class QProgressDialog;
 
 //*****************************************************************************
 // Class MULTIPR_GUI
@@ -92,6 +95,8 @@ protected slots:
     void OnDecimate();
     void OnRemove();
     void OnSave();
+
+    void timerDone(); // update saving progress dialog
     
 protected:
 
@@ -117,7 +122,11 @@ private:
     QString                      mMEDFileName;
     QStringList                  mSelectedParts;
     MULTIPR_ORB::MULTIPR_Obj_ptr mMULTIPRObj;
-  
+
+    QProgressDialog*             mProgress;
+    //MULTIPR_GUI_ProgressCallbackDlg* mProgress;
+    QTimer*                      mTimer;
+
 }; // class MULTIPR_GUI
 
 
@@ -250,4 +259,3 @@ private:
 
 
 // EOF
-
index 9dd41873bb3ca9b956c4e95eec8acc497bbf6cb9..68921c110db23c7e7e32078b23b0a52d0ca2d0ac 100644 (file)
@@ -618,12 +618,11 @@ void MULTIPR_GUI_DecimateDlg::OnThresholdAuto()
 // QT dialog box used to display progress in time consuming task (e.g. save)
 //*****************************************************************************
 
-MULTIPR_GUI_ProgressCallbackDlg::MULTIPR_GUI_ProgressCallbackDlg(QWidget* parent) :
-    QProgressDialog(
-        parent, 
-        0, 
-        false, 
-        WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu)
+MULTIPR_GUI_ProgressCallbackDlg::MULTIPR_GUI_ProgressCallbackDlg(QWidget* parent)
+  : QProgressDialog(parent,
+                    0,
+                    false,
+                    WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu)
 {
     setLabel(new QLabel(this, "Please wait"));
     setLabelText("Please wait");
@@ -649,7 +648,7 @@ void MULTIPR_GUI_ProgressCallbackDlg::done()
     setProgress(100);
 }
 
-    
+
 void MULTIPR_GUI_ProgressCallbackDlg::progress(float pPercent)
 {
     setProgress(int(pPercent));