Salome HOME
Add COPYING license file
[tools/eficas.git] / InterfaceQT4 / monWidgetCommande.py
1 # Copyright (C) 2007-2021   EDF R&D
2 #
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License.
7 #
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # Lesser General Public License for more details.
12 #
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 #
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19 # Modules Python
20 # Modules Eficas
21 from __future__ import absolute_import
22 try :
23     from builtins import str
24 except : pass
25
26 import types
27
28 from desWidgetCommande import Ui_WidgetCommande
29 from .groupe import Groupe
30 from .gereIcones import FacultatifOuOptionnel
31
32 from PyQt5.QtWidgets  import QApplication, QWidget, QSpacerItem, QSizePolicy, QRadioButton
33 from PyQt5.QtGui import QFont, QIcon
34 from PyQt5.QtCore import QTimer
35 from PyQt5.QtCore import Qt
36
37
38
39 from Extensions.i18n import tr
40 import Accas
41 import os
42
43
44 # Import des panels
45
46 class MonWidgetCommande(Ui_WidgetCommande,Groupe):
47     """
48     """
49     def __init__(self,node,editor,etape):
50
51         self.listeAffichageWidget=[]
52         self.inhibe=0
53         self.ensure=0
54         editor.inhibeSplitter=1
55         Groupe.__init__(self,node,editor,None,etape.definition,etape,1,self)
56         spacerItem = QSpacerItem(21, 500, QSizePolicy.Expanding, QSizePolicy.Expanding)
57         self.verticalLayoutCommande.addItem(spacerItem)
58         editor.inhibeSplitter=0
59
60         # Gestion du nom de L OPER si il est nomme
61         if   not(hasattr(etape.definition,'sd_prod')) or (etape.definition.sd_prod==None): self.LENom.close()
62         elif (hasattr(etape.definition,'sd_prod') and type(etape.definition.sd_prod)== types.FunctionType):self.LENom.close()
63         elif (hasattr(etape, 'sdnom')) and etape.sdnom != "sansnom" and etape.sdnom != None:
64             self.LENom.setText(etape.sdnom)
65         else :
66             self.LENom.setText("")
67         if hasattr(self,'LENom'): self.LENom.returnPressed.connect(self.nomChange)
68         self.racine=self.node.tree.racine
69         if self.node.item.getIconName() == "ast-red-square" : self.LENom.setDisabled(True)
70
71         # Gestion de la doc de l objet
72         if node.item.getFr() != "" :
73             self.labelDoc.setText(node.item.getFr())
74             nouvelleSize=self.frameAffichage.height()+60
75             self.frameAffichage.setMinimumHeight(nouvelleSize)
76             self.frameAffichage.resize(self.frameAffichage.width(),nouvelleSize)
77         else : self.labelDoc.close()
78
79
80         # Gestion du nom de l etape
81         maPolice= QFont("Times", 10,)
82         self.setFont(maPolice)
83         self.labelNomCommande.setText(tr(self.obj.nom))
84
85
86         # Gestion du Frame d affichage des autres commandes
87         if self.editor.maConfiguration.closeAutreCommande == True  : self.closeAutreCommande()
88         else :
89             self.bCatalogue.clicked.connect(self.afficheCatalogue)
90             self.bAvant.clicked.connect(self.afficheAvant)
91             self.bApres.clicked.connect(self.afficheApres)
92
93         if self.editor.maConfiguration.closeFrameRechercheCommande==True  :
94             self.frameAffichage.close()
95             self.closeAutreCommande()
96
97
98         self.setAcceptDrops(True)
99         self.etablitOrdre()
100
101         if self.editor.maConfiguration.enleverPoubellePourCommande  :
102             self.RBPoubelle.close() # JDC Fige
103
104         if self.editor.maConfiguration.pasDeMCOptionnels  :
105             return                  # Pas de MC Optionnels pour Carmel
106
107         from .monWidgetOptionnel import MonWidgetOptionnel
108         if self.editor.widgetOptionnel!= None :
109             self.monOptionnel=self.editor.widgetOptionnel
110         else :
111             self.editor.inhibeSplitter=1
112             self.monOptionnel=MonWidgetOptionnel(self.editor)
113             self.editor.widgetOptionnel=self.monOptionnel
114             self.editor.splitter.addWidget(self.monOptionnel)
115             self.editor.ajoutOptionnel()
116             self.editor.inhibeSplitter=0
117             self.monOptionnel=self.editor.widgetOptionnel
118         self.afficheOptionnel()
119
120         #print "fin init de widget Commande"
121
122
123     def closeAutreCommande(self):
124         self.bCatalogue.close()
125         self.bAvant.close()
126         self.bApres.close()
127
128     def donnePremier(self):
129         #print "dans donnePremier"
130         QApplication.processEvents()
131         if self.listeAffichageWidget != [] :
132             self.listeAffichageWidget[0].setFocus(7)
133         QApplication.processEvents()
134         #print self.focusWidget()
135
136
137     def focusNextPrevChild(self, next):
138         # on s assure que ce n est pas un chgt de fenetre
139         #print "je passe dans focusNextPrevChild"
140         if self.editor.fenetreCentraleAffichee != self : return True
141         f = self.focusWidget()
142         if f not in self.listeAffichageWidget :
143             i=0
144             while not hasattr (f,'AAfficher') :
145                 if f==None :i=-1; break
146                 f = f.parentWidget()
147             if hasattr(f,'AAfficher') : f=f.AAfficher
148             if i != -1 : i=self.listeAffichageWidget.index(f)
149         else :i=self.listeAffichageWidget.index(f)
150         if (i==len(self.listeAffichageWidget) -1) and next and not self.inhibe:
151             try :
152                 self.listeAffichageWidget[1].setFocus(7)
153                 w=self.focusWidget()
154                 self.inhibe=1
155                 w.focusPreviousChild()
156                 self.inhibe=0
157                 return True
158             except :
159                 pass
160                 #print self.listeAffichageWidget
161                 #print "souci ds focusNextPrevChild"
162         if i==0 and next==False and not self.inhibe:
163             if hasattr(self.editor.fenetreCentraleAffichee,'scrollArea'):
164                 self.editor.fenetreCentraleAffichee.scrollArea.ensureWidgetVisible(self.listeAffichageWidget[-1])
165             self.listeAffichageWidget[-2].setFocus(7)
166             self.inhibe=1
167             w=self.focusWidget()
168             w.focusNextChild()
169             self.inhibe=0
170             return True
171         if i==0 and next==True and not self.inhibe:
172             self.listeAffichageWidget[0].setFocus(7)
173             self.inhibe=1
174             w=self.focusWidget()
175             w.focusNextChild()
176             self.inhibe=0
177             return True
178         if i>0 and next==False and not self.inhibe:
179             if isinstance(self.listeAffichageWidget[i-1],QRadioButton):
180                 self.listeAffichageWidget[i-1].setFocus(7)
181                 return True
182         return QWidget.focusNextPrevChild(self, next)
183
184     def etablitOrdre(self):
185         i=0
186         while(i +1 < len(self.listeAffichageWidget)):
187             self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
188             i=i+1
189         # si on boucle on perd l'ordre
190
191     def  afficheSuivant(self,f):
192         #print ('ds afficheSuivant')
193         try :
194             i=self.listeAffichageWidget.index(f)
195             next=i+1
196         except :
197             next=1
198         if (next==len(self.listeAffichageWidget) ): next =0
199         #self.f=next
200         #QTimer.singleShot(1, self.rendVisible)
201         try :
202             self.listeAffichageWidget[next].setFocus(7)
203         except :
204             pass
205
206     def nomChange(self):
207         nom = str(self.LENom.text())
208         nom = nom.strip()
209         if nom == '' : return                  # si pas de nom, on ressort sans rien faire
210         test,mess = self.node.item.nommeSd(nom)
211         self.editor.afficheCommentaire(mess)
212
213         #Notation scientifique
214         if test :
215             from .politiquesValidation import Validation
216             validation=Validation(self.node,self.editor)
217             validation.ajoutDsDictReelEtape()
218
219     def afficheOptionnel(self):
220         # N a pas de parentQt. doit donc etre redefini
221         if self.editor.maConfiguration.closeOptionnel : self.editor.fermeOptionnel()
222         liste,liste_rouge=self.ajouteMCOptionnelDesBlocs()
223         #print "dans afficheOptionnel", self.monOptionnel
224         # dans le cas ou l insertion n a pas eu leiu (souci d ordre par exemple)
225         #if self.monOptionnel == None : return
226         self.monOptionnel.parentCommande=self
227         self.monOptionnel.titre(self.obj.nom)
228         self.monGroupe=self.monOptionnel.afficheOptionnel(liste,liste_rouge,self)
229
230
231     def focusInEvent(self,event):
232         #print "je mets a jour dans focusInEvent de monWidget Commande "
233         self.afficheOptionnel()
234
235
236     def reaffiche(self,nodeAVoir=None):
237         # Attention delicat. les appels de fonctions ne semblent pas pouvoir etre supprimes!
238         self.avantH=self.editor.fenetreCentraleAffichee.scrollAreaCommandes.horizontalScrollBar().sliderPosition()
239         self.avantV=self.editor.fenetreCentraleAffichee.scrollAreaCommandes.verticalScrollBar().sliderPosition()
240         self.inhibeExpand=True
241         self.node.affichePanneau()
242         #QTimer.singleShot(1, self.recentre)
243         if nodeAVoir != None and nodeAVoir!=0:
244             self.f=nodeAVoir.fenetre
245             if self.f==None :
246                 newNode=nodeAVoir.treeParent.chercheNoeudCorrespondant(nodeAVoir.item.object)
247                 self.f = newNode.fenetre
248             if self.f != None and self.f.isVisible() : self.inhibeExpand=False; return
249             if self.f != None : self.rendVisible()
250             else : self.recentre()
251         else : self.recentre()
252         self.inhibeExpand=False
253
254
255
256     def recentre(self):
257         QApplication.processEvents()
258         s=self.editor.fenetreCentraleAffichee.scrollAreaCommandes
259         s.horizontalScrollBar().setSliderPosition(self.avantH)
260         s.verticalScrollBar().setSliderPosition(self.avantV)
261
262     def rendVisible(self):
263         QApplication.processEvents()
264         self.f.setFocus(7)
265         self.editor.fenetreCentraleAffichee.scrollAreaCommandes.ensureWidgetVisible(self.f)
266
267     def afficheCatalogue(self):
268         if self.editor.widgetOptionnel != None : self.monOptionnel.hide()
269         self.racine.affichePanneau()
270         if self.node : self.node.select()
271         else : self.racine.select()
272
273     def afficheApres(self):
274         self.node.selectApres()
275
276     def afficheAvant(self):
277         self.node.selectAvant()
278
279     def setValide(self):
280         if not(hasattr (self,'RBValide')) : return
281         icon = QIcon()
282         if self.node.item.object.isValid() : icon=QIcon(self.repIcon+"/ast-green-ball.png")
283         else :                               icon=QIcon(self.repIcon+"/ast-red-ball.png")
284         nomIcone = self.node.item.getIconName()
285         if nomIcone == "ast-yellow-square" : icon=QIcon(self.repIcon+"/ast-yel-ball.png")
286         if nomIcone == "ast-red-square"    : self.LENom.setDisabled(True)
287
288         self.LENom.setDisabled(False)
289         self.RBValide.setIcon(icon)
290
291
292     def propageChange(self,typeChange,donneLeFocus):
293         aReecrire=self.propageChangeEnfant(self.node.item.object,typeChange)
294         if aReecrire : self.node.affichePanneau()
295         if hasattr(donneLeFocus.node.fenetre, 'selectionneDernier') :
296             QApplication.processEvents()
297             self.editor.fenetreCentraleAffichee.scrollAreaCommandes.ensureWidgetVisible(donneLeFocus.node.fenetre)
298             donneLeFocus.node.fenetre.selectionneDernier()
299
300     def propageChangeEnfant(self,mc, typeChange):
301         for enfant in mc.mcListe:
302             if enfant.nature == 'MCSIMP' :
303                 if enfant.waitUserAssd():
304                     if enfant.definition.type[0] == typeChange: return True
305             else :
306                 if enfant.nature == 'MCList' : enfant=enfant[0]
307                 if self.propageChangeEnfant(enfant, typeChange) : return True
308         return False