import traceback
from PyQt4.QtCore import QObject
+from PyQt4.QtCore import * # Import from PyQT
from PyQt4 import QtGui,QtCore
import SalomePyQt
sgPyQt = SalomePyQt.SalomePyQt()
from daGuiImpl.enumerate import Enumerate
from daGuiImpl.adaoCase import AdaoCase
from daEficasWrapper.adaoEficasWrapper import AdaoEficasWrapper
-from daEficasWrapper.eficasWrapper import EficasObserver
-from daEficasWrapper.eficasWrapper import EficasEvent
+
+from daUtils.adaoEficasEvent import *
import adaoGuiHelper
import adaoStudyEditor
import adaoLogger
'NEW_ADAOCASE_ID',
'OPEN_ADAOCASE_ID',
'SAVE_ADAOCASE_ID',
+ 'SAVE_AS_ADAOCASE_ID',
'CLOSE_ADAOCASE_ID',
'EDIT_ADAOCASE_POP_ID',
'YACS_EXPORT_POP_ID',
- ],offset=950)
+ ],offset=6950)
ACTIONS_MAP={
UI_ELT_IDS.NEW_ADAOCASE_ID:"newAdaoCase",
UI_ELT_IDS.OPEN_ADAOCASE_ID:"openAdaoCase",
UI_ELT_IDS.SAVE_ADAOCASE_ID:"saveAdaoCase",
+ UI_ELT_IDS.SAVE_AS_ADAOCASE_ID:"saveasAdaoCase",
UI_ELT_IDS.CLOSE_ADAOCASE_ID:"closeAdaoCase",
UI_ELT_IDS.EDIT_ADAOCASE_POP_ID:"editAdaoCase",
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 == ref objet editor eficas (on est sur qu'elle est unique, cas duplication)
+ # 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)
+
+ # On s'abonne au gestionnaire de selection
+ self.selection_manager = sgPyQt.getSelection()
+ QtCore.QObject.connect(self.selection_manager, QtCore.SIGNAL('currentSelectionChanged()'), self.currentSelectionChanged)
+
+######
+#
+# Gestion de l'activation/désactivation du module
+#
+######
+
+ def activate(self):
+ self.eficas_manager.setEnabled(True)
+ sgPyQt.activateView(self.eficas_viewId)
+ self.harmonizeSelectionFromEficas()
+
+ def deactivate(self):
+ self.eficas_manager.setEnabled(False)
+
+#######
+#
+# Gestion de la sélection entre le GUI d'Eficas
+# et l'arbre d'étude de SALOME
+#
+#######
+
+ # Depuis l'étude SALOME
+ def currentSelectionChanged(self):
+ """
+ Cette méthode permet de changer le tab vu dans eficas
+ selon la sélection de l'utilisateur dans l'étude SALOME
+ """
+ adaoLogger.debug("currentSelectionChanged")
+ salomeStudyItem = adaoGuiHelper.getSelectedItem()
+ for case_editor, adao_case in self.cases.iteritems():
+ if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
+ self.eficas_manager.selectCase(adao_case.eficas_editor)
+ break
+
+ # Depuis Eficas
+ def _processEficasTabChanged(self, eficasWrapper, eficasEvent):
+ """
+ Gestion de la synchonisation entre le tab courant d'Eficas
+ et la selection dans l'étude SALOME
+ """
+ editor = eficasEvent.callbackId
+ for case_editor, adao_case in self.cases.iteritems():
+ if case_editor is editor:
+ adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
+ break
+
+ # On remet la sélection dans SALOME grâce au tab dans Eficas
+ def harmonizeSelectionFromEficas(self):
+ """
+ Cette méthode permet d'harmoniser la sélection dans l'étude
+ grâce au tab courant d'Eficas
+ """
+ if self.cases:
+ # 1: Get current tab index in Eficas
+ editor = self.eficas_manager.getCurrentEditor()
+ # 2: sync with SALOME GUI is a tab is opened
+ if editor:
+ for case_editor, adao_case in self.cases.iteritems():
+ if case_editor is editor:
+ adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
+ break
+
+#######
+#
+# Gestion de la 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.eficas_editor] = adao_case
+
+#######
+#
+# Gestion de l'ouverture d'un cas
+# 1: la fonction openAdaoCase est appelée par le GUI SALOME
+# 2: la fonction _processEficasOpenEvent est appelée par le manager EFICAS
+#
+#######
+
+# Rq: l'ouverture d'un cas adao est un cas particulier de la création d'un cas adao
+
+ def openAdaoCase(self):
+ adaoLogger.debug("Ouverture d'un cas adao")
+ self.eficas_manager.adaoFileOpen(AdaoCase())
+
+ def _processEficasOpenEvent(self, eficasWrapper, eficasEvent):
+ self._processEficasNewEvent(eficasWrapper, eficasEvent)
+
+#######
+#
+# Gestion de la sauvegarde d'un cas
+# 1: la fonction saveAdaoCase est appelée par le GUI SALOME
+# 1 bis: la fonction saveasAdaoCase est appelée par le GUI SALOME
+# 2: la fonction _processEficasSaveEvent est appelée par le manager EFICAS
+#
+#######
+
+ def saveAdaoCase(self):
+ adaoLogger.debug("Sauvegarde du cas s'il y a modification")
+ # A priori, l'utilisateur s'attend à sauvegarder le cas qui est ouvert
+ # dans le GUI d'Eficas
+ self.harmonizeSelectionFromEficas()
+ salomeStudyItem = adaoGuiHelper.getSelectedItem()
+ for case_name, adao_case in self.cases.iteritems():
+ if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
+ self.eficas_manager.adaoFileSave(adao_case)
+ break
+
+ def saveasAdaoCase(self):
+ adaoLogger.debug("Sauvegarde du cas s'il y a modification (version save as)")
+ # A priori, l'utilisateur s'attend à sauvegarder le cas qui est ouvert
+ # dans le GUI d'Eficas
+ self.harmonizeSelectionFromEficas()
+ salomeStudyItem = adaoGuiHelper.getSelectedItem()
+ for case_name, adao_case in self.cases.iteritems():
+ if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
+ self.eficas_manager.adaoFileSaveAs(adao_case)
+ break
+
+ def _processEficasSaveEvent(self, eficasWrapper, eficasEvent):
+ adao_case = eficasEvent.callbackId
+ # On met à jour l'étude
+ adaoStudyEditor.updateItem(adao_case.salome_study_id, adao_case.salome_study_item, adao_case)
+ # Affichage correct dans l'étude
+ adaoGuiHelper.refreshObjectBrowser()
+ adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
+ # Ajout du cas
+ self.cases[adao_case.name] = adao_case
+
+#######
+#
+# Gestion de la fermeture d'un cas
+# 1: la fonction closeAdaoCase est appelée par le GUI SALOME
+# 2: la fonction _processEficasCloseEvent est appelée par le manager EFICAS
+#
+#######
+
+ def closeAdaoCase(self):
+ adaoLogger.debug("Fermeture d'un cas")
+ # A priori, l'utilisateur s'attend à sauvegarder le cas qui est ouvert
+ # dans le GUI d'Eficas
+ self.harmonizeSelectionFromEficas()
+ salomeStudyItem = adaoGuiHelper.getSelectedItem()
+ for case_name, adao_case in self.cases.iteritems():
+ if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
+ self.eficas_manager.adaoFileClose(adao_case)
+ break
+
+ def _processEficasCloseEvent(self, eficasWrapper, eficasEvent):
+ editor = eficasEvent.callbackId
+ # Recuperation du cas
+ adao_case = self.cases[editor]
+ # Suppression de l'objet dans l'étude
+ adaoStudyEditor.removeItem(adao_case.salome_study_id, adao_case.salome_study_item)
+ adaoGuiHelper.refreshObjectBrowser()
+ # Suppression du cas
+ del self.cases[editor]
+
+#######
+#
+# Méthodes secondaires permettant de rediriger les évènements
+# de SALOME et d'Eficas vers les bonnes méthodes de la classe
+#
+#######
+
+ # 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.CLOSE : "_processEficasCloseEvent",
+ EficasEvent.EVENT_TYPES.OPEN : "_processEficasOpenEvent",
+ EficasEvent.EVENT_TYPES.TABCHANGED : "_processEficasTabChanged",
+ EficasEvent.EVENT_TYPES.REOPEN : "_processEficasReOpenEvent"
+ }
+
+ 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()
a = sgPyQt.createAction( UI_ELT_IDS.SAVE_ADAOCASE_ID, "Save case", "Save case", "Save an adao case", "" )
sgPyQt.createMenu(a, mid)
sgPyQt.createTool(a, tid)
+ a = sgPyQt.createAction( UI_ELT_IDS.SAVE_AS_ADAOCASE_ID, "Save as case", "Save as case", "Save an adao case as", "" )
+ sgPyQt.createMenu(a, mid)
+ sgPyQt.createTool(a, tid)
a = sgPyQt.createAction( UI_ELT_IDS.CLOSE_ADAOCASE_ID, "Close case", "Close case", "Close an adao case", "" )
sgPyQt.createMenu(a, mid)
sgPyQt.createTool(a, tid)
adaoLogger.debug("saveAdaoCase")
global __cases__
+ def saveasAdaoCase(self):
+
+ adaoLogger.debug("saveasAdaoCase")
+ global __cases__
+
def exportCaseToYACS(self):
adaoLogger.debug("exportCaseToYACS")
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"
}