1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2008-2016 EDF R&D
4 # This file is part of SALOME ADAO module
6 # This library is free software; you can redistribute it and/or
7 # modify it under the terms of the GNU Lesser General Public
8 # License as published by the Free Software Foundation; either
9 # version 2.1 of the License.
11 # This library is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 # Lesser General Public License for more details.
16 # You should have received a copy of the GNU Lesser General Public
17 # License along with this library; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 This file centralizes the definitions and implementations of ui components used
25 in the GUI part of the module.
28 __author__ = "aribes/gboulant"
31 from PyQt4.QtCore import QObject
32 from PyQt4.QtCore import * # Import from PyQT
33 from PyQt4 import QtGui,QtCore
35 sgPyQt = SalomePyQt.SalomePyQt()
37 from daUtils.enumerate import Enumerate
38 from daGuiImpl.adaoCase import AdaoCase
39 from daEficasWrapper.adaoEficasWrapper import AdaoEficasWrapper
41 from daUtils.adaoEficasEvent import *
43 import adaoStudyEditor
44 from daUtils import adaoLogger
49 # ==============================================================================
50 # Classes to manage the building of UI components
51 # ==============================================================================
53 UI_ELT_IDS = Enumerate([
58 'SAVE_AS_ADAOCASE_ID',
64 UI_ELT_IDS.NEW_ADAOCASE_ID:"newAdaoCase",
65 UI_ELT_IDS.OPEN_ADAOCASE_ID:"openAdaoCase",
66 UI_ELT_IDS.SAVE_ADAOCASE_ID:"saveAdaoCase",
67 UI_ELT_IDS.SAVE_AS_ADAOCASE_ID:"saveasAdaoCase",
68 UI_ELT_IDS.CLOSE_ADAOCASE_ID:"closeAdaoCase",
69 UI_ELT_IDS.YACS_EXPORT_ID:"exportCaseToYACS",
73 class AdaoCaseManager(EficasObserver):
75 Cette classe gere les cas ADAO et coordonne les GUI de SALOME (l'etude)
76 et le GUI de l'objet Eficas (heritage du module Eficas)
81 # Creation d'un dictionnaire de cas
82 # Key == ref objet editor eficas (on est sur qu'elle est unique, cas duplication)
83 # Value == objet AdaoCase()
86 # Creation des deux managers
87 self.salome_manager = AdaoGuiUiComponentBuilder()
88 self.eficas_manager = AdaoEficasWrapper(parent=SalomePyQt.SalomePyQt().getDesktop())
90 # On s'enregistre comme observer pour les evenements venant d'Eficas
91 # Les evenements du salome_manager viennent par le biais de la methode
93 self.eficas_manager.addObserver(self)
95 # Creation du GUI Eficas
96 self.eficas_manager.init_gui()
98 # Creation du viewer QT
99 # Scroll Widget (pour les petites resolutions)
100 area = QtGui.QScrollArea(SalomePyQt.SalomePyQt().getDesktop());
101 area.setWidget(self.eficas_manager)
102 area.setWidgetResizable(1)
104 self.eficas_viewId = sgPyQt.createView(wmType, area)
106 # On interdit que la vue soit fermee
107 # Cela simplifier grandement le code
108 sgPyQt.setViewClosable(self.eficas_viewId, False)
110 # On s'abonne au gestionnaire de selection
111 self.selection_manager = sgPyQt.getSelection()
112 QtCore.QObject.connect(self.selection_manager, QtCore.SIGNAL('currentSelectionChanged()'), self.currentSelectionChanged)
116 # Gestion de l'activation/desactivation du module
121 self.eficas_manager.setEnabled(True)
122 sgPyQt.activateView(self.eficas_viewId)
123 self.harmonizeSelectionFromEficas()
125 def deactivate(self):
126 self.eficas_manager.setEnabled(False)
130 # Gestion de la selection entre le GUI d'Eficas
131 # et l'arbre d'etude de SALOME
135 # Depuis l'etude SALOME
136 def currentSelectionChanged(self):
138 Cette methode permet de changer le tab vu dans eficas
139 selon la selection de l'utilisateur dans l'etude SALOME
141 adaoLogger.debug("currentSelectionChanged")
142 salomeStudyItem = adaoGuiHelper.getSelectedItem()
143 if salomeStudyItem is not None:
144 for case_editor, adao_case in self.cases.iteritems():
145 if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
146 self.eficas_manager.selectCase(adao_case.eficas_editor)
150 def _processEficasTabChanged(self, eficasWrapper, eficasEvent):
152 Gestion de la synchonisation entre le tab courant d'Eficas
153 et la selection dans l'etude SALOME
155 editor = eficasEvent.callbackId
156 for case_editor, adao_case in self.cases.iteritems():
157 if case_editor is editor:
158 adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
161 # On remet la selection dans SALOME grâce au tab dans Eficas
162 def harmonizeSelectionFromEficas(self):
164 Cette methode permet d'harmoniser la selection dans l'etude
165 grâce au tab courant d'Eficas
168 # 1: Get current tab index in Eficas
169 editor = self.eficas_manager.getCurrentEditor()
170 # 2: sync with SALOME GUI is a tab is opened
172 for case_editor, adao_case in self.cases.iteritems():
173 if case_editor is editor:
174 adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
179 # Gestion de la creation d'un nouveau cas
180 # 1: la fonction newAdaoCase est appelee par le GUI SALOME
181 # 2: la fonction _processEficasNewEvent est appelee par le manager EFICAS
185 def newAdaoCase(self):
186 adaoLogger.debug("Creation d'un nouveau cas adao")
187 self.eficas_manager.adaofileNew(AdaoCase())
189 def _processEficasNewEvent(self, eficasWrapper, eficasEvent):
190 adao_case = eficasEvent.callbackId
192 salomeStudyId = adaoGuiHelper.getActiveStudyId()
193 salomeStudyItem = adaoStudyEditor.addInStudy(salomeStudyId, adao_case)
194 # Affichage correct dans l'etude
195 adaoGuiHelper.refreshObjectBrowser()
196 adaoGuiHelper.selectItem(salomeStudyItem.GetID())
197 # Finalisation des donnees du cas
198 adao_case.salome_study_id = salomeStudyId
199 adao_case.salome_study_item = salomeStudyItem
201 self.cases[adao_case.eficas_editor] = adao_case
205 # Gestion de l'ouverture d'un cas
206 # 1: la fonction openAdaoCase est appelee par le GUI SALOME
207 # 2: la fonction _processEficasOpenEvent est appelee par le manager EFICAS
211 # Rq: l'ouverture d'un cas adao est un cas particulier de la creation d'un cas adao
213 def openAdaoCase(self):
214 adaoLogger.debug("Ouverture d'un cas adao")
215 self.eficas_manager.adaoFileOpen(AdaoCase())
217 def _processEficasOpenEvent(self, eficasWrapper, eficasEvent):
218 self._processEficasNewEvent(eficasWrapper, eficasEvent)
222 # Gestion de la sauvegarde d'un cas
223 # 1: la fonction saveAdaoCase est appelee par le GUI SALOME
224 # 1 bis: la fonction saveasAdaoCase est appelee par le GUI SALOME
225 # 2: la fonction _processEficasSaveEvent est appelee par le manager EFICAS
229 def saveAdaoCase(self):
230 adaoLogger.debug("Sauvegarde du cas s'il y a modification (version save)")
231 # A priori, l'utilisateur s'attend a sauvegarder le cas qui est ouvert
232 # dans le GUI d'Eficas
233 self.harmonizeSelectionFromEficas()
234 salomeStudyItem = adaoGuiHelper.getSelectedItem()
235 for case_name, adao_case in self.cases.iteritems():
236 if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
237 if not adao_case.isOk():
238 adaoLogger.debug("Cas invalide, donc il est sauvegarde, mais il ne peut pas etre exporte vers YACS ensuite")
239 self.eficas_manager.adaoFileSave(adao_case)
242 def saveasAdaoCase(self):
243 adaoLogger.debug("Sauvegarde du cas s'il y a modification (version save as)")
244 # A priori, l'utilisateur s'attend a sauvegarder le cas qui est ouvert
245 # dans le GUI d'Eficas
246 self.harmonizeSelectionFromEficas()
247 salomeStudyItem = adaoGuiHelper.getSelectedItem()
248 for case_name, adao_case in self.cases.iteritems():
249 if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
250 if not adao_case.isOk():
251 adaoLogger.debug("Cas invalide, donc il est sauvegarde, mais il ne peut pas etre exporte vers YACS ensuite")
252 self.eficas_manager.adaoFileSaveAs(adao_case)
255 def _processEficasSaveEvent(self, eficasWrapper, eficasEvent):
256 adao_case = eficasEvent.callbackId
257 # On met a jour l'etude
258 adaoStudyEditor.updateItem(adao_case.salome_study_id, adao_case.salome_study_item, adao_case)
259 # Affichage correct dans l'etude
260 adaoGuiHelper.refreshObjectBrowser()
261 adaoGuiHelper.selectItem(adao_case.salome_study_item.GetID())
263 self.cases[adao_case.name] = adao_case
267 # Gestion de la fermeture d'un cas
268 # 1: la fonction closeAdaoCase est appelee par le GUI SALOME
269 # 2: la fonction _processEficasCloseEvent est appelee par le manager EFICAS
273 def closeAdaoCase(self):
274 adaoLogger.debug("Fermeture d'un cas")
275 # A priori, l'utilisateur s'attend a sauvegarder le cas qui est ouvert
276 # dans le GUI d'Eficas
277 self.harmonizeSelectionFromEficas()
278 salomeStudyItem = adaoGuiHelper.getSelectedItem()
279 for case_name, adao_case in self.cases.iteritems():
280 if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
281 self.eficas_manager.adaoFileClose(adao_case)
284 def _processEficasCloseEvent(self, eficasWrapper, eficasEvent):
285 from Extensions.param2 import originalMath
286 originalMath.toOriginal()
287 adaoLogger.debug("Destruction d'un cas")
288 editor = eficasEvent.callbackId
289 # Recuperation du cas
290 adao_case = self.cases[editor]
291 # Suppression de l'objet dans l'etude
292 adaoStudyEditor.removeItem(adao_case.salome_study_id, adao_case.salome_study_item)
294 self.cases.pop(editor)
295 # Refresh GUI -> appelle currentSelectionChanged()
296 adaoGuiHelper.refreshObjectBrowser()
300 # Gestion de la connexion avec YACS
301 # 1: la fonction exportCasToYACS exporte l'etude vers YACS
304 def exportCaseToYACS(self):
305 adaoLogger.debug("Export du cas vers YACS")
307 # A priori, l'utilisateur s'attend a exporter le cas qui est ouvert
308 # dans le GUI d'Eficas
309 self.harmonizeSelectionFromEficas()
310 salomeStudyItem = adaoGuiHelper.getSelectedItem()
311 for case_name, adao_case in self.cases.iteritems():
312 if adao_case.salome_study_item.GetID() == salomeStudyItem.GetID():
314 msg = adao_case.exportCaseToYACS()
315 # If msg is not empty -> error found
317 adaoGuiHelper.gui_warning(SalomePyQt.SalomePyQt().getDesktop(), msg)
319 adaoGuiHelper.gui_warning(SalomePyQt.SalomePyQt().getDesktop(), "ADAO/EFICAS case can't be exported to ADAO/YACS, it is incomplete or invalid. Please return to ADAO/EFICAS edition stage.")
324 # Methodes secondaires permettant de rediriger les evenements
325 # de SALOME et d'Eficas vers les bonnes methodes de la classe
329 # Gestion des evenements venant du manager Eficas
331 EficasEvent.EVENT_TYPES.CLOSE : "_processEficasCloseEvent",
332 EficasEvent.EVENT_TYPES.SAVE : "_processEficasSaveEvent",
333 EficasEvent.EVENT_TYPES.NEW : "_processEficasNewEvent",
334 EficasEvent.EVENT_TYPES.CLOSE : "_processEficasCloseEvent",
335 EficasEvent.EVENT_TYPES.OPEN : "_processEficasOpenEvent",
336 EficasEvent.EVENT_TYPES.TABCHANGED : "_processEficasTabChanged",
337 EficasEvent.EVENT_TYPES.REOPEN : "_processEficasReOpenEvent"
340 def processEficasEvent(self, eficasWrapper, eficasEvent):
342 Implementation of the interface EficasObserver. The implementation is a
343 switch on the possible types of events defined in EficasEvent.EVENT_TYPES.
346 functionName = self.__processOptions.get(eficasEvent.eventType, lambda : "_processEficasUnknownEvent")
347 return getattr(self,functionName)(eficasWrapper, eficasEvent)
349 def _processEficasUnknownEvent(self, eficasWrapper, eficasEvent):
350 adaoLogger.error("Unknown Eficas Event")
352 # Gestion des evenements venant du GUI de SALOME
353 def processGUIEvent(self, actionId):
355 Main switch function for ui actions processing
357 if ACTIONS_MAP.has_key(actionId):
359 functionName = ACTIONS_MAP[actionId]
360 getattr(self,functionName)()
362 traceback.print_exc()
364 adaoLogger.warning("The requested action is not implemented: " + str(actionId))
366 class AdaoGuiUiComponentBuilder:
368 The initialisation of this class creates the graphic components involved
369 in the GUI (menu, menu item, toolbar). A ui component builder should be
370 created for each opened study and associated to its context.
373 self.initUiComponents()
375 def initUiComponents(self):
379 # create top-level menu
380 mid = sgPyQt.createMenu( "ADAO", -1, UI_ELT_IDS.ADAO_MENU_ID, sgPyQt.defaultMenuGroup() )
382 tid = sgPyQt.createTool( "ADAO" )
384 a = sgPyQt.createAction( UI_ELT_IDS.NEW_ADAOCASE_ID, "New case", "New case", "Create a new ADAO case", "eficas_new.png" )
385 sgPyQt.createMenu(a, mid)
386 sgPyQt.createTool(a, tid)
387 a = sgPyQt.createAction( UI_ELT_IDS.OPEN_ADAOCASE_ID, "Open case", "Open case", "Open an ADAO case", "eficas_open.png" )
388 sgPyQt.createMenu(a, mid)
389 sgPyQt.createTool(a, tid)
390 a = sgPyQt.createAction( UI_ELT_IDS.SAVE_ADAOCASE_ID, "Save case", "Save case", "Save an ADAO case", "eficas_save.png" )
391 sgPyQt.createMenu(a, mid)
392 sgPyQt.createTool(a, tid)
393 a = sgPyQt.createAction( UI_ELT_IDS.SAVE_AS_ADAOCASE_ID, "Save as case", "Save as case", "Save an ADAO case as", "eficas_saveas.png" )
394 sgPyQt.createMenu(a, mid)
395 sgPyQt.createTool(a, tid)
396 a = sgPyQt.createAction( UI_ELT_IDS.CLOSE_ADAOCASE_ID, "Close case", "Close case", "Close an ADAO case", "eficas_close.png" )
397 sgPyQt.createMenu(a, mid)
398 sgPyQt.createTool(a, tid)
399 a = sgPyQt.createAction( UI_ELT_IDS.YACS_EXPORT_ID, "Export to YACS", "Export to YACS", "Generate a YACS graph executing this case", "eficas_yacs.png" )
400 sgPyQt.createMenu(a, mid)
401 sgPyQt.createTool(a, tid)
403 # the following action are used in context popup
404 a = sgPyQt.createAction( UI_ELT_IDS.CLOSE_ADAOCASE_ID, "Close case", "Close case", "Close the selected case", "" )
405 a = sgPyQt.createAction( UI_ELT_IDS.YACS_EXPORT_ID, "Export to YACS", "Export to YACS", "Generate a YACS graph executing this case", "" )
407 def createPopupMenuOnItem(self,popup,salomeSudyId, item):
408 if adaoStudyEditor.isValidAdaoCaseItem(salomeSudyId, item):
409 popup.addAction( sgPyQt.action( UI_ELT_IDS.CLOSE_ADAOCASE_ID ) )
410 popup.addAction( sgPyQt.action( UI_ELT_IDS.YACS_EXPORT_ID ) )