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
33 from PyQt5.QtCore import QTimer, QSize, Qt
36 from Extensions.i18n import tr
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
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())
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
110 for i in range(1,aConstruire):
112 QApplication.processEvents()
113 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
114 self.listeValeursCourantes=self.node.item.getListeValeurs()
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))
124 self.ajoutLineEdit(val)
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')
130 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
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
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)
147 setattr(self,nomLineEdit,nouveauLE)
148 self.listeAffichageWidget.append(nouveauLE)
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)
155 def etablitOrdre(self):
157 while(i +1 < len(self.listeAffichageWidget)):
158 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
159 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
161 # si on boucle on perd l'ordre
164 def rendVisibleLigne(self):
165 QApplication.processEvents()
166 self.estVisible.setFocus()
167 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
170 def finCommentaire(self):
171 return self.finCommentaireListe()
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
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
183 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
184 if len(self.listeValeursCourantes) > self.monSimpDef.min :
185 self.node.item.setValeur(self.listeValeursCourantes)
189 return(comm2+" "+comm)
192 # A priori, on ne fait rien
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
203 listeFormatee=list(liste)
205 min,max=self.node.item.getMinMax()
206 if self.objSimp.valeur == None : listeComplete=listeFormatee
207 else : listeComplete =self.objSimp.valeur + listeFormatee
209 if len(listeComplete) > max :
210 texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
211 self.editor.afficheInfos(texte,Qt.red)
214 validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
216 self.editor.affiche_infos(texte,Qt.red)
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
223 self.politique.recordValeur(listeComplete)
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))
233 self.ajoutLineEdit(texte)
234 indexDernierRempli = indexDernierRempli + 1
237 def changeValeur(self,changeDePlace=True,oblige=False):
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(',')
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)
257 courant.setText(lval[0])
258 self.ajoutNValeur(lval[1:])
259 self.listeValeursCourantes = []
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)
274 self.editor.afficheInfos("")
275 elif donneFocus==None : donneFocus=courant
277 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
278 dernier=getattr(self,nomDernierLineEdit)
279 derniereValeur=dernier.text()
281 if donneFocus != None :
282 donneFocus.setFocus()
283 self.scrollArea.ensureWidgetVisible(donneFocus)
284 elif self.indexDernierLabel < self.monSimpDef.max :
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'))
300 # Avertissement quand on quitte le widget