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