]> SALOME platform Git repositories - modules/adao.git/blob - src/daSalome/daGUI/daGuiImpl/adaoGuiManager.py
Salome HOME
Updating copyright date information
[modules/adao.git] / src / daSalome / daGUI / daGuiImpl / adaoGuiManager.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2008-2016 EDF R&D
3 #
4 # This file is part of SALOME ADAO module
5 #
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.
10 #
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.
15 #
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
19 #
20 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 #
22
23 """
24 This file centralizes the definitions and implementations of ui components used
25 in the GUI part of the module.
26 """
27
28 __author__ = "aribes/gboulant"
29
30 import traceback
31 from PyQt4.QtCore import QObject
32 from PyQt4.QtCore import *        # Import from PyQT
33 from PyQt4 import QtGui,QtCore
34 import SalomePyQt
35 sgPyQt = SalomePyQt.SalomePyQt()
36
37 from daUtils.enumerate import Enumerate
38 from daGuiImpl.adaoCase import AdaoCase
39 from daEficasWrapper.adaoEficasWrapper import AdaoEficasWrapper
40
41 from daUtils.adaoEficasEvent import *
42 import adaoGuiHelper
43 import adaoStudyEditor
44 from daUtils import adaoLogger
45
46 __cases__ = {}
47
48 #
49 # ==============================================================================
50 # Classes to manage the building of UI components
51 # ==============================================================================
52 #
53 UI_ELT_IDS = Enumerate([
54         'ADAO_MENU_ID',
55         'NEW_ADAOCASE_ID',
56         'OPEN_ADAOCASE_ID',
57         'SAVE_ADAOCASE_ID',
58         'SAVE_AS_ADAOCASE_ID',
59         'CLOSE_ADAOCASE_ID',
60         'YACS_EXPORT_ID',
61         ],offset=6950)
62
63 ACTIONS_MAP={
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",
70 }
71
72
73 class AdaoCaseManager(EficasObserver):
74   """
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)
77   """
78
79   def __init__(self):
80
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()
84     self.cases = {}
85
86     # Creation des deux managers
87     self.salome_manager = AdaoGuiUiComponentBuilder()
88     self.eficas_manager = AdaoEficasWrapper(parent=SalomePyQt.SalomePyQt().getDesktop())
89
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
92     # processGUIEvent
93     self.eficas_manager.addObserver(self)
94
95     # Creation du GUI Eficas
96     self.eficas_manager.init_gui()
97
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)
103     wmType = "ADAO View"
104     self.eficas_viewId = sgPyQt.createView(wmType, area)
105
106     # On interdit que la vue soit fermee
107     # Cela simplifier grandement le code
108     sgPyQt.setViewClosable(self.eficas_viewId, False)
109
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)
113
114 ######
115 #
116 # Gestion de l'activation/desactivation du module
117 #
118 ######
119
120   def activate(self):
121     self.eficas_manager.setEnabled(True)
122     sgPyQt.activateView(self.eficas_viewId)
123     self.harmonizeSelectionFromEficas()
124
125   def deactivate(self):
126     self.eficas_manager.setEnabled(False)
127
128 #######
129 #
130 # Gestion de la selection entre le GUI d'Eficas
131 # et l'arbre d'etude de SALOME
132 #
133 #######
134
135   # Depuis l'etude SALOME
136   def currentSelectionChanged(self):
137     """
138     Cette methode permet de changer le tab vu dans eficas
139     selon la selection de l'utilisateur dans l'etude SALOME
140     """
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)
147           break
148
149   # Depuis Eficas
150   def _processEficasTabChanged(self, eficasWrapper, eficasEvent):
151     """
152     Gestion de la synchonisation entre le tab courant d'Eficas
153     et la selection dans l'etude SALOME
154     """
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())
159         break
160
161   # On remet la selection dans SALOME grâce au tab dans Eficas
162   def harmonizeSelectionFromEficas(self):
163     """
164     Cette methode permet d'harmoniser la selection dans l'etude
165     grâce au tab courant d'Eficas
166     """
167     if self.cases:
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
171       if editor:
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())
175             break
176
177 #######
178 #
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
182 #
183 #######
184
185   def newAdaoCase(self):
186     adaoLogger.debug("Creation d'un nouveau cas adao")
187     self.eficas_manager.adaofileNew(AdaoCase())
188
189   def _processEficasNewEvent(self, eficasWrapper, eficasEvent):
190     adao_case = eficasEvent.callbackId
191     # Ajout dand l'etude
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
200     # Ajout du cas
201     self.cases[adao_case.eficas_editor] = adao_case
202
203 #######
204 #
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
208 #
209 #######
210
211 # Rq: l'ouverture d'un cas adao est un cas particulier de la creation d'un cas adao
212
213   def openAdaoCase(self):
214     adaoLogger.debug("Ouverture d'un cas adao")
215     self.eficas_manager.adaoFileOpen(AdaoCase())
216
217   def _processEficasOpenEvent(self, eficasWrapper, eficasEvent):
218     self._processEficasNewEvent(eficasWrapper, eficasEvent)
219
220 #######
221 #
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
226 #
227 #######
228
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)
240         break
241
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)
253         break
254
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())
262     # Ajout du cas
263     self.cases[adao_case.name] = adao_case
264
265 #######
266 #
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
270 #
271 #######
272
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)
282         break
283
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)
293     # Suppression du cas
294     self.cases.pop(editor)
295     # Refresh GUI -> appelle currentSelectionChanged()
296     adaoGuiHelper.refreshObjectBrowser()
297
298 #######
299 #
300 # Gestion de la connexion avec YACS
301 # 1: la fonction exportCasToYACS exporte l'etude vers YACS
302 #
303 #######
304   def exportCaseToYACS(self):
305     adaoLogger.debug("Export du cas vers YACS")
306
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():
313         if adao_case.isOk():
314           msg = adao_case.exportCaseToYACS()
315           # If msg is not empty -> error found
316           if msg != "":
317             adaoGuiHelper.gui_warning(SalomePyQt.SalomePyQt().getDesktop(), msg)
318         else:
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.")
320         break
321
322 #######
323 #
324 # Methodes secondaires permettant de rediriger les evenements
325 # de SALOME et d'Eficas vers les bonnes methodes de la classe
326 #
327 #######
328
329   # Gestion des evenements venant du manager Eficas
330   __processOptions={
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"
338       }
339
340   def processEficasEvent(self, eficasWrapper, eficasEvent):
341       """
342       Implementation of the interface EficasObserver. The implementation is a
343       switch on the possible types of events defined in EficasEvent.EVENT_TYPES.
344       @overload
345       """
346       functionName = self.__processOptions.get(eficasEvent.eventType, lambda : "_processEficasUnknownEvent")
347       return getattr(self,functionName)(eficasWrapper, eficasEvent)
348
349   def _processEficasUnknownEvent(self, eficasWrapper, eficasEvent):
350     adaoLogger.error("Unknown Eficas Event")
351
352   # Gestion des evenements venant du GUI de SALOME
353   def processGUIEvent(self, actionId):
354     """
355     Main switch function for ui actions processing
356     """
357     if ACTIONS_MAP.has_key(actionId):
358       try:
359           functionName = ACTIONS_MAP[actionId]
360           getattr(self,functionName)()
361       except:
362           traceback.print_exc()
363     else:
364       adaoLogger.warning("The requested action is not implemented: " + str(actionId))
365
366 class AdaoGuiUiComponentBuilder:
367     """
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.
371     """
372     def __init__(self):
373         self.initUiComponents()
374
375     def initUiComponents(self):
376
377         objectTR = QObject()
378
379         # create top-level menu
380         mid = sgPyQt.createMenu( "ADAO", -1, UI_ELT_IDS.ADAO_MENU_ID, sgPyQt.defaultMenuGroup() )
381         # create toolbar
382         tid = sgPyQt.createTool( "ADAO" )
383
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)
402
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", "" )
406
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 ) )
411         return popup