Salome HOME
pour MT 02_06_17
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursTuple.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 # Modules Python
21 from __future__ import absolute_import
22 try :
23    from builtins import str
24    from builtins import range
25    from builtins import object
26 except : pass
27
28 import types,os,sys
29
30 from six.moves import range
31 from PyQt5.QtWidgets  import QFrame,QApplication, QFrame, QWidget
32 from PyQt5.QtGui  import QIcon
33 from PyQt5.QtCore  import QSize, Qt, QTimer
34
35 from Extensions.i18n import tr
36
37
38 from .feuille               import Feuille
39 from .politiquesValidation  import PolitiquePlusieurs
40 from .qtSaisie              import SaisieValeur
41 from .gereListe             import GereListe
42 from .gereListe             import LECustom
43 from Tuple2                import Ui_Tuple2
44 from Tuple3                import Ui_Tuple3
45
46
47 class TupleCustom(object) :
48   def __init__(self,tailleTuple,parent,parentQt,index):
49       QWidget.__init__(self,parent)
50       self.setupUi(self)
51       self.tailleTuple=tailleTuple
52       self.parent=parent
53       self.parentQt=parentQt
54       self.valeur=None
55       self.index=index
56       self.inFocusOutEvent=False
57
58
59       for i in range(self.tailleTuple):
60          nomLE="lineEditVal_"+str(i+1)
61          courant=getattr(self,nomLE)
62          courant.num=index
63          courant.dansUnTuple=True
64          courant.returnPressed.connect(self.valueChange)
65          courant.numDsLaListe = i+1
66          courant.tupleCustomParent=self
67
68
69   def valueChange(self):
70       listeVal=[]
71     
72       for i in range(self.tailleTuple):
73          nomLE="lineEditVal_"+str(i+1)
74          courant=getattr(self,nomLE)
75          val=str(courant.text())
76         
77          if str(val)=="" or val==None : 
78             if not self.inFocusOutEvent : courant.setFocus()
79             return
80          try :
81              valeur=eval(val,{})
82          except :
83            try :
84              d=self.parentQt.objSimp.jdc.get_contexte_avant(self.parentQt.objSimp. etape)
85              valeur=eval(val,d)
86            except :
87              valeur=val
88          listeVal.append(valeur)
89       self.valeur=listeVal
90       self.parentQt.changeValeur()
91
92
93   def setValeur(self,value):
94       listeVal=[]
95       valeurNulle=True
96       for i in range(self.tailleTuple):
97          nomLE="lineEditVal_"+str(i+1)
98          courant=getattr(self,nomLE)
99          try :
100            if str(value[i]) != "" : valeurNulle=False
101          except :
102            pass
103
104          try :
105            courant.setText(str(value[i]))
106          except :
107            courant.setText("")
108          val=str(courant.text())
109          try :
110            valeur=eval(val,{})
111          except :
112            try :
113              d=self.parentQt.objSimp.jdc.get_contexte_avant(self.parentQt.objSimp. etape)
114              valeur=eval(val,d)
115            except :
116              valeur=val
117          listeVal.append(valeur)
118       if  valeurNulle == True : self.valeur=None
119       else                    : self.valeur=listeVal
120
121   def getValeur(self):
122       return self.valeur
123
124   def text(self):
125       return self.valeur
126
127   def setText(self,value):
128       self.setValeur(value)
129
130   def clean(self):
131       self.valeur=None
132       for i in range(self.tailleTuple):
133          nomLE="lineEditVal_"+str(i+1)
134          courant=getattr(self,nomLE)
135          courant.setText("")
136
137   def finCommentaire(self):
138         return self.finCommentaireListe()
139
140
141 class TupleCustom2(QWidget,Ui_Tuple2,TupleCustom):
142   def __init__(self,tailleTuple,parent,parentQt,index):
143       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
144
145 class TupleCustom3(QWidget,Ui_Tuple3,TupleCustom):
146   def __init__(self,tailleTuple,parent,parentQt,index):
147       TupleCustom. __init__(self,tailleTuple,parent,parentQt,index)
148       
149 # ---------------------------- #
150
151
152 class MonWidgetPlusieursTuple(Feuille,GereListe):
153
154   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
155         self.indexDernierLabel=0
156         self.nomLine="TupleVal"
157         self.listeAffichageWidget=[]
158         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
159         GereListe.__init__(self)
160         self.finCommentaireListe()
161         self.politique=PolitiquePlusieurs(self.node,self.editor)
162         self.parentQt.commandesLayout.insertWidget(-1,self)
163         if sys.platform[0:5]!="linux":
164           repIcon=self.node.editor.appliEficas.repIcon
165           fichier=os.path.join(repIcon, 'arrow_up.png')
166           icon = QIcon(fichier)
167           self.RBHaut.setIcon(icon)
168           self.RBHaut.setIconSize(QSize(32, 32))
169           fichier2=os.path.join(repIcon, 'arrow_down.png')
170           icon2 = QIcon(fichier2)
171           self.RBBas.setIcon(icon2)
172           fichier3=os.path.join(repIcon, 'file-explorer.png')
173           icon3 = QIcon(fichier3)
174           self.BSelectFichier.setIcon(icon3)
175           self.BSelectFichier.setIconSize(QSize(32, 32))
176         self.BSelectFichier.clicked.connect(self.selectInFile)
177           
178         
179
180
181   def ajoutLineEdit(self,valeur=None,inInit=False):
182       self.indexDernierLabel=self.indexDernierLabel+1
183       nomLineEdit=self.nomLine+str(self.indexDernierLabel)
184       if hasattr(self,nomLineEdit) :
185          self.indexDernierLabel=self.indexDernierLabel-1
186          return
187
188       if self.nbValeurs == 2 : nouveauLE = TupleCustom2(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
189       else                   : nouveauLE = TupleCustom3(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
190                  
191       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
192       setattr(self,nomLineEdit,nouveauLE)
193       if valeur != None : nouveauLE.setValeur(valeur)
194
195       self.listeAffichageWidget.append(nouveauLE.lineEditVal_1)
196       self.listeAffichageWidget.append(nouveauLE.lineEditVal_2)
197       if self.nbValeurs == 3 : self.listeAffichageWidget.append(nouveauLE.lineEditVal_3)
198       self.etablitOrdre()
199
200       # deux lignes pour que le ensureVisible fonctionne
201       self.estVisible=nouveauLE.lineEditVal_1
202       if inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
203
204   def etablitOrdre(self):
205       i=0
206       while(i +1 < len(self.listeAffichageWidget)):
207          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
208          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
209          i=i+1
210
211
212   def setValeurs(self):
213        self.RBListePush()
214        valeurs=self.node.item.get_valeur()
215        min,max=self.node.item.GetMinMax()
216        if max == "**" or max > 5 : aCreer=5
217        else : aCreer=max 
218
219        if valeurs == () or valeurs == None :
220           for i in range(aCreer): self.ajoutLineEdit(inInit=True)
221           return
222
223        for v in valeurs:
224            self.ajoutLineEdit(v,inInit=True)
225
226        for i in range(len(valeurs),aCreer) : self.ajoutLineEdit(inInit=True)
227
228   def rendVisibleLigne(self):
229       QApplication.processEvents()
230       self.estVisible.setFocus(True)
231       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
232
233    
234   def changeValeur(self,changeDePlace=False,oblige=True):
235       #Pour compatibilite signature
236       aLeFocus=self.focusWidget()
237       listeComplete=[]
238
239       libre=False
240       for i in range(self.indexDernierLabel) :
241           nom=self.nomLine+str(i+1)
242           courant=getattr(self,nom)
243           valeurTuple=courant.valeur
244           if valeurTuple == None or valeurTuple== "": 
245              libre=True
246              continue
247           validite,comm,comm2,listeRetour= self.politique.AjoutTuple(valeurTuple,listeComplete)
248           if not validite:
249              if comm2 != '' : comm += " " + comm2
250              self.editor.affiche_infos(comm+" "+str(self.objSimp.definition.validators.typeDesTuples),Qt.red)
251              return
252           listeComplete.append(tuple(courant.valeur))
253       if listeComplete == [] : listeComplete=None
254       self.node.item.set_valeur(listeComplete)
255
256       if changeDePlace : return
257       min,max=self.node.item.GetMinMax()
258       if self.indexDernierLabel == max  : self.editor.affiche_infos(tr('Nb maximum de valeurs atteint'))
259       if self.indexDernierLabel < max and libre==False :
260           self.ajoutLineEdit()
261           self.listeAffichageWidget[-2].setFocus(True)
262       else :
263          try :
264            QApplication.processEvents()
265            w=self.listeAffichageWidget[self.listeAffichageWidget.index(aLeFocus)+1]
266            w.setFocus(True)
267            self.scrollArea.ensureWidgetVisible(w,0,0)
268          except :
269            pass
270           
271   def ajoutNValeur(self,liste):
272         if len(liste)%self.nbValeurs != 0 :
273            texte="Nombre incorrect de valeurs"
274            self.editor.affiche_infos(tr(texte),Qt.red)
275         i=0
276         min,max=self.node.item.GetMinMax()
277         if self.objSimp.valeur == None : l = len(liste) and self.objSimp.valeur
278         else : l = len(liste)+len(self.objSimp.valeur)
279         if l > max : 
280            texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
281            self.editor.affiche_infos(texte,Qt.red)
282            return
283         while ( i < len(liste) ) :
284             if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
285             else : indexDernierRempli=0
286             try :
287               t=tuple(liste[i:i+self.nbValeurs])
288               i=i+self.nbValeurs
289             except:
290               t=tuple(liste[i:len(liste)])
291             if indexDernierRempli < self.indexDernierLabel:
292                nomLineEdit=self.nomLine+str(indexDernierRempli+1)
293                LEARemplir=getattr(self,nomLineEdit) 
294                LEARemplir.lineEditVal_1.setText(str(t[0]))
295                LEARemplir.lineEditVal_2.setText(str(t[1]))
296                if self.nbValeurs== 3 : LEARemplir.lineEditVal_3.setText(str(t[2]))
297                LEARemplir.valueChange()
298             else : 
299                self.ajoutLineEdit(t,False)
300                nomLineEdit=self.nomLine+str(self.indexDernierLabel)
301                LEARemplir=getattr(self,nomLineEdit) 
302                LEARemplir.valueChange()
303
304   def RBListePush(self):
305   # PN a rendre generique avec un truc tel prerempli
306       if self.editor.code == 'VP' : return
307       if self.objSimp.valeur != None and self.objSimp.valeur != [] : return
308       if not hasattr(self.editor.readercata.cata[0],'sd_ligne') : self.editor.readercata.cata[0].sd_ligne=None
309       if not hasattr(self.editor.readercata.cata[0],'sd_generateur') : self.editor.readercata.cata[0].sd_generateur=None
310       if not hasattr(self.editor.readercata.cata[0],'sd_transfo') : self.editor.readercata.cata[0].sd_transfo=None
311       if not hasattr(self.editor.readercata.cata[0],'sd_charge') : self.editor.readercata.cata[0].sd_charge=None
312       if not hasattr(self.editor.readercata.cata[0],'sd_moteur') : self.editor.readercata.cata[0].sd_moteur=None
313       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_ligne :
314          val=[]
315          if  hasattr(self.objSimp.jdc,'LineDico'):
316           for k in self.objSimp.jdc.LineDico :
317               try :
318                valeur=self.objSimp.jdc.get_concept(k)
319                val.append((valeur,0))
320               except :
321                pass
322          self.node.item.set_valeur(val)
323       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_generateur :
324          val=[]
325          if  hasattr(self.objSimp.jdc,'MachineDico'):
326           for k in self.objSimp.jdc.MachineDico :
327               try :
328                valeur=self.objSimp.jdc.get_concept(k)
329                val.append((valeur,0))
330               except :
331                pass
332          self.node.item.set_valeur(val)
333       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_transfo :
334          val=[]
335          if  hasattr(self.objSimp.jdc,'TransfoDico'):
336           for k in self.objSimp.jdc.TransfoDico :
337               try :
338                valeur=self.objSimp.jdc.get_concept(k)
339                val.append((valeur,0))
340               except :
341                pass
342          self.node.item.set_valeur(val)
343       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_charge :
344          val=[]
345          if  hasattr(self.objSimp.jdc,'LoadDico'):
346           for k in self.objSimp.jdc.LoadDico :
347               try :
348                valeur=self.objSimp.jdc.get_concept(k)
349                val.append((valeur,0))
350               except :
351                pass
352          self.node.item.set_valeur(val)
353       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_moteur :
354          val=[]
355          if  hasattr(self.objSimp.jdc,'MotorDico'):
356           for k in self.objSimp.jdc.MotorDico :
357               try :
358                valeur=self.objSimp.jdc.get_concept(k)
359                val.append((valeur,0))
360               except :
361                pass
362          self.node.item.set_valeur(val)
363