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
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(',')
223 msgBox.setText("separator ',' ")
224 msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
225 msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
226 msgBox.setDefaultButton(QMessageBox.Ok)
231 courant.setText(lval[0])
232 self.ajoutNValeur(lval[1:])
233 self.listeValeursCourantes = []
235 for i in range (1, self.indexDernierLabel+1):
236 nomLineEdit="lineEditVal"+str(i)
237 courant=getattr(self,nomLineEdit)
238 valeur=courant.text()
239 if valeur != None and valeur != "" :
240 commentaire=self.ajout1Valeur(valeur)
241 if (commentaire != None ):
242 self.editor.affiche_infos(commentaire,Qt.red)
248 self.editor.affiche_infos("")
249 elif donneFocus==None : donneFocus=courant
251 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
252 dernier=getattr(self,nomDernierLineEdit)
253 derniereValeur=dernier.text()
255 if donneFocus != None :
256 donneFocus.setFocus()
257 self.scrollArea.ensureWidgetVisible(donneFocus)
258 elif self.indexDernierLabel < self.monSimpDef.max :
260 if self.listeValeursCourantes == [] : return
261 min,max = self.node.item.GetMinMax()
262 if len(self.listeValeursCourantes) < self.monSimpDef.min :
263 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
264 if len(self.listeValeursCourantes) < min and oblige==True: return
265 if len(self.listeValeursCourantes) > max : return
266 self.node.item.set_valeur(self.listeValeursCourantes)
267 if len(self.listeValeursCourantes) == self.monSimpDef.max :
268 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
274 # Avertissement quand on quitte le widget