Salome HOME
sauve du 9 mai
[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 import string,types,os,sys
22
23 # Modules Eficas
24 from determine import monEnvQT5
25 if monEnvQT5:
26     from PyQt5.QtWidgets  import QFrame,QApplication
27     from PyQt5.QtGui  import QIcon, QFrame
28     from PyQt5.QtCore  import QSize
29 else :
30     from PyQt4.QtGui  import *
31     from PyQt4.QtCore import *
32
33 from Extensions.i18n import tr
34
35
36 from feuille               import Feuille
37 from politiquesValidation  import PolitiquePlusieurs
38 from qtSaisie              import SaisieValeur
39 from gereListe             import GereListe
40 from gereListe             import LECustom
41 from Tuple2                import Ui_Tuple2
42 from Tuple3                import Ui_Tuple3
43 from maMessageBox          import maMessageBox
44
45
46 class TupleCustom :
47   def __init__(self,tailleTuple,parent,parentQt,index):
48       QWidget.__init__(self,parent)
49       self.setupUi(self)
50       self.tailleTuple=tailleTuple
51       self.parent=parent
52       self.parentQt=parentQt
53       self.valeur=None
54       self.index=index
55
56
57       for i in range(self.tailleTuple):
58          nomLE="lineEditVal_"+str(i+1)
59          courant=getattr(self,nomLE)
60          courant.num=index
61          courant.dansUnTuple=True
62          if monEnvQT5 : courant.returnPressed.connect(self.valueChange)
63          else : self.connect(courant,SIGNAL("returnPressed()"),self.valueChange)
64
65
66   def valueChange(self):
67       listeVal=[]
68     
69       for i in range(self.tailleTuple):
70          nomLE="lineEditVal_"+str(i+1)
71          courant=getattr(self,nomLE)
72          val=str(courant.text())
73          if str(val)=="" or val==None : 
74             courant.setFocus()
75             return
76          try :
77              valeur=eval(val,{})
78          except :
79            try :
80              d=self.parentQt.objSimp.jdc.get_contexte_avant(self.parentQt.objSimp. etape)
81              valeur=eval(val,d)
82            except :
83              valeur=val
84          listeVal.append(valeur)
85       self.valeur=listeVal
86       self.parentQt.changeValeur()
87
88
89   def setValeur(self,value):
90       listeVal=[]
91       valeurNulle=True
92       for i in range(self.tailleTuple):
93          nomLE="lineEditVal_"+str(i+1)
94          courant=getattr(self,nomLE)
95          try :
96            if str(value[i]) != "" : valeurNulle=False
97          except :
98            pass
99
100          try :
101            courant.setText(str(value[i]))
102          except :
103            courant.setText("")
104          val=str(courant.text())
105          try :
106            valeur=eval(val,{})
107          except :
108            try :
109              d=self.parentQt.objSimp.jdc.get_contexte_avant(self.parentQt.objSimp. etape)
110              valeur=eval(val,d)
111            except :
112              valeur=val
113          listeVal.append(valeur)
114       if  valeurNulle == True : self.valeur=None
115       else                    : self.valeur=listeVal
116
117   def getValeur(self):
118       return self.valeur
119
120   def text(self):
121       return self.valeur
122
123   def setText(self,value):
124       self.setValeur(value)
125
126   def clean(self):
127       self.valeur=None
128       for i in range(self.tailleTuple):
129          nomLE="lineEditVal_"+str(i+1)
130          courant=getattr(self,nomLE)
131          courant.setText("")
132
133   def finCommentaire(self):
134         return self.finCommentaireListe()
135
136
137 class TupleCustom2(QWidget,Ui_Tuple2,TupleCustom):
138   def __init__(self,tailleTuple,parent,parentQt,index):
139       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
140
141 class TupleCustom3(QWidget,Ui_Tuple3,TupleCustom):
142   def __init__(self,tailleTuple,parent,parentQt,index):
143       TupleCustom. __init__(self,tailleTuple,parent,parentQt,index)
144       
145 # ---------------------------- #
146
147
148 class MonWidgetPlusieursTuple(Feuille,GereListe):
149
150   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
151         self.indexDernierLabel=0
152         self.nomLine="TupleVal"
153         self.listeAffichageWidget=[]
154         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
155         GereListe.__init__(self)
156         self.finCommentaireListe()
157         self.politique=PolitiquePlusieurs(self.node,self.editor)
158         self.parentQt.commandesLayout.insertWidget(-1,self)
159         if sys.platform[0:5]!="linux":
160           repIcon=self.node.editor.appliEficas.repIcon
161           fichier=os.path.join(repIcon, 'arrow_up.png')
162           icon = QIcon(fichier)
163           self.RBHaut.setIcon(icon)
164           self.RBHaut.setIconSize(QSize(32, 32))
165           fichier2=os.path.join(repIcon, 'arrow_down.png')
166           icon2 = QIcon(fichier2)
167           self.RBBas.setIcon(icon2)
168           fichier3=os.path.join(repIcon, 'file-explorer.png')
169           icon3 = QIcon(fichier3)
170           self.BSelectFichier.setIcon(icon3)
171           self.BSelectFichier.setIconSize(QSize(32, 32))
172         if monEnvQT5 :
173           self.BSelectFichier.clicked.connect(self.selectInFile)
174         else :
175           self.connect(self.BSelectFichier,SIGNAL("clicked()"), self.selectInFile)
176           
177         
178
179
180   def ajoutLineEdit(self,valeur=None,inInit=False):
181       self.indexDernierLabel=self.indexDernierLabel+1
182       nomLineEdit=self.nomLine+str(self.indexDernierLabel)
183       if hasattr(self,nomLineEdit) :
184          self.indexDernierLabel=self.indexDernierLabel-1
185          return
186
187       if self.nbValeurs == 2 : nouveauLE = TupleCustom2(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
188       else                   : nouveauLE = TupleCustom3(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
189                  
190       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
191       setattr(self,nomLineEdit,nouveauLE)
192       if valeur != None : nouveauLE.setValeur(valeur)
193
194       self.listeAffichageWidget.append(nouveauLE.lineEditVal_1)
195       self.listeAffichageWidget.append(nouveauLE.lineEditVal_2)
196       if self.nbValeurs == 3 : self.listeAffichageWidget.append(nouveauLE.lineEditVal_3)
197       self.etablitOrdre()
198
199       # deux lignes pour que le ensureVisible fonctionne
200       self.estVisible=nouveauLE.lineEditVal_1
201       if inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
202
203   def etablitOrdre(self):
204       i=0
205       while(i +1 < len(self.listeAffichageWidget)):
206          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
207          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
208          i=i+1
209
210
211   def setValeurs(self):
212        self.RBListePush()
213        valeurs=self.node.item.get_valeur()
214        min,max=self.node.item.GetMinMax()
215        if max == "**" or max > 5 : aCreer=5
216        else : aCreer=max 
217
218        if valeurs == () or valeurs == None :
219           for i in range(aCreer): self.ajoutLineEdit(inInit=True)
220           return
221
222        for v in valeurs:
223            self.ajoutLineEdit(v,inInit=True)
224
225        for i in range(len(valeurs),aCreer) : self.ajoutLineEdit(inInit=True)
226
227   def rendVisibleLigne(self):
228       QApplication.processEvents()
229       self.estVisible.setFocus(True)
230       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
231
232    
233   def changeValeur(self,changeDePlace=False,oblige=True):
234       #Pour compatibilite signature
235       aLeFocus=self.focusWidget()
236       listeComplete=[]
237
238       libre=False
239       for i in range(self.indexDernierLabel) :
240           nom=self.nomLine+str(i+1)
241           courant=getattr(self,nom)
242           valeurTuple=courant.valeur
243           if valeurTuple == None or valeurTuple== "": 
244              libre=True
245              continue
246           validite,comm,comm2,listeRetour= self.politique.AjoutTuple(valeurTuple,listeComplete)
247           if not validite:
248              if comm2 != '' : comm += " " + comm2
249              self.editor.affiche_infos(comm+" "+str(self.objSimp.definition.validators.typeDesTuples),Qt.red)
250              return
251           listeComplete.append(tuple(courant.valeur))
252       if listeComplete == [] : listeComplete=None
253       self.node.item.set_valeur(listeComplete)
254
255       if changeDePlace : return
256       min,max=self.node.item.GetMinMax()
257       if self.indexDernierLabel == max  : self.editor.affiche_infos(tr('Nb maximum de valeurs atteint'))
258       if self.indexDernierLabel < max and libre==False :
259           self.ajoutLineEdit()
260           self.listeAffichageWidget[-2].setFocus(True)
261       else :
262          try :
263            QApplication.processEvents()
264            w=self.listeAffichageWidget[self.listeAffichageWidget.index(aLeFocus)+1]
265            w.setFocus(True)
266            self.scrollArea.ensureWidgetVisible(w,0,0)
267          except :
268            pass
269           
270   def ajoutNValeur(self,liste):
271         if len(liste)%self.nbValeurs != 0 :
272            texte="Nombre incorrect de valeurs"
273            self.editor.affiche_infos(tr(texte),Qt.red)
274         i=0
275         min,max=self.node.item.GetMinMax()
276         if self.objSimp.valeur == None : l = len(liste) and self.objSimp.valeur
277         else : l = len(liste)+len(self.objSimp.valeur)
278         if l > max : 
279            texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
280            self.editor.affiche_infos(texte,Qt.red)
281            return
282         while ( i < len(liste) ) :
283             if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
284             else : indexDernierRempli=0
285             try :
286               t=tuple(liste[i:i+self.nbValeurs])
287               i=i+self.nbValeurs
288             except:
289               t=tuple(liste[i:len(liste)])
290             if indexDernierRempli < self.indexDernierLabel:
291                nomLineEdit=self.nomLine+str(indexDernierRempli+1)
292                LEARemplir=getattr(self,nomLineEdit) 
293                LEARemplir.lineEditVal_1.setText(str(t[0]))
294                LEARemplir.lineEditVal_2.setText(str(t[1]))
295                if self.nbValeurs== 3 : LEARemplir.lineEditVal_3.setText(str(t[2]))
296                LEARemplir.valueChange()
297             else : 
298                self.ajoutLineEdit(t,False)
299                nomLineEdit=self.nomLine+str(self.indexDernierLabel)
300                LEARemplir=getattr(self,nomLineEdit) 
301                LEARemplir.valueChange()
302
303   def RBListePush(self):
304   # PN a rendre generique avec un truc tel prerempli
305       if self.objSimp.valeur != None and self.objSimp.valeur != [] : return
306       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_ligne :
307          val=[]
308          for k in self.objSimp.jdc.LineDico.keys() :
309               try :
310                valeur=self.objSimp.jdc.get_concept(k)
311                val.append((valeur,0))
312               except :
313                pass
314          self.node.item.set_valeur(val)
315       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_generateur :
316          val=[]
317          for k in self.objSimp.jdc.MachineDico.keys() :
318               try :
319                valeur=self.objSimp.jdc.get_concept(k)
320                val.append((valeur,0))
321               except :
322                pass
323          self.node.item.set_valeur(val)
324       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_transfo :
325          val=[]
326          for k in self.objSimp.jdc.TransfoDico.keys() :
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_charge :
334          val=[]
335          for k in self.objSimp.jdc.LoadDico.keys() :
336               try :
337                valeur=self.objSimp.jdc.get_concept(k)
338                val.append((valeur,0))
339               except :
340                pass
341          self.node.item.set_valeur(val)
342