]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT4/monWidgetPlusieursBase.py
Salome HOME
reindent + copyright + merge manuel avec la V9_dev sauf repertoires metier
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursBase.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021   EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 # Modules Python
21 from __future__ import absolute_import
22 try :
23     from builtins import str
24     from builtins import object
25 except : pass
26
27 import types,os,sys
28
29 from six.moves import range
30 from PyQt5.QtGui     import QIcon
31 from PyQt5.QtWidgets import QApplication, QMessageBox, QScrollArea
32 from PyQt5.QtCore    import QTimer, QSize, Qt
33
34 # Modules Eficas
35 from Extensions.i18n import tr
36
37 from InterfaceQT4.feuille                import Feuille
38 from desWidgetPlusieursBase              import Ui_WidgetPlusieursBase
39 from InterfaceQT4.politiquesValidation   import PolitiquePlusieurs
40 from InterfaceQT4.qtSaisie               import SaisieValeur
41 from InterfaceQT4.gereListe              import GereListe
42 from InterfaceQT4.gereListe              import GerePlie
43 from InterfaceQT4.gereListe              import LECustom
44
45 dicoLongueur={2:95,3:125,4:154,5:183,6:210,float('inf'):210}
46 hauteurMax=253
47
48 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
49
50     def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
51         #print "MonWidgetPlusieursBase", nom
52         self.inFocusOutEvent=False
53         self.nomLine="lineEditVal"
54         self.inInit=True
55         self.indexDernierLabel=0
56         self.numLineEditEnCours=0
57         self.listeAffichageWidget=[]
58         self.dictLE={}
59         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
60         GereListe.__init__(self)
61         self.gereIconePlier()
62         self.BSelectFichier.clicked.connect(self.selectInFile)
63
64         repIcon=self.node.editor.appliEficas.repIcon
65         fichier=os.path.join(repIcon, 'arrow_up.png')
66         icon = QIcon(fichier)
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))
76         icon=QIcon(self.repIcon+"/MoinsBleu.png")
77         self.RBMoins.setIcon(icon)
78         icon=QIcon(self.repIcon+"/PlusBleu.png")
79         self.RBPlus.setIcon(icon)
80         icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
81         self.RBVoisListe.setIcon(icon)
82
83
84         self.listeValeursCourantes=self.node.item.getListeValeurs()
85         if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7:
86             hauteurMax=dicoLongueur[self.monSimpDef.max]
87         else :
88             hauteurMax=220
89         #   if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
90         self.resize(self.width(),hauteurMax)
91         self.setMinimumHeight(hauteurMax)
92         self.finCommentaireListe()
93         self.parentQt.commandesLayout.insertWidget(-1,self)
94         self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
95         self.AAfficher=self.lineEditVal1
96         self.inInit=False
97         # PNPN a completer __ si tuple le type des tuples sinon le tuple
98         # trop moche
99         #self.monCommentaireLabel.setText(self.finCommentaireListe())
100         self.monCommentaireLabel.setText("")
101         self.scrollArea.leaveEvent = self.leaveEventScrollArea
102         self.inhibeChangeValeur = False 
103         self.dejaAverti = False
104
105
106     def setValeurs(self):
107         self.vScrollBar = self.scrollArea.verticalScrollBar()
108         self.politique=PolitiquePlusieurs(self.node,self.editor)
109         # construction du min de valeur a entrer
110         if self.monSimpDef.max == "**"  : aConstruire=7
111         elif self.monSimpDef.max == float('inf'): aConstruire=7
112         else                            : aConstruire=self.monSimpDef.max
113
114         for i in range(1,aConstruire):
115             self.ajoutLineEdit()
116         QApplication.processEvents()
117         self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
118         self.listeValeursCourantes=self.node.item.getListeValeurs()
119         index=1
120         for valeur in self.listeValeursCourantes :
121             val=self.politique.getValeurTexte(valeur)
122             nomLineEdit="lineEditVal"+str(index)
123             if hasattr(self,nomLineEdit) :
124                 courant=getattr(self,nomLineEdit)
125                 if 'R' in self.objSimp.definition.type and str(val) != repr(val) :  courant.setText(repr(val))
126                 else                     :  courant.setText(str(val))
127                 self.dictLE[index]=val
128             else :
129                 self.ajoutLineEdit(val)
130             index=index+1
131         # ajout d'une ligne vide ou affichage commentaire
132         if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
133         else : self.scrollArea.setToolTip('nb max de valeurs atteint')
134         #self.adjustSize()
135         #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
136
137
138     def ajoutLineEdit(self,valeur=None,):
139         #print ('ajoutLineEdit plusieursBase')
140         #print ('self.indexDernierLabel', self.indexDernierLabel)
141         self.indexDernierLabel=self.indexDernierLabel+1
142         nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
143         if hasattr(self,nomLineEdit) :
144             self.indexDernierLabel=self.indexDernierLabel-1
145             return
146         nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
147         self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
148         nouveauLE.setText("")
149         if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
150         else :                               nouveauLE.setStyleSheet("background:rgb(235,235,235)")
151         nouveauLE.setFrame(False)
152         nouveauLE.returnPressed.connect(self.changeValeur)
153
154         setattr(self,nomLineEdit,nouveauLE)
155         self.listeAffichageWidget.append(nouveauLE)
156         self.etablitOrdre()
157         if valeur != None :
158             nouveauLE.setText(str(valeur))
159             self.dictLE[self.indexDernierLabel] = valeur
160         else :
161             self.dictLE[self.indexDernierLabel] = None
162         # deux lignes pour que le ensureVisible fonctionne
163         self.estVisible=nouveauLE
164         if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
165
166     def etablitOrdre(self):
167         i=0
168         while(i +1 < len(self.listeAffichageWidget)):
169             self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
170             self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
171             i=i+1
172         # si on boucle on perd l'ordre
173
174
175     def rendVisibleLigne(self):
176         QApplication.processEvents()
177         self.estVisible.setFocus()
178         self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
179
180
181     def finCommentaire(self):
182         return self.finCommentaireListe()
183
184     def ajout1Valeur(self,valeur=None):
185         print ('ajout1Valeur plusieursBase')
186         if valeur == None : return
187         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
188         if validite == 0 : return
189         if liste ==[]    : return
190         listeVal=[]
191         for valeur in self.listeValeursCourantes : listeVal.append(valeur)
192         validite,comm,comm2,listeRetour=self.politique.ajoutValeurs(liste,-1,listeVal)
193         if (comm2 != "" and comm != None) : return comm2
194         if validite :
195             self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
196             if len(self.listeValeursCourantes) > self.monSimpDef.min :
197                 self.node.item.setValeur(self.listeValeursCourantes)
198                 self.reaffiche()
199             return None
200         else :
201             return(comm2+" "+comm)
202
203     def reaffiche(self):
204         # A priori, on ne fait rien
205         pass
206
207
208     def ajoutNValeur(self,liste):
209         #print ('ajoutNValeur plusieursBase')
210     #----------------------------
211     # attention quand on charge par un fichier, on ne peut pas se contenter d ajouter N fois 1 valeur
212     # car alors le temps de verification devient prohibitif  reconstructu=ion et verification a
213     # chaque valeur. d ou l ajout de ajoutNTuple a politique plusieurs
214
215
216         listeFormatee=list(liste)
217
218         min,max=self.node.item.getMinMax()
219         if self.objSimp.valeur == None : listeComplete=listeFormatee
220         else : listeComplete =self.objSimp.valeur + listeFormatee
221
222         if len(listeComplete) > max :
223             texte=tr("Nombre maximum de valeurs ")+str(max)+tr(" atteint")
224             self.editor.afficheInfos(texte,Qt.red)
225             return
226
227         validite,comm,comm2,listeRetour= self.politique.ajoutNTuple(listeComplete)
228         if not validite :
229             self.editor.affiche_infos(texte,Qt.red)
230             return
231
232         # on calcule le dernier lineedit rempli avant de changer la valeur
233         if self.objSimp.valeur != None : indexDernierRempli=len(self.objSimp.valeur)
234         else : indexDernierRempli=0
235
236         self.politique.recordValeur(listeComplete)
237
238         indexDernierRempli=0
239         while ( indexDernierRempli < len(liste) ) :
240             texte=liste[indexDernierRempli]
241             if indexDernierRempli < self.indexDernierLabel:
242                 nomLineEdit="lineEditVal"+str(indexDernierRempli+1)
243                 courant=getattr(self,nomLineEdit)
244                 courant.setText(str(texte))
245             else :
246                 self.ajoutLineEdit(texte)
247             indexDernierRempli = indexDernierRempli + 1
248
249
250     def changeValeur(self,changeDePlace=True,oblige=False):
251         #print ('achangeValeur plusieursBase', self)
252         #import traceback
253         #traceback.print_stack()
254         if self.inhibeChangeValeur : return
255         self.inhibeChangeValeur = True 
256         donneFocus=None
257         derniereValeur=None
258         self.listeValeursCourantes = []
259         fin=self.indexDernierLabel
260         if (not('TXM' in self.objSimp.definition.type)) and not (self.dejaAverti):
261             for i in range (1, fin):
262                 nomLineEdit="lineEditVal"+str(i)
263                 courant=getattr(self,nomLineEdit)
264                 valeur=courant.text()
265                 lval=valeur.split(',')
266                 if len (lval) > 1 :
267                     self.dejaAverti = True
268                     QMessageBox.warning(self,tr('"," used'), 'Perhaps, character "," is used in ' +str( valeur)  + 'intead of "."') 
269                     break
270                     # msgBox = QMessageBox()
271                     # msgBox.setText("separator ',' ")
272                     # msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
273                     # msgBox.setInformativeText ("  you want to enter " + str (lval) + "?")
274                     # msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
275                     # msgBox.setDefaultButton(QMessageBox.Ok)
276                     #ret = msgBox.exec()
277                     # tres dicutable 20210401 j enleve la boucle
278                     # if faut remtrre self.inhibeChangeValeur si on la reactive
279                     # if ret == 1024:
280                     #   courant.setText(lval[0])
281                     #   self.ajoutNValeur(lval[1:])
282                     #   self.listeValeursCourantes = []
283
284
285         for i in range (1, self.indexDernierLabel+1):
286             nomLineEdit="lineEditVal"+str(i)
287             courant=getattr(self,nomLineEdit)
288             valeur=courant.text()
289             if valeur != None and valeur != "" :
290                 commentaire=self.ajout1Valeur(valeur)
291                 if (commentaire != None ):
292                     self.editor.afficheInfos(commentaire,Qt.red)
293                     courant.setText("")
294                     donneFocus=courant
295                     self.reaffiche()
296                     return
297                 else :
298                     self.editor.afficheInfos("")
299             elif donneFocus==None : donneFocus=courant
300
301         nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
302         dernier=getattr(self,nomDernierLineEdit)
303         derniereValeur=dernier.text()
304         if changeDePlace:
305             if donneFocus != None :
306                 donneFocus.setFocus()
307                 self.scrollArea.ensureWidgetVisible(donneFocus)
308             elif self.indexDernierLabel < self.monSimpDef.max  :
309                 self.ajoutLineEdit()
310         if self.listeValeursCourantes == [] : return
311         min,max = self.node.item.getMinMax()
312         if len(self.listeValeursCourantes) < self.monSimpDef.min  :
313             self.editor.afficheInfos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
314         if len(self.listeValeursCourantes) < min and oblige==True: return
315         if len(self.listeValeursCourantes) > max : return
316         retour=self.node.item.setValeur(self.listeValeursCourantes)
317         if len(self.listeValeursCourantes) == self.monSimpDef.max  :
318             self.editor.afficheInfos(tr('nb max de valeurs atteint'))
319         self.setValide()
320         self.reaffiche()
321         self.inhibeChangeValeur = False 
322
323     def leaveEventScrollArea(self,event):
324         #print ('achangeValeur plusieursBase')
325         self.changeValeur(changeDePlace=False)
326         QScrollArea.leaveEvent(self.scrollArea,event)
327
328 # Avertissement quand on quitte le widget