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.nomLine="lineEditVal"
55 self.indexDernierLabel=0
56 self.NumLineEditEnCours=0
57 self.listeAffichageWidget=[]
58 Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
59 GereListe.__init__(self)
61 self.BSelectFichier.clicked.connect(self.selectInFile)
63 if sys.platform[0:5]!="linux":
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 if self.editor.salome :
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)
144 setattr(self,nomLineEdit,nouveauLE)
145 self.listeAffichageWidget.append(nouveauLE)
147 if valeur != None : nouveauLE.setText(str(valeur))
148 # deux lignes pour que le ensureVisible fonctionne
149 self.estVisible=nouveauLE
150 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
151 #if donneLeFocus==True : nouveauLE.setFocus()
153 def etablitOrdre(self):
155 while(i +1 < len(self.listeAffichageWidget)):
156 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
157 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
159 # si on boucle on perd l'ordre
162 def rendVisibleLigne(self):
163 QApplication.processEvents()
164 self.estVisible.setFocus()
165 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
168 def finCommentaire(self):
169 return self.finCommentaireListe()
171 def ajout1Valeur(self,valeur=None):
172 if valeur == None : return
173 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
174 if validite == 0 : return
175 if liste ==[] : return
177 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
178 validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
179 if (comm2 != "" and comm != None) : return comm2
181 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
182 if len(self.listeValeursCourantes) > self.monSimpDef.min :
183 self.node.item.set_valeur(self.listeValeursCourantes)
187 return(comm2+" "+comm)
190 # A priori, on ne fait rien
193 def ajoutNValeur(self,liste) :
197 while i < self.indexDernierLabel+1:
198 nomLineEdit="lineEditVal"+str(i)
199 courant=getattr(self,nomLineEdit)
200 valeur=courant.text()
201 if valeur == None or valeur == "" :
203 courant.setText(str(val))
204 commentaire=self.ajout1Valeur(val)
205 if (commentaire != None ):
206 self.editor.affiche_infos(commentaire,Qt.red)
212 self.ajoutLineEdit(valeur=str(val))
216 def changeValeur(self,changeDePlace=True,oblige=False):
219 self.listeValeursCourantes = []
220 fin=self.indexDernierLabel
221 for i in range (1, fin):
222 nomLineEdit="lineEditVal"+str(i)
223 courant=getattr(self,nomLineEdit)
224 valeur=courant.text()
225 lval=valeur.split(',')
228 msgBox.setText("separator ',' ")
229 msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
230 msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
231 msgBox.setDefaultButton(QMessageBox.Ok)
236 courant.setText(lval[0])
237 self.ajoutNValeur(lval[1:])
238 self.listeValeursCourantes = []
240 for i in range (1, self.indexDernierLabel+1):
241 nomLineEdit="lineEditVal"+str(i)
242 courant=getattr(self,nomLineEdit)
243 valeur=courant.text()
244 if valeur != None and valeur != "" :
245 commentaire=self.ajout1Valeur(valeur)
246 if (commentaire != None ):
247 self.editor.affiche_infos(commentaire,Qt.red)
253 self.editor.affiche_infos("")
254 elif donneFocus==None : donneFocus=courant
256 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
257 dernier=getattr(self,nomDernierLineEdit)
258 derniereValeur=dernier.text()
260 if donneFocus != None :
261 donneFocus.setFocus()
262 self.scrollArea.ensureWidgetVisible(donneFocus)
263 elif self.indexDernierLabel < self.monSimpDef.max :
265 if self.listeValeursCourantes == [] : return
266 min,max = self.node.item.GetMinMax()
267 if len(self.listeValeursCourantes) < self.monSimpDef.min :
268 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
269 if len(self.listeValeursCourantes) < min and oblige==True: return
270 if len(self.listeValeursCourantes) > max : return
271 self.node.item.set_valeur(self.listeValeursCourantes)
272 if len(self.listeValeursCourantes) == self.monSimpDef.max :
273 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
279 # Avertissement quand on quitte le widget