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