]> SALOME platform Git repositories - modules/yacs.git/blob - src/ydfx_gui/ResourceWidget.cxx
Salome HOME
New Py2YacsDialog using PyEditor_Window.
[modules/yacs.git] / src / ydfx_gui / ResourceWidget.cxx
1 #include "ResourceWidget.hxx"
2
3 ResourceWidget::ResourceWidget(AbstractResourceModel* model, QWidget* parent)
4 : QScrollArea(parent),
5   _model(model),
6   _clusterBox(0),
7   _localdirEdit(0)
8 {
9   QWidget* mainWidget = new QWidget();
10   QVBoxLayout *mainLayout = new QVBoxLayout();
11   mainWidget->setLayout(mainLayout);
12   QGroupBox *resourcesBox = new QGroupBox();
13   resourcesBox->setTitle(tr("Launching parameters"));
14   mainLayout->addWidget(resourcesBox);
15   QGridLayout *resourcesLayout = new QGridLayout();
16   resourcesBox->setLayout(resourcesLayout);
17   
18   QCheckBox *parallelizeStatusCheckBox = new QCheckBox(tr("Parallelize status"));
19   parallelizeStatusCheckBox->setChecked(_model->getParallelizeStatus());
20   connect(parallelizeStatusCheckBox, SIGNAL(toggled(bool)),
21           this, SLOT(updateParallelizeStatus(bool)));
22   resourcesLayout->addWidget(parallelizeStatusCheckBox, 0, 0);
23   
24   QLabel * resourcesLabel = new QLabel(tr("Computing resource:"));
25   resourcesLayout->addWidget(resourcesLabel, 1, 0);
26   
27   QComboBox* resourcesComboBox = new QComboBox;
28   std::vector<std::string> resources = _model->getFittingMachines();
29   std::vector<std::string>::const_iterator it;
30   for(it=resources.begin(); it!=resources.end(); it++)
31     resourcesComboBox->addItem(QString(it->c_str()));
32   resourcesLayout->addWidget(resourcesComboBox, 1, 1);
33   
34   _clusterBox = createClusterWidgets();
35   mainLayout->addWidget(_clusterBox);
36
37   resourcesComboBox->setCurrentIndex(
38                 resourcesComboBox->findText(model->getWantedMachine().c_str()));
39
40   connect(resourcesComboBox, SIGNAL(currentIndexChanged( const QString &)),
41           this, SLOT(updateWantedMachine( const QString &)));
42
43   _clusterBox->setVisible(!model->isMachineInteractive(
44                                                     model->getWantedMachine()));
45   mainLayout->addStretch();
46   setWidget(mainWidget);
47   setWidgetResizable (true);
48 }
49
50 ResourceWidget::~ResourceWidget()
51 {
52 }
53
54 QWidget * ResourceWidget::createClusterWidgets()
55 {
56   // Infos for clusters
57   QGroupBox *clusterBox = new QGroupBox();
58   QGridLayout *groupLayout = new QGridLayout;
59   clusterBox->setLayout(groupLayout);
60   clusterBox->setTitle(tr("Specific parameters for clusters"));
61   QHBoxLayout *hLayout;
62   int pos = 0;
63
64   QLabel *nbprocLabel = new QLabel();
65   QSpinBox *nbprocEdit = new QSpinBox();
66   nbprocLabel->setText(tr("Number of processes"));
67   nbprocEdit->setRange(1, 10000);
68   groupLayout->addWidget(nbprocLabel, pos, 0);
69   groupLayout->addWidget(nbprocEdit, pos++, 1);
70   connect(nbprocEdit, SIGNAL(valueChanged(int)), this, SLOT(updateNbprocs(int)));
71   nbprocEdit->setValue(_model->getNbprocs());
72
73   QLabel *remotedirLabel = new QLabel();
74   _remotedirEdit = new QLineEdit();
75   remotedirLabel->setText(tr("Remote working directory"));
76   groupLayout->addWidget(remotedirLabel, pos, 0);
77   groupLayout->addWidget(_remotedirEdit, pos++, 1);
78   connect(_remotedirEdit, SIGNAL(textEdited(const QString &)),
79           this, SLOT(updateRemoteDir(const QString &)));
80   _remotedirEdit->setText(_model->getRemoteDir().c_str());
81
82   QLabel *localdirLabel = new QLabel();
83   _localdirEdit = new QLineEdit();
84   QPushButton* localdirButton = new QPushButton("...");
85   
86   localdirLabel->setText(tr("Local result directory"));
87   groupLayout->addWidget(localdirLabel, pos, 0);
88   groupLayout->addWidget(_localdirEdit, pos, 1);
89   groupLayout->addWidget(localdirButton, pos++, 2);
90   connect(_localdirEdit, SIGNAL(textEdited(const QString &)),
91           this, SLOT(updateLocalDir(const QString &)));
92   connect(localdirButton,SIGNAL(clicked()),this, SLOT(onChoseLocaldir()));
93   _localdirEdit->setText(_model->getLocalDir().c_str());
94   
95   QLabel *wckeyLabel = new QLabel();
96   QLineEdit *wckeyEdit = new QLineEdit();
97   wckeyLabel->setText(tr("Working Characterization Key"));
98   groupLayout->addWidget(wckeyLabel, pos, 0);
99   groupLayout->addWidget(wckeyEdit, pos++, 1);
100   connect(wckeyEdit, SIGNAL(textEdited(const QString &)),
101           this, SLOT(updateWckey(const QString &)));
102   wckeyEdit->setText(_model->getWckey().c_str());
103   
104   hLayout = new QHBoxLayout();
105   QLabel *timeLabel = new QLabel();
106   QLabel *hoursLabel = new QLabel();
107   QLabel *minutesLabel = new QLabel();
108   QSpinBox *hoursEdit = new QSpinBox();
109   QSpinBox *minutesEdit = new QSpinBox();
110   hoursEdit->setRange(0, 99);
111   minutesEdit->setRange(0,59);
112   timeLabel->setText(tr("Time limit (0:0 for default values):"));
113   hoursLabel->setText(tr("hours"));
114   minutesLabel->setText(tr("minutes"));
115   hLayout->addWidget(hoursEdit);
116   hLayout->addWidget(hoursLabel);
117   hLayout->addWidget(minutesEdit);
118   hLayout->addWidget(minutesLabel);
119   groupLayout->addWidget(timeLabel, pos, 0);
120   groupLayout->addLayout(hLayout, pos++, 1);
121   
122   hoursEdit->setValue(_model->getMaxDurationHours());
123   minutesEdit->setValue(_model->getMaxDurationMinutes());
124   connect(hoursEdit, SIGNAL(valueChanged(int)),
125           this, SLOT(updateMaxHours(int)));
126   connect(minutesEdit, SIGNAL(valueChanged(int)),
127           this, SLOT(updateMaxMinutes(int)));
128   
129   QGroupBox * inputFilesBox = new QGroupBox;
130   inputFilesBox->setTitle(tr("Input files"));
131   QHBoxLayout *inputFilesLayout = new QHBoxLayout;
132   inputFilesBox->setLayout(inputFilesLayout);
133   _inputFilesList = new QListWidget;
134   _inputFilesList->setSelectionMode(QAbstractItemView::MultiSelection);
135   std::list<std::string>::const_iterator it;
136   for(it=_model->getInFiles().begin(); it!= _model->getInFiles().end(); it++)
137   {
138     _inputFilesList->addItem(it->c_str());
139   }
140   QVBoxLayout *inputButtonsLayout = new QVBoxLayout;
141   QPushButton *addInputFilesButton = new QPushButton(tr("+"));
142   _removeInputFilesButton = new QPushButton(tr("-"));
143   inputButtonsLayout->addWidget(addInputFilesButton);
144   inputButtonsLayout->addWidget(_removeInputFilesButton);
145   inputFilesLayout->addWidget(_inputFilesList);
146   inputFilesLayout->addLayout(inputButtonsLayout);
147   groupLayout->addWidget(inputFilesBox, pos++, 0, 1, -1);
148   _removeInputFilesButton->setEnabled(false);
149   connect(_inputFilesList, SIGNAL(itemSelectionChanged()),
150           this, SLOT(inputSelectionChanged()));
151   connect(addInputFilesButton, SIGNAL(clicked()),
152           this, SLOT(addInputFiles()));
153   connect(_removeInputFilesButton, SIGNAL(clicked()),
154           this, SLOT(removeInputFiles()));
155   return clusterBox;
156 }
157
158 void ResourceWidget::updateParallelizeStatus(bool v)
159 {
160   _model->setParallelizeStatus(v);
161 }
162
163 void ResourceWidget::updateWantedMachine( const QString& v)
164 {
165   _model->setWantedMachine(v.toStdString());
166   bool isRemote = !_model->isMachineInteractive(v.toStdString());
167   _clusterBox->setVisible(isRemote);
168   if(isRemote)
169   {
170     std::string defaultValue = _model->getDefaultRemoteDir(v.toStdString());
171     _remotedirEdit->setText(defaultValue.c_str());
172     _model->setRemoteDir(defaultValue);
173   }
174 }
175
176 void ResourceWidget::updateNbprocs(int v)
177 {
178   _model->setNbprocs(v);
179 }
180
181 void ResourceWidget::updateRemoteDir(const QString &v)
182 {
183   _model->setRemoteDir(v.toStdString());
184 }
185
186 void ResourceWidget::updateLocalDir(const QString &v)
187 {
188   _model->setLocalDir(v.toStdString());
189 }
190
191 void ResourceWidget::updateWckey(const QString &v)
192 {
193   _model->setWckey(v.toStdString());
194 }
195
196 void ResourceWidget::updateMaxHours(int v)
197 {
198   _model->setMaxDurationHours(v);
199 }
200
201 void ResourceWidget::updateMaxMinutes(int v)
202 {
203   _model->setMaxDurationMinutes(v);
204 }
205
206 void ResourceWidget::onChoseLocaldir()
207 {
208   QString dir;
209   dir = QFileDialog::getExistingDirectory(this,
210                                           tr("Choose local result directory"),
211                                           "",
212                                           QFileDialog::ShowDirsOnly
213                                           | QFileDialog::DontResolveSymlinks);
214
215   if (dir != "")
216   {
217     _model->setLocalDir(dir.toStdString());
218     _localdirEdit->setText(dir);
219   }
220 }
221
222 void ResourceWidget::inputSelectionChanged()
223 {
224   bool canRemove = (_inputFilesList->selectedItems().size() > 0);
225   _removeInputFilesButton->setEnabled(canRemove);
226 }
227
228 void ResourceWidget::addInputFiles()
229 {
230   // We need to be able to select both files and folders.
231   // Standard QFileDialog cannot do it.
232   QFileDialog w(this, tr("Select input files"),
233               "", tr("All files and folders(*)")) ;
234   w.setOption(QFileDialog::DontUseNativeDialog,true);
235   QListView *l = w.findChild<QListView*>("listView");
236   if (l)
237   {
238     l->setSelectionMode(QAbstractItemView::MultiSelection);
239   }
240   QTreeView *t = w.findChild<QTreeView*>();
241   if (t)
242   {
243     t->setSelectionMode(QAbstractItemView::MultiSelection);
244   }
245   if(w.exec())
246   {
247     QStringList fileNames = w.selectedFiles();
248     for (int i = 0; i < fileNames.size(); ++i) 
249     {
250       QString fileName = fileNames.at(i);
251       if (_inputFilesList->findItems(fileName,Qt::MatchFixedString).size() == 0)
252       {
253         _model->getInFiles().push_back(fileName.toStdString());
254         _inputFilesList->addItem(fileName);
255       }
256     }
257   }
258 }
259
260 void ResourceWidget::removeInputFiles()
261 {
262   QList<QListWidgetItem *> list = _inputFilesList->selectedItems();
263   for (int i = 0; i < list.size(); ++i)
264   {
265     int row = _inputFilesList->row( list.at(i) );
266     QListWidgetItem * item = _inputFilesList->takeItem(row);
267     std::string itemName = item->text().toStdString();
268     _model->getInFiles().remove(itemName);
269     delete item;
270   }
271 }