1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 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 .feuille import Feuille
39 from desWidgetPlusieursBase import Ui_WidgetPlusieursBase
40 from .politiquesValidation import PolitiquePlusieurs
41 from .qtSaisie import SaisieValeur
42 from .gereListe import GereListe
43 from .gereListe import GerePlie
44 from .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
100 def setValeurs(self):
101 self.vScrollBar = self.scrollArea.verticalScrollBar()
102 self.politique=PolitiquePlusieurs(self.node,self.editor)
103 # construction du min de valeur a entrer
104 if self.monSimpDef.max == "**" : aConstruire=7
105 elif self.monSimpDef.max == float('inf'): aConstruire=7
106 else : aConstruire=self.monSimpDef.max
108 for i in range(1,aConstruire):
110 QApplication.processEvents()
111 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
112 self.listeValeursCourantes=self.node.item.GetListeValeurs()
114 for valeur in self.listeValeursCourantes :
115 val=self.politique.GetValeurTexte(valeur)
116 nomLineEdit="lineEditVal"+str(index)
117 if hasattr(self,nomLineEdit) :
118 courant=getattr(self,nomLineEdit)
119 if 'R' in self.objSimp.definition.type and str(val) != repr(val) : courant.setText(repr(val))
120 else : courant.setText(str(val))
122 self.ajoutLineEdit(val)
124 # ajout d'une ligne vide ou affichage commentaire
125 if self.indexDernierLabel < self.monSimpDef.max : self.ajoutLineEdit()
126 else : self.scrollArea.setToolTip('nb max de valeurs atteint')
128 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
131 def ajoutLineEdit(self,valeur=None,):
132 self.indexDernierLabel=self.indexDernierLabel+1
133 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
134 if hasattr(self,nomLineEdit) :
135 self.indexDernierLabel=self.indexDernierLabel-1
137 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
138 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
139 nouveauLE.setText("")
140 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
141 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
142 nouveauLE.setFrame(False)
143 nouveauLE.returnPressed.connect(self.changeValeur)
145 setattr(self,nomLineEdit,nouveauLE)
146 self.listeAffichageWidget.append(nouveauLE)
148 if valeur != None : nouveauLE.setText(str(valeur))
149 # deux lignes pour que le ensureVisible fonctionne
150 self.estVisible=nouveauLE
151 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
152 #if donneLeFocus==True : nouveauLE.setFocus()
154 def etablitOrdre(self):
156 while(i +1 < len(self.listeAffichageWidget)):
157 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
158 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
160 # si on boucle on perd l'ordre
163 def rendVisibleLigne(self):
164 QApplication.processEvents()
165 self.estVisible.setFocus()
166 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
169 def finCommentaire(self):
170 return self.finCommentaireListe()
172 def ajout1Valeur(self,valeur=None):
173 if valeur == None : return
174 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
175 if validite == 0 : return
176 if liste ==[] : return
178 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
179 validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
180 if (comm2 != "" and comm != None) : return comm2
182 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
183 if len(self.listeValeursCourantes) > self.monSimpDef.min :
184 self.node.item.set_valeur(self.listeValeursCourantes)
188 return(comm2+" "+comm)
191 # A priori, on ne fait rien
194 def ajoutNValeur(self,liste) :
198 while i < self.indexDernierLabel+1:
199 nomLineEdit="lineEditVal"+str(i)
200 courant=getattr(self,nomLineEdit)
201 valeur=courant.text()
202 if valeur == None or valeur == "" :
204 courant.setText(str(val))
205 commentaire=self.ajout1Valeur(val)
206 if (commentaire != None ):
207 self.editor.affiche_infos(commentaire,Qt.red)
213 self.ajoutLineEdit(valeur=str(val))
217 def changeValeur(self,changeDePlace=True,oblige=False):
220 self.listeValeursCourantes = []
221 fin=self.indexDernierLabel
222 for i in range (1, fin):
223 nomLineEdit="lineEditVal"+str(i)
224 courant=getattr(self,nomLineEdit)
225 valeur=courant.text()
226 lval=valeur.split(',')
229 msgBox.setText("separator ',' ")
230 msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
231 msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
232 msgBox.setDefaultButton(QMessageBox.Ok)
237 courant.setText(lval[0])
238 self.ajoutNValeur(lval[1:])
239 self.listeValeursCourantes = []
241 for i in range (1, self.indexDernierLabel+1):
242 nomLineEdit="lineEditVal"+str(i)
243 courant=getattr(self,nomLineEdit)
244 valeur=courant.text()
245 if valeur != None and valeur != "" :
246 commentaire=self.ajout1Valeur(valeur)
247 if (commentaire != None ):
248 self.editor.affiche_infos(commentaire,Qt.red)
254 self.editor.affiche_infos("")
255 elif donneFocus==None : donneFocus=courant
257 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
258 dernier=getattr(self,nomDernierLineEdit)
259 derniereValeur=dernier.text()
261 if donneFocus != None :
262 donneFocus.setFocus()
263 self.scrollArea.ensureWidgetVisible(donneFocus)
264 elif self.indexDernierLabel < self.monSimpDef.max :
266 if self.listeValeursCourantes == [] : return
267 min,max = self.node.item.GetMinMax()
268 if len(self.listeValeursCourantes) < self.monSimpDef.min :
269 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
270 if len(self.listeValeursCourantes) < min and oblige==True: return
271 if len(self.listeValeursCourantes) > max : return
272 self.node.item.set_valeur(self.listeValeursCourantes)
273 if len(self.listeValeursCourantes) == self.monSimpDef.max :
274 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
280 # Avertissement quand on quitte le widget