Salome HOME
Merge V9 dans Master
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursBase.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2017   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.QtGui     import QIcon 
32 from PyQt5.QtWidgets import QApplication, QMessageBox
33 from PyQt5.QtCore    import QTimer, QSize, Qt
34
35 # Modules Eficas
36 from Extensions.i18n import tr
37
38 from InterfaceQT4.feuille                import Feuille
39 from desWidgetPlusieursBase        import Ui_WidgetPlusieursBase 
40 from InterfaceQT4.politiquesValidation   import PolitiquePlusieurs
41 from InterfaceQT4.qtSaisie               import SaisieValeur
42 from InterfaceQT4.gereListe              import GereListe
43 from InterfaceQT4.gereListe              import GerePlie
44 from InterfaceQT4.gereListe              import LECustom
45
46 dicoLongueur={2:95,3:125,4:154,5:183,6:210,float('inf'):210}
47 hauteurMax=253
48
49 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
50
51   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
52         #print "MonWidgetPlusieursBase", nom
53         self.inFocusOutEvent=False
54         self.nomLine="lineEditVal"
55         self.inInit=True
56         self.indexDernierLabel=0
57         self.numLineEditEnCours=0
58         self.listeAffichageWidget=[]
59         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
60         GereListe.__init__(self)
61         self.gereIconePlier()
62         self.BSelectFichier.clicked.connect(self.selectInFile)
63
64         if sys.platform[0:5]!="linux":
65           repIcon=self.node.editor.appliEficas.repIcon
66           fichier=os.path.join(repIcon, 'arrow_up.png')
67           icon = QIcon(fichier)
68           self.RBHaut.setIcon(icon)
69           self.RBHaut.setIconSize(QSize(32, 32))
70           fichier2=os.path.join(repIcon, 'arrow_down.png')
71           icon2 = QIcon(fichier2)
72           self.RBBas.setIcon(icon2)
73           fichier3=os.path.join(repIcon, 'file-explorer.png')
74           icon3 = QIcon(fichier2)
75           self.BSelectFichier.setIcon(icon3)
76           self.BSelectFichier.setIconSize(QSize(32, 32))
77         icon=QIcon(self.repIcon+"/MoinsBleu.png")
78         self.RBMoins.setIcon(icon)
79         icon=QIcon(self.repIcon+"/PlusBleu.png")
80         self.RBPlus.setIcon(icon)
81         icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
82         self.RBVoisListe.setIcon(icon)
83
84
85         self.listeValeursCourantes=self.node.item.getListeValeurs()
86         if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7: 
87            hauteurMax=dicoLongueur[self.monSimpDef.max]
88         else :
89            hauteurMax=220
90         #   if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
91         self.resize(self.width(),hauteurMax)
92         self.setMinimumHeight(hauteurMax)
93         self.finCommentaireListe()
94         self.parentQt.commandesLayout.insertWidget(-1,self)
95         self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
96         self.AAfficher=self.lineEditVal1
97         self.inInit=False
98         # PNPN a completer __ si tuple le type des tuples sinon le tuple
99         self.monCommentaireLabel.setText(self.finCommentaireListe())
100
101
102   def setValeurs(self):
103        self.vScrollBar = self.scrollArea.verticalScrollBar()
104        self.politique=PolitiquePlusieurs(self.node,self.editor)
105        # construction du min de valeur a entrer
106        if self.monSimpDef.max == "**"  : aConstruire=7
107        elif self.monSimpDef.max == float('inf'): aConstruire=7
108        else                            : aConstruire=self.monSimpDef.max
109
110        for i in range(1,aConstruire):
111            self.ajoutLineEdit()
112        QApplication.processEvents()
113        self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
114        self.listeValeursCourantes=self.node.item.getListeValeurs()
115        index=1
116        for valeur in self.listeValeursCourantes :
117            val=self.politique.getValeurTexte(valeur)
118            nomLineEdit="lineEditVal"+str(index)
119            if hasattr(self,nomLineEdit) : 
120               courant=getattr(self,nomLineEdit)
121               if 'R' in self.objSimp.definition.type and str(val) != repr(val) :  courant.setText(repr(val))
122               else                     :  courant.setText(str(val))
123            else :
124               self.ajoutLineEdit(val)
125            index=index+1
126        # ajout d'une ligne vide ou affichage commentaire
127        if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
128        else : self.scrollArea.setToolTip('nb max de valeurs atteint')
129        #self.adjustSize()
130        #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
131        
132
133   def ajoutLineEdit(self,valeur=None,):
134       self.indexDernierLabel=self.indexDernierLabel+1
135       nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
136       if hasattr(self,nomLineEdit) : 
137          self.indexDernierLabel=self.indexDernierLabel-1
138          return
139       nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
140       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
141       nouveauLE.setText("")
142       if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
143       else :                               nouveauLE.setStyleSheet("background:rgb(235,235,235)")
144       nouveauLE.setFrame(False)
145       nouveauLE.returnPressed.connect(self.changeValeur)
146
147       setattr(self,nomLineEdit,nouveauLE)
148       self.listeAffichageWidget.append(nouveauLE)
149       self.etablitOrdre()
150       if valeur != None : nouveauLE.setText(str(valeur))
151       # deux lignes pour que le ensureVisible fonctionne
152       self.estVisible=nouveauLE
153       if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
154
155   def etablitOrdre(self):
156       i=0
157       while(i +1 < len(self.listeAffichageWidget)):
158          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
159          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
160          i=i+1
161       # si on boucle on perd l'ordre
162
163
164   def rendVisibleLigne(self):
165       QApplication.processEvents()
166       self.estVisible.setFocus()
167       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
168       
169
170   def finCommentaire(self):
171       return self.finCommentaireListe()
172
173   def ajout1Valeur(self,valeur=None):
174         if valeur == None : return
175         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
176         if validite == 0 : return
177         if liste ==[]    : return
178         listeVal=[]
179         for valeur in self.listeValeursCourantes : listeVal.append(valeur)
180         validite,comm,comm2,listeRetour=self.politique.ajoutValeurs(liste,-1,listeVal)
181         if (comm2 != "" and comm != None) : return comm2
182         if validite : 
183            self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
184            if len(self.listeValeursCourantes) > self.monSimpDef.min :
185               self.node.item.setValeur(self.listeValeursCourantes)
186               self.reaffiche()
187            return None
188         else :
189            return(comm2+" "+comm)
190         
191   def reaffiche(self):
192       # A priori, on ne fait rien
193       pass
194
195                 
196   def ajoutNValeur(self,liste):
197   #----------------------------
198   # attention quand on charge par un fichier, on ne peut pas se contenter d ajouter N fois 1 valeur
199   # car alors le temps de verification devient prohibitif  reconstructu=ion et verification a 
200   # chaque valeur. d ou l ajout de ajoutNTuple a politique plusieurs
201
202            
203         listeFormatee=list(liste)
204
205         min,max=self.node.item.getMinMax()
206         if self.objSimp.valeur == None : listeComplete=listeFormatee
207         else : listeComplete =self.objSimp.valeur + listeFormatee
208
209         if len(listeComplete) > max : 
210            texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
211            self.editor.afficheInfos(texte,Qt.red)
212            return
213
214         validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
215         if not validite : 
216            self.editor.afficheInfos(comm2,Qt.red)
217            return
218
219        
220         # on calcule le dernier lineedit rempli avant de changer la valeur
221         if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
222         else : indexDernierRempli=0
223
224         self.politique.recordValeur(listeComplete)
225
226         indexDernierRempli=0
227         while ( indexDernierRempli < len(liste) ) :
228          texte=liste[indexDernierRempli]
229          if indexDernierRempli < self.indexDernierLabel:
230             nomLineEdit="lineEditVal"+str(indexDernierRempli+1)
231             courant=getattr(self,nomLineEdit)
232             courant.setText(str(texte))
233          else : 
234             self.ajoutLineEdit(texte)
235          indexDernierRempli = indexDernierRempli + 1
236         
237
238   def changeValeur(self,changeDePlace=True,oblige=False):
239       donneFocus=None
240       derniereValeur=None
241       self.listeValeursCourantes = []
242       fin=self.indexDernierLabel
243       for i in range (1, fin):
244           nomLineEdit="lineEditVal"+str(i)
245           courant=getattr(self,nomLineEdit)
246           valeur=courant.text()
247           lval=valeur.split(',')
248           if len (lval) > 1 : 
249              msgBox=QMessageBox()
250              msgBox.setText("separator ',' ")
251              msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
252              msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
253              msgBox.setDefaultButton(QMessageBox.Ok)
254              ret = msgBox.exec_()
255              if ret != 1024 : 
256                 courant.setText("") 
257                 return
258              courant.setText(lval[0])
259              self.ajoutNValeur(lval[1:])
260              self.listeValeursCourantes = []
261
262       for i in range (1, self.indexDernierLabel+1):
263           nomLineEdit="lineEditVal"+str(i)
264           courant=getattr(self,nomLineEdit)
265           valeur=courant.text()
266           if valeur != None and valeur != "" : 
267              commentaire=self.ajout1Valeur(valeur)
268              if (commentaire != None ):
269                  self.editor.afficheInfos(commentaire,Qt.red)
270                  courant.setText("")
271                  donneFocus=courant
272                  self.reaffiche()
273                  return
274              else :
275                  self.editor.afficheInfos("")
276           elif donneFocus==None : donneFocus=courant
277
278       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
279       dernier=getattr(self,nomDernierLineEdit)
280       derniereValeur=dernier.text()
281       if changeDePlace:
282          if donneFocus != None : 
283            donneFocus.setFocus()
284            self.scrollArea.ensureWidgetVisible(donneFocus)
285          elif self.indexDernierLabel < self.monSimpDef.max  : 
286            self.ajoutLineEdit()
287       if self.listeValeursCourantes == [] : return
288       min,max = self.node.item.getMinMax()
289       if len(self.listeValeursCourantes) < self.monSimpDef.min  :
290         self.editor.afficheInfos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
291       if len(self.listeValeursCourantes) < min and oblige==True: return
292       if len(self.listeValeursCourantes) > max : return
293       self.node.item.setValeur(self.listeValeursCourantes)
294       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
295         self.editor.afficheInfos(tr('nb max de valeurs atteint'))
296       self.setValide()
297       self.reaffiche()
298
299           
300
301 # Avertissement quand on quitte le widget