From 59c1ebf1d9f3e00538699a43485def8f349b98ed Mon Sep 17 00:00:00 2001
From: Damien Dupuis
Date: Fri, 29 Jan 2010 13:07:27 +0000
Subject: [PATCH] Initial import for goodies
---
bootstrap/easyChams/CompilationWidget.cpp | 266 ++++++++++++++++++
bootstrap/easyChams/CompilationWidget.h | 69 +++++
bootstrap/easyChams/CompileHighlighter.cpp | 70 +++++
bootstrap/easyChams/CompileHighlighter.h | 38 +++
bootstrap/easyChams/ConfigDialog.cpp | 83 ++++++
bootstrap/easyChams/ConfigDialog.h | 88 ++++++
bootstrap/easyChams/MainWindow.cpp | 22 ++
bootstrap/easyChams/MainWindow.h | 15 +
bootstrap/easyChams/README | 5 +
bootstrap/easyChams/compile.sh | 8 +
.../easyChams/icons/linux/Eye_of_Horus.png | Bin 0 -> 29336 bytes
.../easyChams/icons/macosx/Eye of Horus.zip | Bin 0 -> 31787 bytes
bootstrap/easyChams/main.cpp | 16 ++
13 files changed, 680 insertions(+)
create mode 100644 bootstrap/easyChams/CompilationWidget.cpp
create mode 100644 bootstrap/easyChams/CompilationWidget.h
create mode 100644 bootstrap/easyChams/CompileHighlighter.cpp
create mode 100644 bootstrap/easyChams/CompileHighlighter.h
create mode 100644 bootstrap/easyChams/ConfigDialog.cpp
create mode 100644 bootstrap/easyChams/ConfigDialog.h
create mode 100644 bootstrap/easyChams/MainWindow.cpp
create mode 100644 bootstrap/easyChams/MainWindow.h
create mode 100644 bootstrap/easyChams/README
create mode 100755 bootstrap/easyChams/compile.sh
create mode 100644 bootstrap/easyChams/icons/linux/Eye_of_Horus.png
create mode 100644 bootstrap/easyChams/icons/macosx/Eye of Horus.zip
create mode 100644 bootstrap/easyChams/main.cpp
diff --git a/bootstrap/easyChams/CompilationWidget.cpp b/bootstrap/easyChams/CompilationWidget.cpp
new file mode 100644
index 00000000..2e179915
--- /dev/null
+++ b/bootstrap/easyChams/CompilationWidget.cpp
@@ -0,0 +1,266 @@
+#include
+using namespace std;
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "CompilationWidget.h"
+#include "CompileHighlighter.h"
+#include "ConfigDialog.h"
+
+CompilationWidget::CompilationWidget(QWidget *parent)
+ : QWidget(parent)
+ , _cProgram ("")
+ , _sourceRD ("")
+ , _hasHurricane (false)
+ , _hasIo (false)
+ , _hasTest (false)
+ , _hasCrlcore (false)
+ , _hasChams (false)
+ , _hasHurricaneAMS (false) {
+
+ setStyleSheet("font-weight: normal;");
+
+ _hurricane = new QCheckBox ( "hurricane" , this );
+ _io = new QCheckBox ( "io" , this );
+ _test = new QCheckBox ( "test" , this );
+ _crlcore = new QCheckBox ( "crlcore" , this );
+ _chams = new QCheckBox ( "chams" , this );
+ _hurricaneAMS = new QCheckBox ( "hurricaneAMS", this );
+
+ readSettings();
+
+ QVBoxLayout* vBoxOutilsGroup = new QVBoxLayout();
+ vBoxOutilsGroup->addWidget(_hurricane);
+ vBoxOutilsGroup->addWidget(_io);
+ vBoxOutilsGroup->addWidget(_test);
+ vBoxOutilsGroup->addWidget(_crlcore);
+ vBoxOutilsGroup->addWidget(_chams);
+ vBoxOutilsGroup->addWidget(_hurricaneAMS);
+ if (!_hasHurricane) _hurricane->setVisible(false);
+ if (!_hasIo) _io->setVisible(false);
+ if (!_hasTest) _test->setVisible(false);
+ if (!_hasCrlcore) _crlcore->setVisible(false);
+ if (!_hasChams) _chams->setVisible(false);
+ if (!_hasHurricaneAMS) _hurricaneAMS->setVisible(false);
+
+ QGroupBox* outilsGroup = new QGroupBox ( "Outils", this );
+ outilsGroup->setLayout(vBoxOutilsGroup);
+
+ _mode = new QComboBox (this);
+ QStringList modes;
+ modes << "Release" << "Debug";
+ _mode->addItems(modes);
+ _static = new QCheckBox ("static", this);
+ _svnUp = new QCheckBox ("svn update", this);
+ _doc = new QCheckBox ("build doc", this);
+ _clean = new QCheckBox ("clean build", this);
+
+ QVBoxLayout* vBoxOptionsGroup = new QVBoxLayout();
+ vBoxOptionsGroup->addWidget(_mode);
+ vBoxOptionsGroup->addWidget(_static);
+ vBoxOptionsGroup->addWidget(_doc);
+ vBoxOptionsGroup->addWidget(_svnUp);
+ vBoxOptionsGroup->addWidget(_clean);
+
+ QGroupBox* optionsGroup = new QGroupBox ( "Options", this );
+ optionsGroup->setLayout(vBoxOptionsGroup);
+
+ _compile = new QPushButton ( "Compile !", this );
+ connect ( _compile, SIGNAL(clicked()), this, SLOT(compile()) );
+
+ _progressBar = new QProgressBar ( this );
+ _progressBar->setRange(0,100);
+ _progressBar->setTextVisible(true);
+ connect ( this, SIGNAL(progress(int)), _progressBar, SLOT(setValue(int)) );
+
+ QVBoxLayout* vBoxLayout = new QVBoxLayout();
+ vBoxLayout->addWidget(outilsGroup);
+ vBoxLayout->addWidget(optionsGroup);
+ vBoxLayout->addWidget(_compile);
+ vBoxLayout->addWidget(_progressBar);
+
+ QWidget* menu = new QWidget ( this );
+ menu->setLayout(vBoxLayout);
+
+ _console = new QTextEdit(this);
+ _console->setFixedSize(800,400);
+ CompileHighlighter* highlight = new CompileHighlighter(_console->document());
+
+ QHBoxLayout* hBoxLayout = new QHBoxLayout();
+ hBoxLayout->addWidget(menu);
+ hBoxLayout->addWidget(_console);
+ setLayout(hBoxLayout);
+ setWindowTitle("Easy compile for chams");
+
+}
+
+void CompilationWidget::compile() {
+ QStringList arguments;
+
+ _progressBar->reset();
+ _console->clear();
+
+ _myProcess = new QProcess(this);
+ QStringList env = QProcess::systemEnvironment();
+ //QString currentInstallRD = _installRD;
+ //if (_static->isChecked()) currentInstallRD += "/"+_mode->currentText()+".Static";
+ //else currentInstallRD += "/"+_mode->currentText()+".Shared";
+ //cerr << _installRD.toStdString() << endl;
+ //env << "HURRICANE_TOP=" + currentInstallRD;
+ //env << "CHAMS_TOP=" + currentInstallRD;
+ //env << "IO_TOP=" + currentInstallRD;
+ //env << "DYLD_LIBRARY_PATH=" + currentInstallRD + "/lib";
+ //_myProcess->setEnvironment(env);
+ connect(_myProcess, SIGNAL(readyReadStandardError()) , this, SLOT(updateError()));
+ connect(_myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(updateText()));
+ connect(_myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(updateExit(int, QProcess::ExitStatus)));
+ //arguments << "-s " + _sourceRD;
+ //arguments << "-i " + currentInstallRD;
+ //arguments << "-b " + _buildRD;
+ arguments << "-p" + _sourceRD;
+ arguments << "-m" + _mode->currentText();
+ if (_static->isChecked()) arguments << "-s";
+ if (_svnUp->isChecked()) arguments << "-u";
+ if (_doc->isChecked()) arguments << "-d";
+ if (_clean->isChecked()) arguments << "-c";
+ if (_hurricane->isChecked()) arguments << "-t hurricane";
+ if (_io->isChecked()) arguments << "-t io";
+ if (_test->isChecked()) arguments << "-t test";
+ if (_crlcore->isChecked()) arguments << "-t crlcore";
+ if (_chams->isChecked()) arguments << "-t chams";
+ if (_hurricaneAMS->isChecked()) arguments << "-t hurricaneAMS";
+
+ for (int i = 0; i < arguments.size(); ++i)
+ cout << arguments.at(i).toLocal8Bit().constData() << endl;
+
+ _myProcess->start(_cProgram, arguments);
+}
+
+void CompilationWidget::readSettings() {
+ _settings = new QSettings ( "chams", "easyChams" );
+
+ if ( !_settings->contains("Compilation program") ) {
+ QMessageBox::warning(this, tr("easyChams"), tr("It seems you do not have configured the application. Let's configure it now."), QMessageBox::Ok, QMessageBox::Ok);
+ runConfigDialog(true);
+ }
+ else {
+ _cProgram = _settings->value("Compilation program").toString();
+ _sourceRD = _settings->value("Source root").toString();
+ _hasHurricane = _settings->value("Hurricane").toBool();
+ _hasIo = _settings->value("Io").toBool();
+ _hasTest = _settings->value("Test").toBool();
+ _hasCrlcore = _settings->value("Crlcore").toBool();
+ _hasChams = _settings->value("Chams").toBool();
+ _hasHurricaneAMS = _settings->value("HurricaneAMS").toBool();
+ }
+}
+
+void CompilationWidget::runConfigDialog(bool first) {
+ ConfigDialog* cfg = new ConfigDialog;
+ connect ( cfg, SIGNAL(configDone(QStringList)), this, SLOT(updateConfig(QStringList)) );
+ if (!first) {
+ cfg->setCompileProgram(_cProgram);
+ cfg->setSourceRootDirectory(_sourceRD);
+ cfg->setHasHurricane(_hasHurricane);
+ cfg->setHasIo(_hasIo);
+ cfg->setHasTest(_hasTest);
+ cfg->setHasCrlcore(_hasCrlcore);
+ cfg->setHasChams(_hasChams);
+ cfg->setHasHurricaneAMS(_hasHurricaneAMS);
+ }
+ cfg->exec();
+ writeSettings();
+}
+
+void CompilationWidget::reconfig() {
+ runConfigDialog(false);
+}
+
+void CompilationWidget::writeSettings() {
+ _settings->setValue("Compilation program", _cProgram);
+ _settings->setValue("Source root" , _sourceRD);
+ _settings->setValue("Hurricane" , _hasHurricane);
+ _settings->setValue("Io" , _hasIo);
+ _settings->setValue("Test" , _hasTest);
+ _settings->setValue("Crlcore" , _hasCrlcore);
+ _settings->setValue("Chams" , _hasChams);
+ _settings->setValue("HurricaneAMS" , _hasHurricaneAMS);
+}
+
+void CompilationWidget::updateConfig(QStringList list) {
+ _cProgram = list.value(0); // First value is compilation program
+ _sourceRD = list.value(1); // Second value is source root directory
+ _hasHurricane = (list.value(2) == "ON") ? true : false; // Third value is hasHurricane
+ _hasIo = (list.value(3) == "ON") ? true : false; // Forth value is hasIo
+ _hasTest = (list.value(4) == "ON") ? true : false; // Fifth value is hasTest
+ _hasCrlcore = (list.value(5) == "ON") ? true : false; // Sixth value is hasCrlcore
+ _hasChams = (list.value(6) == "ON") ? true : false; // Seventh value is hasChams
+ _hasHurricaneAMS = (list.value(7) == "ON") ? true : false; // Eight value is hasHurricaneAMS
+ // updates Tools visibility :
+ if (_hasHurricane) { _hurricane->setVisible(true); }
+ else { _hurricane->setVisible(false); _hurricane->setCheckState(Qt::Unchecked); }
+ if (_hasIo) { _io->setVisible(true); }
+ else { _io->setVisible(false); _io->setCheckState(Qt::Unchecked); }
+ if (_hasTest) { _test->setVisible(true); }
+ else { _test->setVisible(false); _test->setCheckState(Qt::Unchecked); }
+ if (_hasCrlcore) { _crlcore->setVisible(true); }
+ else { _crlcore->setVisible(false); _crlcore->setCheckState(Qt::Unchecked); }
+ if (_hasChams) { _chams->setVisible(true); }
+ else { _chams->setVisible(false); _chams->setCheckState(Qt::Unchecked); }
+ if (_hasHurricaneAMS) { _hurricaneAMS->setVisible(true); }
+ else { _hurricaneAMS->setVisible(false); _hurricaneAMS->setCheckState(Qt::Unchecked); }
+}
+
+
+void CompilationWidget::updateError() {
+ QByteArray data = _myProcess->readAllStandardError();
+ _console->insertPlainText(QString(data));
+ int end = _console->verticalScrollBar()->maximum();
+ _console->verticalScrollBar()->setValue(end);
+}
+
+void CompilationWidget::updateText() {
+ QByteArray data = _myProcess->readAllStandardOutput();
+ QString str(data);
+ QRegExp rx = QRegExp ( "([0-9]+)%" );
+ if ( str.contains(rx) ) {
+ bool ok;
+ int value = rx.cap(1).toInt ( &ok, 10 );
+ emit(progress(value));
+ }
+ _console->insertPlainText(QString(data));
+ int end = _console->verticalScrollBar()->maximum();
+ _console->verticalScrollBar()->setValue(end);
+}
+
+void CompilationWidget::updateExit(int exitCode, QProcess::ExitStatus exitStatus)
+{
+ if (exitStatus == QProcess::NormalExit) {
+ _console->append("Completed Successfully");
+ }
+ else {
+ _console->append("Error");
+ }
+}
+
+void CompilationWidget::about()
+{
+ QMessageBox::about(this, tr("About easyChams"), tr("easyChams
"
+ "This tool allows every one to easily update and compile chams project's sources.
"
+ "Version 0.6
29/01/2010
by D.Dupuis
"));
+}
diff --git a/bootstrap/easyChams/CompilationWidget.h b/bootstrap/easyChams/CompilationWidget.h
new file mode 100644
index 00000000..9c48459d
--- /dev/null
+++ b/bootstrap/easyChams/CompilationWidget.h
@@ -0,0 +1,69 @@
+#ifndef __COMPILATION_WIDGET_H
+#define __COMPILATION_WIDGET_H
+
+#include
+#include
+
+class QCheckBox;
+class QComboBox;
+class QTextEdit;
+class QPushButton;
+class QProgressBar;
+class QSettings;
+class QStringList;
+class QAction;
+
+class CompilationWidget : public QWidget {
+ Q_OBJECT
+
+ public:
+ CompilationWidget (QWidget *parent =0);
+ ~CompilationWidget () {};
+
+ private:
+ QCheckBox* _hurricane;
+ QCheckBox* _io;
+ QCheckBox* _test;
+ QCheckBox* _crlcore;
+ QCheckBox* _chams;
+ QCheckBox* _hurricaneAMS;
+ QComboBox* _mode;
+ QCheckBox* _static;
+ QCheckBox* _svnUp;
+ QCheckBox* _doc;
+ QCheckBox* _clean;
+ QPushButton* _compile;
+ QProgressBar* _progressBar;
+
+ QTextEdit* _console;
+ QProcess* _myProcess;
+
+ QSettings* _settings;
+ QString _cProgram;
+ QString _sourceRD;
+ bool _hasHurricane;
+ bool _hasIo;
+ bool _hasTest;
+ bool _hasCrlcore;
+ bool _hasChams;
+ bool _hasHurricaneAMS;
+
+ private:
+ void readSettings();
+ void writeSettings();
+ void runConfigDialog(bool first);
+
+ public slots:
+ void compile();
+ void updateError();
+ void updateText();
+ void updateExit(int exitCode, QProcess::ExitStatus exitStatus);
+ void updateConfig(QStringList list);
+ void reconfig();
+ void about();
+
+ signals:
+ void progress(int value);
+};
+
+#endif
diff --git a/bootstrap/easyChams/CompileHighlighter.cpp b/bootstrap/easyChams/CompileHighlighter.cpp
new file mode 100644
index 00000000..b193c4ec
--- /dev/null
+++ b/bootstrap/easyChams/CompileHighlighter.cpp
@@ -0,0 +1,70 @@
+// File : CompileHighlighter.cpp
+// Date : 01.10.2009
+// Author : Dupuis Damien
+//
+
+#include "CompileHighlighter.h"
+
+CompileHighlighter::CompileHighlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) {
+ // defines rules
+ CompileHighlighterRule rule;
+
+ //building/linking/scanning rule : blue Bold
+ _doingFormat.setForeground(Qt::blue);
+ _doingFormat.setFontWeight(QFont::Bold);
+ rule.format = _doingFormat;
+ rule.pattern = QRegExp("(^Building.*$|^Linking.*$|^Scanning.*$|^Built target.*$)");
+ _rules.append(rule);
+
+ //compile rule : darkBlue Normal
+ _compileFormat.setForeground(Qt::darkBlue);
+ rule.format = _compileFormat;
+ rule.pattern = QRegExp("(^\\[.*$)");
+ _rules.append(rule);
+
+ //install rule : cyan Bold
+ _installFormat.setForeground(Qt::cyan);
+ _installFormat.setFontWeight(QFont::Bold);
+ rule.format = _installFormat;
+ rule.pattern = QRegExp("(^Install the project.*$)");
+ _rules.append(rule);
+
+ //--install rule : darkCyan
+ _installingFormat.setForeground(Qt::darkCyan);
+ rule.format = _installingFormat;
+ rule.pattern = QRegExp("(^-- Install.*$)");
+ _rules.append(rule);
+
+ //--uptodate : darkCyan Italic
+ _uptodateFormat.setForeground(Qt::darkCyan);
+ _uptodateFormat.setFontItalic(true);
+ rule.format = _uptodateFormat;
+ rule.pattern = QRegExp("(^-- Up-to-date.*$)");
+ _rules.append(rule);
+
+ //warning rule
+ _warningFormat.setForeground(QColor("orange"));
+ rule.format = _warningFormat;
+ rule.pattern = QRegExp("(^/.*In function.*$|^/.*warning:.*$)");
+ _rules.append(rule);
+
+ //error rule
+ _errorFormat.setForeground(Qt::red);
+ rule.format = _errorFormat;
+ rule.pattern = QRegExp("(^/.*error:.*$|^make\\[.*$)");
+ _rules.append(rule);
+}
+
+void CompileHighlighter::highlightBlock(const QString &text) {
+ foreach (const CompileHighlighterRule &rule, _rules) {
+ QRegExp expression (rule.pattern);
+ int index = expression.indexIn(text);
+ while (index >= 0) {
+ int length = expression.matchedLength();
+ setFormat(index, length, rule.format);
+ index = expression.indexIn(text, index + length);
+ }
+ }
+ setCurrentBlockState(0);
+}
+
diff --git a/bootstrap/easyChams/CompileHighlighter.h b/bootstrap/easyChams/CompileHighlighter.h
new file mode 100644
index 00000000..448a060f
--- /dev/null
+++ b/bootstrap/easyChams/CompileHighlighter.h
@@ -0,0 +1,38 @@
+// File : CompileHighlighter.h
+// Date : 01.10.2009
+// Author : Dupuis Damien
+//
+#ifndef COMPILEHIGHLIGHTER_H
+#define COMPILEHIGHLIGHTER_H
+
+#include
+#include
+#include
+
+class CompileHighlighter : public QSyntaxHighlighter {
+ Q_OBJECT
+
+ public:
+ CompileHighlighter ( QTextDocument *parent = 0 );
+
+ protected:
+ void highlightBlock ( const QString &text );
+
+ private:
+ struct CompileHighlighterRule {
+ QTextCharFormat format;
+ QRegExp pattern;
+ };
+ QVector _rules;
+
+ QTextCharFormat _compileFormat;
+ QTextCharFormat _warningFormat;
+ QTextCharFormat _errorFormat;
+ QTextCharFormat _installFormat;
+ QTextCharFormat _installingFormat;
+ QTextCharFormat _uptodateFormat;
+ QTextCharFormat _doingFormat;
+};
+
+
+#endif
diff --git a/bootstrap/easyChams/ConfigDialog.cpp b/bootstrap/easyChams/ConfigDialog.cpp
new file mode 100644
index 00000000..683a2f05
--- /dev/null
+++ b/bootstrap/easyChams/ConfigDialog.cpp
@@ -0,0 +1,83 @@
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "configDialog.h"
+
+#define LINEEDITWIDTH 300
+
+ConfigDialog::ConfigDialog() {
+ // First GroupBox : Directories
+ // Create Widgets
+ QLabel* compileL = new QLabel(tr("Compilation script:"), this);
+ QLabel* sourceL = new QLabel(tr("Chams source root directory:"), this);
+ _compileE = new QLineEdit ("", this);
+ _sourceE = new QLineEdit ("", this);
+ _compileE->setFixedWidth(LINEEDITWIDTH);
+ _sourceE->setFixedWidth (LINEEDITWIDTH);
+ QPushButton* compileB = new QPushButton(tr("&Browse"));
+ QPushButton* sourceB = new QPushButton(tr("&Browse"));
+ QDialogButtonBox* bBox = new QDialogButtonBox(QDialogButtonBox::Ok);
+ // Connect SIGNAL/SLOTS
+ connect(compileB, SIGNAL(clicked()) , this, SLOT(chooseCProgram()));
+ connect(sourceB , SIGNAL(clicked()) , this, SLOT(chooseSourceRD()));
+ connect(bBox , SIGNAL(accepted()), this, SLOT(doConfig()));
+ // Create GroupBox
+ QGroupBox* directories = new QGroupBox("Directories", this);
+ QGridLayout* gLayout = new QGridLayout(this);
+ gLayout->addWidget( compileL, 0, 0, 1, 1);
+ gLayout->addWidget(_compileE, 0, 1, 1, 2);
+ gLayout->addWidget( compileB, 0, 3, 1, 1);
+ gLayout->addWidget( sourceL , 1, 0, 1, 1);
+ gLayout->addWidget(_sourceE , 1, 1, 1, 2);
+ gLayout->addWidget( sourceB , 1, 3, 1, 1);
+ directories->setLayout(gLayout);
+ // Second GroupBox : Tools
+ // Create Widgets
+ _hurCB = new QCheckBox("Hurricane" , this);
+ _ioCB = new QCheckBox("Io" , this);
+ _testCB = new QCheckBox("Test (not in svn)", this);
+ _crlCB = new QCheckBox("Crlcore" , this);
+ _chamsCB = new QCheckBox("Chams" , this);
+ _hurAMSCB = new QCheckBox("HurricaneAMS" , this);
+ // Create GroupBox
+ QGroupBox* tools = new QGroupBox("Available Tools", this);
+ QGridLayout* grLayout = new QGridLayout(this);
+ grLayout->addWidget(_hurCB , 0, 0, 1, 1);
+ grLayout->addWidget(_ioCB , 1, 0, 1, 1);
+ grLayout->addWidget(_testCB , 2, 0, 1, 1);
+ grLayout->addWidget(_crlCB , 0, 1, 1, 1);
+ grLayout->addWidget(_chamsCB , 1, 1, 1, 1);
+ grLayout->addWidget(_hurAMSCB, 2, 1, 1, 1);
+ tools->setLayout(grLayout);
+ // ConfigDialog Layout
+ QVBoxLayout* vLayout = new QVBoxLayout;
+ vLayout->addWidget(directories);
+ vLayout->addWidget(tools);
+ vLayout->addWidget(bBox);
+ setLayout(vLayout);
+}
+
+void ConfigDialog::chooseCProgram() {
+ _compileE->setText(QFileDialog::getOpenFileName(this, tr("Select chams.sh"), "", tr("Shell script (*.sh)")));
+}
+
+void ConfigDialog::chooseSourceRD() {
+ _sourceE->setText(QFileDialog::getExistingDirectory(this, tr("Select the chams source root directory")));
+}
+
+void ConfigDialog::doConfig() {
+ QStringList list;
+ QString hur = (_hurCB->isChecked()) ? "ON" : "OFF";
+ QString io = (_ioCB->isChecked()) ? "ON" : "OFF";
+ QString test = (_testCB->isChecked()) ? "ON" : "OFF";
+ QString crl = (_crlCB->isChecked()) ? "ON" : "OFF";
+ QString chams = (_chamsCB->isChecked()) ? "ON" : "OFF";
+ QString hurAMS = (_hurAMSCB->isChecked()) ? "ON" : "OFF";
+ list << _compileE->text() << _sourceE->text() << hur << io << test << crl << chams << hurAMS;
+ emit configDone(list);
+ accept();
+}
diff --git a/bootstrap/easyChams/ConfigDialog.h b/bootstrap/easyChams/ConfigDialog.h
new file mode 100644
index 00000000..2df9ab1c
--- /dev/null
+++ b/bootstrap/easyChams/ConfigDialog.h
@@ -0,0 +1,88 @@
+#ifndef CONFIGDIALOG_H
+#define CONFIGDIALOG_H
+
+#include
+#include
+#include
+
+class QLabel;
+class QStringList;
+
+class ConfigDialog : public QDialog {
+ Q_OBJECT
+
+public:
+ ConfigDialog();
+ inline void setCompileProgram(QString);
+ inline void setSourceRootDirectory(QString);
+ inline void setHasHurricane(bool);
+ inline void setHasIo(bool);
+ inline void setHasTest(bool);
+ inline void setHasCrlcore(bool);
+ inline void setHasChams(bool);
+ inline void setHasHurricaneAMS(bool);
+
+public slots:
+ void chooseCProgram();
+ void chooseSourceRD();
+ void doConfig();
+
+signals:
+ void configDone (QStringList list);
+
+private:
+ QLineEdit* _compileE;
+ QLineEdit* _sourceE;
+ QCheckBox* _hurCB;
+ QCheckBox* _ioCB;
+ QCheckBox* _testCB;
+ QCheckBox* _crlCB;
+ QCheckBox* _chamsCB;
+ QCheckBox* _hurAMSCB;
+};
+
+inline void ConfigDialog::setCompileProgram (QString cProgram ) { _compileE->setText(cProgram); };
+inline void ConfigDialog::setSourceRootDirectory (QString rDirectory) { _sourceE->setText(rDirectory); };
+
+inline void ConfigDialog::setHasHurricane(bool state) {
+ if (state)
+ _hurCB->setCheckState(Qt::Checked);
+ else
+ _hurCB->setCheckState(Qt::Unchecked);
+};
+
+inline void ConfigDialog::setHasIo(bool state) {
+ if (state)
+ _ioCB->setCheckState(Qt::Checked);
+ else
+ _ioCB->setCheckState(Qt::Unchecked);
+};
+
+inline void ConfigDialog::setHasTest(bool state) {
+ if (state)
+ _testCB->setCheckState(Qt::Checked);
+ else
+ _testCB->setCheckState(Qt::Unchecked);
+};
+
+inline void ConfigDialog::setHasCrlcore(bool state) {
+ if (state)
+ _crlCB->setCheckState(Qt::Checked);
+ else
+ _crlCB->setCheckState(Qt::Unchecked);
+};
+
+inline void ConfigDialog::setHasChams(bool state) {
+ if (state)
+ _chamsCB->setCheckState(Qt::Checked);
+ else
+ _chamsCB->setCheckState(Qt::Unchecked);
+};
+
+inline void ConfigDialog::setHasHurricaneAMS(bool state) {
+ if (state)
+ _hurAMSCB->setCheckState(Qt::Checked);
+ else
+ _hurAMSCB->setCheckState(Qt::Unchecked);
+};
+#endif
diff --git a/bootstrap/easyChams/MainWindow.cpp b/bootstrap/easyChams/MainWindow.cpp
new file mode 100644
index 00000000..b9f21d8e
--- /dev/null
+++ b/bootstrap/easyChams/MainWindow.cpp
@@ -0,0 +1,22 @@
+#include
+#include
+#include
+
+#include "MainWindow.h"
+
+MainWindow::MainWindow()
+{
+ CompilationWidget* cWidget = new CompilationWidget(this);
+ setCentralWidget(cWidget);
+
+ QAction* configAct = new QAction(tr("&Configure"), this);
+ configAct->setStatusTip(tr("Configure the application"));
+ connect(configAct, SIGNAL(triggered()), cWidget, SLOT(reconfig()));
+ QAction* aboutAct = new QAction(tr("&About"), this);
+ aboutAct->setStatusTip(tr("Show the about dialog box"));
+ connect(aboutAct, SIGNAL(triggered()), cWidget, SLOT(about()));
+ QMenu* editMenu = menuBar()->addMenu(tr("&Edit"));
+ editMenu->addAction(configAct);
+ QMenu* helpMenu = menuBar()->addMenu(tr("&Help"));
+ helpMenu->addAction(aboutAct);
+}
diff --git a/bootstrap/easyChams/MainWindow.h b/bootstrap/easyChams/MainWindow.h
new file mode 100644
index 00000000..80a519f7
--- /dev/null
+++ b/bootstrap/easyChams/MainWindow.h
@@ -0,0 +1,15 @@
+#ifndef __MAINWINDOW_H
+#define __MAINWINDOW_H
+
+#include
+
+#include "CompilationWidget.h"
+
+class MainWindow : public QMainWindow {
+ Q_OBJECT
+
+ public:
+ MainWindow ();
+ ~MainWindow () {};
+};
+#endif
diff --git a/bootstrap/easyChams/README b/bootstrap/easyChams/README
new file mode 100644
index 00000000..70cc37a6
--- /dev/null
+++ b/bootstrap/easyChams/README
@@ -0,0 +1,5 @@
+easyChams readme
+
+This tool allows every one to easily compile & install chams project's sources.
+
+To compile this tool use ./compile.sh which is platform independant.
diff --git a/bootstrap/easyChams/compile.sh b/bootstrap/easyChams/compile.sh
new file mode 100755
index 00000000..56e63490
--- /dev/null
+++ b/bootstrap/easyChams/compile.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+qmake -project
+case "`uname -s`" in
+ Linux) qmake;;
+ Darwin) qmake -spec macx-g++;;
+esac
+make -j2 && make clean
diff --git a/bootstrap/easyChams/icons/linux/Eye_of_Horus.png b/bootstrap/easyChams/icons/linux/Eye_of_Horus.png
new file mode 100644
index 0000000000000000000000000000000000000000..85b5a497a22bdb0a15cea4fd4d35197a84d4236b
GIT binary patch
literal 29336
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