Salome HOME
b506c2057db2ff58d424793a33b624d86b87efdf
[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         self.monSimpDef.max = 3
79         if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7: 
80            hauteurMax=dicoLongueur[self.monSimpDef.max]
81         else :
82            hauteurMax=220
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
90         self.inInit=False
91
92
93   def setValeurs(self):
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
102        for i in range(1,aConstruire):
103            self.ajoutLineEdit()
104        QApplication.processEvents()
105        self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
106        self.listeValeursCourantes=self.node.item.GetListeValeurs()
107        index=1
108        for valeur in self.listeValeursCourantes :
109            val=self.politique.GetValeurTexte(valeur)
110            nomLineEdit="lineEditVal"+str(index)
111            if hasattr(self,nomLineEdit) : 
112               courant=getattr(self,nomLineEdit)
113               if 'R' in self.objSimp.definition.type and str(val) != repr(val) :  courant.setText(repr(val))
114               else                     :  courant.setText(str(val))
115            else :
116               self.ajoutLineEdit(val)
117            index=index+1
118        # ajout d'une ligne vide ou affichage commentaire
119        if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
120        else : self.scrollArea.setToolTip('nb max de valeurs atteint')
121        #self.adjustSize()
122        #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
123        
124
125   def ajoutLineEdit(self,valeur=None,):
126       self.indexDernierLabel=self.indexDernierLabel+1
127       nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
128       if hasattr(self,nomLineEdit) : 
129          self.indexDernierLabel=self.indexDernierLabel-1
130          return
131       nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
132       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
133       nouveauLE.setText("")
134       if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
135       else :                               nouveauLE.setStyleSheet("background:rgb(235,235,235)")
136       nouveauLE.setFrame(False)
137       nouveauLE.returnPressed.connect(self.changeValeur)
138       setattr(self,nomLineEdit,nouveauLE)
139       self.listeAffichageWidget.append(nouveauLE)
140       self.etablitOrdre()
141       if valeur != None : nouveauLE.setText(str(valeur))
142       # deux lignes pour que le ensureVisible fonctionne
143       self.estVisible=nouveauLE
144       if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
145       #if donneLeFocus==True : nouveauLE.setFocus()
146
147   def etablitOrdre(self):
148       i=0
149       while(i +1 < len(self.listeAffichageWidget)):
150          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
151          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
152          i=i+1
153       # si on boucle on perd l'ordre
154
155
156   def rendVisibleLigne(self):
157       QApplication.processEvents()
158       self.estVisible.setFocus()
159       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
160       
161
162   def finCommentaire(self):
163       return self.finCommentaireListe()
164
165   def ajout1Valeur(self,valeur=None):
166         if valeur == None : return
167         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
168         if validite == 0 : return
169         if liste ==[]    : return
170         listeVal=[]
171         for valeur in self.listeValeursCourantes : listeVal.append(valeur)
172         validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
173         if (comm2 != "" and comm != None) : return comm2
174         if validite : 
175            self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
176            if len(self.listeValeursCourantes) > self.monSimpDef.min :
177               self.node.item.set_valeur(self.listeValeursCourantes)
178               self.reaffiche()
179            return None
180         else :
181            return(comm2+" "+comm)
182         
183   def reaffiche(self):
184       # A priori, on ne fait rien
185       pass
186
187   def ajoutNValeur(self,liste) :
188       for val in liste :
189          i=1
190          ajoute=False
191          while i <  self.indexDernierLabel+1:
192             nomLineEdit="lineEditVal"+str(i)
193             courant=getattr(self,nomLineEdit)
194             valeur=courant.text()
195             if valeur == None or valeur == "" :
196               ajoute=True
197               courant.setText(str(val))
198               commentaire=self.ajout1Valeur(val)
199               if (commentaire != None ):
200                  self.editor.affiche_infos(commentaire,Qt.red)
201                  courant.setText("")
202               break
203             else : 
204               i=i+1
205          if ajoute : continue
206          self.ajoutLineEdit(valeur=str(val))
207          self.changeValeur()
208                 
209
210   def changeValeur(self,changeDePlace=True,oblige=False):
211       donneFocus=None
212       derniereValeur=None
213       self.listeValeursCourantes = []
214       fin=self.indexDernierLabel
215       for i in range (1, fin):
216           nomLineEdit="lineEditVal"+str(i)
217           courant=getattr(self,nomLineEdit)
218           valeur=courant.text()
219           lval=valeur.split(',')
220           if len (lval) > 1 : 
221              msgBox=QMessageBox()
222              msgBox.setText("separator ',' ")
223              msgBox.setInformativeText("Do you want to enter " + str (lval) + "?")
224              msgBox.setStandardButtons( QMessageBox.Ok | QMessageBox.Cancel)
225              msgBox.setDefaultButton(QMessageBox.Ok)
226              ret = msgBox.exec_()
227              if ret != 1024 : 
228                 courant.setText("") 
229                 return
230              courant.setText(lval[0])
231              self.ajoutNValeur(lval[1:])
232              self.listeValeursCourantes = []
233
234       for i in range (1, self.indexDernierLabel+1):
235           nomLineEdit="lineEditVal"+str(i)
236           courant=getattr(self,nomLineEdit)
237           valeur=courant.text()
238           if valeur != None and valeur != "" : 
239              commentaire=self.ajout1Valeur(valeur)
240              if (commentaire != None ):
241                  self.editor.affiche_infos(commentaire,Qt.red)
242                  courant.setText("")
243                  donneFocus=courant
244                  self.reaffiche()
245                  return
246              else :
247                  self.editor.affiche_infos("")
248           elif donneFocus==None : donneFocus=courant
249
250       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
251       dernier=getattr(self,nomDernierLineEdit)
252       derniereValeur=dernier.text()
253       if changeDePlace:
254          if donneFocus != None : 
255            donneFocus.setFocus()
256            self.scrollArea.ensureWidgetVisible(donneFocus)
257          elif self.indexDernierLabel < self.monSimpDef.max  : 
258            self.ajoutLineEdit()
259       if self.listeValeursCourantes == [] : return
260       min,max = self.node.item.GetMinMax()
261       if len(self.listeValeursCourantes) < self.monSimpDef.min  :
262         self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
263       if len(self.listeValeursCourantes) < min and oblige==True: return
264       if len(self.listeValeursCourantes) > max : return
265       self.node.item.set_valeur(self.listeValeursCourantes)
266       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
267         self.editor.affiche_infos(tr('nb max de valeurs atteint'))
268       self.setValide()
269       self.reaffiche()
270
271           
272
273 # Avertissement quand on quitte le widget