1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021 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 object
29 from six.moves import range
30 from PyQt5.QtGui import QIcon
31 from PyQt5.QtWidgets import QApplication, QMessageBox, QScrollArea
32 from PyQt5.QtCore import QTimer, QSize, Qt
35 from Extensions.i18n import tr
37 from InterfaceQT4.feuille import Feuille
38 from desWidgetPlusieursBase import Ui_WidgetPlusieursBase
39 from InterfaceQT4.politiquesValidation import PolitiquePlusieurs
40 from InterfaceQT4.qtSaisie import SaisieValeur
41 from InterfaceQT4.gereListe import GereListe
42 from InterfaceQT4.gereListe import GerePlie
43 from InterfaceQT4.gereListe import LECustom
45 dicoLongueur={2:95,3:125,4:154,5:183,6:210,float('inf'):210}
48 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
50 def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
51 #print "MonWidgetPlusieursBase", nom
52 self.inFocusOutEvent=False
53 self.nomLine="lineEditVal"
55 self.indexDernierLabel=0
56 self.numLineEditEnCours=0
57 self.listeAffichageWidget=[]
59 Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
60 GereListe.__init__(self)
62 self.BSelectFichier.clicked.connect(self.selectInFile)
64 repIcon=self.node.editor.appliEficas.repIcon
65 fichier=os.path.join(repIcon, 'arrow_up.png')
67 self.RBHaut.setIcon(icon)
68 self.RBHaut.setIconSize(QSize(32, 32))
69 fichier2=os.path.join(repIcon, 'arrow_down.png')
70 icon2 = QIcon(fichier2)
71 self.RBBas.setIcon(icon2)
72 fichier3=os.path.join(repIcon, 'file-explorer.png')
73 icon3 = QIcon(fichier2)
74 self.BSelectFichier.setIcon(icon3)
75 self.BSelectFichier.setIconSize(QSize(32, 32))
76 icon=QIcon(self.repIcon+"/MoinsBleu.png")
77 self.RBMoins.setIcon(icon)
78 icon=QIcon(self.repIcon+"/PlusBleu.png")
79 self.RBPlus.setIcon(icon)
80 icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
81 self.RBVoisListe.setIcon(icon)
84 self.listeValeursCourantes=self.node.item.getListeValeurs()
85 if self.monSimpDef.max != "**" and self.monSimpDef.max < 7:
86 hauteurMax=dicoLongueur[self.monSimpDef.max]
89 # if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
90 self.resize(self.width(),hauteurMax)
91 self.setMinimumHeight(hauteurMax)
92 self.finCommentaireListe()
93 self.parentQt.commandesLayout.insertWidget(-1,self)
94 self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
95 self.AAfficher=self.lineEditVal1
97 # PNPN a completer __ si tuple le type des tuples sinon le tuple
99 #self.monCommentaireLabel.setText(self.finCommentaireListe())
100 self.monCommentaireLabel.setText("")
101 self.scrollArea.leaveEvent = self.leaveEventScrollArea
102 self.inhibeChangeValeur = False
103 self.dejaAverti = False
106 def setValeurs(self):
107 self.vScrollBar = self.scrollArea.verticalScrollBar()
108 self.politique=PolitiquePlusieurs(self.node,self.editor)
109 # construction du min de valeur a entrer
110 if self.monSimpDef.max == "**" : aConstruire=7
111 elif self.monSimpDef.max == float('inf'): aConstruire=7
112 else : aConstruire=self.monSimpDef.max
114 for i in range(1,aConstruire):
116 QApplication.processEvents()
117 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
118 self.listeValeursCourantes=self.node.item.getListeValeurs()
120 for valeur in self.listeValeursCourantes :
121 val=self.politique.getValeurTexte(valeur)
122 nomLineEdit="lineEditVal"+str(index)
123 if hasattr(self,nomLineEdit) :
124 courant=getattr(self,nomLineEdit)
125 if 'R' in self.objSimp.definition.type and str(val) != repr(val) : courant.setText(repr(val))
126 else : courant.setText(str(val))
127 self.dictLE[index]=val
129 self.ajoutLineEdit(val)
131 # ajout d'une ligne vide ou affichage commentaire
132 if self.indexDernierLabel < self.monSimpDef.max : self.ajoutLineEdit()
133 else : self.scrollArea.setToolTip('nb max de valeurs atteint')
135 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
138 def ajoutLineEdit(self,valeur=None,):
139 #print ('ajoutLineEdit plusieursBase')
140 #print ('self.indexDernierLabel', self.indexDernierLabel)
141 self.indexDernierLabel=self.indexDernierLabel+1
142 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
143 if hasattr(self,nomLineEdit) :
144 self.indexDernierLabel=self.indexDernierLabel-1
146 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
147 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
148 nouveauLE.setText("")
149 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
150 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
151 nouveauLE.setFrame(False)
152 nouveauLE.returnPressed.connect(self.changeValeur)
154 setattr(self,nomLineEdit,nouveauLE)
155 self.listeAffichageWidget.append(nouveauLE)
158 nouveauLE.setText(str(valeur))
159 self.dictLE[self.indexDernierLabel] = valeur
161 self.dictLE[self.indexDernierLabel] = None
162 # deux lignes pour que le ensureVisible fonctionne
163 self.estVisible=nouveauLE
164 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
166 def etablitOrdre(self):
168 while(i +1 < len(self.listeAffichageWidget)):
169 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
170 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
172 # si on boucle on perd l'ordre
175 def rendVisibleLigne(self):
176 QApplication.processEvents()
177 self.estVisible.setFocus()
178 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
181 def finCommentaire(self):
182 return self.finCommentaireListe()
184 def ajout1Valeur(self,valeur=None):
185 print ('ajout1Valeur plusieursBase')
186 if valeur == None : return
187 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
188 if validite == 0 : return
189 if liste ==[] : return
191 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
192 validite,comm,comm2,listeRetour=self.politique.ajoutValeurs(liste,-1,listeVal)
193 if (comm2 != "" and comm != None) : return comm2
195 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
196 if len(self.listeValeursCourantes) > self.monSimpDef.min :
197 self.node.item.setValeur(self.listeValeursCourantes)
201 return(comm2+" "+comm)
204 # A priori, on ne fait rien
208 def ajoutNValeur(self,liste):
209 #print ('ajoutNValeur plusieursBase')
210 #----------------------------
211 # attention quand on charge par un fichier, on ne peut pas se contenter d ajouter N fois 1 valeur
212 # car alors le temps de verification devient prohibitif reconstructu=ion et verification a
213 # chaque valeur. d ou l ajout de ajoutNTuple a politique plusieurs
216 listeFormatee=list(liste)
218 min,max=self.node.item.getMinMax()
219 if self.objSimp.valeur == None : listeComplete=listeFormatee
220 else : listeComplete =self.objSimp.valeur + listeFormatee
222 if len(listeComplete) > max :
223 texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
224 self.editor.afficheInfos(texte,Qt.red)
227 validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
229 self.editor.affiche_infos(texte,Qt.red)
232 # on calcule le dernier lineedit rempli avant de changer la valeur
233 if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
234 else : indexDernierRempli=0
236 self.politique.recordValeur(listeComplete)
239 while ( indexDernierRempli < len(liste) ) :
240 texte=liste[indexDernierRempli]
241 if indexDernierRempli < self.indexDernierLabel:
242 nomLineEdit="lineEditVal"+str(indexDernierRempli+1)
243 courant=getattr(self,nomLineEdit)
244 courant.setText(str(texte))
246 self.ajoutLineEdit(texte)
247 indexDernierRempli = indexDernierRempli + 1
250 def changeValeur(self,changeDePlace=True,oblige=False):
251 #print ('achangeValeur plusieursBase', self)
253 #traceback.print_stack()
254 if self.inhibeChangeValeur : return
255 self.inhibeChangeValeur = True
258 self.listeValeursCourantes = []
259 fin=self.indexDernierLabel
260 if (not('TXM' in self.objSimp.definition.type)) and not (self.dejaAverti):
261 for i in range (1, fin):
262 nomLineEdit="lineEditVal"+str(i)
263 courant=getattr(self,nomLineEdit)
264 valeur=courant.text()
265 lval=valeur.split(',')
267 self.dejaAverti = True
268 QMessageBox.warning(self,tr('"," used'), 'Perhaps, character "," is used in ' +str( valeur) + 'intead of "."')
270 # msgBox = QMessageBox()
271 # msgBox.setText("separator ',' ")
272 # msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
273 # msgBox.setInformativeText (" you want to enter " + str (lval) + "?")
274 # msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
275 # msgBox.setDefaultButton(QMessageBox.Ok)
277 # tres dicutable 20210401 j enleve la boucle
278 # if faut remtrre self.inhibeChangeValeur si on la reactive
280 # courant.setText(lval[0])
281 # self.ajoutNValeur(lval[1:])
282 # self.listeValeursCourantes = []
285 for i in range (1, self.indexDernierLabel+1):
286 nomLineEdit="lineEditVal"+str(i)
287 courant=getattr(self,nomLineEdit)
288 valeur=courant.text()
289 if valeur != None and valeur != "" :
290 commentaire=self.ajout1Valeur(valeur)
291 if (commentaire != None ):
292 self.editor.afficheInfos(commentaire,Qt.red)
298 self.editor.afficheInfos("")
299 elif donneFocus==None : donneFocus=courant
301 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
302 dernier=getattr(self,nomDernierLineEdit)
303 derniereValeur=dernier.text()
305 if donneFocus != None :
306 donneFocus.setFocus()
307 self.scrollArea.ensureWidgetVisible(donneFocus)
308 elif self.indexDernierLabel < self.monSimpDef.max :
310 if self.listeValeursCourantes == [] : return
311 min,max = self.node.item.getMinMax()
312 if len(self.listeValeursCourantes) < self.monSimpDef.min :
313 self.editor.afficheInfos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
314 if len(self.listeValeursCourantes) < min and oblige==True: return
315 if len(self.listeValeursCourantes) > max : return
316 retour=self.node.item.setValeur(self.listeValeursCourantes)
317 if len(self.listeValeursCourantes) == self.monSimpDef.max :
318 self.editor.afficheInfos(tr('nb max de valeurs atteint'))
321 self.inhibeChangeValeur = False
323 def leaveEventScrollArea(self,event):
324 #print ('achangeValeur plusieursBase')
325 self.changeValeur(changeDePlace=False)
326 QScrollArea.leaveEvent(self.scrollArea,event)
328 # Avertissement quand on quitte le widget