diff options
author | Brian Helfrich <helfrich9000@gmail.com> | 2008-03-06 04:40:45 +0000 |
---|---|---|
committer | Brian Helfrich <helfrich9000@gmail.com> | 2008-03-06 04:40:45 +0000 |
commit | 23b812bd8f191442fd557172999d108a42f1f2b3 (patch) | |
tree | a210d43a99478e308e17722045d2f9372c1b6519 | |
parent | c0963f9367d215f43e4faf67b57ea2e72e8e4e1d (diff) | |
download | nanoengineer-23b812bd8f191442fd557172999d108a42f1f2b3.tar.gz nanoengineer-23b812bd8f191442fd557172999d108a42f1f2b3.zip |
More job management functionality.
9 files changed, 277 insertions, 44 deletions
diff --git a/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp b/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp index 535c544d1..dc79208ee 100644 --- a/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp +++ b/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.cpp @@ -81,6 +81,12 @@ void GROMACS_JobMonitor::run() { } +/* FUNCTION: CheckJobActive */ +bool GROMACS_JobMonitor::CheckJobActive(const QString& pid) { + return true; +} + + /* FUNCTION: abortJob */ void GROMACS_JobMonitor::abortJob() { QMutexLocker locker(&jobControlMutex); diff --git a/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.h b/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.h index 77f870a05..9fd5b53a8 100644 --- a/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.h +++ b/cad/plugins/NanoVision-1/src/JobManagement/GROMACS_JobMonitor.h @@ -25,6 +25,7 @@ class GROMACS_JobMonitor : public JobMonitor { ~GROMACS_JobMonitor(); void run(); + static bool CheckJobActive(const QString& pid); signals: void startedMonitoring(const QString& processType, const QString id, diff --git a/cad/plugins/NanoVision-1/src/JobSelectorDialog.cpp b/cad/plugins/NanoVision-1/src/JobSelectorDialog.cpp new file mode 100644 index 000000000..cdec4c9f0 --- /dev/null +++ b/cad/plugins/NanoVision-1/src/JobSelectorDialog.cpp @@ -0,0 +1,38 @@ +// Copyright 2008 Nanorex, Inc. See LICENSE file for details. + +#include "JobSelectorDialog.h" + + +/* CONSTRUCTORS */ +JobSelectorDialog::JobSelectorDialog(QWidget *parent) + : QDialog(parent), Ui_JobSelectorDialog() { + + setupUi(this); + buttonBox->button(QDialogButtonBox::Ok)->setDisabled(true); + connect(listWidget, SIGNAL(itemClicked(QListWidgetItem*)), + this, SLOT(itemSelected(QListWidgetItem*))); +} + + +/* DESTRUCTOR */ +JobSelectorDialog::~JobSelectorDialog() { +} + + +/* FUNCTION: addActiveJobs */ +void JobSelectorDialog::addActiveJobs(const QStringList& activeJobs) { + listWidget->addItems(activeJobs); +} + + +/* FUNCTION: getSelection */ +QString JobSelectorDialog::getSelection() { + return listWidget->selectedItems().first()->text(); +} + + +/* FUNCTION: itemSelected */ +void JobSelectorDialog::itemSelected(QListWidgetItem* item) { + buttonBox->button(QDialogButtonBox::Ok)->setDisabled(false); +} + diff --git a/cad/plugins/NanoVision-1/src/JobSelectorDialog.h b/cad/plugins/NanoVision-1/src/JobSelectorDialog.h new file mode 100644 index 000000000..5a4874f97 --- /dev/null +++ b/cad/plugins/NanoVision-1/src/JobSelectorDialog.h @@ -0,0 +1,27 @@ +// Copyright 2008 Nanorex, Inc. See LICENSE file for details. + +#ifndef JOBSELECTORDIALOG_H +#define JOBSELECTORDIALOG_H + +#include <QObject> +#include <QPushButton> + +#include "ui_JobSelectorDialog.h" + +class JobSelectorDialog : public QDialog, private Ui_JobSelectorDialog { + + Q_OBJECT + + public: + JobSelectorDialog(QWidget *parent = 0); + ~JobSelectorDialog(); + + void addActiveJobs(const QStringList& activeJobs); + QString getSelection(); + + public slots: + void itemSelected(QListWidgetItem* item); +}; + +#endif + diff --git a/cad/plugins/NanoVision-1/src/JobSelectorDialog.ui b/cad/plugins/NanoVision-1/src/JobSelectorDialog.ui new file mode 100644 index 000000000..2c4d6c573 --- /dev/null +++ b/cad/plugins/NanoVision-1/src/JobSelectorDialog.ui @@ -0,0 +1,79 @@ +<ui version="4.0" > + <class>JobSelectorDialog</class> + <widget class="QDialog" name="JobSelectorDialog" > + <property name="geometry" > + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle" > + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" > + <property name="margin" > + <number>9</number> + </property> + <property name="spacing" > + <number>6</number> + </property> + <item> + <widget class="QLabel" name="label" > + <property name="text" > + <string>Choose an existing job to open, or click Cancel.</string> + </property> + </widget> + </item> + <item> + <widget class="QListWidget" name="listWidget" /> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox" > + <property name="orientation" > + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons" > + <set>QDialogButtonBox::Cancel|QDialogButtonBox::NoButton|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>JobSelectorDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel" > + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel" > + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>JobSelectorDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel" > + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel" > + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro b/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro index 485815c82..522eb020d 100644 --- a/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro +++ b/cad/plugins/NanoVision-1/src/KDevelop/Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine/NXOpenGLRenderingEngine.pro @@ -13,7 +13,6 @@ HEADERS += ../../../../../../include/Nanorex/Interface/NXAtomRenderData.h \ ../../../../../Plugins/RenderingEngines/OpenGL/NXOpenGLRenderingEngine.h \ ../../../../../../include/Nanorex/Interface/NXRendererPlugin.h \ ../../../../../../include/Nanorex/Interface/NXRenderingEngine.h \ - ../../../../../../include/Nanorex/Interface/NXRGBColor.h \ ../../../../../../include/Nanorex/Interface/NXSceneGraph.h \ ../../../../../Plugins/RenderingEngines/OpenGL/NXOpenGLSceneGraph.h \ ../../../../../Plugins/RenderingEngines/OpenGL/NXOpenGLMaterial.h \ diff --git a/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro b/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro index 13c727fa9..4a8d8d64a 100644 --- a/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro +++ b/cad/plugins/NanoVision-1/src/KDevelop/nv1/nv1.pro @@ -32,7 +32,8 @@ SOURCES += ../../DataWindow.cpp \ ../../TrajectoryGraphicsWindow.cpp \ ../../StructureGraphicsWindow.cpp \ ../../InputParametersWindow.cpp \ - ../../ResultsSummaryWindow.cpp + ../../ResultsSummaryWindow.cpp \ + ../../JobSelectorDialog.cpp HEADERS += ../../DataWindow.h \ ../../LogHandlerWidget.h \ @@ -46,7 +47,8 @@ HEADERS += ../../DataWindow.h \ ../../TrajectoryGraphicsWindow.h \ ../../StructureGraphicsWindow.h \ ../../InputParametersWindow.h \ - ../../ResultsSummaryWindow.h + ../../ResultsSummaryWindow.h \ + ../../JobSelectorDialog.h FORMS += ../../LogHandlerWidget.ui \ ../../MainWindowTabWidget.ui \ @@ -54,7 +56,8 @@ FORMS += ../../LogHandlerWidget.ui \ ../../ErrorDialog.ui \ ../../TrajectoryGraphicsWindow.ui \ ../../InputParametersWindow.ui \ - ../../ResultsSummaryWindow.ui + ../../ResultsSummaryWindow.ui \ + ../../JobSelectorDialog.ui RESOURCES += ../../application.qrc diff --git a/cad/plugins/NanoVision-1/src/nv1.cpp b/cad/plugins/NanoVision-1/src/nv1.cpp index 75fd1e528..10ca4e994 100644 --- a/cad/plugins/NanoVision-1/src/nv1.cpp +++ b/cad/plugins/NanoVision-1/src/nv1.cpp @@ -46,51 +46,61 @@ nv1::~nv1() { /* FUNCTION: processCommandLine */ void nv1::processCommandLine(int argc, char *argv[]) { + string filename, processType, processInit; NXCommandLine commandLine; if ((commandLine.SplitLine(argc, argv) > 0) && (commandLine.HasSwitch("-f"))) { - string filename = commandLine.GetArgument("-f", 0); - - QString message = tr("Opening file: %1").arg(filename.c_str()); - NXLOG_INFO("nv1", qPrintable(message)); - - if (resultsWindow->loadFile(filename.c_str())) { - statusBar()->showMessage(tr("File loaded"), 2000); - resultsWindow->show(); + filename = commandLine.GetArgument("-f", 0); + if (commandLine.GetArgumentCount("-p") == 2) { + processType = commandLine.GetArgument("-p", 0); + processInit = commandLine.GetArgument("-p", 1); + } - // Start job monitor - string processType, processInit; - JobMonitor* jobMonitor = 0; - if (commandLine.GetArgumentCount("-p") == 2) { - processType = commandLine.GetArgument("-p", 0); - processInit = commandLine.GetArgument("-p", 1); - message = - tr("Setting up job management with job handle info: %1 %2") - .arg(processType.c_str()).arg(processInit.c_str()); - NXLOG_INFO("nv1", qPrintable(message)); - if (processType == "GMX") { - jobMonitor = new GROMACS_JobMonitor(processInit.c_str()); - } - if (jobMonitor != 0) { - connect(jobMonitor, - SIGNAL(startedMonitoring(const QString&, - const QString&, - const QString&)), - this, - SLOT(addMonitoredJob(const QString&, - const QString&, - const QString&))); - connect(jobMonitor, SIGNAL(jobFinished(const QString&)), - this, SLOT(removeMonitoredJob(const QString&))); - connect(jobMonitor, SIGNAL(jobAborted(const QString&)), - this, SLOT(removeMonitoredJob(const QString&))); - jobMonitors[processInit.c_str()] = jobMonitor; - jobMonitor->start(); - } + } else { + checkForActiveJobs(filename, processType, processInit); + } + + if (filename != "") + loadFile(filename, processType, processInit); +} + + +/* FUNCTION: loadFile */ +void nv1::loadFile(const string& filename, const string& processType, + const string& processInit) { - } else { - // Check if there are any active jobs and ask user which, if any - // to connect to. + QString message = tr("Opening file: %1").arg(filename.c_str()); + NXLOG_INFO("nv1", qPrintable(message)); + + if (resultsWindow->loadFile(filename.c_str())) { + statusBar()->showMessage(tr("File loaded"), 2000); + resultsWindow->show(); + + // Start job monitor + JobMonitor* jobMonitor = 0; + if ((processType != "") && (processInit != "")) { + message = + tr("Setting up job management with job handle info: %1 %2") + .arg(processType.c_str()).arg(processInit.c_str()); + NXLOG_INFO("nv1", qPrintable(message)); + if (processType == "GMX") { + jobMonitor = new GROMACS_JobMonitor(processInit.c_str()); + } + if (jobMonitor != 0) { + connect(jobMonitor, + SIGNAL(startedMonitoring(const QString&, + const QString&, + const QString&)), + this, + SLOT(addMonitoredJob(const QString&, + const QString&, + const QString&))); + connect(jobMonitor, SIGNAL(jobFinished(const QString&)), + this, SLOT(removeMonitoredJob(const QString&))); + connect(jobMonitor, SIGNAL(jobAborted(const QString&)), + this, SLOT(removeMonitoredJob(const QString&))); + jobMonitors[processInit.c_str()] = jobMonitor; + jobMonitor->start(); } } } @@ -385,3 +395,68 @@ void nv1::abortJob(const QString& id) { jobMonitors[id]->abortJob(); } + +/* FUNCTION: checkForActiveJobs + * + * Check if there are any active jobs and ask the user which, if any to + * connect to. Populate the given variables. + */ +void nv1::checkForActiveJobs(string& filename, string& processType, + string& processInit) { + + // Get a list of active jobs + QSettings settings(QSettings::IniFormat, QSettings::UserScope, + "Nanorex", "NanoVision-1"); + QFileInfo fileInfo(settings.fileName()); + QDir dir(fileInfo.absolutePath().append("/Jobs")); + if (!dir.exists()) { + dir.cdUp(); + dir.mkdir("Jobs"); + } + bool jobActive; + QStringList activeJobs; + QStringList fileList = dir.entryList(QDir::Files); + QStringList::const_iterator constIterator; + for (constIterator = fileList.constBegin(); + constIterator != fileList.constEnd(); ++constIterator) { + jobActive = false; + if ((*constIterator).startsWith("GMX")) { + QString pid = (*constIterator).mid(4); + jobActive = GROMACS_JobMonitor::CheckJobActive(pid); + } + if (jobActive) + activeJobs.append(*constIterator); + else + ; // Delete job file + } + + // Show a selector dialog + int jobSelectionResult = QDialog::Rejected; + QString selectedJob; + if (!activeJobs.empty()) { + JobSelectorDialog jobSelectorDialog; + jobSelectorDialog.addActiveJobs(activeJobs); + jobSelectorDialog.exec(); + jobSelectionResult = jobSelectorDialog.result(); + if (jobSelectionResult == QDialog::Accepted) + selectedJob = jobSelectorDialog.getSelection(); + } + + if (jobSelectionResult == QDialog::Accepted) { + + // TODO: make this handle more than just "GMX_<pid>" + processType = "GMX"; + processInit = qPrintable(selectedJob.mid(4)); + + QString jobFilename = dir.absolutePath().append("/").append(selectedJob); + QFile jobFile(jobFilename); + if (jobFile.open(QIODevice::ReadOnly)) { + char buffer[512]; + if (jobFile.readLine(buffer, sizeof(buffer)) != -1) { + filename = buffer; + } + jobFile.close(); + } + } +} + diff --git a/cad/plugins/NanoVision-1/src/nv1.h b/cad/plugins/NanoVision-1/src/nv1.h index 974bc5b91..7df347ab6 100644 --- a/cad/plugins/NanoVision-1/src/nv1.h +++ b/cad/plugins/NanoVision-1/src/nv1.h @@ -18,6 +18,7 @@ using namespace Nanorex; #include "ResultsWindow.h" #include "LogHandlerWidget.h" +#include "JobSelectorDialog.h" #include "MainWindowTabWidget.h" #include "JobManagement/JobMonitor.h" #include "JobManagement/GROMACS_JobMonitor.h" @@ -32,6 +33,8 @@ public: ~nv1(); void processCommandLine(int argc, char *argv[]); + void loadFile(const string& filename, const string& processType, + const string& processInit); protected: void closeEvent (QCloseEvent *event); @@ -48,6 +51,8 @@ private slots: void about(); void updateWindowMenu(); void abortJob(const QString& id); + void checkForActiveJobs(string& filename, string& processType, + string& processInit); private: NXEntityManager* entityManager; |