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