Salome HOME
67cbf912dff443a9368f6807ca80c7739c71cdd7
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursBase.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2017   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.inFocusOutEvent=False
54         self.nomLine="lineEditVal"
55         self.inInit=True
56         self.indexDernierLabel=0
57         self.NumLineEditEnCours=0
58         self.listeAffichageWidget=[]
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         if sys.platform[0:5]!="linux":
65           repIcon=self.node.editor.appliEficas.repIcon
66           fichier=os.path.join(repIcon, 'arrow_up.png')
67           icon = QIcon(fichier)
68           self.RBHaut.setIcon(icon)
69           self.RBHaut.setIconSize(QSize(32, 32))
70           fichier2=os.path.join(repIcon, 'arrow_down.png')
71           icon2 = QIcon(fichier2)
72           self.RBBas.setIcon(icon2)
73           fichier3=os.path.join(repIcon, 'file-explorer.png')
74           icon3 = QIcon(fichier2)
75           self.BSelectFichier.setIcon(icon3)
76           self.BSelectFichier.setIconSize(QSize(32, 32))
77         icon=QIcon(self.repIcon+"/MoinsBleu.png")
78         self.RBMoins.setIcon(icon)
79         icon=QIcon(self.repIcon+"/PlusBleu.png")
80         self.RBPlus.setIcon(icon)
81         icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
82         self.RBVoisListe.setIcon(icon)
83
84
85         self.listeValeursCourantes=self.node.item.GetListeValeurs()
86         if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7: 
87            hauteurMax=dicoLongueur[self.monSimpDef.max]
88         else :
89            hauteurMax=220
90         #   if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
91         self.resize(self.width(),hauteurMax)
92         self.setMinimumHeight(hauteurMax)
93         self.finCommentaireListe()
94         self.parentQt.commandesLayout.insertWidget(-1,self)
95         self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
96         self.AAfficher=self.lineEditVal1
97         self.inInit=False
98
99
100   def setValeurs(self):
101        self.vScrollBar = self.scrollArea.verticalScrollBar()
102        self.politique=PolitiquePlusieurs(self.node,self.editor)
103        # construction du min de valeur a entrer
104        if self.monSimpDef.max == "**"  : aConstruire=7
105        elif self.monSimpDef.max == float('inf'): aConstruire=7
106        else                            : aConstruire=self.monSimpDef.max
107
108        for i in range(1,aConstruire):
109            self.ajoutLineEdit()
110        QApplication.processEvents()
111        self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
112        self.listeValeursCourantes=self.node.item.GetListeValeurs()
113        index=1
114        for valeur in self.listeValeursCourantes :
115            val=self.politique.GetValeurTexte(valeur)
116            nomLineEdit="lineEditVal"+str(index)
117            if hasattr(self,nomLineEdit) : 
118               courant=getattr(self,nomLineEdit)
119               if 'R' in self.objSimp.definition.type and str(val) != repr(val) :  courant.setText(repr(val))
120               else                     :  courant.setText(str(val))
121            else :
122               self.ajoutLineEdit(val)
123            index=index+1
124        # ajout d'une ligne vide ou affichage commentaire
125        if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
126        else : self.scrollArea.setToolTip('nb max de valeurs atteint')
127        #self.adjustSize()
128        #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
129        
130
131   def ajoutLineEdit(self,valeur=None,):
132       self.indexDernierLabel=self.indexDernierLabel+1
133       nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
134       if hasattr(self,nomLineEdit) : 
135          self.indexDernierLabel=self.indexDernierLabel-1
136          return
137       nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
138       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
139       nouveauLE.setText("")
140       if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
141       else :                               nouveauLE.setStyleSheet("background:rgb(235,235,235)")
142       nouveauLE.setFrame(False)
143       nouveauLE.returnPressed.connect(self.changeValeur)
144
145       setattr(self,nomLineEdit,nouveauLE)
146       self.listeAffichageWidget.append(nouveauLE)
147       self.etablitOrdre()
148       if valeur != None : nouveauLE.setText(str(valeur))
149       # deux lignes pour que le ensureVisible fonctionne
150       self.estVisible=nouveauLE
151       if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
152       #if donneLeFocus==True : nouveauLE.setFocus()
153
154   def etablitOrdre(self):
155       i=0
156       while(i +1 < len(self.listeAffichageWidget)):
157          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
158          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
159          i=i+1
160       # si on boucle on perd l'ordre
161
162
163   def rendVisibleLigne(self):
164       QApplication.processEvents()
165       self.estVisible.setFocus()
166       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
167       
168
169   def finCommentaire(self):
170       return self.finCommentaireListe()
171
172   def ajout1Valeur(self,valeur=None):
173         if valeur == None : return
174         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
175         if validite == 0 : return
176         if liste ==[]    : return
177         listeVal=[]
178         for valeur in self.listeValeursCourantes : listeVal.append(valeur)
179         validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
180         if (comm2 != "" and comm != None) : return comm2
181         if validite : 
182            self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
183            if len(self.listeValeursCourantes) > self.monSimpDef.min :
184               self.node.item.set_valeur(self.listeValeursCourantes)
185               self.reaffiche()
186            return None
187         else :
188            return(comm2+" "+comm)
189         
190   def reaffiche(self):
191       # A priori, on ne fait rien
192       pass
193
194   def ajoutNValeur(self,liste) :
195       for val in liste :
196          i=1
197          ajoute=False
198          while i <  self.indexDernierLabel+1:
199             nomLineEdit="lineEditVal"+str(i)
200             courant=getattr(self,nomLineEdit)
201             valeur=courant.text()
202             if valeur == None or valeur == "" :
203               ajoute=True
204               courant.setText(str(val))
205               commentaire=self.ajout1Valeur(val)
206               if (commentaire != None ):
207                  self.editor.affiche_infos(commentaire,Qt.red)
208                  courant.setText("")
209               break
210             else : 
211               i=i+1
212          if ajoute : continue
213          self.ajoutLineEdit(valeur=str(val))
214          self.changeValeur()
215                 
216
217   def changeValeur(self,changeDePlace=True,oblige=False):
218       donneFocus=None
219       derniereValeur=None
220       self.listeValeursCourantes = []
221       fin=self.indexDernierLabel
222       for i in range (1, fin):
223           nomLineEdit="lineEditVal"+str(i)
224           courant=getattr(self,nomLineEdit)
225           valeur=courant.text()
226           lval=valeur.split(',')
227           if len (lval) > 1 : 
228              msgBox=QMessageBox()
229              msgBox.setText("separator ',' ")
230              msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
231              msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
232              msgBox.setDefaultButton(QMessageBox.Ok)
233              ret = msgBox.exec_()
234              if ret != 1024 : 
235                 courant.setText("") 
236                 return
237              courant.setText(lval[0])
238              self.ajoutNValeur(lval[1:])
239              self.listeValeursCourantes = []
240
241       for i in range (1, self.indexDernierLabel+1):
242           nomLineEdit="lineEditVal"+str(i)
243           courant=getattr(self,nomLineEdit)
244           valeur=courant.text()
245           if valeur != None and valeur != "" : 
246              commentaire=self.ajout1Valeur(valeur)
247              if (commentaire != None ):
248                  self.editor.affiche_infos(commentaire,Qt.red)
249                  courant.setText("")
250                  donneFocus=courant
251                  self.reaffiche()
252                  return
253              else :
254                  self.editor.affiche_infos("")
255           elif donneFocus==None : donneFocus=courant
256
257       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
258       dernier=getattr(self,nomDernierLineEdit)
259       derniereValeur=dernier.text()
260       if changeDePlace:
261          if donneFocus != None : 
262            donneFocus.setFocus()
263            self.scrollArea.ensureWidgetVisible(donneFocus)
264          elif self.indexDernierLabel < self.monSimpDef.max  : 
265            self.ajoutLineEdit()
266       if self.listeValeursCourantes == [] : return
267       min,max = self.node.item.GetMinMax()
268       if len(self.listeValeursCourantes) < self.monSimpDef.min  :
269         self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
270       if len(self.listeValeursCourantes) < min and oblige==True: return
271       if len(self.listeValeursCourantes) > max : return
272       self.node.item.set_valeur(self.listeValeursCourantes)
273       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
274         self.editor.affiche_infos(tr('nb max de valeurs atteint'))
275       self.setValide()
276       self.reaffiche()
277
278           
279
280 # Avertissement quand on quitte le widget