Salome HOME
Merge V9 dans Master
[tools/eficas.git] / InterfaceQT4 / aiemonWidgetPlusieursBase.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 UiQT5.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.affiche_infos(texte,Qt.red)
217            return
218
219         # on calcule le dernier lineedit rempli avant de changer la valeur
220         if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
221         else : indexDernierRempli=0
222
223         self.politique.recordValeur(listeComplete)
224
225         indexDernierRempli=0
226         while ( indexDernierRempli < len(liste) ) :
227          texte=liste[indexDernierRempli]
228          if indexDernierRempli < self.indexDernierLabel:
229             nomLineEdit="lineEditVal"+str(indexDernierRempli+1)
230             courant=getattr(self,nomLineEdit)
231             courant.setText(str(texte))
232          else : 
233             self.ajoutLineEdit(texte)
234          indexDernierRempli = indexDernierRempli + 1
235         
236
237   def changeValeur(self,changeDePlace=True,oblige=False):
238       donneFocus=None
239       derniereValeur=None
240       self.listeValeursCourantes = []
241       fin=self.indexDernierLabel
242       for i in range (1, fin):
243           nomLineEdit="lineEditVal"+str(i)
244           courant=getattr(self,nomLineEdit)
245           valeur=courant.text()
246           lval=valeur.split(',')
247           if len (lval) > 1 : 
248              msgBox=QMessageBox()
249              msgBox.setText("separator ',' ")
250              msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
251              msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
252              msgBox.setDefaultButton(QMessageBox.Ok)
253              ret = msgBox.exec_()
254              if ret != 1024 : 
255                 courant.setText("") 
256                 return
257              courant.setText(lval[0])
258              self.ajoutNValeur(lval[1:])
259              self.listeValeursCourantes = []
260
261       for i in range (1, self.indexDernierLabel+1):
262           nomLineEdit="lineEditVal"+str(i)
263           courant=getattr(self,nomLineEdit)
264           valeur=courant.text()
265           if valeur != None and valeur != "" : 
266              commentaire=self.ajout1Valeur(valeur)
267              if (commentaire != None ):
268                  self.editor.afficheInfos(commentaire,Qt.red)
269                  courant.setText("")
270                  donneFocus=courant
271                  self.reaffiche()
272                  return
273              else :
274                  self.editor.afficheInfos("")
275           elif donneFocus==None : donneFocus=courant
276
277       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
278       dernier=getattr(self,nomDernierLineEdit)
279       derniereValeur=dernier.text()
280       if changeDePlace:
281          if donneFocus != None : 
282            donneFocus.setFocus()
283            self.scrollArea.ensureWidgetVisible(donneFocus)
284          elif self.indexDernierLabel < self.monSimpDef.max  : 
285            self.ajoutLineEdit()
286       if self.listeValeursCourantes == [] : return
287       min,max = self.node.item.getMinMax()
288       if len(self.listeValeursCourantes) < self.monSimpDef.min  :
289         self.editor.afficheInfos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
290       if len(self.listeValeursCourantes) < min and oblige==True: return
291       if len(self.listeValeursCourantes) > max : return
292       self.node.item.setValeur(self.listeValeursCourantes)
293       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
294         self.editor.afficheInfos(tr('nb max de valeurs atteint'))
295       self.setValide()
296       self.reaffiche()
297
298           
299
300 # Avertissement quand on quitte le widget