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