Salome HOME
chgt copyright
[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 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.verifItem(item)==1: liste.append(item)
102                self.listeAAfficher=self.node.item.getListePossible(liste)
103             else: 
104                self.listeAAfficher=self.node.item.getListePossible([])
105        else :
106             self.listeAAfficher=self.node.item.getListePossible(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        index=1
135        for val in self.listeValeursCourantes :
136           nomLE="LEResultat"+str(index)
137           courant=getattr(self,nomLE)
138           courant.setText(str(val))
139           courant.setReadOnly(True)
140           index=index+1
141        while (index < self.indexDernierLabel) :
142           nomLE="LEResultat"+str(index)
143           courant=getattr(self,nomLE)
144           courant.setText("")
145           courant.setReadOnly(True)
146           index=index+1
147        #self.prepareListeResultat()
148
149   def moinsPushed(self):
150       self.ouAjouter=self.ouAjouter-1
151       GereListe.moinsPushed(self)
152       self.setValeurs(first=False)
153
154   def prepareListeResultatFiltre(self):
155       for i in self.listeRouge :
156           nomLE="lineEditVal"+str(i+1)
157           courant=getattr(self,nomLE)
158           texte=courant.text()
159           palette = QPalette(Qt.black)
160           palette.setColor(QPalette.WindowText,Qt.black)
161           courant.setPalette(palette)
162           courant.setText(texte)
163       
164       self.listeRouge = []
165       filtre=str(self.LEFiltre.text())
166       if filtre == '' : return
167       for i in range(len(self.listeAAfficher)):
168            nomLE="lineEditVal"+str(i+1)
169            courant=getattr(self,nomLE)
170            texte=courant.text()
171            if texte.find(filtre) == 0 :
172               palette = QPalette(Qt.red)
173               palette.setColor(QPalette.WindowText,Qt.red)
174               courant.setPalette(palette)
175               courant.setText(texte)
176            self.listeRouge.append(i)
177
178   def cleanListeResultatFiltre(self):
179       self.LEFiltre.setText('')
180       self.prepareListeResultatFiltre()
181
182   def ajoutLEResultat (self,index,valeur=None):
183       #print ('ajoutLEResultat', index, valeur)
184       nomLE="LEResultat"+str(index)
185       if not (hasattr(self,nomLE)) : 
186         nouveauLE = LECustom(self.scrollAreaRE,self,index)
187         nouveauLE.setFrame(False)
188         self.CBChoisis.insertWidget(self.ouAjouter,nouveauLE)
189         self.ouAjouter=self.ouAjouter+1
190         nouveauLE.setReadOnly(True)
191         if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
192         else :            nouveauLE.setStyleSheet("background:rgb(240,240,240)")
193         self.vScrollBarRE = self.scrollAreaRE.verticalScrollBar()
194         self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
195         setattr(self,nomLE,nouveauLE)
196         self.estVisibleRE=nouveauLE
197       else :
198          nouveauLE=getattr(self,nomLE)
199
200       if valeur == None : nouveauLE.setText("")
201       else : nouveauLE.setText(str(valeur))
202       
203   def ajoutLE(self,index,valeur=None):
204       #print ('ajoutLE')
205       nomLE="lineEditVal"+str(index)
206       nouveauLE = MonLabelListeClic(self)
207       #self.CBLayout.addWidget(nouveauLE)
208       self.CBLayout.insertWidget(index -1,nouveauLE)
209       self.listeLE.append(nouveauLE)
210       nouveauLE.setFrameShape(QFrame.NoFrame)
211       QApplication.processEvents()
212       nouveauLE.setText("")
213       if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
214       else :              nouveauLE.setStyleSheet("background:rgb(240,240,240)")
215       self.vScrollBar.triggerAction(QScrollBar.SliderToMaximum)
216       nouveauLE.setFocus()
217       setattr(self,nomLE,nouveauLE)
218       
219   def ajoutLineEdit(self):
220       print ('ajoutLineEdit')
221       self.indexDernierLabel=self.indexDernierLabel+1
222       self.ajoutLEResultat (self.indexDernierLabel)
223
224
225   def traiteClicSurLabelListe(self,valeur):
226         if valeur == None : return
227         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
228         if validite == 0 : return
229         if liste ==[]    : return
230         listeVal=[]
231
232         self.listeValeursCourantes=self.node.item.getListeValeurs()
233         min,max = self.node.item.getMinMax()
234         if len(self.listeValeursCourantes) +1 > max : 
235            self.editor.afficheInfos(tr("Nombre maximal de valeurs : ") + str(max),Qt.red)
236            return
237         else :
238            self.editor.afficheInfos("")
239
240         affiche=False
241         for i in range(1,self.indexDernierLabel+1):
242            nomLE="LEResultat"+str(i)
243            courant=getattr(self,nomLE)
244            if str(courant.text())==str("") : 
245               courant.setText(valeur)
246               courant.setReadOnly(True)
247               affiche=True
248               self.estVisibleRE=courant
249               QTimer.singleShot(1, self.rendVisibleLigneRE)
250               break
251           
252         if affiche == False:
253            self.indexDernierLabel = self.indexDernierLabel+1
254            self.ajoutLEResultat (self.indexDernierLabel,str(valeur))
255            self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
256            QTimer.singleShot(1, self.rendVisibleLigneRE)
257         self.changeValeur()
258         self.setValeurs(first=False)
259
260   def changeValeur(self,changeDePlace=False,oblige=False):
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