Salome HOME
legere difference ds VARIABLES_TO_BE...
[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         icon=QIcon(self.repIcon+"/MoinsBleu.png")
79         self.RBMoins.setIcon(icon)
80         icon=QIcon(self.repIcon+"/PlusBleu.png")
81         self.RBPlus.setIcon(icon)
82         icon=QIcon(self.repIcon+"/verre-loupe-icone-6087-64.png")
83         self.RBVoisListe.setIcon(icon)
84
85         self.PBClean.clicked.connect(self.cleanListeResultatFiltre)
86         self.parentQt.commandesLayout.insertWidget(-1,self)
87         self.listeRouge=[]
88
89        
90   def prepareListeResultat(self):
91        for i in self.listeLE: i.close()
92        self.listeLE=[]
93        self.vScrollBar = self.scrollArea.verticalScrollBar()
94        self.listeValeursCourantes=self.node.item.GetListeValeurs()
95        if hasattr(self.node.item.definition.validators,'set_MCSimp'):
96             obj=self.node.item.getObject()
97             self.node.item.definition.validators.set_MCSimp(obj)
98             if self.node.item.isvalid() == 0 :
99                liste=[]
100                for item in self.listeValeursCourantes:
101                    if self.node.item.definition.validators.verif_item(item)==1: liste.append(item)
102                self.listeAAfficher=self.node.item.get_liste_possible(liste)
103             else: 
104                self.listeAAfficher=self.node.item.get_liste_possible([])
105        else :
106             self.listeAAfficher=self.node.item.get_liste_possible(self.listeValeursCourantes)
107
108        if self.listeAAfficher==[] : 
109           self.ajoutLE(0)
110           return
111        self.filtreListe()
112        if len(self.listeAAfficher)*20 > 400 : self.setMinimumHeight(400)
113        else : self.setMinimumHeight(len(self.listeAAfficher)*30)
114
115        self.politique=PolitiquePlusieurs(self.node,self.editor)
116        for i in range(1,len(self.listeAAfficher)+1): self.ajoutLE(i)
117        for i in range(len(self.listeAAfficher)):
118            nomLE="lineEditVal"+str(i+1)
119            courant=getattr(self,nomLE)
120            courant.setText(str(self.listeAAfficher[i]))
121        self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
122        if len(self.listeAAfficher) < 15 and hasattr(self,'frameRecherche') : self.frameRecherche.close() 
123        if len(self.listeAAfficher) < 15 and hasattr(self,'frameRecherche2') : self.frameRecherche2.close() 
124        
125       
126   def setValeurs(self,first=True):
127        self.listeValeursCourantes=self.node.item.GetListeValeurs()
128        if first : 
129           if self.monSimpDef.max == "**" or self.monSimpDef.max == float('inf') : aConstruire=7
130           else : aConstruire=self.monSimpDef.max
131           if len(self.listeValeursCourantes) > aConstruire : aConstruire=len(self.listeValeursCourantes)
132           self.indexDernierLabel = aConstruire
133           for i in range(1,aConstruire+1): self.ajoutLEResultat(i)
134        else : self.indexDernierLabel= len(self.listeValeursCourantes)
135        index=1
136        for val in self.listeValeursCourantes :
137           nomLE="LEResultat"+str(index)
138           courant=getattr(self,nomLE)
139           courant.setText(str(val))
140           courant.setReadOnly(True)
141           index=index+1
142        #self.prepareListeResultat()
143
144   def moinsPushed(self):
145       self.ouAjouter=self.ouAjouter-1
146       GereListe.moinsPushed(self)
147       self.setValeurs(first=False)
148
149   def prepareListeResultatFiltre(self):
150       for i in self.listeRouge :
151           nomLE="lineEditVal"+str(i+1)
152           courant=getattr(self,nomLE)
153           texte=courant.text()
154           palette = QPalette(Qt.black)
155           palette.setColor(QPalette.WindowText,Qt.black)
156           courant.setPalette(palette)
157           courant.setText(texte)
158       
159       self.listeRouge = []
160       filtre=str(self.LEFiltre.text())
161       if filtre == '' : return
162       for i in range(len(self.listeAAfficher)):
163            nomLE="lineEditVal"+str(i+1)
164            courant=getattr(self,nomLE)
165            texte=courant.text()
166            if texte.find(filtre) == 0 :
167               palette = QPalette(Qt.red)
168               palette.setColor(QPalette.WindowText,Qt.red)
169               courant.setPalette(palette)
170               courant.setText(texte)
171            self.listeRouge.append(i)
172
173   def cleanListeResultatFiltre(self):
174       self.LEFiltre.setText('')
175       self.prepareListeResultatFiltre()
176
177   def ajoutLEResultat (self,index,valeur=None):
178       #print ('ajoutLEResultat', index, valeur)
179       nomLE="LEResultat"+str(index)
180       if not (hasattr(self,nomLE)) : 
181         nouveauLE = LECustom(self.scrollAreaRE,self,index)
182         nouveauLE.setFrame(False)
183         self.CBChoisis.insertWidget(self.ouAjouter,nouveauLE)
184         self.ouAjouter=self.ouAjouter+1
185         nouveauLE.setReadOnly(True)
186         if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
187         else :            nouveauLE.setStyleSheet("background:rgb(240,240,240)")
188         self.vScrollBarRE = self.scrollAreaRE.verticalScrollBar()
189         self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
190         setattr(self,nomLE,nouveauLE)
191         self.estVisibleRE=nouveauLE
192       else :
193          nouveauLE=getattr(self,nomLE)
194
195       if valeur == None : nouveauLE.setText("")
196       else : nouveauLE.setText(str(valeur))
197       
198   def ajoutLE(self,index,valeur=None):
199       #print ('ajoutLE')
200       nomLE="lineEditVal"+str(index)
201       nouveauLE = MonLabelListeClic(self)
202       #self.CBLayout.addWidget(nouveauLE)
203       self.CBLayout.insertWidget(index -1,nouveauLE)
204       self.listeLE.append(nouveauLE)
205       nouveauLE.setFrameShape(QFrame.NoFrame)
206       QApplication.processEvents()
207       nouveauLE.setText("")
208       if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
209       else :              nouveauLE.setStyleSheet("background:rgb(240,240,240)")
210       self.vScrollBar.triggerAction(QScrollBar.SliderToMaximum)
211       nouveauLE.setFocus()
212       setattr(self,nomLE,nouveauLE)
213       
214   def ajoutLineEdit(self):
215       #print ('ajoutLineEdit')
216       self.indexDernierLabel=self.indexDernierLabel+1
217       self.ajoutLEResultat (self.indexDernierLabel)
218
219
220   def traiteClicSurLabelListe(self,valeur):
221         if valeur == None : return
222         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
223         if validite == 0 : return
224         if liste ==[]    : return
225         listeVal=[]
226
227         self.listeValeursCourantes=self.node.item.GetListeValeurs()
228         min,max = self.node.item.GetMinMax()
229         if len(self.listeValeursCourantes) +1 > max : 
230            self.editor.affiche_infos(tr("Nombre maximal de valeurs : ") + str(max),Qt.red)
231            return
232         else :
233            self.editor.affiche_infos("")
234
235         affiche=False
236         for i in range(1,self.indexDernierLabel+1):
237            nomLE="LEResultat"+str(i)
238            courant=getattr(self,nomLE)
239            if str(courant.text())==str("") : 
240               courant.setText(valeur)
241               courant.setReadOnly(True)
242               affiche=True
243               self.estVisibleRE=courant
244               QTimer.singleShot(1, self.rendVisibleLigneRE)
245               break
246           
247         if affiche == False:
248            self.indexDernierLabel = self.indexDernierLabel+1
249            self.ajoutLEResultat (self.indexDernierLabel,str(valeur))
250            self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
251            QTimer.singleShot(1, self.rendVisibleLigneRE)
252         self.changeValeur()
253         self.setValeurs(first=False)
254
255   def changeValeur(self,changeDePlace=False,oblige=False):
256 #PN les 2 arg sont pour que la signature de ma fonction soit identique a monWidgetPlusieursBase
257         listeVal=[]
258         for i in range(1,self.indexDernierLabel+1):
259            nomLE="LEResultat"+str(i)
260            courant=getattr(self,nomLE)
261            valeur=courant.text()
262            if str(valeur)=="" : continue
263            liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
264            listeVal.append(str(valeur))
265
266         validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(listeVal,-1,[])
267         
268
269         self.listeValeursCourantes=self.node.item.GetListeValeurs()
270         min,max = self.node.item.GetMinMax()
271         if len(self.listeValeursCourantes) < min : 
272            self.editor.affiche_infos(tr("Nombre minimal de valeurs : ") + str(min),Qt.red)
273         else :
274            self.editor.affiche_infos("")
275     
276         if len(listeRetour) == 0 :
277            self.node.item.set_valeur(None)
278         elif validite :
279            self.node.item.set_valeur(listeRetour)
280         else :
281            commentaire=comm+" "+comm2
282            self.editor.affiche_infos(commentaire,Qt.red)
283         self.setValide()
284 #
285   def rendVisibleLigneRE(self):
286       QApplication.processEvents()
287       self.estVisibleRE.setFocus()
288       self.scrollArea.ensureWidgetVisible(self.estVisibleRE,0,0)
289 #
290
291