diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index 6a1fc6c791..91a8fe0053 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -211,6 +211,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : connect(ui->actionUndo, &QAction::triggered, this, &LammpsGui::undo); connect(ui->actionRedo, &QAction::triggered, this, &LammpsGui::redo); connect(ui->actionRun_Buffer, &QAction::triggered, this, &LammpsGui::run_buffer); + connect(ui->actionRun_File, &QAction::triggered, this, &LammpsGui::run_file); connect(ui->actionStop_LAMMPS, &QAction::triggered, this, &LammpsGui::stop_run); connect(ui->actionSet_Variables, &QAction::triggered, this, &LammpsGui::edit_variables); connect(ui->actionImage, &QAction::triggered, this, &LammpsGui::render_image); @@ -810,13 +811,34 @@ void LammpsGui::run_done() dirstatus->show(); } -void LammpsGui::run_buffer() +void LammpsGui::do_run(bool use_buffer) { if (lammps.is_running()) { QMessageBox::warning(this, "LAMMPS GUI Error", "Must stop current run before starting a new run"); return; } + + if (!use_buffer && ui->textEdit->document()->isModified()) { + QMessageBox msg; + msg.setWindowTitle("Unsaved Changes"); + msg.setWindowIcon(windowIcon()); + msg.setText(QString("The buffer ") + current_file + " has changes"); + msg.setInformativeText("Do you want to save the buffer before running LAMMPS?"); + msg.setIcon(QMessageBox::Question); + msg.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); + int rv = msg.exec(); + switch (rv) { + case QMessageBox::Yes: + save(); + break; + case QMessageBox::Cancel: // falthrough + default: + return; + break; + } + } + QSettings settings; progress->setValue(0); dirstatus->hide(); @@ -836,12 +858,17 @@ void LammpsGui::run_buffer() clear(); capturer->BeginCapture(); - // always add final newline since the text edit widget does not - char *input = mystrdup(ui->textEdit->toPlainText().toStdString() + "\n"); - is_running = true; + runner = new LammpsRunner(this); + is_running = true; + if (use_buffer) { + // always add final newline since the text edit widget does not + char *input = mystrdup(ui->textEdit->toPlainText().toStdString() + "\n"); + runner->setup_run(&lammps, input, nullptr); + } else { + char *fname = mystrdup(current_file.toStdString()); + runner->setup_run(&lammps, nullptr, fname); + } - runner = new LammpsRunner(this); - runner->setup_run(&lammps, input); connect(runner, &LammpsRunner::resultReady, this, &LammpsGui::run_done); connect(runner, &LammpsRunner::finished, runner, &QObject::deleteLater); runner->start(); @@ -852,8 +879,12 @@ void LammpsGui::run_buffer() logwindow->setReadOnly(true); logwindow->setCenterOnScroll(true); logwindow->moveCursor(QTextCursor::End); - logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on buffer - " + - current_file); + if (use_buffer) + logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on buffer - " + + current_file); + else + logwindow->setWindowTitle("LAMMPS-GUI - Output from running LAMMPS on file - " + + current_file); logwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); QFont text_font; text_font.fromString(settings.value("textfont", text_font.toString()).toString()); @@ -872,8 +903,12 @@ void LammpsGui::run_buffer() // if configured, delete old log window before opening new one if (settings.value("chartreplace", false).toBool()) delete chartwindow; chartwindow = new ChartWindow(current_file); - chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on buffer - " + - current_file); + if (use_buffer) + chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on buffer - " + + current_file); + else + chartwindow->setWindowTitle("LAMMPS-GUI - Thermo charts from running LAMMPS on file - " + + current_file); chartwindow->setWindowIcon(QIcon(":/lammps-icon-128x128.png")); chartwindow->setMinimumSize(400, 300); shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), chartwindow); @@ -1092,8 +1127,8 @@ void LammpsGui::preferences() QSettings settings; int oldthreads = settings.value("nthreads", 1).toInt(); int oldaccel = settings.value("accelerator", AcceleratorTab::None).toInt(); - bool oldecho = settings.value("echo", 0).toBool(); - bool oldcite = settings.value("cite", 0).toBool(); + bool oldecho = settings.value("echo", 0).toBool(); + bool oldcite = settings.value("cite", 0).toBool(); Preferences prefs(&lammps); if (prefs.exec() == QDialog::Accepted) { diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index a97a233883..65165c9c38 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -60,6 +60,7 @@ protected: void write_file(const QString &filename); void update_recents(const QString &filename = ""); void update_variables(); + void do_run(bool use_buffer); void start_lammps(); void run_done(); @@ -77,7 +78,9 @@ private slots: void undo(); void redo(); void clear(); - void run_buffer(); + void run_buffer() { do_run(true); } + void run_file() { do_run(false); } + void stop_run(); void edit_variables(); void render_image(); diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index d6b941b2d0..31f997f05e 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -1,48 +1,49 @@ lammps-icon-128x128.png - help_index.table - system-help.png - help-browser.png - gtk-zoom-in.png - gtk-zoom-out.png - gtk-zoom-fit.png - edit-delete.png - object-rotate-right.png - object-rotate-left.png - gtk-go-up.png - gtk-go-down.png - document-save-as.png + antialias.png + application-calc.png + application-exit.png + application-plot.png + axes-img.png + document-new.png document-open-recent.png document-open.png - document-new.png - edit-undo.png - edit-redo.png - edit-paste.png - edit-cut.png - edit-copy.png - application-exit.png - utilities-terminal.png - x-office-drawing.png - document-save.png document-revert.png - preferences-desktop.png - preferences-desktop-personal.png - preferences-desktop-font.png - help-faq.png - help-about.png + document-save-as.png + document-save.png + edit-copy.png + edit-cut.png + edit-delete.png + edit-paste.png + edit-redo.png + edit-undo.png emblem-photos.png - process-stop.png - system-run.png - window-close.png - application-plot.png - application-calc.png - system-box.png - axes-img.png + gtk-go-down.png + gtk-go-up.png + gtk-zoom-fit.png + gtk-zoom-in.png + gtk-zoom-out.png hd-img.png - antialias.png + help-about.png + help-browser.png + help-faq.png + help_index.table + object-rotate-left.png + object-rotate-right.png ovito.png - vmd.png + preferences-desktop-font.png + preferences-desktop-personal.png + preferences-desktop.png + process-stop.png + run-file.png + system-box.png + system-help.png + system-run.png + utilities-terminal.png vdw-style.png + vmd.png + window-close.png + x-office-drawing.png diff --git a/tools/lammps-gui/lammpsgui.ui b/tools/lammps-gui/lammpsgui.ui index 635ec25db6..045b541da2 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -68,6 +68,7 @@ &Run + @@ -215,12 +216,23 @@ - &Run LAMMPS + &Run LAMMPS from Editor Buffer Ctrl+Return + + + + + + &Run LAMMPS from File + + + Ctrl+Shift+Return + + diff --git a/tools/lammps-gui/lammpsrunner.h b/tools/lammps-gui/lammpsrunner.h index 72ad52986e..a864282924 100644 --- a/tools/lammps-gui/lammpsrunner.h +++ b/tools/lammps-gui/lammpsrunner.h @@ -27,16 +27,22 @@ public: // execute LAMMPS in runner thread void run() override { - lammps->commands_string(input); - delete[] input; + if (input) { + lammps->commands_string(input); + delete[] input; + } else if (file) { + lammps->file(file); + delete[] file; + } emit resultReady(); } // transfer info to worker thread and reset LAMMPS instance - void setup_run(LammpsWrapper *_lammps, const char *_input) + void setup_run(LammpsWrapper *_lammps, const char *_input, const char *_file = nullptr) { lammps = _lammps; input = _input; + file = _file; lammps->command("clear"); } @@ -46,6 +52,7 @@ signals: private: LammpsWrapper *lammps; const char *input; + const char *file; }; #endif diff --git a/tools/lammps-gui/lammpswrapper.cpp b/tools/lammps-gui/lammpswrapper.cpp index bb46d7c425..52ea177596 100644 --- a/tools/lammps-gui/lammpswrapper.cpp +++ b/tools/lammps-gui/lammpswrapper.cpp @@ -147,6 +147,17 @@ void LammpsWrapper::command(const char *input) } } +void LammpsWrapper::file(const char *filename) +{ + if (lammps_handle) { +#if defined(LAMMPS_GUI_USE_PLUGIN) + ((liblammpsplugin_t *)plugin_handle)->file(lammps_handle, filename); +#else + lammps_file(lammps_handle, filename); +#endif + } +} + void LammpsWrapper::commands_string(const char *input) { if (lammps_handle) { diff --git a/tools/lammps-gui/lammpswrapper.h b/tools/lammps-gui/lammpswrapper.h index 555307960c..3a18b61802 100644 --- a/tools/lammps-gui/lammpswrapper.h +++ b/tools/lammps-gui/lammpswrapper.h @@ -23,6 +23,7 @@ public: void close(); void finalize(); + void file(const char *); void command(const char *); void commands_string(const char *);