]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT4/monWidgetPlusieursBase.py
Salome HOME
modif 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
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              courant.setText(lval[0])
223              self.ajoutNValeur(lval[1:])
224              self.listeValeursCourantes = []
225
226       for i in range (1, self.indexDernierLabel+1):
227           nomLineEdit="lineEditVal"+str(i)
228           courant=getattr(self,nomLineEdit)
229           valeur=courant.text()
230           if valeur != None and valeur != "" : 
231              commentaire=self.ajout1Valeur(valeur)
232              if (commentaire != None ):
233                  self.editor.affiche_infos(commentaire,Qt.red)
234                  courant.setText("")
235                  donneFocus=courant
236                  self.reaffiche()
237                  return
238              else :
239                  self.editor.affiche_infos("")
240           elif donneFocus==None : donneFocus=courant
241
242       nomDernierLineEdit="lineEditVal"+str(self.indexDernierLabel)
243       dernier=getattr(self,nomDernierLineEdit)
244       derniereValeur=dernier.text()
245       if changeDePlace:
246          if donneFocus != None : 
247            donneFocus.setFocus()
248            self.scrollArea.ensureWidgetVisible(donneFocus)
249          elif self.indexDernierLabel < self.monSimpDef.max  : 
250            self.ajoutLineEdit()
251       if self.listeValeursCourantes == [] : return
252       min,max = self.node.item.GetMinMax()
253       if len(self.listeValeursCourantes) < self.monSimpDef.min  :
254         self.editor.affiche_infos(tr('nb min de valeurs : ')+str( self.monSimpDef.min))
255       if len(self.listeValeursCourantes) < min and oblige==True: return
256       if len(self.listeValeursCourantes) > max : return
257       self.node.item.set_valeur(self.listeValeursCourantes)
258       if len(self.listeValeursCourantes) == self.monSimpDef.max  :
259         self.editor.affiche_infos(tr('nb max de valeurs atteint'))
260       self.setValide()
261       self.reaffiche()
262
263           
264   def entreListe(self,listeDeValeur,index):
265              self.entreListe(lval, i)
266
267 # Avertissement quand on quitte le widget