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