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