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