Salome HOME
efccfa2c26914daeb1d94449ca955d2932b70c7d
[modules/filter.git] / src / FILTERGUI / SelectField.cxx
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D
2 //
3 //  This library is free software; you can redistribute it and/or
4 //  modify it under the terms of the GNU Lesser General Public
5 //  License as published by the Free Software Foundation; either
6 //  version 2.1 of the License.
7 //
8 //  This library is distributed in the hope that it will be useful,
9 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 //  Lesser General Public License for more details.
12 //
13 //  You should have received a copy of the GNU Lesser General Public
14 //  License along with this library; if not, write to the Free Software
15 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 using namespace std;
20
21 #include "SelectField.h"
22 #include "MEDMEM_define.hxx"
23
24 #include <qgroupbox.h>
25 #include <qframe.h>
26 #include <qlayout.h>
27 #include <qlistview.h>
28 #include <qslider.h>
29 #include <qlabel.h>
30 #include <qpushbutton.h>
31
32 SelectField::SelectField(FilterGUI* theModule,const QString& file, 
33                          const char* name,
34                          bool modal, WFlags fl)
35   : QDialog(FILTER::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu),
36     myFilterGUI( theModule ),
37     _file(file),
38     _mesh(NULL),
39     _field(NULL),
40     _ts(0),
41     _dimMesh(-1)
42 {
43   QListViewItem *element;
44
45   SCRUTE(_file);
46   _filter = myFilterGUI->InitFilterGen();
47   _filter->loadMED(_file);
48   SALOME_FILTER::StrSeq* meshesNames = _filter->getMeshNames();
49   int numberOfMeshes = (*meshesNames).length();
50
51   SALOME_FILTER::StrSeq* fieldsNames = _filter->getFieldNames();
52   int numberOfFields = (*fieldsNames).length();
53
54   QGridLayout* _lay = new QGridLayout( this, 1, 1 );
55
56   QGroupBox* _GroupC1 = new QGroupBox( this, "GroupC1" );
57   _lay->addWidget( _GroupC1,0,0 );
58
59   MESSAGE(basename((char*)(_file.ascii())));
60   QString qs(tr("FILTER_FILE"));
61   qs.append(basename((char*)(_file.ascii())));
62   _GroupC1->setTitle(qs);
63   _GroupC1->setColumnLayout(0, Qt::Vertical );
64   _GroupC1->layout()->setSpacing( 0 );
65   _GroupC1->layout()->setMargin( 0 );
66   _myGroupLayout = new QGridLayout( _GroupC1->layout() );
67   _myGroupLayout->setAlignment( Qt::AlignTop );
68   _myGroupLayout->setSpacing( 6 );
69   _myGroupLayout->setMargin( 11 );
70   _myGroupLayout->setColStretch( 0, 0 );
71   _myGroupLayout->setColStretch( 1, 1 );
72
73   int row = 0;
74
75   // 0)  label to select field on 3D mesh
76   _myGroupLayout->addWidget( new QLabel(tr("FILTER_SEL_3D"),_GroupC1), row, 0 );
77   row++;
78
79   // 1)  tree to visualize meshes and fields
80   _myList = new QListView( _GroupC1, "List of fields" );
81   _myList->setMinimumSize( 500, 500 );
82   _myList->setMaximumSize( 500, 500 );
83   _myList->setRootIsDecorated(true);
84   _myList->addColumn(tr("FILTER_NAME"));
85   _myList->addColumn(tr("FILTER_TYPE"));
86   _myList->addColumn(tr("FILTER_DIM"));
87
88   for(int i=0;i<numberOfMeshes;i++){
89     _dimMesh = _filter->getMeshDimension((*meshesNames)[i]);
90     char strd[4];
91     sprintf(strd,"%dD\0",_dimMesh);
92     element = new QListViewItem( _myList, QString((*meshesNames)[i]), tr("FILTER_MESH") ,strd);
93     element->setExpandable(true);
94     _myList->setOpen(element,true);
95
96     for (int j=0; j<numberOfFields; j++){
97       SALOME_FILTER::DTITSeq *myIteration = _filter->getFieldIteration((*fieldsNames)[j]);
98       string meshName = _filter->getMeshName((*fieldsNames)[j],(*myIteration)[0].dt,(*myIteration)[0].it);
99       if( strcmp(meshName.c_str(),(*meshesNames)[i]) == 0){
100         int ent = _filter->getFieldEntity((*fieldsNames)[j],(*myIteration)[0].dt,(*myIteration)[0].it);
101         bool isOnAllElements = _filter->fieldIsOnAllElements((*fieldsNames)[j],(*myIteration)[0].dt,(*myIteration)[0].it);
102
103         char stre[10];
104         switch(ent){
105         case MED_EN::MED_CELL:
106           strcpy(stre,"on cells");
107           break;
108         case MED_EN::MED_FACE:
109           strcpy(stre,"on faces");
110           break;
111         case MED_EN::MED_EDGE:
112           strcpy(stre,"on edges");
113           break;
114         case MED_EN::MED_NODE:
115           strcpy(stre,"on nodes");
116           break;
117         }
118         QListViewItem *elem = new QListViewItem( element, QString((*fieldsNames)[j]), tr("FILTER_FIELD"),stre );
119         if( (_dimMesh != 3) || (ent != MED_EN::MED_NODE) || !isOnAllElements )
120           elem->setSelectable(false);
121       }
122     }
123
124     element->setSelectable(false);
125   }
126   _myGroupLayout->addWidget( _myList, row, 0 );
127   row++;
128
129   // 2)  label for time steps
130   _myLab = new QLabel(tr("FILTER_SEL_TS"),_GroupC1);
131   _myLab->hide();
132   _myGroupLayout->addWidget( _myLab, row, 0 );
133   row++;
134
135   // 3)  slider to visualize time steps
136   _mySlider = new QSlider(_GroupC1);
137   _mySlider->setOrientation(Qt::Horizontal);
138   _mySlider->setTickmarks(QSlider::Below);
139   _myGroupLayout->addWidget( _mySlider, row, 0 );
140
141   _mySlider->hide();
142   row++;
143
144   // 4) buttons Ok, Cancel and Help
145   _GroupButtons = new QGroupBox(_GroupC1, "GroupButtons");
146   _GroupButtons->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, _GroupButtons->sizePolicy().hasHeightForWidth()));
147 //   _GroupButtons->setGeometry(QRect(10, 10, 281, 48));
148   _GroupButtons->setTitle(tr("" ));
149   _GroupButtons->setColumnLayout(0, Qt::Vertical);
150   _GroupButtons->layout()->setSpacing(0);
151   _GroupButtons->layout()->setMargin(0);
152   _GroupButtonsLayout = new QGridLayout(_GroupButtons->layout());
153   _GroupButtonsLayout->setAlignment(Qt::AlignTop);
154   _GroupButtonsLayout->setSpacing(6);
155   _GroupButtonsLayout->setMargin(11);
156   _buttonHelp = new QPushButton(_GroupButtons, "buttonHelp");
157   _buttonHelp->setText(tr("FILTER_BUT_HELP" ));
158   _buttonHelp->setAutoDefault(TRUE);
159   _GroupButtonsLayout->addWidget(_buttonHelp, 0, 2);
160   _buttonCancel = new QPushButton(_GroupButtons, "buttonClose");
161   _buttonCancel->setText(tr("FILTER_BUT_CANCEL" ));
162   _buttonCancel->setAutoDefault(TRUE);
163   _GroupButtonsLayout->addWidget(_buttonCancel, 0, 1);
164   _buttonOk = new QPushButton(_GroupButtons, "buttonOk");
165   _buttonOk->setText(tr("FILTER_BUT_OK" ));
166   _buttonOk->setAutoDefault(TRUE);
167   _GroupButtonsLayout->addWidget(_buttonOk, 0, 0);
168   _myGroupLayout->addWidget( _GroupButtons, row, 0 );
169   row++;
170
171   connect( _myList, SIGNAL(clicked(QListViewItem *)), this, SLOT(fieldSelected(QListViewItem *)));
172   connect( _mySlider, SIGNAL(sliderReleased()), this, SLOT(tsSelected()));
173   connect(_buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
174   connect(_buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
175   connect(_buttonHelp, SIGNAL(clicked()),   this, SLOT(ClickOnHelp()));
176
177 }
178
179 SelectField::~SelectField()
180 {
181   // no need to delete child widgets, Qt does it all for us
182   cout << "SelectField: destructor called" << endl;
183   _filter->unloadMED();
184 }
185
186 void SelectField::fieldSelected(QListViewItem *lvi)
187 {
188   if(lvi){
189     if( (strcmp(lvi->text(1),"Field") == 0) && (_dimMesh == 3) ){
190       _field = lvi->text(0);
191       _mesh = lvi->parent()->text(0);
192 //       deque<DT_IT_> myIteration = _filterMED->getFieldIteration(lvi->text(0));
193       SALOME_FILTER::DTITSeq *myIteration = _filter->getFieldIteration(lvi->text(0));
194       int numberOfIteration = (*myIteration).length();
195       if( numberOfIteration > 1 ){
196         _mySlider->setRange((*myIteration)[0].dt,
197                             (*myIteration)[numberOfIteration-1].dt);
198         _myLab->show();
199         _mySlider->show();
200       }
201       else{
202         _ts = 0;
203         _myLab->hide();
204         _mySlider->hide();
205       }
206     }
207   }
208 }
209
210 void SelectField::tsSelected()
211 {
212   _ts = _mySlider->value();
213   MESSAGE("File " << _file );
214   MESSAGE("Mesh " << _mesh );
215   MESSAGE("Field " << _field );
216   MESSAGE("Time step " << _ts );
217 }
218
219 void SelectField::ClickOnOk()
220 {
221   MESSAGE("click on Ok");
222   accept();
223 }
224
225 void SelectField::ClickOnCancel()
226 {
227   MESSAGE("click on Cancel");
228   reject();
229 }
230
231 void SelectField::ClickOnHelp()
232 {
233   MESSAGE("click on Help");
234 }