Salome HOME
onItem=Deplie
[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 clean(self):
108       self.valeur=None
109       for i in range(self.tailleTuple):
110          nomLE="lineEditVal_"+str(i+1)
111          courant=getattr(self,nomLE)
112          courant.setText("")
113
114 class TupleCustom2(QWidget,Ui_Tuple2,TupleCustom):
115   def __init__(self,tailleTuple,parent,parentQt,index):
116       TupleCustom.__init__(self,tailleTuple,parent,parentQt,index)
117
118 class TupleCustom3(QWidget,Ui_Tuple3,TupleCustom):
119   def __init__(self,tailleTuple,parent,parentQt,index):
120       TupleCustom. __init__(self,tailleTuple,parent,parentQt,index)
121       
122 # ---------------------------- #
123
124
125 class MonWidgetPlusieursTuple(Feuille,GereListe):
126
127   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
128         self.indexDernierLabel=0
129         self.nomLine="TupleVal"
130         self.listeAffichageWidget=[]
131         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
132         GereListe.__init__(self)
133         self.politique=PolitiquePlusieurs(self.node,self.editor)
134         self.parentQt.commandesLayout.insertWidget(-1,self)
135         if sys.platform[0:5]!="linux":
136           repIcon=self.node.editor.appliEficas.repIcon
137           fichier=os.path.join(repIcon, 'arrow_up.png')
138           icon = QIcon(fichier)
139           self.RBHaut.setIcon(icon)
140           self.RBHaut.setIconSize(QSize(32, 32))
141           fichier2=os.path.join(repIcon, 'arrow_down.png')
142           icon2 = QIcon(fichier2)
143           self.RBBas.setIcon(icon2)
144           fichier3=os.path.join(repIcon, 'file-explorer.png')
145           icon3 = QIcon(fichier3)
146           self.BSelectFichier.setIcon(icon3)
147           self.BSelectFichier.setIconSize(QSize(32, 32))
148         self.connect(self.BSelectFichier,SIGNAL("clicked()"), self.selectInFile)
149           
150         
151
152
153   def ajoutLineEdit(self,valeur=None,inInit=False):
154       self.indexDernierLabel=self.indexDernierLabel+1
155       nomLineEdit=self.nomLine+str(self.indexDernierLabel)
156       if hasattr(self,nomLineEdit) :
157          self.indexDernierLabel=self.indexDernierLabel-1
158          return
159
160       if self.nbValeurs == 2 : nouveauLE = TupleCustom2(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
161       else                   : nouveauLE = TupleCustom3(self.nbValeurs,self.scrollArea,self,self.indexDernierLabel)
162                  
163       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
164       setattr(self,nomLineEdit,nouveauLE)
165       if valeur != None : nouveauLE.setValeur(valeur)
166
167       self.listeAffichageWidget.append(nouveauLE.lineEditVal_1)
168       self.listeAffichageWidget.append(nouveauLE.lineEditVal_2)
169       if self.nbValeurs == 3 : self.listeAffichageWidget.append(nouveauLE.lineEditVal_3)
170       self.etablitOrdre()
171
172       # deux lignes pour que le ensureVisible fonctionne
173       self.estVisible=nouveauLE.lineEditVal_1
174       if inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
175
176   def etablitOrdre(self):
177       i=0
178       while(i +1 < len(self.listeAffichageWidget)):
179          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
180          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
181          i=i+1
182
183
184   def setValeurs(self):
185        self.RBListePush()
186        valeurs=self.node.item.get_valeur()
187        min,max=self.node.item.GetMinMax()
188        if max == "**" or max > 5 : aCreer=5
189        else : aCreer=max 
190
191        if valeurs == () or valeurs == None :
192           for i in range(aCreer): self.ajoutLineEdit(inInit=True)
193           return
194
195        for v in valeurs:
196            self.ajoutLineEdit(v,inInit=True)
197
198        for i in range(len(valeurs),aCreer) : self.ajoutLineEdit(inInit=True)
199
200   def rendVisibleLigne(self):
201       qApp.processEvents()
202       self.estVisible.setFocus(True)
203       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
204
205    
206   def changeValeur(self,changeDePlace=False,oblige=True):
207       #Pour compatibilite signature
208       aLeFocus=self.focusWidget()
209       listeComplete=[]
210
211       libre=False
212       for i in range(self.indexDernierLabel) :
213           nom=self.nomLine+str(i+1)
214           courant=getattr(self,nom)
215           valeurTuple=courant.valeur
216           if valeurTuple == None or valeurTuple== "": 
217              libre=True
218              continue
219           validite,comm,comm2,listeRetour= self.politique.AjoutTuple(valeurTuple,listeComplete)
220           if not validite:
221              if comm2 != '' : comm += " " + comm2
222              self.editor.affiche_infos(comm+" "+str(self.objSimp.definition.validators.typeDesTuples),Qt.red)
223              return
224           listeComplete.append(tuple(courant.valeur))
225       if listeComplete == [] : listeComplete=None
226       self.node.item.set_valeur(listeComplete)
227
228       if changeDePlace : return
229       min,max=self.node.item.GetMinMax()
230       if self.indexDernierLabel == max  : self.editor.affiche_infos(tr('Nb maximum de valeurs atteint'))
231       if self.indexDernierLabel < max and libre==False :
232           self.ajoutLineEdit()
233           self.listeAffichageWidget[-2].setFocus(True)
234       else :
235          try :
236            qApp.processEvents()
237            w=self.listeAffichageWidget[self.listeAffichageWidget.index(aLeFocus)+1]
238            w.setFocus(True)
239            self.scrollArea.ensureWidgetVisible(w,0,0)
240          except :
241            pass
242           
243   def AjoutNValeur(self,liste):
244         if len(liste)%self.nbValeurs != 0 :
245            texte="Nombre de valeur incorrecte"
246            #self.Commentaire.setText(texte)
247            self.editor.affiche_infos(texte,Qt.red)
248            return
249         i=0
250         while ( i < len(liste) ) :
251             if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
252             else : indexDernierRempli=0
253             try :
254               t=tuple(liste[i:i+self.nbValeurs])
255               i=i+self.nbValeurs
256             except:
257               t=tuple(liste[i:len(liste)])
258             if indexDernierRempli < self.indexDernierLabel:
259                nomLineEdit=self.nomLine+str(indexDernierRempli+1)
260                LEARemplir=getattr(self,nomLineEdit) 
261                LEARemplir.lineEditVal_1.setText(str(t[0]))
262                LEARemplir.lineEditVal_2.setText(str(t[1]))
263                if self.nbValeurs== 3 : LEARemplir.lineEditVal_3.setText(str(t[2]))
264                LEARemplir.valueChange()
265             else : 
266                self.ajoutLineEdit(t,False)
267                nomLineEdit=self.nomLine+str(self.indexDernierLabel)
268                LEARemplir=getattr(self,nomLineEdit) 
269                LEARemplir.valueChange()
270
271
272   def RBListePush(self):
273   # PN a rendre generique avec un truc tel prerempli
274       if self.objSimp.valeur != None and self.objSimp.valeur != [] : return
275       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_ligne :
276          val=[]
277          for k in self.objSimp.jdc.LineDico.keys() :
278               try :
279                valeur=self.objSimp.jdc.get_concept(k)
280                val.append((valeur,0))
281               except :
282                pass
283          self.node.item.set_valeur(val)
284       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_generateur :
285          val=[]
286          for k in self.objSimp.jdc.MachineDico.keys() :
287               try :
288                valeur=self.objSimp.jdc.get_concept(k)
289                val.append((valeur,0))
290               except :
291                pass
292          self.node.item.set_valeur(val)
293       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_transfo :
294          val=[]
295          for k in self.objSimp.jdc.TransfoDico.keys() :
296               try :
297                valeur=self.objSimp.jdc.get_concept(k)
298                val.append((valeur,0))
299               except :
300                pass
301          self.node.item.set_valeur(val)
302       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_charge :
303          val=[]
304          for k in self.objSimp.jdc.LoadDico.keys() :
305               try :
306                valeur=self.objSimp.jdc.get_concept(k)
307                val.append((valeur,0))
308               except :
309                pass
310          self.node.item.set_valeur(val)
311