]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
PPGP issue #5: Cannot save study after modification of PPGP module
authorsan <san@opencascade.com>
Wed, 16 Nov 2011 16:05:37 +0000 (16:05 +0000)
committersan <san@opencascade.com>
Wed, 16 Nov 2011 16:05:37 +0000 (16:05 +0000)
SalomePyQt API extended with two methods isModified() and setModified(). These methods allows light Python modules to control modification status of the C++ data model class according to the actual state of Python data.

src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_DataModelLight.cxx
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_DataModelLight.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip

index 2fc1d07c56da23e5f1d342c23783a6eb39b0e53f..8370296139a285a605633fd37664ad9011a4a67c 100644 (file)
@@ -40,7 +40,8 @@
 SALOME_PYQT_DataModelLight::SALOME_PYQT_DataModelLight(CAM_Module * theModule)
   : LightApp_DataModel( theModule ),
     myFileName( "" ),
-    myStudyURL( "" )
+    myStudyURL( "" ),
+    myModified( false )
 {
   
 }
@@ -66,6 +67,8 @@ bool SALOME_PYQT_DataModelLight::open( const QString& theURL, CAM_Study* study,
     return false;
   
   LightApp_DataModel::open( theURL, aDoc, theListOfFiles );
+
+  setModified( false );
   
   return aModule->open(theListOfFiles);
   
@@ -93,6 +96,9 @@ bool SALOME_PYQT_DataModelLight::save( QStringList& theListOfFiles)
   theListOfFiles.append(QString(aTmpDir.c_str()));
   int listSize = theListOfFiles.size();
   aModule->save(theListOfFiles);
+
+  setModified( false );
+
   //Return true if in the List of files was added item(s)
   //else return false 
   return theListOfFiles.size() > listSize;
@@ -148,23 +154,24 @@ bool SALOME_PYQT_DataModelLight::dumpPython( const QString& theURL,
 
 //=================================================================================
 // function : isModified()
-// purpose  : default implementation, always returns false so as not to mask study's isModified()
+// purpose  : returns this model's modification status that can be controlled 
+//            with help of setModified() calls by the underlying Python module
 //=================================================================================
 bool SALOME_PYQT_DataModelLight::isModified() const
 {
-  return false;
+  return myModified;
 }
 
 //=================================================================================
-// function : isSaved()
-// purpose  : default implementation, always returns true so as not to mask study's isSaved()
+// function : setModified()
+// purpose  : sets the model's modification status, should be used by 
+//            the underlying Python module when its data changes.
 //=================================================================================
-bool SALOME_PYQT_DataModelLight::isSaved() const
+void SALOME_PYQT_DataModelLight::setModified( bool flag )
 {
-  return true;
+  myModified = flag;
 }
 
-
 //=================================================================================
 // function : close()
 // purpose  : Close data model operation
index 6f604cdc3f2c6cf08d9e01c49730183289923ca7..6a9e3539152b97939e719b432b96d6ff4ac0ee11 100644 (file)
@@ -52,7 +52,7 @@ public:
                                   QStringList& );
   
   virtual bool         isModified () const;
-  virtual bool         isSaved    () const;
+  void                 setModified( bool );
   
   virtual void         update ( LightApp_DataObject* = 0, LightApp_Study* = 0 );
 
@@ -61,6 +61,7 @@ public:
  private:
   QString              myFileName;
   QString              myStudyURL;
+  bool                 myModified;
 };
 
 #endif // SALOME_PYQT_DATAMODELLIGHT_H
index 3385b724543993c5e47ed1ef531379b4df840768..632f4713d6e0496cc6168b2b6ec42b49ef4fdbda 100644 (file)
@@ -32,6 +32,7 @@
 #endif
 
 #include <SALOME_PYQT_ModuleLight.h> // this include must be first!!!
+#include <SALOME_PYQT_DataModelLight.h>
 #include "SalomePyQt.h"
 
 #include <QApplication>
@@ -612,6 +613,76 @@ void SalomePyQt::updateObjBrowser( const int studyId, bool updateSelection )
   ProcessVoidEvent( new TEvent( studyId, updateSelection ) );
 }
 
+
+/*!
+  SalomePyQt::isModified()
+  \return The modification status of the data model
+  for the currently active Python module
+  \sa setModified()
+*/
+class TIsModifiedEvent: public SALOME_Event
+{
+public:
+  typedef bool TResult;
+  TResult myResult;
+  TIsModifiedEvent() : myResult( false ) {}
+  virtual void Execute() 
+  {
+    SALOME_PYQT_ModuleLight* module = getActiveModule();
+    if ( !module )
+      return;
+    
+    SALOME_PYQT_DataModelLight* aModel =
+      dynamic_cast<SALOME_PYQT_DataModelLight*>( module->dataModel() );
+    if ( aModel )
+      myResult = aModel->isModified();
+  }
+};
+bool SalomePyQt::isModified()
+{
+  return ProcessEvent(new TIsModifiedEvent());
+}
+
+/*!
+  SalomePyQt::setModified()
+
+  Sets the modification status of the data model for 
+  the currently active Python module. This method should be used
+  by the Python code in order to enable/disable "Save" operation
+  depending on the module's data state.
+
+  \param New modification status of the data model
+
+  \sa isModified()
+*/
+void SalomePyQt::setModified( bool flag )
+{  
+  class TEvent: public SALOME_Event
+  {
+    bool myFlag;
+  public:
+    TEvent( bool flag ) 
+      : myFlag( flag ) {}
+    virtual void Execute()
+    {
+      SALOME_PYQT_ModuleLight* module = getActiveModule();
+      if ( !module )
+       return;
+
+      SALOME_PYQT_DataModelLight* aModel =
+       dynamic_cast<SALOME_PYQT_DataModelLight*>( module->dataModel() );
+      LightApp_Application* aLApp = 
+       dynamic_cast<LightApp_Application*>( module->application() );
+      if ( !aModel || !aLApp )
+       return;
+
+      aModel->setModified( myFlag );
+      aLApp->updateActions();
+    }
+  };
+  ProcessVoidEvent( new TEvent( flag ) );
+}
+
 /*!
   \brief Default resource file section name.
   \internal
index 52920dee6da922c91917095ae0d264d9e394d2d6..2fd65b871e14e267f73c2efb3e2803329023b9fa 100644 (file)
@@ -133,6 +133,9 @@ public:
   static bool              activateModule( const QString& );
   static void              updateObjBrowser( const int = 0, bool = true );
 
+  static bool              isModified();
+  static void              setModified( bool );
+
   static QString           getFileName         ( QWidget*, const QString&, const QStringList&, const QString&, bool );
   static QStringList       getOpenFileNames    ( QWidget*, const QString&, const QStringList&, const QString& );
   static QString           getExistingDirectory( QWidget*, const QString&, const QString& );
index a8f41999928630392fb5c5b08ab55b07e7932afa..7c2090b6fbb717032e2a60ee357b2487cd183548 100644 (file)
@@ -215,7 +215,10 @@ public:
   static const QString     getActiveComponent() /ReleaseGIL/ ;
   static SIP_PYOBJECT      getActivePythonModule() /ReleaseGIL/ ;
   static bool              activateModule( const QString& ) /ReleaseGIL/ ;
-  static void              updateObjBrowser( const int = 0, bool = true ) /ReleaseGIL/ ;
+  static void              updateObjBrowser( const int = 0, bool =  true ) /ReleaseGIL/ ;
+  
+  static bool              isModified() /ReleaseGIL/ ;
+  static void              setModified( bool ) /ReleaseGIL/ ;
 
   static QString           getFileName         ( QWidget*, const QString&, const QStringList&, const QString&, bool ) /ReleaseGIL/ ;
   static QStringList       getOpenFileNames    ( QWidget*, const QString&, const QStringList&, const QString& ) /ReleaseGIL/ ;