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
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
101 print ('1,aConstruire', aConstruire)
103 for i in range(1,aConstruire):
105 QApplication.processEvents()
106 self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
107 self.listeValeursCourantes=self.node.item.GetListeValeurs()
109 for valeur in self.listeValeursCourantes :
110 val=self.politique.GetValeurTexte(valeur)
111 nomLineEdit="lineEditVal"+str(index)
112 if hasattr(self,nomLineEdit) :
113 courant=getattr(self,nomLineEdit)
114 if 'R' in self.objSimp.definition.type and str(val) != repr(val) : courant.setText(repr(val))
115 else : courant.setText(str(val))
117 self.ajoutLineEdit(val)
119 # ajout d'une ligne vide ou affichage commentaire
120 if self.indexDernierLabel < self.monSimpDef.max : self.ajoutLineEdit()
121 else : self.scrollArea.setToolTip('nb max de valeurs atteint')
123 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
126 def ajoutLineEdit(self,valeur=None,):
127 self.indexDernierLabel=self.indexDernierLabel+1
128 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
129 if hasattr(self,nomLineEdit) :
130 self.indexDernierLabel=self.indexDernierLabel-1
132 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
133 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
134 nouveauLE.setText("")
135 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
136 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
137 nouveauLE.setFrame(False)
138 nouveauLE.returnPressed.connect(self.changeValeur)
139 setattr(self,nomLineEdit,nouveauLE)
140 self.listeAffichageWidget.append(nouveauLE)
142 if valeur != None : nouveauLE.setText(str(valeur))
143 # deux lignes pour que le ensureVisible fonctionne
144 self.estVisible=nouveauLE
145 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
146 #if donneLeFocus==True : nouveauLE.setFocus()
148 def etablitOrdre(self):
150 while(i +1 < len(self.listeAffichageWidget)):
151 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
152 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
154 # si on boucle on perd l'ordre
157 def rendVisibleLigne(self):
158 QApplication.processEvents()
159 self.estVisible.setFocus()
160 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
163 def finCommentaire(self):
164 return self.finCommentaireListe()
166 def ajout1Valeur(self,valeur=None):
167 if valeur == None : return
168 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
169 if validite == 0 : return
170 if liste ==[] : return
172 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
173 validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
174 if (comm2 != "" and comm != None) : return comm2
176 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
177 if len(self.listeValeursCourantes) > self.monSimpDef.min :
178 self.node.item.set_valeur(self.listeValeursCourantes)
182 return(comm2+" "+comm)
185 # A priori, on ne fait rien
188 def ajoutNValeur(self,liste) :
192 while i < self.indexDernierLabel+1:
193 nomLineEdit="lineEditVal"+str(i)
194 courant=getattr(self,nomLineEdit)
195 valeur=courant.text()
196 if valeur == None or valeur == "" :
198 courant.setText(str(val))
199 commentaire=self.ajout1Valeur(val)
200 if (commentaire != None ):
201 self.editor.affiche_infos(commentaire,Qt.red)
207 self.ajoutLineEdit(valeur=str(val))
211 def changeValeur(self,changeDePlace=True,oblige=False):
214 self.listeValeursCourantes = []
215 fin=self.indexDernierLabel
216 for i in range (1, fin):
217 nomLineEdit="lineEditVal"+str(i)
218 courant=getattr(self,nomLineEdit)
219 valeur=courant.text()
220 lval=valeur.split(',')
222 courant.setText(lval[0])
223 self.ajoutNValeur(lval[1:])
224 self.listeValeursCourantes = []
226 for i in range (1, self.indexDernierLabel+1):
227 nomLineEdit="lineEditVal"+str(i)
228 courant=getattr(self,nomLineEdit)
229 valeur=courant.text()
230 if valeur != None and valeur != "" :
231 commentaire=self.ajout1Valeur(valeur)
232 if (commentaire != None ):
233 self.editor.affiche_infos(commentaire,Qt.red)
239 self.editor.affiche_infos("")
240 elif donneFocus==None : donneFocus=courant
242 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
243 dernier=getattr(self,nomDernierLineEdit)
244 derniereValeur=dernier.text()
246 if donneFocus != None :
247 donneFocus.setFocus()
248 self.scrollArea.ensureWidgetVisible(donneFocus)
249 elif self.indexDernierLabel < self.monSimpDef.max :
251 if self.listeValeursCourantes == [] : return
252 min,max = self.node.item.GetMinMax()
253 if len(self.listeValeursCourantes) < self.monSimpDef.min :
254 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
255 if len(self.listeValeursCourantes) < min and oblige==True: return
256 if len(self.listeValeursCourantes) > max : return
257 self.node.item.set_valeur(self.listeValeursCourantes)
258 if len(self.listeValeursCourantes) == self.monSimpDef.max :
259 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
264 def entreListe(self,listeDeValeur,index):
265 self.entreListe(lval, i)
267 # Avertissement quand on quitte le widget