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