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 if self.monSimpDef.max != "**" and self.monSimpDef.max < 7:
79 hauteurMax=dicoLongueur[self.monSimpDef.max]
82 # if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
83 self.resize(self.width(),hauteurMax)
84 self.setMinimumHeight(hauteurMax)
85 self.finCommentaireListe()
86 self.parentQt.commandesLayout.insertWidget(-1,self)
87 self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
88 self.AAfficher=self.lineEditVal1
93 self.vScrollBar = self.scrollArea.verticalScrollBar()
94 self.politique=PolitiquePlusieurs(self.node,self.editor)
95 # construction du min de valeur a entrer
96 if self.monSimpDef.max == "**" : aConstruire=7
97 elif self.monSimpDef.max == float('inf'): aConstruire=7
98 else : aConstruire=self.monSimpDef.max
100 for i in range(1,aConstruire):
102 QApplication.processEvents()
103 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
104 self.listeValeursCourantes=self.node.item.GetListeValeurs()
106 for valeur in self.listeValeursCourantes :
107 val=self.politique.GetValeurTexte(valeur)
108 nomLineEdit="lineEditVal"+str(index)
109 if hasattr(self,nomLineEdit) :
110 courant=getattr(self,nomLineEdit)
111 if 'R' in self.objSimp.definition.type and str(val) != repr(val) : courant.setText(repr(val))
112 else : courant.setText(str(val))
114 self.ajoutLineEdit(val)
116 # ajout d'une ligne vide ou affichage commentaire
117 if self.indexDernierLabel < self.monSimpDef.max : self.ajoutLineEdit()
118 else : self.scrollArea.setToolTip('nb max de valeurs atteint')
120 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
123 def ajoutLineEdit(self,valeur=None,):
124 self.indexDernierLabel=self.indexDernierLabel+1
125 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
126 if hasattr(self,nomLineEdit) :
127 self.indexDernierLabel=self.indexDernierLabel-1
129 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
130 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
131 nouveauLE.setText("")
132 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
133 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
134 nouveauLE.setFrame(False)
135 nouveauLE.returnPressed.connect(self.changeValeur)
136 setattr(self,nomLineEdit,nouveauLE)
137 self.listeAffichageWidget.append(nouveauLE)
139 if valeur != None : nouveauLE.setText(str(valeur))
140 # deux lignes pour que le ensureVisible fonctionne
141 self.estVisible=nouveauLE
142 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
143 #if donneLeFocus==True : nouveauLE.setFocus()
145 def etablitOrdre(self):
147 while(i +1 < len(self.listeAffichageWidget)):
148 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
149 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
151 # si on boucle on perd l'ordre
154 def rendVisibleLigne(self):
155 QApplication.processEvents()
156 self.estVisible.setFocus()
157 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
160 def finCommentaire(self):
161 return self.finCommentaireListe()
163 def ajout1Valeur(self,valeur=None):
164 if valeur == None : return
165 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
166 if validite == 0 : return
167 if liste ==[] : return
169 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
170 validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
171 if (comm2 != "" and comm != None) : return comm2
173 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
174 if len(self.listeValeursCourantes) > self.monSimpDef.min :
175 self.node.item.set_valeur(self.listeValeursCourantes)
179 return(comm2+" "+comm)
182 # A priori, on ne fait rien
185 def ajoutNValeur(self,liste) :
189 while i < self.indexDernierLabel+1:
190 nomLineEdit="lineEditVal"+str(i)
191 courant=getattr(self,nomLineEdit)
192 valeur=courant.text()
193 if valeur == None or valeur == "" :
195 courant.setText(str(val))
196 commentaire=self.ajout1Valeur(val)
197 if (commentaire != None ):
198 self.editor.affiche_infos(commentaire,Qt.red)
204 self.ajoutLineEdit(valeur=str(val))
208 def changeValeur(self,changeDePlace=True,oblige=False):
211 self.listeValeursCourantes = []
212 fin=self.indexDernierLabel
213 for i in range (1, fin):
214 nomLineEdit="lineEditVal"+str(i)
215 courant=getattr(self,nomLineEdit)
216 valeur=courant.text()
217 lval=valeur.split(',')
220 msgBox.setText("separator ',' ")
221 msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
222 msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
223 msgBox.setDefaultButton(QMessageBox.Ok)
228 courant.setText(lval[0])
229 self.ajoutNValeur(lval[1:])
230 self.listeValeursCourantes = []
232 for i in range (1, self.indexDernierLabel+1):
233 nomLineEdit="lineEditVal"+str(i)
234 courant=getattr(self,nomLineEdit)
235 valeur=courant.text()
236 if valeur != None and valeur != "" :
237 commentaire=self.ajout1Valeur(valeur)
238 if (commentaire != None ):
239 self.editor.affiche_infos(commentaire,Qt.red)
245 self.editor.affiche_infos("")
246 elif donneFocus==None : donneFocus=courant
248 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
249 dernier=getattr(self,nomDernierLineEdit)
250 derniereValeur=dernier.text()
252 if donneFocus != None :
253 donneFocus.setFocus()
254 self.scrollArea.ensureWidgetVisible(donneFocus)
255 elif self.indexDernierLabel < self.monSimpDef.max :
257 if self.listeValeursCourantes == [] : return
258 min,max = self.node.item.GetMinMax()
259 if len(self.listeValeursCourantes) < self.monSimpDef.min :
260 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
261 if len(self.listeValeursCourantes) < min and oblige==True: return
262 if len(self.listeValeursCourantes) > max : return
263 self.node.item.set_valeur(self.listeValeursCourantes)
264 if len(self.listeValeursCourantes) == self.monSimpDef.max :
265 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
271 # Avertissement quand on quitte le widget