Salome HOME
fin du menage
[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):
293       aReecrire=self.propageChangeEnfant(self.node.item.object,typeChange)
294       if aReecrire : self.node.affichePanneau()
295
296   def propageChangeEnfant(self,mc, typeChange):
297       for enfant in mc.mcListe:
298           if enfant.nature == 'MCSIMP' :
299              if enfant.waitUserAssd():
300                 if enfant.definition.type[0] == typeChange: return True
301           else :
302             if enfant.nature == 'MCList' : enfant=enfant[0]
303             if self.propageChangeEnfant(enfant, typeChange) : return True
304       return False
305              
306