summaryrefslogtreecommitdiffstats
path: root/Source/QtDialog/CMakeSetupDialog.cxx
diff options
context:
space:
mode:
authorClinton Stimpson <clinton@elemtech.com>2007-11-02 15:50:17 (GMT)
committerClinton Stimpson <clinton@elemtech.com>2007-11-02 15:50:17 (GMT)
commit800cbd0550466794cf853c6fb4dc0349e245220c (patch)
tree6a55206bc76ac9a72f99906f341a8b7115879f8d /Source/QtDialog/CMakeSetupDialog.cxx
parentdcf21dd90b816d06b43716ce96e496fe3d591594 (diff)
downloadCMake-800cbd0550466794cf853c6fb4dc0349e245220c.zip
CMake-800cbd0550466794cf853c6fb4dc0349e245220c.tar.gz
CMake-800cbd0550466794cf853c6fb4dc0349e245220c.tar.bz2
ENH: Beginnings of a Qt UI for CMake.
Diffstat (limited to 'Source/QtDialog/CMakeSetupDialog.cxx')
-rw-r--r--Source/QtDialog/CMakeSetupDialog.cxx193
1 files changed, 193 insertions, 0 deletions
diff --git a/Source/QtDialog/CMakeSetupDialog.cxx b/Source/QtDialog/CMakeSetupDialog.cxx
new file mode 100644
index 0000000..7f2ab1d
--- /dev/null
+++ b/Source/QtDialog/CMakeSetupDialog.cxx
@@ -0,0 +1,193 @@
+
+#include "CMakeSetupDialog.h"
+
+#include <QFileDialog>
+#include <QThread>
+#include <QProgressBar>
+#include <QMessageBox>
+
+#include "QCMake.h"
+#include "QCMakeCacheView.h"
+
+// QCMake instance on a thread
+class QCMakeThread : public QThread
+{
+public:
+ QCMakeThread(QObject* p) : QThread(p) { }
+ QCMake* CMakeInstance;
+
+protected:
+ virtual void run()
+ {
+ this->CMakeInstance = new QCMake;
+ this->exec();
+ delete this->CMakeInstance;
+ }
+};
+
+CMakeSetupDialog::CMakeSetupDialog()
+{
+ // create the GUI
+ this->setupUi(this);
+ this->ProgressBar = new QProgressBar();
+ this->ProgressBar->setRange(0,100);
+ this->statusBar()->addPermanentWidget(this->ProgressBar);
+
+ // start the cmake worker thread
+ this->CMakeThread = new QCMakeThread(this);
+ // TODO does this guarantee the QCMake instance is created before initialize is called?
+ QObject::connect(this->CMakeThread, SIGNAL(started()),
+ this, SLOT(initialize()));
+ this->CMakeThread->start();
+}
+
+void CMakeSetupDialog::initialize()
+{
+ // now the cmake worker thread is running, lets make our connections to it
+ QObject::connect(this->CMakeThread->CMakeInstance,
+ SIGNAL(propertiesChanged(const QCMakeCachePropertyList&)),
+ this->CacheValues->cacheModel(),
+ SLOT(setProperties(const QCMakeCachePropertyList&)));
+ QObject::connect(this,
+ SIGNAL(propertiesChanged(const QCMakeCachePropertyList&)),
+ this->CMakeThread->CMakeInstance,
+ SLOT(setProperties(const QCMakeCachePropertyList&)));
+
+ QObject::connect(this->configureButton, SIGNAL(clicked(bool)),
+ this, SLOT(doConfigure()));
+ QObject::connect(this, SIGNAL(configure()),
+ this->CMakeThread->CMakeInstance, SLOT(configure()));
+ QObject::connect(this->CMakeThread->CMakeInstance, SIGNAL(configureDone(int)),
+ this, SLOT(finishConfigure(int)));
+ QObject::connect(this->CMakeThread->CMakeInstance, SIGNAL(generateDone(int)),
+ this, SLOT(finishGenerate(int)));
+
+ QObject::connect(this->generateButton, SIGNAL(clicked(bool)),
+ this, SLOT(doOk()));
+ QObject::connect(this, SIGNAL(ok()),
+ this->CMakeThread->CMakeInstance, SLOT(generate()));
+
+ QObject::connect(this->cancelButton, SIGNAL(clicked(bool)),
+ this, SLOT(doCancel()));
+ QObject::connect(this, SIGNAL(cancel()),
+ this->CMakeThread->CMakeInstance, SLOT(interrupt()));
+
+ QObject::connect(this->BrowseSourceDirectoryButton, SIGNAL(clicked(bool)),
+ this, SLOT(doSourceBrowse()));
+ QObject::connect(this->BrowseBinaryDirectoryButton, SIGNAL(clicked(bool)),
+ this, SLOT(doBinaryBrowse()));
+
+ QObject::connect(this->BinaryDirectory, SIGNAL(textChanged(QString)),
+ this->CMakeThread->CMakeInstance, SLOT(setBinaryDirectory(QString)));
+
+ QObject::connect(this->CMakeThread->CMakeInstance, SIGNAL(sourceDirChanged(QString)),
+ this, SLOT(updateSourceDirectory(QString)));
+
+ QObject::connect(this->CMakeThread->CMakeInstance, SIGNAL(progressChanged(QString, float)),
+ this, SLOT(showProgress(QString,float)));
+
+ QObject::connect(this->CMakeThread->CMakeInstance, SIGNAL(error(QString, QString, bool*)),
+ this, SLOT(error(QString,QString,bool*)), Qt::BlockingQueuedConnection);
+
+}
+
+CMakeSetupDialog::~CMakeSetupDialog()
+{
+ // wait for thread to stop
+ this->CMakeThread->quit();
+ this->CMakeThread->wait();
+}
+
+void CMakeSetupDialog::doConfigure()
+{
+ emit this->propertiesChanged(this->CacheValues->cacheModel()->properties());
+ emit this->configure();
+}
+
+void CMakeSetupDialog::finishConfigure(int error)
+{
+ this->ProgressBar->reset();
+ this->statusBar()->showMessage("Configure Done", 2000);
+ if(error != 0)
+ {
+ bool dummy;
+ this->error("Error", "Error in configuration process, project files may be invalid", &dummy);
+ }
+}
+
+void CMakeSetupDialog::finishGenerate(int error)
+{
+ this->ProgressBar->reset();
+ this->statusBar()->showMessage("Generate Done", 2000);
+ if(error != 0)
+ {
+ bool dummy;
+ this->error("Error", "Error in generation process, project files may be invalid", &dummy);
+ }
+}
+
+void CMakeSetupDialog::doOk()
+{
+ emit this->ok();
+}
+
+void CMakeSetupDialog::doCancel()
+{
+ emit this->cancel();
+}
+
+void CMakeSetupDialog::doHelp()
+{
+}
+
+void CMakeSetupDialog::doSourceBrowse()
+{
+ QString dir = QFileDialog::getExistingDirectory(this, "TODO", this->SourceDirectory->text());
+ if(!dir.isEmpty())
+ {
+ this->updateSourceDirectory(dir);
+ }
+}
+
+void CMakeSetupDialog::updateSourceDirectory(const QString& dir)
+{
+ this->SourceDirectory->setText(dir);
+}
+
+void CMakeSetupDialog::doBinaryBrowse()
+{
+ QString dir = QFileDialog::getExistingDirectory(this, "TODO", this->BinaryDirectory->currentText());
+ if(!dir.isEmpty())
+ {
+ this->setBinaryDirectory(dir);
+ }
+}
+
+void CMakeSetupDialog::setBinaryDirectory(const QString& dir)
+{
+ if(dir != this->BinaryDirectory->currentText())
+ {
+ this->BinaryDirectory->setEditText(dir);
+ }
+}
+
+void CMakeSetupDialog::showProgress(const QString& msg, float percent)
+{
+ if(percent >= 0)
+ {
+ this->statusBar()->showMessage(msg);
+ this->ProgressBar->setValue(qRound(percent * 100));
+ }
+}
+
+void CMakeSetupDialog::error(const QString& title, const QString& message, bool* cancel)
+{
+ QMessageBox::StandardButton btn =
+ QMessageBox::critical(this, title, message, QMessageBox::Ok | QMessageBox::Cancel);
+ if(btn == QMessageBox::Cancel)
+ {
+ *cancel = false;
+ }
+}
+
+