]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Imp PAL10992 : How to create preferences in python modules
authorvsr <vsr@opencascade.com>
Tue, 17 Oct 2006 13:18:03 +0000 (13:18 +0000)
committervsr <vsr@opencascade.com>
Tue, 17 Oct 2006 13:18:03 +0000 (13:18 +0000)
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.cxx
src/SALOME_PYQT/SALOME_PYQT_GUI/SALOME_PYQT_Module.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.cxx
src/SALOME_PYQT/SalomePyQt/SalomePyQt.h
src/SALOME_PYQT/SalomePyQt/SalomePyQt.sip
src/SALOME_PYQT/SalomePyQt/SalomePyQt_v4.sip

index 5d11cf06388be06f7bbc0fba62a0b49e18076ea9..56bb1a7553afc367b104e885cebb51ce5ffd0817 100644 (file)
@@ -538,6 +538,38 @@ void SALOME_PYQT_Module::contextMenuPopup( const QString& theContext, QPopupMenu
     PyInterp_Dispatcher::Get()->Exec( new PopupMenuEvent( myInterp, this, theContext, thePopupMenu ) );
 }
 
+/*!
+ * Export preferences for the Python module.
+ * Called only once when the first instance of the module is created.
+ */
+void SALOME_PYQT_Module::createPreferences()
+{
+  MESSAGE( "SALOME_PYQT_Module::createPr eferences");
+  // perform synchronous request to Python event dispatcher
+  class Event : public PyInterp_LockRequest
+  {
+  public:
+    Event( PyInterp_base*      _py_interp,
+          SALOME_PYQT_Module* _obj )
+      : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true)
+        myObj    ( _obj )   {}
+
+  protected:
+    virtual void execute()
+    {
+      myObj->initPreferences();
+    }
+
+  private:
+    SALOME_PYQT_Module* myObj;
+  };
+
+  // Posting the request only if dispatcher is not busy!
+  // Executing the request synchronously
+  if ( !PyInterp_Dispatcher::Get()->IsBusy() )
+    PyInterp_Dispatcher::Get()->Exec( new Event( myInterp, this ) );
+}
+
 /*!
  * Defines the dockable window associated with the module.
  * To fill the list of windows the correspondind Python module's windows()
@@ -946,6 +978,31 @@ void SALOME_PYQT_Module::menuHighlight( const int menu, const int submenu )
   }
 }
 
+/*!
+ *  Initialises preferences for the module
+ *  - calls Python module's createPreferences() method
+ */
+void SALOME_PYQT_Module::initPreferences()
+{
+  // Python interpreter should be initialized and Python module should be
+  // import first
+  if ( !myInterp || !myModule )
+    return;
+
+  // temporary set myInitModule because createPreferences() method
+  // might be called during the module intialization process
+  myInitModule = this;
+
+  if ( PyObject_HasAttrString(myModule , "createPreferences") ) {
+    PyObjWrapper res( PyObject_CallMethod( myModule, "createPreferences", "" ) );
+    if( !res ) {
+      PyErr_Print();
+    }
+  }
+
+  myInitModule = 0;
+}
+
 /*!
  *  Initialises python subinterpreter (one per study)
  */
@@ -1241,6 +1298,7 @@ QAction* SALOME_PYQT_Module::createAction( const int id, const QString& text, co
   }
   return a;
 }
+
 /*! 
  * Load icon from resource file
  */
@@ -1434,6 +1492,38 @@ bool SALOME_PYQT_Module::clearMenu( const int id, const int menu, const bool rem
   return false;
 }
 
+/*!
+ * The next methods call the parent implementation.
+ * This is done to open protected methods from LightApp_Module class.
+ */
+
+int SALOME_PYQT_Module::addPreference( const QString& label )
+{
+  return SalomeApp_Module::addPreference( label );
+}
+                                      
+int SALOME_PYQT_Module::addPreference( const QString& label, 
+                                      const int pId, const int type,
+                                      const QString& section,
+                                      const QString& param )
+{
+  return SalomeApp_Module::addPreference( label, pId, type, section, param );
+}
+
+QVariant SALOME_PYQT_Module::preferenceProperty( const int id, 
+                                                const QString& prop ) const
+{
+  QVariant v = SalomeApp_Module::preferenceProperty( id, prop );
+  return v;
+}
+
+void SALOME_PYQT_Module::setPreferenceProperty( const int id, 
+                                               const QString& prop, 
+                                               const QVariant& var )
+{
+  SalomeApp_Module::setPreferenceProperty( id, prop, var );
+}
+
 // SALOME_PYQT_XmlHandler class implementation
 
 // gets an tag name for the dom element [ static ]
index 7d20a34008e7389ed54bb12f1035a97518643812..51f3a8215a94c76f2b76155cb1db4d80922ab941 100644 (file)
@@ -109,6 +109,9 @@ public:
   /* context popup menu request */
   void            contextMenuPopup( const QString&, QPopupMenu*, QString& );
 
+  /* create preferences */
+  void            createPreferences();
+
   /* get module engine IOR */
   virtual QString engineIOR() const;
 
@@ -147,6 +150,14 @@ public:
   /* load icon from resource file */
   QIconSet               loadIcon( const QString& fileName );
 
+  /* working with preferences : open protected methods */
+  int                    addPreference( const QString& );
+  int                    addPreference( const QString&, const int, const int = -1,
+                                       const QString& = QString::null,
+                                       const QString& = QString::null );
+  QVariant               preferenceProperty( const int, const QString& ) const;
+  void                   setPreferenceProperty( const int, const QString&, const QVariant& );
+
   /* Show/hide menus/toolbars */
   void                   setMenuShown( const bool );
   void                   setToolShown( const bool );
@@ -194,6 +205,8 @@ private:
   void            guiEvent( const int );
   /* Menu highlight processing */
   void            menuHighlight( const int, const int );
+  /* Init preferences */
+  void            initPreferences();
 
   /* initialize a Python subinterpreter */
   void            initInterp  ( int );
index d76d0bd1d774ab015cb3ff5a7c83393f3c996bb6..d26f9b5a9f28a54ac35cc414ec1e6c5864b6e5cc 100644 (file)
@@ -1364,3 +1364,181 @@ bool SalomePyQt::clearMenu( const int id, const int menu, const bool removeActio
   return ProcessEvent( new TClearMenuEvent( id, menu, removeActions ) );
 }
 
+/*!
+  SalomePyQt::addPreference
+  Adds preference 
+ */
+class TAddPrefEvent: public SALOME_Event {
+public:
+  typedef int TResult;
+  TResult myResult;
+  QString myLabel;
+  TAddPrefEvent( const QString& label )
+    : myResult( -1 ), myLabel( label ) {}
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->addPreference( myLabel );
+    }
+  }
+};
+int SalomePyQt::addPreference( const QString& label )
+{
+  return ProcessEvent( new TAddPrefEvent( label ) );
+}
+
+/*!
+  SalomePyQt::addPreference
+  Adds preference 
+ */
+class TAddPrefParamEvent: public SALOME_Event {
+public:
+  typedef int TResult;
+  TResult myResult;
+  QString myLabel;
+  int     myPId;
+  int     myType;
+  QString mySection;
+  QString myParam;
+  TAddPrefParamEvent( const QString& label, 
+                     const int pId, const int type,
+                     const QString& section, 
+                     const QString& param )
+    : myResult( -1 ),
+      myLabel( label ), myPId( pId ), myType( type ), 
+      mySection( section ), myParam ( param ) {}
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->addPreference( myLabel, myPId, myType, mySection, myParam );
+    }
+  }
+};
+int SalomePyQt::addPreference( const QString& label, const int pId, const int type,
+                              const QString& section, const QString& param )
+{
+  return ProcessEvent( new TAddPrefParamEvent( label, pId, type, section, param ) );
+}
+
+/*!
+  SalomePyQt::preferenceProperty
+  Gets the property value for the given (by id) preference
+ */
+class TPrefPropEvent: public SALOME_Event {
+public:
+  typedef QVariant TResult;
+  TResult myResult;
+  int     myId;
+  QString myProp;
+  TPrefPropEvent( const int id, const QString& prop )
+    : myId( id ), myProp( prop )
+  { 
+    myResult = QVariant();
+  }
+  virtual void Execute() {
+    if ( SalomeApp_Application* anApp = getApplication() ) {
+      SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+      if ( !module )
+        module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+      if ( module )
+       myResult = module->preferenceProperty( myId, myProp );
+    }
+  }
+};
+QVariant SalomePyQt::preferenceProperty( const int id, const QString& prop )
+{
+  return ProcessEvent( new TPrefPropEvent( id, prop ) );
+}
+
+/*!
+  SalomePyQt::setPreferenceProperty
+  Sets the property value for the given (by id) preference
+ */
+void SalomePyQt::setPreferenceProperty( const int id, 
+                                       const QString& prop,
+                                       const QVariant& var )
+{
+  class TEvent: public SALOME_Event {
+    int      myId;
+    QString  myProp;
+    QVariant myVar;
+  public:
+    TEvent( const int id, const QString& prop, const QVariant& var ) 
+      : myId( id ), myProp( prop ), myVar( var ) {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+       if ( !module )
+         module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+       if ( module )
+         module->setPreferenceProperty( myId, myProp, myVar );
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( id, prop, var) );
+}
+
+/*!
+  SalomePyQt::addPreferenceProperty
+  Adds the property value to the list of values 
+  for the given (by id) preference
+
+  This method allows creating properties which are QValueList<QVariant>
+  - there is no way to pass such values directly to QVariant parameter
+  from Python
+ */
+void SalomePyQt::addPreferenceProperty( const int id, 
+                                       const QString& prop,
+                                       const int idx, 
+                                       const QVariant& var )
+{
+  class TEvent: public SALOME_Event {
+    int      myId;
+    QString  myProp;
+    int      myIdx;
+    QVariant myVar;
+  public:
+    TEvent( const int id, const QString& prop, const int idx, const QVariant& var ) 
+      : myId( id ), myProp( prop ), myIdx( idx), myVar( var ) {}
+    virtual void Execute() {
+      if ( SalomeApp_Application* anApp = getApplication() ) {
+       SALOME_PYQT_Module* module = SALOME_PYQT_Module::getInitModule();
+       if ( !module )
+         module = dynamic_cast<SALOME_PYQT_Module*>( anApp->activeModule() );
+       if ( module ) {
+         QVariant var =  module->preferenceProperty( myId, myProp );
+         if ( var.isValid() ) {
+           if ( var.type() == QVariant::StringList ) {
+             QStringList sl = var.asStringList();
+             if ( myIdx >= 0 && myIdx < sl.count() ) 
+               sl[myIdx] = myVar.asString();
+             else
+               sl.append( myVar.asString() );
+             module->setPreferenceProperty( myId, myProp, sl );
+           }
+           else if ( var.type() == QVariant::List ) {
+             QValueList<QVariant> vl = var.asList();
+             if ( myIdx >= 0 && myIdx < vl.count() ) 
+               vl[myIdx] = myVar;
+             else
+               vl.append( myVar );
+             module->setPreferenceProperty( myId, myProp, vl );
+           }
+         }
+         else {
+           QValueList<QVariant> vl;
+           vl.append( myVar );
+           module->setPreferenceProperty( myId, myProp, vl );
+         }
+       }
+      }
+    }
+  };
+  ProcessVoidEvent( new TEvent( id, prop, idx, var) );
+}
index b656cd1c0c19267b5e58ccf67e237d559075a36c..5d908ce6ec2082f233ba59ae78a2dcd1e94e40e8 100644 (file)
@@ -25,6 +25,7 @@
 #include <qcolor.h>
 
 #include <LightApp_Application.h>
+#include <LightApp_Preferences.h>
 
 class LightApp_SelectionMgr;
 class SalomeApp_Application;
@@ -73,6 +74,23 @@ enum {
   WT_User          = LightApp_Application::WT_User
 };
 
+enum { 
+  PT_Space    = LightApp_Preferences::Space,
+  PT_Bool     = LightApp_Preferences::Bool, 
+  PT_Color    = LightApp_Preferences::Color,
+  PT_String   = LightApp_Preferences::String, 
+  PT_Selector = LightApp_Preferences::Selector, 
+  PT_DblSpin  = LightApp_Preferences::DblSpin, 
+  PT_IntSpin  = LightApp_Preferences::IntSpin, 
+  PT_Double   = LightApp_Preferences::Double, 
+  PT_Integer  = LightApp_Preferences::Integer, 
+  PT_GroupBox = LightApp_Preferences::GroupBox, 
+  PT_Font     = LightApp_Preferences::Font, 
+  PT_DirList  = LightApp_Preferences::DirList, 
+  PT_File     = LightApp_Preferences::File, 
+  PT_User     = LightApp_Preferences::User
+};
+
 class SalomePyQt
 {
 public:
@@ -143,6 +161,20 @@ public:
   static void              addDoubleSetting( const QString&, const double,   bool = true );
   static void              removeSettings  ( const QString& );
   static QString           getSetting      ( const QString& );
+
+  static int               addPreference( const QString& );
+  static int               addPreference( const QString&,
+                                          const int, const int = -1,
+                                          const QString& = QString::null,
+                                         const QString& = QString::null );
+  static QVariant          preferenceProperty( const int, const QString& );
+  static void              setPreferenceProperty( const int, 
+                                                  const QString&,
+                                                  const QVariant& );
+  static void              addPreferenceProperty( const int,
+                                                 const QString&,
+                                                 const int,
+                                                 const QVariant& );
 };
 
 #endif // SALOME_PYQT_H
index dcb6501786d0fec147cca9f9aa74aed89d50ccdc..73772408d66c9986f227e399fdc6733a194ecf39 100644 (file)
@@ -46,6 +46,23 @@ enum WindowType {
   WT_User
 };
 
+enum PrefType { 
+  PT_Space,
+  PT_Bool, 
+  PT_Color,
+  PT_String, 
+  PT_Selector, 
+  PT_DblSpin, 
+  PT_IntSpin, 
+  PT_Double, 
+  PT_Integer, 
+  PT_GroupBox, 
+  PT_Font, 
+  PT_DirList, 
+  PT_File, 
+  PT_User
+};
+
 class QtxAction : QAction
 {
 %TypeHeaderCode
@@ -131,4 +148,17 @@ public:
   static void              addDoubleSetting( const QString&, const double,   bool = true );
   static void              removeSettings  ( const QString& );
   static QString           getSetting      ( const QString& );
+
+  static int               addPreference( const QString& );
+  static int               addPreference( const QString&, const int, int = -1,
+                                         const QString& = QString::null,
+                                         const QString& = QString::null );
+  static QVariant          preferenceProperty( const int, const QString& );
+  static void              setPreferenceProperty( const int, 
+                                                  const QString&,
+                                                 const QVariant& );
+  static void              addPreferenceProperty( const int, 
+                                                  const QString&,
+                                                 const int, 
+                                                 const QVariant& );
 };
index a1a1c046aea65d1b8313fc59e60d14058a0f30aa..1c202ebe16df5f9e6a149bd727dc2fc61f2993c1 100644 (file)
@@ -46,6 +46,23 @@ enum WindowType {
   WT_User
 };
 
+enum PrefType { 
+  PT_Space,
+  PT_Bool, 
+  PT_Color,
+  PT_String, 
+  PT_Selector, 
+  PT_DblSpin, 
+  PT_IntSpin, 
+  PT_Double, 
+  PT_Integer, 
+  PT_GroupBox, 
+  PT_Font, 
+  PT_DirList, 
+  PT_File, 
+  PT_User
+};
+
 class QtxAction : QAction
 {
 %TypeHeaderCode
@@ -130,4 +147,18 @@ public:
   static void              addDoubleSetting( const QString&, const double,   bool = true ) /ReleaseGIL/ ;
   static void              removeSettings  ( const QString& ) /ReleaseGIL/ ;
   static QString           getSetting      ( const QString& ) /ReleaseGIL/ ;
+
+  static int               addPreference( const QString& ) /ReleaseGIL/ ;
+  static int               addPreference( const QString&,
+                                          const int, const int = -1,
+                                          const QString& = QString::null,
+                                         const QString& = QString::null ) /ReleaseGIL/ ;
+  static QVariant          preferenceProperty( const int, const QString& ) /ReleaseGIL/ ;
+  static void              setPreferenceProperty( const int, 
+                                                  const QString&,
+                                                  const QVariant& ) /ReleaseGIL/ ;
+  static void              addPreferenceProperty( const int, 
+                                                  const QString&, 
+                                                 const int, 
+                                                 const QVariant& ) /ReleaseGIL/ ;
 };