Salome HOME
linux/windows
[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.NumLineEditEnCours=0
130         self.nomLine="TupleVal"
131         self.listeAffichageWidget=[]
132         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
133         GereListe.__init__(self)
134         self.politique=PolitiquePlusieurs(self.node,self.editor)
135         self.parentQt.commandesLayout.insertWidget(-1,self)
136         if sys.platform[0:5]!="linux":
137           repIcon=self.node.editor.appliEficas.repIcon
138           fichier=os.path.join(repIcon, 'arrow_up.png')
139           icon = QIcon(fichier)
140           self.RBHaut.setIcon(icon)
141           self.RBHaut.setIconSize(QSize(32, 32))
142           fichier2=os.path.join(repIcon, 'arrow_down.png')
143           icon2 = QIcon(fichier2)
144           self.RBBas.setIcon(icon2)
145           fichier3=os.path.join(repIcon, 'file-explorer.png')
146           icon3 = QIcon(fichier3)
147           self.BSelectFichier.setIcon(icon3)
148           self.BSelectFichier.setIconSize(QSize(32, 32))
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 RBListePush(self):
244       if self.objSimp.valeur != None and self.objSimp.valeur != [] : return
245       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_ligne :
246          val=[]
247          for k in self.objSimp.jdc.LineDico.keys() :
248               try :
249                valeur=self.objSimp.jdc.get_concept(k)
250                val.append((valeur,0))
251               except :
252                pass
253          self.node.item.set_valeur(val)
254       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_generateur :
255          val=[]
256          for k in self.objSimp.jdc.MachineDico.keys() :
257               try :
258                valeur=self.objSimp.jdc.get_concept(k)
259                val.append((valeur,0))
260               except :
261                pass
262          self.node.item.set_valeur(val)
263       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_transfo :
264          val=[]
265          for k in self.objSimp.jdc.TransfoDico.keys() :
266               try :
267                valeur=self.objSimp.jdc.get_concept(k)
268                val.append((valeur,0))
269               except :
270                pass
271          self.node.item.set_valeur(val)
272       if self.objSimp.definition.validators.typeDesTuples[0]==self.editor.readercata.cata[0].sd_charge :
273          val=[]
274          for k in self.objSimp.jdc.LoadDico.keys() :
275               try :
276                valeur=self.objSimp.jdc.get_concept(k)
277                val.append((valeur,0))
278               except :
279                pass
280          self.node.item.set_valeur(val)