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