Salome HOME
1f1ce2cdd3045556fd23cd5bcb3a1b3aa0cb46f7
[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 import string,types,os,sys
22
23 # Modules Eficas
24 from PyQt4.QtGui import *
25 from PyQt4.QtCore import *
26 from Extensions.i18n import tr
27
28 from feuille                import Feuille
29 from desWidgetPlusieursIntoOrdonne import Ui_WidgetPlusieursIntoOrdonne 
30 from politiquesValidation   import PolitiquePlusieurs
31 from qtSaisie               import SaisieValeur
32 from gereListe              import GereListe
33 from gereListe              import GerePlie
34 from gereListe              import LECustom
35 from gereListe              import MonLabelListeClic
36
37
38
39 class MonWidgetPlusieursIntoOrdonne (Ui_WidgetPlusieursIntoOrdonne, Feuille,GereListe,GerePlie):
40
41   def __init__(self,node,monSimpDef,nom,objSimp,parentQt,commande):
42         #print "MonWidgetPlusieursInto", nom, self
43         self.nomLine="LEResultat"
44         self.listeLE=[]
45         self.ouAjouter=0
46         Feuille.__init__(self,node,monSimpDef,nom,objSimp,parentQt,commande)
47         GereListe.__init__(self)
48         self.initCommentaire()
49         self.gereIconePlier()
50         try :
51           self.maCommande.listeAffichageWidget.append(self.lineEditVal1)
52         except :
53           # cas ou on ne peut rien ajouter
54           pass 
55         self.prepareListeResultat()
56         self.adjustSize()
57         if sys.platform[0:5]!="linux":
58           repIcon=self.node.editor.appliEficas.repIcon
59           fichier=os.path.join(repIcon, 'arrow_up.png')
60           icon = QIcon(fichier)
61           self.RBHaut.setIcon(icon)
62           self.RBHaut.setIconSize(QSize(32, 32))
63           fichier2=os.path.join(repIcon, 'arrow_down.png')
64           icon2 = QIcon(fichier2)
65           self.RBBas.setIcon(icon2)
66         self.parentQt.commandesLayout.insertWidget(-1,self)
67
68        
69   def prepareListeResultat(self):
70        for i in self.listeLE: i.close()
71        self.listeLE=[]
72        self.vScrollBar = self.scrollArea.verticalScrollBar()
73        listeValeursCourantes=self.node.item.GetListeValeurs()
74        if hasattr(self.node.item.definition.validators,'set_MCSimp'):
75             obj=self.node.item.getObject()
76             self.node.item.definition.validators.set_MCSimp(obj)
77             if self.node.item.isvalid() == 0 :
78                liste=[]
79                for item in listeValeursCourantes:
80                    if self.node.item.definition.validators.verif_item(item)==1: liste.append(item)
81                self.listeAAfficher=self.node.item.get_liste_possible(liste)
82             else: 
83                self.listeAAfficher=self.node.item.get_liste_possible([])
84        else :
85             self.listeAAfficher=self.node.item.get_liste_possible(listeValeursCourantes)
86
87        if self.listeAAfficher==[] : 
88           self.ajoutLE(0)
89           return
90        if len(self.listeAAfficher)*20 > 400 : self.setMinimumHeight(400)
91        else : self.setMinimumHeight(len(self.listeAAfficher)*30)
92
93        self.politique=PolitiquePlusieurs(self.node,self.editor)
94        for i in range(1,len(self.listeAAfficher)+1): self.ajoutLE(i)
95        for i in range(len(self.listeAAfficher)):
96            nomLE="lineEditVal"+str(i+1)
97            courant=getattr(self,nomLE)
98            courant.setText(str(self.listeAAfficher[i]))
99        self.vScrollBar.triggerAction(QScrollBar.SliderToMinimum)
100        
101       
102   def setValeurs(self):
103        listeValeursCourantes=self.node.item.GetListeValeurs()
104        if self.monSimpDef.max == "**" : aConstruire=7
105        else                           : aConstruire=self.monSimpDef.max
106        if len(listeValeursCourantes) > aConstruire : aConstruire=len(listeValeursCourantes)
107        for i in range(1,aConstruire+1): self.ajoutLEResultat(i)
108        self.indexDernierLabel=aConstruire
109        index=1
110        for val in listeValeursCourantes :
111           nomLE="LEResultat"+str(index)
112           courant=getattr(self,nomLE)
113           courant.setText(str(val))
114           courant.setReadOnly(True)
115           index=index+1
116        self.prepareListeResultat()
117
118   def moinsPushed(self):
119       self.ouAjouter=self.ouAjouter-1
120       GereListe.moinsPushed(self)
121       self.setValeurs()
122
123
124   def ajoutLEResultat (self,index,valeur=None):
125       nomLE="LEResultat"+str(index)
126       if hasattr(self,nomLE) : return
127       nouveauLE = LECustom(self.scrollAreaRE,self,index)
128       nouveauLE.setFrame(False)
129       self.CBChoisis.insertWidget(self.ouAjouter,nouveauLE)
130       self.ouAjouter=self.ouAjouter+1
131       nouveauLE.setText("")
132       nouveauLE.setReadOnly(True)
133       if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
134       else :              nouveauLE.setStyleSheet("background:rgb(240,240,240)")
135       self.vScrollBarRE = self.scrollAreaRE.verticalScrollBar()
136       self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
137       setattr(self,nomLE,nouveauLE)
138       self.estVisibleRE=nouveauLE
139       if valeur != None : 
140          nouveauLE.setText(valeur)
141       
142   def ajoutLE(self,index,valeur=None):
143       nomLE="lineEditVal"+str(index)
144       nouveauLE = MonLabelListeClic(self)
145       #self.CBLayout.addWidget(nouveauLE)
146       self.CBLayout.insertWidget(index -1,nouveauLE)
147       self.listeLE.append(nouveauLE)
148       nouveauLE.setFrameShape(QFrame.NoFrame)
149       qApp.processEvents()
150       nouveauLE.setText("")
151       if index % 2 == 1 : nouveauLE.setStyleSheet("background:rgb(210,210,210)")
152       else :              nouveauLE.setStyleSheet("background:rgb(240,240,240)")
153       self.vScrollBar.triggerAction(QScrollBar.SliderToMaximum)
154       nouveauLE.setFocus()
155       setattr(self,nomLE,nouveauLE)
156       
157
158
159   def traiteClicSurLabelListe(self,valeur):
160         if valeur == None : return
161         liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
162         if validite == 0 : return
163         if liste ==[]    : return
164         listeVal=[]
165
166         listeValeursCourantes=self.node.item.GetListeValeurs()
167         min,max = self.node.item.GetMinMax()
168         if len(listeValeursCourantes) +1 > max : 
169            self.editor.affiche_infos(tr("Nombre maximal de valeurs : ") + str(max),Qt.red)
170            return
171         else :
172            self.editor.affiche_infos(tr(""))
173
174         affiche=False
175         for i in range(1,self.indexDernierLabel+1):
176            nomLE="LEResultat"+str(i)
177            courant=getattr(self,nomLE)
178            if str(courant.text())==str("") : 
179               courant.setText(valeur)
180               courant.setReadOnly(True)
181               affiche=True
182               self.estVisibleRE=courant
183               QTimer.singleShot(1, self.rendVisibleLigneRE)
184               break
185           
186         if affiche == False:
187            self.indexDernierLabel = self.indexDernierLabel+1
188            self.ajoutLEResultat (self.indexDernierLabel,str(valeur))
189            self.vScrollBarRE.triggerAction(QScrollBar.SliderToMaximum)
190            QTimer.singleShot(1, self.rendVisibleLigneRE)
191         self.changeValeur()
192         self.setValeurs()
193
194   def changeValeur(self,changeDePlace=False,oblige=False):
195 #PN les 2 arg sont pour que la signature de ma fonction soit identique a monWidgetPlusieursBase
196         listeVal=[]
197         for i in range(1,self.indexDernierLabel+1):
198            nomLE="LEResultat"+str(i)
199            courant=getattr(self,nomLE)
200            valeur=courant.text()
201            if str(valeur)=="" : continue
202            liste,validite=SaisieValeur.TraiteLEValeur(self,str(valeur))
203            listeVal.append(str(valeur))
204
205         validite,comm,comm2,listeRetour=self.politique.AjoutValeurs(listeVal,-1,[])
206         
207
208         listeValeursCourantes=self.node.item.GetListeValeurs()
209         min,max = self.node.item.GetMinMax()
210         if len(listeValeursCourantes) < min : 
211            self.editor.affiche_infos(tr("Nombre minimal de valeurs : ") + str(min),Qt.red)
212         else :
213            self.editor.affiche_infos("")
214     
215         if len(listeRetour) == 0 :
216            self.node.item.set_valeur(None)
217         elif validite :
218            self.node.item.set_valeur(listeRetour)
219         else :
220            commentaire=comm+" "+comm2
221            self.editor.affiche_infos(commentaire,Qt.red)
222         self.setValide()
223 #
224   def rendVisibleLigneRE(self):
225       qApp.processEvents()
226       self.estVisibleRE.setFocus()
227       self.scrollArea.ensureWidgetVisible(self.estVisibleRE,0,0)
228 #
229   def initCommentaire(self):
230         commentaire=""
231         mc = self.node.item.get_definition()
232         d_aides = { 'TXM' : 'chaînes\n',
233                   'R'   : 'réels\n',
234                   'I'   : 'entiers\n',
235                   'C'   : 'complexes\n'}
236         type = mc.type[0]
237         if not d_aides.has_key(type) :
238            if mc.min == mc.max:
239                commentaire=tr("Entrez ")+str(mc.min)+(" valeurs \n ")
240            else :
241                commentaire=tr("Entrez entre ")+str(mc.min)+tr(" et ")+str(mc.max)+tr(" valeurs ")
242         else :
243           # Pour la traduction
244            if type == 'TXM' : aide=tr('chaines \n')
245            if type == 'R'   : aide=tr('reels\n')
246            if type == 'I'   : aide=tr('entiers\n')
247            if type == 'C'   : aide=tr('complexes\n')
248            if mc.min == mc.max:
249                commentaire=tr("Entrez ")+str(mc.min)+" "+ aide
250            else :
251                commentaire=tr("Entrez entre ")+str(mc.min)+tr(" et ")+str(mc.max)+" "+aide
252         aideval=self.node.item.aide()
253         commentaire=commentaire +  (aideval)
254         self.monCommentaireLabel.setText(commentaire)
255
256