]> SALOME platform Git repositories - modules/adao.git/commitdiff
Salome HOME
Changement d'architecture pour la gestion du GUI
authorAndré Ribes <andre.ribes@edf.fr>
Tue, 22 Feb 2011 15:24:30 +0000 (16:24 +0100)
committerAndré Ribes <andre.ribes@edf.fr>
Tue, 22 Feb 2011 15:24:30 +0000 (16:24 +0100)
src/daSalome/daGUI/daEficasWrapper/adaoEficasWrapper.py
src/daSalome/daGUI/daGuiImpl/ADAOGUI_impl.py
src/daSalome/daGUI/daGuiImpl/adaoCase.py
src/daSalome/daGUI/daGuiImpl/adaoGuiManager.py
src/daSalome/daGUI/daGuiImpl/adaoStudyEditor.py
src/daSalome/daGUI/daUtils/adaoEficasEvent.py

index c6b468d9a16d9d75cea2becc9341c92c554b03e7..f2dfbc327aa56f100f704706208eeb98908e260d 100644 (file)
@@ -23,9 +23,12 @@ import os
 
 import eficasSalome               # Import from EFICAS_SRC
 from InterfaceQT4 import qtEficas # Import from Eficas
-from PyQt4 import QtGui,QtCore    # Import from PyQT
+from PyQt4.QtGui  import *        # Import from PyQT
+from PyQt4.QtCore import *        # Import from PyQT
+from PyQt4.QtAssistant import *   # Import from PyQT
 
 from daUtils.adaoEficasEvent import *
+from daGuiImpl.adaoLogger import *
 
 #
 # ============================================
@@ -47,7 +50,9 @@ class AdaoEficasWrapper(eficasSalome.MyEficas):
         self.__parent = parent
 
     def init_gui(self):
+
       eficasSalome.MyEficas.__init__(self, self.__parent, code="ADAO", module="ADAO")
+      self.connect(self.viewmanager.myQtab, SIGNAL('currentChanged(int)'), self.tabChanged)
 
 
       # On réouvre tous les fichiers comm
@@ -58,16 +63,21 @@ class AdaoEficasWrapper(eficasSalome.MyEficas):
       for editor, myCallbackId in save_CallbackId.iteritems():
         self.notifyObserver(EficasEvent.EVENT_TYPES.REOPEN, callbackId=myCallbackId)
 
+    def tabChanged(self, index):
+      debug("tabChanged " + str(index))
+      self.notifyObserver(EficasEvent.EVENT_TYPES.TABCHANGED, callbackId=self.viewmanager.dict_editors[index])
+
     def addJdcInSalome(  self, jdcPath ):
       # On gere nous meme l'etude
       pass
 
-    def fileNew(self):
-        """
-        @overload
-        """
+    def adaofileNew(self, adao_case):
+
         qtEficas.Appli.fileNew(self)
-        self.notifyObserver(EficasEvent.EVENT_TYPES.NEW)
+        index = self.viewmanager.myQtab.currentIndex()
+        adao_case.name          = str(self.viewmanager.myQtab.tabText(index)) # Utilisation de str() pour passer d'un Qstring à un string
+        adao_case.eficas_editor = self.viewmanager.dict_editors[index]
+        self.notifyObserver(EficasEvent.EVENT_TYPES.NEW, callbackId=adao_case)
 
     def openEmptyCase(self, callbackId):
         qtEficas.Appli.fileNew(self)
@@ -124,10 +134,10 @@ class AdaoEficasWrapper(eficasSalome.MyEficas):
         """
         @overload
         """
-        fichier = QtGui.QFileDialog.getOpenFileName(self,
-                                                    self.trUtf8('Ouvrir Fichier'),
-                                                    self.CONFIGURATION.savedir,
-                                                    self.trUtf8('JDC Files (*.comm);;''All Files (*)'))
+        fichier = QFileDialog.getOpenFileName(self,
+                                              self.trUtf8('Ouvrir Fichier'),
+                                              self.CONFIGURATION.savedir,
+                                              self.trUtf8('JDC Files (*.comm);;''All Files (*)'))
         if fichier.isNull(): return
         self.__file_open_name = fichier
         self.notifyObserver(EficasEvent.EVENT_TYPES.OPEN)
@@ -220,7 +230,7 @@ class AdaoEficasWrapper(eficasSalome.MyEficas):
         self.__observer = observer
 
     def notifyObserver(self, eventType, callbackId=None):
-      if eventType != EficasEvent.EVENT_TYPES.NEW and eventType != EficasEvent.EVENT_TYPES.OPEN:
+      if eventType != EficasEvent.EVENT_TYPES.OPEN:
         if callbackId is None :
           eficasEvent = EficasEvent(eventType, self.getCallbackId())
         else:
index 8ff7d13cc43506aa9247b33e4ccf2b8552125ba0..198371c0db1d76497af6e078f62a596912f202c2 100644 (file)
@@ -36,22 +36,18 @@ sgPyQt = SalomePyQt.SalomePyQt()
 # creates the menu and toolbar items (must be created for every study)
 
 from daGuiImpl import adaoGuiHelper
-from daGuiImpl.adaoGuiManager import AdaoGuiUiComponentBuilder
-from daGuiImpl.adaoGuiManager import AdaoGuiActionImpl
+from daGuiImpl.adaoGuiManager import AdaoCaseManager
+
 class GUIcontext:
-    uiComponentBuilder = None
-    actionImpl = None
+    adaoCaseManager = None
     def __init__(self):
-        self.uiComponentBuilder = AdaoGuiUiComponentBuilder()
-        self.actionImpl = AdaoGuiActionImpl()
-
+        self.adaoCaseManager = AdaoCaseManager()
 
 __study2context__   = {}
 __current_context__ = None
 def _setContext( studyID ):
     global __study2context__, __current_context__
     if not __study2context__.has_key(studyID):
-        print "create new context"
         __study2context__[studyID] = GUIcontext()
         pass
     __current_context__ = __study2context__[studyID]
@@ -92,15 +88,14 @@ def createPreferences():
 # called when module is activated
 # returns True if activating is successfull and False otherwise
 def activate():
-    print "activate study",  sgPyQt.getStudyId()
     ctx = _setContext( sgPyQt.getStudyId() )
-    ctx.actionImpl.activate()
+    ctx.adaoCaseManager.activate()
     return True
 
 # called when module is deactivated
 def deactivate():
     ctx = _setContext( sgPyQt.getStudyId() )
-    ctx.actionImpl.deactivate()
+    ctx.adaoCaseManager.deactivate()
     pass
 
 # called when active study is changed
@@ -109,7 +104,6 @@ def activeStudyChanged( studyID ):
     ctx = _setContext( sgPyQt.getStudyId() )
     pass
 
-
 # called when popup menu is invoked
 # popup menu and menu context are passed as parameters
 def createPopupMenu( popup, context ):
@@ -118,7 +112,7 @@ def createPopupMenu( popup, context ):
   selcount, selected = adaoGuiHelper.getAllSelected(activeStudyId)
   if selcount == 1:
     selectedItem = adaoGuiHelper.getSelectedItem(activeStudyId)
-    popup = ctx.uiComponentBuilder.createPopupMenuOnItem(popup, activeStudyId, selectedItem)
+    popup = ctx.adaoCaseManager.salome_manager.createPopupMenuOnItem(popup, activeStudyId, selectedItem)
 
 def OnGUIEvent(actionId) :
     """
@@ -128,7 +122,7 @@ def OnGUIEvent(actionId) :
     pass
     print "OnGUIEvent", actionId
     ctx = _setContext( sgPyQt.getStudyId() )
-    ctx.actionImpl.processAction(actionId)
+    ctx.adaoCaseManager.processGUIEvent(actionId)
 
 # called when module's preferences are changed
 # preference's resources section and setting name are passed as parameters
index ea665b8b46a4ccc792e67a08168d67369e17421b..c7838943dac54b99cda16cde6ab5c535b8ad55a8 100644 (file)
@@ -26,28 +26,23 @@ import SalomePyQt
 class AdaoCase:
 
   def __init__(self):
-    self.__name = "new_case"
-    self.__filename = ""
-    self.__yacs_filename = ""
 
-  def get_name(self):
-    return self.__name
+    self.name = "not yet defined"           # Name of the case
 
-  def set_name(self, name):
-    self.__name = str(name)
+    self.filename = "not yet defined"       # Python filename generated by Eficas
+    self.yacs_filename = "not yet defined"  # Yacs schema filename
 
-  def get_filename(self):
-    return self.__filename
+    self.salome_study_id = -1               # Study of the case
+    self.salome_study_item = None           # Study item object
 
-  def set_filename(self, name):
-    self.__filename = str(name)
+    self.eficas_editor = None               # Editor object from Eficas
 
   def createYACSFile(self):
     rtn = ""
-    if (self.__filename == ""):
+    if (self.filename == ""):
       return "You need to save your case to export it"
 
-    filename = self.__filename[:self.__filename.rfind(".")] + '.py'
+    filename = self.filename[:self.filename.rfind(".")] + '.py'
     if not os.path.exists(filename):
       msg =  "Cannot find the py file for YACS generation \n"
       msg += "Is your case correct ? \n"
@@ -59,11 +54,11 @@ class AdaoCase:
 
     adao_path = os.environ["ADAO_ROOT_DIR"]
     adao_exe = adao_path + "/bin/salome/AdaoYacsSchemaCreator.py"
-    self.__yacs_filename = self.__filename[:self.__filename.rfind(".")] + '.xml'
-    args = ["python", adao_exe, filename, self.__yacs_filename]
+    self.yacs_filename = self.filename[:self.filename.rfind(".")] + '.xml'
+    args = ["python", adao_exe, filename, self.yacs_filename]
     p = subprocess.Popen(args)
     (stdoutdata, stderrdata) = p.communicate()
-    if not os.path.exists(self.__yacs_filename):
+    if not os.path.exists(self.yacs_filename):
       msg  = "An error occured during the execution of AdaoYacsSchemaCreator.py \n"
       msg += "See erros details in your terminal \n"
       return msg
@@ -78,10 +73,9 @@ class AdaoCase:
     try:
       import libYACS_Swig
       yacs_swig = libYACS_Swig.YACS_Swig()
-      yacs_swig.loadSchema(self.__yacs_filename)
+      yacs_swig.loadSchema(self.yacs_filename)
     except:
       msg =  "Please install YACS module, error was: \n"
       msg += traceback.format_exc()
       return msg
     return rtn
-
index ccb63d4af3cbb7de831c2e4f1a5dd90946eb3cbd..1096d8f7fb3dd7fcf273a77197adf8584fc9224a 100644 (file)
@@ -57,7 +57,7 @@ UI_ELT_IDS = Enumerate([
 
         'EDIT_ADAOCASE_POP_ID',
         'YACS_EXPORT_POP_ID',
-        ],offset=950)
+        ],offset=6950)
 
 ACTIONS_MAP={
     UI_ELT_IDS.NEW_ADAOCASE_ID:"newAdaoCase",
@@ -70,11 +70,133 @@ ACTIONS_MAP={
     UI_ELT_IDS.YACS_EXPORT_POP_ID:"exportCaseToYACS",
 }
 
+
+class AdaoCaseManager(EficasObserver):
+  """
+  Cette classe gére les cas ADAO et coordonne les GUI de SALOME (l'étude)
+  et le GUI de l'objet Eficas (héritage du module Eficas)
+  """
+  def __init__(self):
+
+    # Création d'un dictionnaire de cas
+    # Key   == nom du cas
+    # Value == objet AdaoCase()
+    self.cases = {}
+
+
+    # Création des deux managers
+    self.salome_manager = AdaoGuiUiComponentBuilder()
+    self.eficas_manager = AdaoEficasWrapper(parent=SalomePyQt.SalomePyQt().getDesktop())
+
+    # On s'enregistre comme observer pour les évènements venant d'Eficas
+    # Les évènements du salome_manager viennent par le biais de la méthode
+    # processGUIEvent
+    self.eficas_manager.addObserver(self)
+
+    # Création du GUI Eficas
+    self.eficas_manager.init_gui()
+
+    # Création du viewer QT
+    # Scroll Widget (pour les petites résolutions)
+    area = QtGui.QScrollArea(SalomePyQt.SalomePyQt().getDesktop());
+    area.setWidget(self.eficas_manager)
+    area.setWidgetResizable(1)
+    wmType = "ADAO View"
+    self.eficas_viewId = sgPyQt.createView(wmType, area)
+
+    # On interdit que la vue soit fermée
+    # Cela simplifier grandement le code
+    sgPyQt.setViewClosable(self.eficas_viewId, False)
+
+  def activate(self):
+    self.__dlgEficasWrapper.setEnabled(True)
+
+  def deactivate(self):
+    self.__dlgEficasWrapper.setEnabled(False)
+
+  def _processEficasTabChanged(self, eficasWrapper, eficasEvent):
+    """
+    Gestion de la synchonisation entre le tab courant et la selection
+    dans l'étude
+    """
+    editor = eficasEvent.callbackId
+    for case_name, adao_case in self.cases.iteritems():
+      if adao_case.eficas_editor is editor:
+        adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
+        break
+
+  # Création d'un nouveau cas
+  # 1: la fonction newAdaoCase est appelée par le GUI SALOME
+  # 2: la fonction _processEficasNewEvent est appelée par le manager EFICAS
+  def newAdaoCase(self):
+    adaoLogger.debug("Création d'un nouveau cas adao")
+    self.eficas_manager.adaofileNew(AdaoCase())
+
+  def _processEficasNewEvent(self, eficasWrapper, eficasEvent):
+    adao_case = eficasEvent.callbackId
+    # Ajout dand l'étude
+    salomeStudyId   = adaoGuiHelper.getActiveStudyId()
+    salomeStudyItem = adaoStudyEditor.addInStudy(salomeStudyId, adao_case)
+    # Affichage correct dans l'étude
+    adaoGuiHelper.refreshObjectBrowser()
+    adaoGuiHelper.selectItem(salomeStudyItem.GetID())
+    # Finalisation des données du cas
+    adao_case.salome_study_id   = salomeStudyId
+    adao_case.salome_study_item = salomeStudyItem
+    # Ajout du cas
+    self.cases[adao_case.name] = adao_case
+
+
+
+
+
+
+
+
+
+
+  # Gestion des évènements venant du manager Eficas
+  __processOptions={
+      EficasEvent.EVENT_TYPES.CLOSE      : "_processEficasCloseEvent",
+      EficasEvent.EVENT_TYPES.SAVE       : "_processEficasSaveEvent",
+      EficasEvent.EVENT_TYPES.NEW        : "_processEficasNewEvent",
+      EficasEvent.EVENT_TYPES.DESTROY    : "_processEficasDestroyEvent",
+      EficasEvent.EVENT_TYPES.OPEN       : "_processEficasOpenEvent",
+      EficasEvent.EVENT_TYPES.REOPEN     : "_processEficasReOpenEvent",
+      EficasEvent.EVENT_TYPES.TABCHANGED : "_processEficasTabChanged"
+      }
+
+  def processEficasEvent(self, eficasWrapper, eficasEvent):
+      """
+      Implementation of the interface EficasObserver. The implementation is a
+      switch on the possible types of events defined in EficasEvent.EVENT_TYPES.
+      @overload
+      """
+      functionName = self.__processOptions.get(eficasEvent.eventType, lambda : "_processEficasUnknownEvent")
+      return getattr(self,functionName)(eficasWrapper, eficasEvent)
+
+  def _processEficasUnknownEvent(self, eficasWrapper, eficasEvent):
+    adaoLogger.error("Unknown Eficas Event")
+
+  # Gestion des évènements venant du GUI de SALOME
+  def processGUIEvent(self, actionId):
+    """
+    Main switch function for ui actions processing
+    """
+    if ACTIONS_MAP.has_key(actionId):
+      try:
+          functionName = ACTIONS_MAP[actionId]
+          getattr(self,functionName)()
+      except:
+          traceback.print_exc()
+    else:
+      adaoLogger.warning("The requested action is not implemented: " + str(actionId))
+
 class AdaoGuiUiComponentBuilder:
     """
     The initialisation of this class creates the graphic components involved
     in the GUI (menu, menu item, toolbar). A ui component builder should be
-    created for each opened study and associated to its context (see usage in OMAGUI.py).
+    created for each opened study and associated to its context.
     """
     def __init__(self):
         self.initUiComponents()
index 81960873767f4d4ca83b3e850da2673fe064145d..3bb857afd770b673c8d1a2c6d4af8480944c3205 100644 (file)
@@ -59,18 +59,17 @@ def addInStudy(salomeStudyId, adaoCase):
 
     adaoRootEntry = studyEditor.findOrCreateComponent(
         moduleName    = adaoModuleHelper.componentName(),
-        componentName = adaoModuleHelper.componentUserName())
+        componentName = adaoModuleHelper.componentUserName(),
+        icon          = adaoModuleHelper.modulePixmap())
 
-    itemName  = adaoCase.get_name()
-    itemValue = str(adaoCase.get_filename())
+    itemName  = adaoCase.name
+    itemValue = adaoCase.filename
     itemType  = ADAO_ITEM_TYPES.ADAO_CASE
 
     salomeStudyItem = studyEditor.createItem(
         adaoRootEntry, itemName,
         comment = itemValue,
         typeId  = itemType)
-    # _MEM_ Note that we use the comment attribute to store the serialize
-    # description of the data.
 
     return salomeStudyItem
 
index 921a6d2195d50ac29fa113d20d72fe640086a818..f16ced47c5392ba54e0ea0b5d806cd032f369dd8 100644 (file)
@@ -52,7 +52,8 @@ class EficasEvent:
         'DESTROY',
         'OPEN',
         'REOPEN',
-        'NEW'
+        'NEW',
+        'TABCHANGED'
     ])
 
     def __init__(self,eventType,callbackId=None):