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