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