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