Salome HOME
synchronisation avec Yoann
[tools/eficas.git] / InterfaceQT4 / monWidgetPlusieursIntoOrdonne.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 except : pass
26
27 import types,os,sys
28
29 # Modules Eficas
30 from .feuille                import Feuille
31 from desWidgetPlusieursIntoOrdonne import Ui_WidgetPlusieursIntoOrdonne 
32 from .politiquesValidation   import PolitiquePlusieurs
33 from .qtSaisie               import SaisieValeur
34 from .gereListe              import GereListe
35 from .gereListe              import GerePlie
36 from .gereListe              import LECustom
37 from .gereListe              import MonLabelListeClic
38 from Extensions.i18n import tr
39
40 from six.moves import range
41 from PyQt5.QtWidgets  import   QFrame, QApplication, QScrollBar
42 from PyQt5.QtCore import QTimer, QSize, Qt
43 from PyQt5.QtGui  import QIcon, QPalette
44
45
46 class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,GereListe,GerePlie):
47
48   def __init__(self,node,monSimpDef,nom,objSimp,parent,commande):
49         self.nomLine="LEResultat"
50         self.listeLE=[]
51         self.ouAjouter=0
52         self.NumLineEditEnCours=0
53         self.alpha=0
54         self.filtre=""
55         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parent,commande)
56         GereListe.__init__(self)
57         #self.finCommentaireListe()
58         self.gereIconePlier()
59         self.listeValeursCourantes=self.node.item.GetListeValeurs()
60         try :
61           self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
62         except :
63           # cas ou on ne peut rien ajouter
64           pass 
65         self.prepareListeResultat()
66         if len(self.listeAAfficher) < 20 : self.frameRecherche2.close()
67         if len(self.listeAAfficher) < 20 : self.frameRecherche.close()
68         self.adjustSize()
69         if sys.platform[0:5]!="linux":
70           repIcon=self.node.editor.appliEficas.repIcon
71           fichier=os.path.join(repIcon, 'arrow_up.png')
72           icon = QIcon(fichier)
73           self.RBHaut.setIcon(icon)
74           self.RBHaut.setIconSize(QSize(32, 32))
75           fichier2=os.path.join(repIcon, 'arrow_down.png')
76           icon2 = QIcon(fichier2)
77           self.RBBas.setIcon(icon2)
78         if self.editor.salome :
79           icon=QIcon(self.repIcon+"/MoinsBleu.png")
80           self.RBMoins.setIcon(icon)
81           icon=QIcon(self.repIcon+"/PlusBleu.png")
82           self.RBPlus.setIcon(icon)
83           icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
84           self.RBVoisListe.setIcon(icon)
85
86         self.PBClean.clicked.connect(self.cleanListeResultatFiltre)
87         self.parentQt.commandesLayout.insertWidget(-1,self)
88         self.listeRouge=[]
89
90        
91   def prepareListeResultat(self):
92        for i in self.listeLE: i.close()
93        self.listeLE=[]
94        self.vScrollBar = self.scrollArea.verticalScrollBar()
95        self.listeValeursCourantes=self.node.item.GetListeValeurs()
96        if hasattr(self.node.item.definition.validators,'set_MCSimp'):
97             obj=self.node.item.getObject()
98             self.node.item.definition.validators.set_MCSimp(obj)
99             if self.node.item.isvalid() == 0 :
100                liste=[]
101                for item in self.listeValeursCourantes:
102                    if self.node.item.definition.validators.verif_item(item)==1: liste.append(item)
103                self.listeAAfficher=self.node.item.get_liste_possible(liste)
104             else: 
105                self.listeAAfficher=self.node.item.get_liste_possible([])
106        else :
107             self.listeAAfficher=self.node.item.get_liste_possible(self.listeValeursCourantes)
108
109        if self.listeAAfficher==[] : 
110           self.ajoutLE(0)
111           return
112        self.filtreListe()
113        if len(self.listeAAfficher)*20 > 400 : self.setMinimumHeight(400)
114        else : self.setMinimumHeight(len(self.listeAAfficher)*30)
115
116        self.politique=PolitiquePlusieurs(self.node,self.editor)
117        for i in range(1,len(self.listeAAfficher)+1): self.ajoutLE(i)
118        for i in range(len(self.listeAAfficher)):
119            nomLE="lineEditVal"+str(i+1)
120            courant=getattr(self,nomLE)
121            courant.setText(str(self.listeAAfficher[i]))
122        self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
123        if len(self.listeAAfficher) < 15 and hasattr(self,'frameRecherche') : self.frameRecherche.close() 
124        if len(self.listeAAfficher) < 15 and hasattr(self,'frameRecherche2') : self.frameRecherche2.close() 
125        
126       
127   def setValeurs(self,first=True):
128        self.listeValeursCourantes=self.node.item.GetListeValeurs()
129        if first : 
130           if self.monSimpDef.max == "**" or self.monSimpDef.max == float('inf') : aConstruire=7
131           else : aConstruire=self.monSimpDef.max
132           if len(self.listeValeursCourantes) > aConstruire : aConstruire=len(self.listeValeursCourantes)
133           self.indexDernierLabel = aConstruire
134           for i in range(1,aConstruire+1): self.ajoutLEResultat(i)
135        else : self.indexDernierLabel= len(self.listeValeursCourantes)
136        index=1
137        for val in self.listeValeursCourantes :
138           nomLE="LEResultat"+str(index)
139           courant=getattr(self,nomLE)
140           courant.setText(str(val))
141           courant.setReadOnly(True)
142           index=index+1
143        #self.prepareListeResultat()
144
145   def moinsPushed(self):
146       self.ouAjouter=self.ouAjouter-1
147       GereListe.moinsPushed(self)
148       self.setValeurs(first=False)
149
150   def prepareListeResultatFiltre(self):
151       for i in self.listeRouge :
152           nomLE="lineEditVal"+str(i+1)
153           courant=getattr(self,nomLE)
154           texte=courant.text()
155           palette = QPalette(Qt.black)
156           palette.setColor(QPalette.WindowText,Qt.black)
157           courant.setPalette(palette)
158           courant.setText(texte)
159       
160       self.listeRouge = []
161       filtre=str(self.LEFiltre.text())
162       if filtre == '' : return
163       for i in range(len(self.listeAAfficher)):
164            nomLE="lineEditVal"+str(i+1)
165            courant=getattr(self,nomLE)
166            texte=courant.text()
167            if texte.find(filtre) == 0 :
168               palette = QPalette(Qt.red)
169               palette.setColor(QPalette.WindowText,Qt.red)
170               courant.setPalette(palette)
171               courant.setText(texte)
172            self.listeRouge.append(i)
173
174   def cleanListeResultatFiltre(self):
175       self.LEFiltre.setText('')
176       self.prepareListeResultatFiltre()
177
178   def ajoutLEResultat (self,index,valeur=None):
179       #print ('ajoutLEResultat', index, valeur)
180       nomLE="LEResultat"+str(index)
181       if not (hasattr(self,nomLE)) : 
182         nouveauLE = LECustom(self.scrollAreaRE,self,index)
183         nouveauLE.setFrame(False)
184         self.CBChoisis.insertWidget(self.ouAjouter,nouveauLE)
185         self.ouAjouter=self.ouAjouter+1
186         nouveauLE.setReadOnly(True)
187         if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
188         else :            nouveauLE.setStyleSheet("background:rgb(240,240,240)")
189         self.vScrollBarRE = self.scrollAreaRE.verticalScrollBar()
190         self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
191         setattr(self,nomLE,nouveauLE)
192         self.estVisibleRE=nouveauLE
193       else :
194          nouveauLE=getattr(self,nomLE)
195
196       if valeur == None : nouveauLE.setText("")
197       else : nouveauLE.setText(str(valeur))
198       
199   def ajoutLE(self,index,valeur=None):
200       #print ('ajoutLE')
201       nomLE="lineEditVal"+str(index)
202       nouveauLE = MonLabelListeClic(self)
203       #self.CBLayout.addWidget(nouveauLE)
204       self.CBLayout.insertWidget(index -1,nouveauLE)
205       self.listeLE.append(nouveauLE)
206       nouveauLE.setFrameShape(QFrame.NoFrame)
207       QApplication.processEvents()
208       nouveauLE.setText("")
209       if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
210       else :              nouveauLE.setStyleSheet("background:rgb(240,240,240)")
211       self.vScrollBar.triggerAction(QScrollBar.SliderToMaximum)
212       nouveauLE.setFocus()
213       setattr(self,nomLE,nouveauLE)
214       
215   def ajoutLineEdit(self):
216       #print ('ajoutLineEdit')
217       self.indexDernierLabel=self.indexDernierLabel+1
218       self.ajoutLEResultat (self.indexDernierLabel)
219
220
221   def traiteClicSurLabelListe(self,valeur):
222         if valeur == None : return
223         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
224         if validite == 0 : return
225         if liste ==[]    : return
226         listeVal=[]
227
228         self.listeValeursCourantes=self.node.item.GetListeValeurs()
229         min,max = self.node.item.GetMinMax()
230         if len(self.listeValeursCourantes) +1 > max : 
231            self.editor.affiche_infos(tr("Nombre maximal de valeurs : ") + str(max),Qt.red)
232            return
233         else :
234            self.editor.affiche_infos("")
235
236         affiche=False
237         for i in range(1,self.indexDernierLabel+1):
238            nomLE="LEResultat"+str(i)
239            courant=getattr(self,nomLE)
240            if str(courant.text())==str("") : 
241               courant.setText(valeur)
242               courant.setReadOnly(True)
243               affiche=True
244               self.estVisibleRE=courant
245               QTimer.singleShot(1, self.rendVisibleLigneRE)
246               break
247           
248         if affiche == False:
249            self.indexDernierLabel = self.indexDernierLabel+1
250            self.ajoutLEResultat (self.indexDernierLabel,str(valeur))
251            self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
252            QTimer.singleShot(1, self.rendVisibleLigneRE)
253         self.changeValeur()
254         self.setValeurs(first=False)
255
256   def changeValeur(self,changeDePlace=False,oblige=False):
257 #PN les 2 arg sont pour que la signature de ma fonction soit identique a monWidgetPlusieursBase
258         listeVal=[]
259         for i in range(1,self.indexDernierLabel+1):
260            nomLE="LEResultat"+str(i)
261            courant=getattr(self,nomLE)
262            valeur=courant.text()
263            if str(valeur)=="" : continue
264            liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
265            listeVal.append(str(valeur))
266
267         validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(listeVal,-1,[])
268         
269
270         self.listeValeursCourantes=self.node.item.GetListeValeurs()
271         min,max = self.node.item.GetMinMax()
272         if len(self.listeValeursCourantes) < min : 
273            self.editor.affiche_infos(tr("Nombre minimal de valeurs : ") + str(min),Qt.red)
274         else :
275            self.editor.affiche_infos("")
276     
277         if len(listeRetour) == 0 :
278            self.node.item.set_valeur(None)
279         elif validite :
280            self.node.item.set_valeur(listeRetour)
281         else :
282            commentaire=comm+" "+comm2
283            self.editor.affiche_infos(commentaire,Qt.red)
284         self.setValide()
285 #
286   def rendVisibleLigneRE(self):
287       QApplication.processEvents()
288       self.estVisibleRE.setFocus()
289       self.scrollArea.ensureWidgetVisible(self.estVisibleRE,0,0)
290 #
291
292