Salome HOME
bug sur max
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursBase.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013   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 range
25    from builtins import object
26 except : pass
27
28 import types,os,sys
29
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
34
35 # Modules Eficas
36 from Extensions.i18n import tr
37
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
45
46 dicoLongueur={2:95,3:125,4:154,5:183,6:210,float('inf'):210}
47 hauteurMax=253
48
49 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
50
51   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
52         #print "MonWidgetPlusieursBase", nom
53         self.nomLine="lineEditVal"
54         self.inInit=True
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)
60         self.gereIconePlier()
61         self.BSelectFichier.clicked.connect(self.selectInFile)
62
63         if sys.platform[0:5]!="linux":
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
77         self.listeValeursCourantes=self.node.item.GetListeValeurs()
78         if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7: 
79            hauteurMax=dicoLongueur[self.monSimpDef.max]
80         else :
81            hauteurMax=220
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
89         self.inInit=False
90
91
92   def setValeurs(self):
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
99
100        for i in range(1,aConstruire):
101            self.ajoutLineEdit()
102        QApplication.processEvents()
103        self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
104        self.listeValeursCourantes=self.node.item.GetListeValeurs()
105        index=1
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))
113            else :
114               self.ajoutLineEdit(val)
115            index=index+1
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.adjustSize()
120        #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
121        
122
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
128          return
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)
138       self.etablitOrdre()
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()
144
145   def etablitOrdre(self):
146       i=0
147       while(i +1 < len(self.listeAffichageWidget)):
148          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
149          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
150          i=i+1
151       # si on boucle on perd l'ordre
152
153
154   def rendVisibleLigne(self):
155       QApplication.processEvents()
156       self.estVisible.setFocus()
157       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
158       
159
160   def finCommentaire(self):
161       return self.finCommentaireListe()
162
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
168         listeVal=[]
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
172         if validite : 
173            self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
174            if len(self.listeValeursCourantes) > self.monSimpDef.min :
175               self.node.item.set_valeur(self.listeValeursCourantes)
176               self.reaffiche()
177            return None
178         else :
179            return(comm2+" "+comm)
180         
181   def reaffiche(self):
182       # A priori, on ne fait rien
183       pass
184
185   def ajoutNValeur(self,liste) :
186       for val in liste :
187          i=1
188          ajoute=False
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 == "" :
194               ajoute=True
195               courant.setText(str(val))
196               commentaire=self.ajout1Valeur(val)
197               if (commentaire != None ):
198                  self.editor.affiche_infos(commentaire,Qt.red)
199                  courant.setText("")
200               break
201             else : 
202               i=i+1
203          if ajoute : continue
204          self.ajoutLineEdit(valeur=str(val))
205          self.changeValeur()
206                 
207
208   def changeValeur(self,changeDePlace=True,oblige=False):
209       donneFocus=None
210       derniereValeur=None
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(',')
218           if len (lval) > 1 : 
219              msgBox=QMessageBox()
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)
224              ret = msgBox.exec_()
225              if ret != 1024 : 
226                 courant.setText("") 
227                 return
228              courant.setText(lval[0])
229              self.ajoutNValeur(lval[1:])
230              self.listeValeursCourantes = []
231
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)
240                  courant.setText("")
241                  donneFocus=courant
242                  self.reaffiche()
243                  return
244              else :
245                  self.editor.affiche_infos("")
246           elif donneFocus==None : donneFocus=courant
247
248       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
249       dernier=getattr(self,nomDernierLineEdit)
250       derniereValeur=dernier.text()
251       if changeDePlace:
252          if donneFocus != None : 
253            donneFocus.setFocus()
254            self.scrollArea.ensureWidgetVisible(donneFocus)
255          elif self.indexDernierLabel < self.monSimpDef.max  : 
256            self.ajoutLineEdit()
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'))
266       self.setValide()
267       self.reaffiche()
268
269           
270
271 # Avertissement quand on quitte le widget