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))
77 self.listeValeursCourantes=self.node.item.GetListeValeurs()
78 self.monSimpDef.max = 3
79 if self.monSimpDef.max != "**" and self.monSimpDef.max < 7:
80 hauteurMax=dicoLongueur[self.monSimpDef.max]
83 # if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
84 self.resize(self.width(),hauteurMax)
85 self.setMinimumHeight(hauteurMax)
86 self.finCommentaireListe()
87 self.parentQt.commandesLayout.insertWidget(-1,self)
88 self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
89 self.AAfficher=self.lineEditVal1
94 self.vScrollBar = self.scrollArea.verticalScrollBar()
95 self.politique=PolitiquePlusieurs(self.node,self.editor)
96 # construction du min de valeur a entrer
97 self.monSimpDef.max = 3
98 if self.monSimpDef.max == "**" : aConstruire=7
99 elif self.monSimpDef.max == float('inf'): aConstruire=7
100 else : aConstruire=self.monSimpDef.max
102 for i in range(1,aConstruire):
104 QApplication.processEvents()
105 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
106 self.listeValeursCourantes=self.node.item.GetListeValeurs()
108 for valeur in self.listeValeursCourantes :
109 val=self.politique.GetValeurTexte(valeur)
110 nomLineEdit="lineEditVal"+str(index)
111 if hasattr(self,nomLineEdit) :
112 courant=getattr(self,nomLineEdit)
113 if 'R' in self.objSimp.definition.type and str(val) != repr(val) : courant.setText(repr(val))
114 else : courant.setText(str(val))
116 self.ajoutLineEdit(val)
118 # ajout d'une ligne vide ou affichage commentaire
119 if self.indexDernierLabel < self.monSimpDef.max : self.ajoutLineEdit()
120 else : self.scrollArea.setToolTip('nb max de valeurs atteint')
122 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
125 def ajoutLineEdit(self,valeur=None,):
126 self.indexDernierLabel=self.indexDernierLabel+1
127 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
128 if hasattr(self,nomLineEdit) :
129 self.indexDernierLabel=self.indexDernierLabel-1
131 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
132 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
133 nouveauLE.setText("")
134 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
135 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
136 nouveauLE.setFrame(False)
137 nouveauLE.returnPressed.connect(self.changeValeur)
138 setattr(self,nomLineEdit,nouveauLE)
139 self.listeAffichageWidget.append(nouveauLE)
141 if valeur != None : nouveauLE.setText(str(valeur))
142 # deux lignes pour que le ensureVisible fonctionne
143 self.estVisible=nouveauLE
144 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
145 #if donneLeFocus==True : nouveauLE.setFocus()
147 def etablitOrdre(self):
149 while(i +1 < len(self.listeAffichageWidget)):
150 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
151 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
153 # si on boucle on perd l'ordre
156 def rendVisibleLigne(self):
157 QApplication.processEvents()
158 self.estVisible.setFocus()
159 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
162 def finCommentaire(self):
163 return self.finCommentaireListe()
165 def ajout1Valeur(self,valeur=None):
166 if valeur == None : return
167 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
168 if validite == 0 : return
169 if liste ==[] : return
171 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
172 validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
173 if (comm2 != "" and comm != None) : return comm2
175 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
176 if len(self.listeValeursCourantes) > self.monSimpDef.min :
177 self.node.item.set_valeur(self.listeValeursCourantes)
181 return(comm2+" "+comm)
184 # A priori, on ne fait rien
187 def ajoutNValeur(self,liste) :
191 while i < self.indexDernierLabel+1:
192 nomLineEdit="lineEditVal"+str(i)
193 courant=getattr(self,nomLineEdit)
194 valeur=courant.text()
195 if valeur == None or valeur == "" :
197 courant.setText(str(val))
198 commentaire=self.ajout1Valeur(val)
199 if (commentaire != None ):
200 self.editor.affiche_infos(commentaire,Qt.red)
206 self.ajoutLineEdit(valeur=str(val))
210 def changeValeur(self,changeDePlace=True,oblige=False):
213 self.listeValeursCourantes = []
214 fin=self.indexDernierLabel
215 for i in range (1, fin):
216 nomLineEdit="lineEditVal"+str(i)
217 courant=getattr(self,nomLineEdit)
218 valeur=courant.text()
219 lval=valeur.split(',')
222 msgBox.setText("separator ',' ")
223 msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
224 msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
225 msgBox.setDefaultButton(QMessageBox.Ok)
230 courant.setText(lval[0])
231 self.ajoutNValeur(lval[1:])
232 self.listeValeursCourantes = []
234 for i in range (1, self.indexDernierLabel+1):
235 nomLineEdit="lineEditVal"+str(i)
236 courant=getattr(self,nomLineEdit)
237 valeur=courant.text()
238 if valeur != None and valeur != "" :
239 commentaire=self.ajout1Valeur(valeur)
240 if (commentaire != None ):
241 self.editor.affiche_infos(commentaire,Qt.red)
247 self.editor.affiche_infos("")
248 elif donneFocus==None : donneFocus=courant
250 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
251 dernier=getattr(self,nomDernierLineEdit)
252 derniereValeur=dernier.text()
254 if donneFocus != None :
255 donneFocus.setFocus()
256 self.scrollArea.ensureWidgetVisible(donneFocus)
257 elif self.indexDernierLabel < self.monSimpDef.max :
259 if self.listeValeursCourantes == [] : return
260 min,max = self.node.item.GetMinMax()
261 if len(self.listeValeursCourantes) < self.monSimpDef.min :
262 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
263 if len(self.listeValeursCourantes) < min and oblige==True: return
264 if len(self.listeValeursCourantes) > max : return
265 self.node.item.set_valeur(self.listeValeursCourantes)
266 if len(self.listeValeursCourantes) == self.monSimpDef.max :
267 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
273 # Avertissement quand on quitte le widget