1 #include "ResourceWidget.hxx"
3 ResourceWidget::ResourceWidget(AbstractResourceModel* model, QWidget* parent)
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);
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);
24 QLabel * resourcesLabel = new QLabel(tr("Computing resource:"));
25 resourcesLayout->addWidget(resourcesLabel, 1, 0);
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);
34 _clusterBox = createClusterWidgets();
35 mainLayout->addWidget(_clusterBox);
37 resourcesComboBox->setCurrentIndex(
38 resourcesComboBox->findText(model->getWantedMachine().c_str()));
40 connect(resourcesComboBox, SIGNAL(currentIndexChanged( const QString &)),
41 this, SLOT(updateWantedMachine( const QString &)));
43 _clusterBox->setVisible(!model->isMachineInteractive(
44 model->getWantedMachine()));
45 mainLayout->addStretch();
46 setWidget(mainWidget);
47 setWidgetResizable (true);
50 ResourceWidget::~ResourceWidget()
54 QWidget * ResourceWidget::createClusterWidgets()
57 QGroupBox *clusterBox = new QGroupBox();
58 QGridLayout *groupLayout = new QGridLayout;
59 clusterBox->setLayout(groupLayout);
60 clusterBox->setTitle(tr("Specific parameters for clusters"));
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());
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());
82 QLabel *localdirLabel = new QLabel();
83 _localdirEdit = new QLineEdit();
84 QPushButton* localdirButton = new QPushButton("...");
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());
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());
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);
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)));
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++)
138 _inputFilesList->addItem(it->c_str());
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()));
158 void ResourceWidget::updateParallelizeStatus(bool v)
160 _model->setParallelizeStatus(v);
163 void ResourceWidget::updateWantedMachine( const QString& v)
165 _model->setWantedMachine(v.toStdString());
166 bool isRemote = !_model->isMachineInteractive(v.toStdString());
167 _clusterBox->setVisible(isRemote);
170 std::string defaultValue = _model->getDefaultRemoteDir(v.toStdString());
171 _remotedirEdit->setText(defaultValue.c_str());
172 _model->setRemoteDir(defaultValue);
176 void ResourceWidget::updateNbprocs(int v)
178 _model->setNbprocs(v);
181 void ResourceWidget::updateRemoteDir(const QString &v)
183 _model->setRemoteDir(v.toStdString());
186 void ResourceWidget::updateLocalDir(const QString &v)
188 _model->setLocalDir(v.toStdString());
191 void ResourceWidget::updateWckey(const QString &v)
193 _model->setWckey(v.toStdString());
196 void ResourceWidget::updateMaxHours(int v)
198 _model->setMaxDurationHours(v);
201 void ResourceWidget::updateMaxMinutes(int v)
203 _model->setMaxDurationMinutes(v);
206 void ResourceWidget::onChoseLocaldir()
209 dir = QFileDialog::getExistingDirectory(this,
210 tr("Choose local result directory"),
212 QFileDialog::ShowDirsOnly
213 | QFileDialog::DontResolveSymlinks);
217 _model->setLocalDir(dir.toStdString());
218 _localdirEdit->setText(dir);
222 void ResourceWidget::inputSelectionChanged()
224 bool canRemove = (_inputFilesList->selectedItems().size() > 0);
225 _removeInputFilesButton->setEnabled(canRemove);
228 void ResourceWidget::addInputFiles()
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");
238 l->setSelectionMode(QAbstractItemView::MultiSelection);
240 QTreeView *t = w.findChild<QTreeView*>();
243 t->setSelectionMode(QAbstractItemView::MultiSelection);
247 QStringList fileNames = w.selectedFiles();
248 for (int i = 0; i < fileNames.size(); ++i)
250 QString fileName = fileNames.at(i);
251 if (_inputFilesList->findItems(fileName,Qt::MatchFixedString).size() == 0)
253 _model->getInFiles().push_back(fileName.toStdString());
254 _inputFilesList->addItem(fileName);
260 void ResourceWidget::removeInputFiles()
262 QList<QListWidgetItem *> list = _inputFilesList->selectedItems();
263 for (int i = 0; i < list.size(); ++i)
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);