]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT4/monWidgetPlusieursBase.py
Salome HOME
modif pour MT
[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, QScrollArea
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         self.scrollArea.leaveEvent = self.leaveEventScrollArea
101
102
103   def setValeurs(self):
104        self.vScrollBar = self.scrollArea.verticalScrollBar()
105        self.politique=PolitiquePlusieurs(self.node,self.editor)
106        # construction du min de valeur a entrer
107        if self.monSimpDef.max == "**"  : aConstruire=7
108        elif self.monSimpDef.max == float('inf'): aConstruire=7
109        else                            : aConstruire=self.monSimpDef.max
110
111        for i in range(1,aConstruire):
112            self.ajoutLineEdit()
113        QApplication.processEvents()
114        self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
115        self.listeValeursCourantes=self.node.item.getListeValeurs()
116        index=1
117        for valeur in self.listeValeursCourantes :
118            val=self.politique.getValeurTexte(valeur)
119            nomLineEdit="lineEditVal"+str(index)
120            if hasattr(self,nomLineEdit) : 
121               courant=getattr(self,nomLineEdit)
122               if 'R' in self.objSimp.definition.type and str(val) != repr(val) :  courant.setText(repr(val))
123               else                     :  courant.setText(str(val))
124            else :
125               self.ajoutLineEdit(val)
126            index=index+1
127        # ajout d'une ligne vide ou affichage commentaire
128        if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
129        else : self.scrollArea.setToolTip('nb max de valeurs atteint')
130        #self.adjustSize()
131        #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
132        
133
134   def ajoutLineEdit(self,valeur=None,):
135       self.indexDernierLabel=self.indexDernierLabel+1
136       nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
137       if hasattr(self,nomLineEdit) : 
138          self.indexDernierLabel=self.indexDernierLabel-1
139          return
140       nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
141       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
142       nouveauLE.setText("")
143       if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
144       else :                               nouveauLE.setStyleSheet("background:rgb(235,235,235)")
145       nouveauLE.setFrame(False)
146       nouveauLE.returnPressed.connect(self.changeValeur)
147
148       setattr(self,nomLineEdit,nouveauLE)
149       self.listeAffichageWidget.append(nouveauLE)
150       self.etablitOrdre()
151       if valeur != None : nouveauLE.setText(str(valeur))
152       # deux lignes pour que le ensureVisible fonctionne
153       self.estVisible=nouveauLE
154       if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
155
156   def etablitOrdre(self):
157       i=0
158       while(i +1 < len(self.listeAffichageWidget)):
159          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
160          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
161          i=i+1
162       # si on boucle on perd l'ordre
163
164
165   def rendVisibleLigne(self):
166       QApplication.processEvents()
167       self.estVisible.setFocus()
168       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
169       
170
171   def finCommentaire(self):
172       return self.finCommentaireListe()
173
174   def ajout1Valeur(self,valeur=None):
175         if valeur == None : return
176         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
177         if validite == 0 : return
178         if liste ==[]    : return
179         listeVal=[]
180         for valeur in self.listeValeursCourantes : listeVal.append(valeur)
181         validite,comm,comm2,listeRetour=self.politique.ajoutValeurs(liste,-1,listeVal)
182         if (comm2 != "" and comm != None) : return comm2
183         if validite : 
184            self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
185            if len(self.listeValeursCourantes) > self.monSimpDef.min :
186               self.node.item.setValeur(self.listeValeursCourantes)
187               self.reaffiche()
188            return None
189         else :
190            return(comm2+" "+comm)
191         
192   def reaffiche(self):
193       # A priori, on ne fait rien
194       pass
195
196                 
197   def ajoutNValeur(self,liste):
198   #----------------------------
199   # attention quand on charge par un fichier, on ne peut pas se contenter d ajouter N fois 1 valeur
200   # car alors le temps de verification devient prohibitif  reconstructu=ion et verification a 
201   # chaque valeur. d ou l ajout de ajoutNTuple a politique plusieurs
202
203            
204         listeFormatee=list(liste)
205
206         min,max=self.node.item.getMinMax()
207         if self.objSimp.valeur == None : listeComplete=listeFormatee
208         else : listeComplete =self.objSimp.valeur + listeFormatee
209
210         if len(listeComplete) > max : 
211            texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
212            self.editor.afficheInfos(texte,Qt.red)
213            return
214
215         validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
216         if not validite : 
217            self.editor.affiche_infos(texte,Qt.red)
218            return
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       retour=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   def leaveEventScrollArea(self,event):
300        self.changeValeur(changeDePlace=False)
301        QScrollArea.leaveEvent(self.scrollArea,event)
302
303 # Avertissement quand on quitte le widget