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}
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 hauteur=dicoLongueur[self.monSimpDef.max]
80 self.resize(self.width(),hauteur)
81 self.setMinimumHeight(hauteur)
82 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 if self.monSimpDef.max == "**" : aConstruire=7
98 else : aConstruire=self.monSimpDef.max
99 #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')
119 #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
122 def ajoutLineEdit(self,valeur=None,):
123 self.indexDernierLabel=self.indexDernierLabel+1
124 nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
125 if hasattr(self,nomLineEdit) :
126 self.indexDernierLabel=self.indexDernierLabel-1
128 nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
129 self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
130 nouveauLE.setText("")
131 if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
132 else : nouveauLE.setStyleSheet("background:rgb(235,235,235)")
133 nouveauLE.setFrame(False)
134 nouveauLE.returnPressed.connect(self.changeValeur)
135 setattr(self,nomLineEdit,nouveauLE)
136 self.listeAffichageWidget.append(nouveauLE)
138 if valeur != None : nouveauLE.setText(str(valeur))
139 # deux lignes pour que le ensureVisible fonctionne
140 self.estVisible=nouveauLE
141 if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
142 #if donneLeFocus==True : nouveauLE.setFocus()
144 def etablitOrdre(self):
146 while(i +1 < len(self.listeAffichageWidget)):
147 self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
148 self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
150 # si on boucle on perd l'ordre
153 def rendVisibleLigne(self):
154 QApplication.processEvents()
155 self.estVisible.setFocus()
156 self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
159 def finCommentaire(self):
160 return self.finCommentaireListe()
162 def ajout1Valeur(self,valeur=None):
163 if valeur == None : return
164 liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
165 if validite == 0 : return
166 if liste ==[] : return
168 for valeur in self.listeValeursCourantes : listeVal.append(valeur)
169 validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
170 if (comm2 != "" and comm != None) : return comm2
172 self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
173 if len(self.listeValeursCourantes) > self.monSimpDef.min :
174 self.node.item.set_valeur(self.listeValeursCourantes)
178 return(comm2+" "+comm)
181 # A priori, on ne fait rien
184 def ajoutNValeur(self,liste) :
188 while i < self.indexDernierLabel+1:
189 nomLineEdit="lineEditVal"+str(i)
190 courant=getattr(self,nomLineEdit)
191 valeur=courant.text()
192 if valeur == None or valeur == "" :
194 courant.setText(str(val))
195 commentaire=self.ajout1Valeur(val)
196 if (commentaire != None ):
197 self.editor.affiche_infos(commentaire,Qt.red)
203 self.ajoutLineEdit(valeur=str(val))
207 def changeValeur(self,changeDePlace=True,oblige=False):
210 self.listeValeursCourantes = []
211 fin=self.indexDernierLabel
212 for i in range (1, fin):
213 nomLineEdit="lineEditVal"+str(i)
214 courant=getattr(self,nomLineEdit)
215 valeur=courant.text()
216 lval=valeur.split(',')
218 courant.setText(lval[0])
219 self.ajoutNValeur(lval[1:])
220 self.listeValeursCourantes = []
222 for i in range (1, self.indexDernierLabel+1):
223 nomLineEdit="lineEditVal"+str(i)
224 courant=getattr(self,nomLineEdit)
225 valeur=courant.text()
226 if valeur != None and valeur != "" :
227 commentaire=self.ajout1Valeur(valeur)
228 if (commentaire != None ):
229 self.editor.affiche_infos(commentaire,Qt.red)
235 self.editor.affiche_infos("")
236 elif donneFocus==None : donneFocus=courant
237 nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
238 dernier=getattr(self,nomDernierLineEdit)
239 derniereValeur=dernier.text()
241 if donneFocus != None :
242 donneFocus.setFocus()
243 self.scrollArea.ensureWidgetVisible(donneFocus)
244 elif self.indexDernierLabel < self.monSimpDef.max :
246 if self.listeValeursCourantes == [] : return
247 min,max = self.node.item.GetMinMax()
248 if len(self.listeValeursCourantes) < self.monSimpDef.min :
249 self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
250 if len(self.listeValeursCourantes) < min and oblige==True: return
251 if len(self.listeValeursCourantes) > max : return
252 self.node.item.set_valeur(self.listeValeursCourantes)
253 if len(self.listeValeursCourantes) == self.monSimpDef.max :
254 self.editor.affiche_infos(tr('nb max de valeurs atteint'))
259 def entreListe(self,listeDeValeur,index):
260 self.entreListe(lval, i)
262 # Avertissement quand on quitte le widget