1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2017 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 from __future__ import absolute_import
23 from builtins import str
24 from builtins import range
25 from builtins import object
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
36 from Extensions.i18n import tr
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
46 dicoLongueur={2:95,3:125,4:154,5:183,6:210,float('inf'):210}
49 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
51 def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
52 #print "MonWidgetPlusieursBase", nom
53 self.inFocusOutEvent=False
54 self.nomLine="lineEditVal"
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)
62 self.BSelectFichier.clicked.connect(self.selectInFile)
64 if sys.platform[0:5]!="linux":
65 repIcon=self.node.editor.appliEficas.repIcon
66 fichier=os.path.join(repIcon, 'arrow_up.png')
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)
85 self.listeValeursCourantes=self.node.item.getListeValeurs()
86 if self.monSimpDef.max != "**" and self.monSimpDef.max < 7:
87 hauteurMax=dicoLongueur[self.monSimpDef.max]
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
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
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
111 for i in range(1,aConstruire):
113 QApplication.processEvents()
114 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
115 self.listeValeursCourantes=self.node.item.getListeValeurs()
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))
125 self.ajoutLineEdit(val)
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')
131 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
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
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)
148 setattr(self,nomLineEdit,nouveauLE)
149 self.listeAffichageWidget.append(nouveauLE)
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)
156 def etablitOrdre(self):
158 while(i +1 < len(self.listeAffichageWidget)):
159 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
160 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
162 # si on boucle on perd l'ordre
165 def rendVisibleLigne(self):
166 QApplication.processEvents()
167 self.estVisible.setFocus()
168 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
171 def finCommentaire(self):
172 return self.finCommentaireListe()
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
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
184 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
185 if len(self.listeValeursCourantes) > self.monSimpDef.min :
186 self.node.item.setValeur(self.listeValeursCourantes)
190 return(comm2+" "+comm)
193 # A priori, on ne fait rien
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
204 listeFormatee=list(liste)
206 min,max=self.node.item.getMinMax()
207 if self.objSimp.valeur == None : listeComplete=listeFormatee
208 else : listeComplete =self.objSimp.valeur + listeFormatee
210 if len(listeComplete) > max :
211 texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
212 self.editor.afficheInfos(texte,Qt.red)
215 validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
217 self.editor.affiche_infos(texte,Qt.red)
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
224 self.politique.recordValeur(listeComplete)
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))
234 self.ajoutLineEdit(texte)
235 indexDernierRempli = indexDernierRempli + 1
238 def changeValeur(self,changeDePlace=True,oblige=False):
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(',')
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)
258 courant.setText(lval[0])
259 self.ajoutNValeur(lval[1:])
260 self.listeValeursCourantes = []
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)
275 self.editor.afficheInfos("")
276 elif donneFocus==None : donneFocus=courant
278 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
279 dernier=getattr(self,nomDernierLineEdit)
280 derniereValeur=dernier.text()
282 if donneFocus != None :
283 donneFocus.setFocus()
284 self.scrollArea.ensureWidgetVisible(donneFocus)
285 elif self.indexDernierLabel < self.monSimpDef.max :
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'))
299 def leaveEventScrollArea(self,event):
300 self.changeValeur(changeDePlace=False)
301 QScrollArea.leaveEvent(self.scrollArea,event)
303 # Avertissement quand on quitte le widget