1 #include "ResourceWidget.hxx"
3 ResourceWidget::ResourceWidget(AbstractResourceModel* model, QWidget* parent)
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);
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);
23 QLabel * resourcesLabel = new QLabel(tr("Computing resource:"));
24 resourcesLayout->addWidget(resourcesLabel, 1, 0);
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);
33 _clusterBox = createClusterWidgets();
34 mainLayout->addWidget(_clusterBox);
36 resourcesComboBox->setCurrentIndex(
37 resourcesComboBox->findText(model->getWantedMachine().c_str()));
39 connect(resourcesComboBox, SIGNAL(currentIndexChanged( const QString &)),
40 this, SLOT(updateWantedMachine( const QString &)));
42 _clusterBox->setVisible(!model->isMachineInteractive(
43 model->getWantedMachine()));
46 ResourceWidget::~ResourceWidget()
50 QWidget * ResourceWidget::createClusterWidgets()
53 QGroupBox *clusterBox = new QGroupBox();
54 QGridLayout *groupLayout = new QGridLayout;
55 clusterBox->setLayout(groupLayout);
56 clusterBox->setTitle(tr("Specific parameters for clusters"));
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());
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());
78 QLabel *localdirLabel = new QLabel();
79 _localdirEdit = new QLineEdit();
80 QPushButton* localdirButton = new QPushButton("...");
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());
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());
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);
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)));
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()));
149 void ResourceWidget::updateParallelizeStatus(bool v)
151 _model->setParallelizeStatus(v);
154 void ResourceWidget::updateWantedMachine( const QString& v)
156 _model->setWantedMachine(v.toStdString());
157 bool isRemote = !_model->isMachineInteractive(v.toStdString());
158 _clusterBox->setVisible(isRemote);
161 std::string defaultValue = _model->getDefaultRemoteDir(v.toStdString());
162 _remotedirEdit->setText(defaultValue.c_str());
163 _model->setRemoteDir(defaultValue);
167 void ResourceWidget::updateNbprocs(int v)
169 _model->setNbprocs(v);
172 void ResourceWidget::updateRemoteDir(const QString &v)
174 _model->setRemoteDir(v.toStdString());
177 void ResourceWidget::updateLocalDir(const QString &v)
179 _model->setLocalDir(v.toStdString());
182 void ResourceWidget::updateWckey(const QString &v)
184 _model->setWckey(v.toStdString());
187 void ResourceWidget::updateMaxHours(int v)
189 _model->setMaxDurationHours(v);
192 void ResourceWidget::updateMaxMinutes(int v)
194 _model->setMaxDurationMinutes(v);
197 void ResourceWidget::onChoseLocaldir()
200 dir = QFileDialog::getExistingDirectory(this,
201 tr("Choose local result directory"),
203 QFileDialog::ShowDirsOnly
204 | QFileDialog::DontResolveSymlinks);
208 _model->setLocalDir(dir.toStdString());
209 _localdirEdit->setText(dir);
213 void ResourceWidget::inputSelectionChanged()
215 bool canRemove = (_inputFilesList->selectedItems().size() > 0);
216 _removeInputFilesButton->setEnabled(canRemove);
219 void ResourceWidget::addInputFiles()
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");
229 l->setSelectionMode(QAbstractItemView::MultiSelection);
231 QTreeView *t = w.findChild<QTreeView*>();
234 t->setSelectionMode(QAbstractItemView::MultiSelection);
238 QStringList fileNames = w.selectedFiles();
239 for (int i = 0; i < fileNames.size(); ++i)
241 QString fileName = fileNames.at(i);
242 if (_inputFilesList->findItems(fileName,Qt::MatchFixedString).size() == 0)
244 _model->getInFiles().push_back(fileName.toStdString());
245 _inputFilesList->addItem(fileName);
251 void ResourceWidget::removeInputFiles()
253 QList<QListWidgetItem *> list = _inputFilesList->selectedItems();
254 for (int i = 0; i < list.size(); ++i)
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);