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 if self.editor.salome :
78 icon=QIcon(self.repIcon+"/MoinsBleu.png")
79 self.RBMoins.setIcon(icon)
80 icon=QIcon(self.repIcon+"/PlusBleu.png")
81 self.RBPlus.setIcon(icon)
82 icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
83 self.RBVoisListe.setIcon(icon)
86 self.listeValeursCourantes=self.node.item.GetListeValeurs()
87 if self.monSimpDef.max != "**" and self.monSimpDef.max < 7:
88 hauteurMax=dicoLongueur[self.monSimpDef.max]
91 # if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
92 self.resize(self.width(),hauteurMax)
93 self.setMinimumHeight(hauteurMax)
94 self.finCommentaireListe()
95 self.parentQt.commandesLayout.insertWidget(-1,self)
96 self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
97 self.AAfficher=self.lineEditVal1
101 def setValeurs(self):
102 self.vScrollBar = self.scrollArea.verticalScrollBar()
103 self.politique=PolitiquePlusieurs(self.node,self.editor)
104 # construction du min de valeur a entrer
105 if self.monSimpDef.max == "**" : aConstruire=7
106 elif self.monSimpDef.max == float('inf'): aConstruire=7
107 else : aConstruire=self.monSimpDef.max
109 for i in range(1,aConstruire):
111 QApplication.processEvents()
112 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
113 self.listeValeursCourantes=self.node.item.GetListeValeurs()
115 for valeur in self.listeValeursCourantes :
116 val=self.politique.GetValeurTexte(valeur)
117 nomLineEdit="lineEditVal"+str(index)
118 if hasattr(self,nomLineEdit) :
119 courant=getattr(self,nomLineEdit)
120 if 'R' in self.objSimp.definition.type and str(val) != repr(val) : courant.setText(repr(val))
121 else : courant.setText(str(val))
123 self.ajoutLineEdit(val)
125 # ajout d'une ligne vide ou affichage commentaire
126 if self.indexDernierLabel < self.monSimpDef.max : self.ajoutLineEdit()
127 else : self.scrollArea.setToolTip('nb max de valeurs atteint')
129 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
132 def ajoutLineEdit(self,valeur=None,):
133 self.indexDernierLabel=self.indexDernierLabel+1
134 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
135 if hasattr(self,nomLineEdit) :
136 self.indexDernierLabel=self.indexDernierLabel-1
138 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
139 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
140 nouveauLE.setText("")
141 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
142 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
143 nouveauLE.setFrame(False)
144 nouveauLE.returnPressed.connect(self.changeValeur)
146 setattr(self,nomLineEdit,nouveauLE)
147 self.listeAffichageWidget.append(nouveauLE)
149 if valeur != None : nouveauLE.setText(str(valeur))
150 # deux lignes pour que le ensureVisible fonctionne
151 self.estVisible=nouveauLE
152 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
153 #if donneLeFocus==True : nouveauLE.setFocus()
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.set_valeur(self.listeValeursCourantes)
189 return(comm2+" "+comm)
192 # A priori, on ne fait rien
195 def ajoutNValeur(self,liste) :
199 while i < self.indexDernierLabel+1:
200 nomLineEdit="lineEditVal"+str(i)
201 courant=getattr(self,nomLineEdit)
202 valeur=courant.text()
203 if valeur == None or valeur == "" :
205 courant.setText(str(val))
206 commentaire=self.ajout1Valeur(val)
207 if (commentaire != None ):
208 self.editor.affiche_infos(commentaire,Qt.red)
214 self.ajoutLineEdit(valeur=str(val))
218 def changeValeur(self,changeDePlace=True,oblige=False):
221 self.listeValeursCourantes = []
222 fin=self.indexDernierLabel
223 for i in range (1, fin):
224 nomLineEdit="lineEditVal"+str(i)
225 courant=getattr(self,nomLineEdit)
226 valeur=courant.text()
227 lval=valeur.split(',')
230 msgBox.setText("separator ',' ")
231 msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
232 msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
233 msgBox.setDefaultButton(QMessageBox.Ok)
238 courant.setText(lval[0])
239 self.ajoutNValeur(lval[1:])
240 self.listeValeursCourantes = []
242 for i in range (1, self.indexDernierLabel+1):
243 nomLineEdit="lineEditVal"+str(i)
244 courant=getattr(self,nomLineEdit)
245 valeur=courant.text()
246 if valeur != None and valeur != "" :
247 commentaire=self.ajout1Valeur(valeur)
248 if (commentaire != None ):
249 self.editor.affiche_infos(commentaire,Qt.red)
255 self.editor.affiche_infos("")
256 elif donneFocus==None : donneFocus=courant
258 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
259 dernier=getattr(self,nomDernierLineEdit)
260 derniereValeur=dernier.text()
262 if donneFocus != None :
263 donneFocus.setFocus()
264 self.scrollArea.ensureWidgetVisible(donneFocus)
265 elif self.indexDernierLabel < self.monSimpDef.max :
267 if self.listeValeursCourantes == [] : return
268 min,max = self.node.item.GetMinMax()
269 if len(self.listeValeursCourantes) < self.monSimpDef.min :
270 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
271 if len(self.listeValeursCourantes) < min and oblige==True: return
272 if len(self.listeValeursCourantes) > max : return
273 self.node.item.set_valeur(self.listeValeursCourantes)
274 if len(self.listeValeursCourantes) == self.monSimpDef.max :
275 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
281 # Avertissement quand on quitte le widget