coriolis/bootstrap/runPharos/ConfigDialog.cpp

153 lines
5.3 KiB
C++

#include <iostream>
using namespace std;
#include <QGridLayout>
#include <QDialogButtonBox>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QFileDialog>
#include <QGroupBox>
#include <QVBoxLayout>
#include <QMessageBox>
#include "ConfigDialog.h"
#include "TechnoRow.h"
#define LINEEDITWIDTH 300
int ConfigDialog::_rowID = 0;
ConfigDialog::ConfigDialog() {
setStyleSheet("font-weight: normal;");
// First GroupBox : Directories
// Create widgets
QLabel* programL = new QLabel(tr("Pharos binary") , this);
QLabel* libraryL = new QLabel(tr("LD_LIBRARY_PATH") , this);
_programE = new QLineEdit ("", this);
_libraryE = new QLineEdit ("", this);
_programE->setFixedWidth(LINEEDITWIDTH);
_libraryE->setFixedWidth(LINEEDITWIDTH);
_programE->setToolTip(tr("Select <b>Pharos</b> binary file."));
_libraryE->setToolTip(tr("Select the directory containing c++ dynamic libraries used by <b>Pharos</b>."));
QPushButton* programB = new QPushButton(tr("&Browse"));
QPushButton* libraryB = new QPushButton(tr("&Browse"));
// Connect SIGNAL/SLOTS
connect(programB , SIGNAL(clicked()), this, SLOT(chooseProgram()));
connect(libraryB , SIGNAL(clicked()), this, SLOT(chooseLibrary()));
// Create GroupBox
QGroupBox* directories = new QGroupBox("Directories", this);
QGridLayout* gLayout = new QGridLayout(this);
gLayout->addWidget( programL , 0, 0, 1, 1);
gLayout->addWidget(_programE , 0, 1, 1, 1);
gLayout->addWidget( programB , 0, 2, 1, 1);
gLayout->addWidget( libraryL , 1, 0, 1, 1);
gLayout->addWidget(_libraryE , 1, 1, 1, 1);
gLayout->addWidget( libraryB , 1, 2, 1, 1);
directories->setLayout(gLayout);
// Second GroupBox : Technos
// Create Widgets / Layout
QLabel* name = new QLabel(tr("Name"));
QLabel* file = new QLabel(tr("XML Config File"));
name->setFixedWidth(80);
file->setFixedWidth(LINEEDITWIDTH);
_rowLayout = new QVBoxLayout();
_rowLayout->setContentsMargins(0,0,0,0);
_rowLayout->setSpacing(0);
addRow();
// Create GroupBox
QGroupBox* technos = new QGroupBox("Technologies", this);
QHBoxLayout* headerLayout = new QHBoxLayout();
headerLayout->addSpacing(20);
headerLayout->addWidget(name);
headerLayout->addWidget(file);
QVBoxLayout* techLayout = new QVBoxLayout();
techLayout->addLayout(headerLayout);
techLayout->addLayout(_rowLayout);
technos->setLayout(techLayout);
QDialogButtonBox* dbBox = new QDialogButtonBox(QDialogButtonBox::Ok);
_add = new QPushButton("&Add technology", this);
dbBox->addButton(_add, QDialogButtonBox::ActionRole);
connect(_add , SIGNAL(clicked()) , this, SLOT(addRow()));
connect(dbBox, SIGNAL(accepted()), this, SLOT(doConfig()));
QVBoxLayout* tLayout = new QVBoxLayout();
tLayout->setContentsMargins(0,0,0,0);
tLayout->addWidget(directories);
tLayout->addWidget(technos);
tLayout->addWidget(dbBox);
setLayout(tLayout);
setWindowTitle(tr("Configure runPharos"));
layout()->setSizeConstraint(QLayout::SetFixedSize);
}
void ConfigDialog::addRow() {
TechnoRow* row = new TechnoRow(_rowID++, this);
connect(row, SIGNAL(suppressed(int)), this, SLOT(removeRow(int)));
row->setContentsMargins(0,0,0,0);
_rows.push_back(row);
_rowLayout->addWidget(row);
}
void ConfigDialog::addRow(QString& name, QString& file) {
TechnoRow* row = new TechnoRow(_rowID++, this);
row->setName(name);
row->setFile(file);
connect(row, SIGNAL(suppressed(int)), this, SLOT(removeRow(int)));
row->setContentsMargins(0,0,0,0);
_rows.push_back(row);
_rowLayout->addWidget(row);
}
void ConfigDialog::removeRow(int id) {
TechnoRow* row = _rows[id];
_rowLayout->removeWidget(row);
row->hide();
}
void ConfigDialog::doConfig() {
QStringList list;
if ( _programE->text().isEmpty() || _libraryE->text().isEmpty() ) {
QMessageBox::warning(this, tr("runPharos warning"), tr("You must set all directories."));
return;
}
list << _programE->text() << _libraryE->text();
vector<pair<QString, QString> > technos;
for ( size_t i = 0 ; i < _rows.size() ; i++ ) {
TechnoRow* row = _rows[i];
if (row->isVisible()) {
if((row->getName() != "") && (row->getFile() != "")) {
technos.push_back(pair<QString, QString>(row->getName(), row->getFile()));
} else {
QMessageBox::warning(this, tr("runPharos warning"), tr("You must set a valid name and file for each technology."));
return;
}
}
}
if (technos.size() > 0) {
emit(configDone(list, technos));
accept();
} else {
QMessageBox::warning(this, tr("runPharos warning"), tr("You must set at least one valid technology."));
}
}
void ConfigDialog::chooseProgram() {
_programE->setText(QFileDialog::getOpenFileName(this, tr("Select Pharos binary file"), "", tr("Executable file (*)")));
}
void ConfigDialog::chooseLibrary() {
_libraryE->setText(QFileDialog::getExistingDirectory(this, tr("Select directory containing c++ dynamic libraries")));
}
void ConfigDialog::setProgram(QString program) {
_programE->setText(program);
}
void ConfigDialog::setLibrary(QString library) {
_libraryE->setText(library);
}