Salome HOME
mse a jour du 07/03/2016 pour sauvegarde
[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 import string,types,os,sys
22
23 from determine import monEnvQT5
24 if monEnvQT5:
25     from PyQt5.QtGui  import Qicon, QApplication
26     from PyQt5.QtCore import QTimer, QSize, QT
27 else :
28     from PyQt4.QtGui  import *
29     from PyQt4.QtCore import *
30
31 # Modules Eficas
32 from Extensions.i18n import tr
33
34 from feuille                import Feuille
35 from desWidgetPlusieursBase import Ui_WidgetPlusieursBase 
36 from politiquesValidation   import PolitiquePlusieurs
37 from qtSaisie               import SaisieValeur
38 from gereListe              import GereListe
39 from gereListe              import GerePlie
40 from gereListe              import LECustom
41
42 dicoLongueur={2:95,3:125,4:154,5:183,6:210}
43 hauteurMax=253
44
45 class MonWidgetPlusieursBase (Ui_WidgetPlusieursBase,Feuille,GereListe,GerePlie):
46
47   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
48         print "MonWidgetPlusieursBase", nom
49         self.nomLine="lineEditVal"
50         self.inInit=True
51         self.indexDernierLabel=0
52         self.NumLineEditEnCours=0
53         self.listeAffichageWidget=[]
54         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
55         GereListe.__init__(self)
56         self.gereIconePlier()
57         self.connect(self.BSelectFichier,SIGNAL("clicked()"), self.selectInFile)
58
59         if sys.platform[0:5]!="linux":
60           repIcon=self.node.editor.appliEficas.repIcon
61           fichier=os.path.join(repIcon, 'arrow_up.png')
62           icon = QIcon(fichier)
63           self.RBHaut.setIcon(icon)
64           self.RBHaut.setIconSize(QSize(32, 32))
65           fichier2=os.path.join(repIcon, 'arrow_down.png')
66           icon2 = QIcon(fichier2)
67           self.RBBas.setIcon(icon2)
68           fichier3=os.path.join(repIcon, 'file-explorer.png')
69           icon3 = QIcon(fichier2)
70           self.BSelectFichier.setIcon(icon3)
71           self.BSelectFichier.setIconSize(QSize(32, 32))
72
73         self.listeValeursCourantes=self.node.item.GetListeValeurs()
74         if self.monSimpDef.max != "**"  and self.monSimpDef.max < 7: 
75            hauteur=dicoLongueur[self.monSimpDef.max]
76            self.resize(self.width(),hauteur)
77            self.setMinimumHeight(hauteur)
78            if self.monSimpDef.max == self.monSimpDef.min : self.setMaximumHeight(hauteur)
79         else :
80            self.resize(self.width(),hauteurMax)
81            self.setMinimumHeight(hauteurMax)
82         self.finCommentaireListe()
83         self.parentQt.commandesLayout.insertWidget(-1,self)
84         self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
85         self.AAfficher=self.lineEditVal1
86         self.inInit=False
87
88
89   def setValeurs(self):
90        self.vScrollBar = self.scrollArea.verticalScrollBar()
91        self.politique=PolitiquePlusieurs(self.node,self.editor)
92        # construction du min de valeur a entrer
93        if self.monSimpDef.max == "**" : aConstruire=7
94        else                           : aConstruire=self.monSimpDef.max
95        for i in range(1,aConstruire):
96            self.ajoutLineEdit()
97        QApplication.processEvents()
98        self.scrollArea.ensureWidgetVisible(self.lineEditVal1)
99        self.listeValeursCourantes=self.node.item.GetListeValeurs()
100        index=1
101        for valeur in self.listeValeursCourantes :
102            val=self.politique.GetValeurTexte(valeur)
103            nomLineEdit="lineEditVal"+str(index)
104            if hasattr(self,nomLineEdit) : 
105               courant=getattr(self,nomLineEdit)
106               courant.setText(str(val))
107            else :
108               self.ajoutLineEdit(val)
109            index=index+1
110        # ajout d'une ligne vide ou affichage commentaire
111        if self.indexDernierLabel < self.monSimpDef.max  : self.ajoutLineEdit()
112        else : self.scrollArea.setToolTip('nb max de valeurs atteint')
113        #self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
114        
115
116   def ajoutLineEdit(self,valeur=None,):
117       self.indexDernierLabel=self.indexDernierLabel+1
118       nomLineEdit="lineEditVal"+str(self.indexDernierLabel)
119       if hasattr(self,nomLineEdit) : 
120          self.indexDernierLabel=self.indexDernierLabel-1
121          return
122       nouveauLE = LECustom(self.scrollArea,self,self.indexDernierLabel)
123       self.verticalLayoutLE.insertWidget(self.indexDernierLabel-1,nouveauLE)
124       nouveauLE.setText("")
125       if self.indexDernierLabel % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
126       else :                               nouveauLE.setStyleSheet("background:rgb(235,235,235)")
127       nouveauLE.setFrame(False)
128       self.connect(nouveauLE,SIGNAL("returnPressed()"),self.changeValeur)
129       setattr(self,nomLineEdit,nouveauLE)
130       self.listeAffichageWidget.append(nouveauLE)
131       self.etablitOrdre()
132       if valeur != None : nouveauLE.setText(str(valeur))
133       # deux lignes pour que le ensureVisible fonctionne
134       self.estVisible=nouveauLE
135       if self.inInit==False :QTimer.singleShot(1, self.rendVisibleLigne)
136       #if donneLeFocus==True : nouveauLE.setFocus()
137
138   def etablitOrdre(self):
139       i=0
140       while(i +1 < len(self.listeAffichageWidget)):
141          self.listeAffichageWidget[i].setFocusPolicy(Qt.StrongFocus)
142          self.setTabOrder(self.listeAffichageWidget[i],self.listeAffichageWidget[i+1])
143          i=i+1
144       # si on boucle on perd l'ordre
145
146
147   def rendVisibleLigne(self):
148       QApplication.processEvents()
149       self.estVisible.setFocus()
150       self.scrollArea.ensureWidgetVisible(self.estVisible,0,0)
151       
152
153   def finCommentaire(self):
154       return self.finCommentaireListe()
155
156   def ajout1Valeur(self,valeur=None):
157         if valeur == None : return
158         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
159         if validite == 0 : return
160         if liste ==[]    : return
161         listeVal=[]
162         for valeur in self.listeValeursCourantes : listeVal.append(valeur)
163         validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(liste,-1,listeVal)
164         if (comm2 != "" and comm != None) : return comm2
165         if validite : 
166            self.listeValeursCourantes=self.listeValeursCourantes+listeRetour
167            if len(self.listeValeursCourantes) > self.monSimpDef.min :
168               self.node.item.set_valeur(self.listeValeursCourantes)
169               self.reaffiche()
170            return None
171         else :
172            return(comm2+" "+comm)
173         
174   def reaffiche(self):
175       # A priori, on ne fait rien
176       pass
177
178   def ajoutNValeur(self,liste) :
179       for val in liste :
180          i=1
181          ajoute=False
182          while i <  self.indexDernierLabel+1:
183             nomLineEdit="lineEditVal"+str(i)
184             courant=getattr(self,nomLineEdit)
185             valeur=courant.text()
186             if valeur == None or valeur == "" :
187               ajoute=True
188               courant.setText(str(val))
189               commentaire=self.ajout1Valeur(val)
190               if (commentaire != None ):
191                  self.editor.affiche_infos(commentaire,Qt.red)
192                  courant.setText("")
193               break
194             else : 
195               i=i+1
196          if ajoute : continue
197          self.ajoutLineEdit(valeur=str(val))
198          self.changeValeur()
199                 
200
201   def changeValeur(self,changeDePlace=True,oblige=False):
202       donneFocus=None
203       derniereValeur=None
204       self.listeValeursCourantes = []
205       for i in range (1, self.indexDernierLabel+1):
206           nomLineEdit="lineEditVal"+str(i)
207           courant=getattr(self,nomLineEdit)
208           valeur=courant.text()
209           if valeur != None and valeur != "" : 
210              commentaire=self.ajout1Valeur(valeur)
211              if (commentaire != None ):
212                  self.editor.affiche_infos(commentaire,Qt.red)
213                  courant.setText("")
214                  donneFocus=courant
215                  self.reaffiche()
216                  return
217              else :
218                  self.editor.affiche_infos("")
219           elif donneFocus==None : donneFocus=courant
220       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
221       dernier=getattr(self,nomDernierLineEdit)
222       derniereValeur=dernier.text()
223       if changeDePlace:
224          if donneFocus != None : 
225            donneFocus.setFocus()
226            self.scrollArea.ensureWidgetVisible(donneFocus)
227          elif self.indexDernierLabel < self.monSimpDef.max  : 
228            self.ajoutLineEdit()
229       if self.listeValeursCourantes == [] : return
230       min,max = self.node.item.GetMinMax()
231       if len(self.listeValeursCourantes) < self.monSimpDef.min  :
232         self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
233       if len(self.listeValeursCourantes) < min and oblige==True: return
234       if len(self.listeValeursCourantes) > max : return
235       self.node.item.set_valeur(self.listeValeursCourantes)
236       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
237         self.editor.affiche_infos(tr('nb max de valeurs atteint'))
238       self.setValide()
239       self.reaffiche()
240
241           
242
243 # Avertissement quand on quitte le widget