From 514fec1b114cd5fbdc321eb944cd06a2913a7093 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 29 Aug 2023 18:45:04 -0400 Subject: [PATCH] add non-functional slide show window to GUI # Conflicts: # tools/lammps-gui/CMakeLists.txt # tools/lammps-gui/lammpsgui.cpp # tools/lammps-gui/lammpsgui.qrc # tools/lammps-gui/lammpsgui.ui --- tools/lammps-gui/CMakeLists.txt | 14 +- tools/lammps-gui/image-x-generic.png | Bin 0 -> 2903 bytes tools/lammps-gui/lammpsgui.cpp | 20 ++- tools/lammps-gui/lammpsgui.h | 3 + tools/lammps-gui/lammpsgui.qrc | 1 + tools/lammps-gui/lammpsgui.ui | 12 ++ tools/lammps-gui/slideshow.cpp | 190 +++++++++++++++++++++++++++ tools/lammps-gui/slideshow.h | 76 +++++++++++ 8 files changed, 308 insertions(+), 8 deletions(-) create mode 100644 tools/lammps-gui/image-x-generic.png create mode 100644 tools/lammps-gui/slideshow.cpp create mode 100644 tools/lammps-gui/slideshow.h diff --git a/tools/lammps-gui/CMakeLists.txt b/tools/lammps-gui/CMakeLists.txt index 10ac72783f..0cd15bd753 100644 --- a/tools/lammps-gui/CMakeLists.txt +++ b/tools/lammps-gui/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -project(lammps-gui VERSION 1.3.1 LANGUAGES CXX) +project(lammps-gui VERSION 1.4.0 LANGUAGES CXX) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) @@ -72,17 +72,17 @@ find_package(Qt5 5.12 REQUIRED COMPONENTS Widgets Charts) set(PROJECT_SOURCES main.cpp + lammpsgui.cpp + lammpsgui.h + lammpsgui.ui + chartviewer.cpp + chartviewer.h codeeditor.cpp codeeditor.h highlighter.cpp highlighter.h imageviewer.cpp imageviewer.h - chartviewer.cpp - chartviewer.h - lammpsgui.cpp - lammpsgui.h - lammpsgui.ui lammpsrunner.h lammpswrapper.cpp lammpswrapper.h @@ -93,6 +93,8 @@ set(PROJECT_SOURCES preferences.h setvariables.cpp setvariables.h + slideshow.h + slideshow.cpp stdcapture.cpp ${PLUGIN_LOADER_SRC} ${ICON_RC_FILE} diff --git a/tools/lammps-gui/image-x-generic.png b/tools/lammps-gui/image-x-generic.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe112632a05e50ac786a7fd36ee8b34195f426d GIT binary patch literal 2903 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 Y7w(P4KaTI0rMm$Jx+Xd`TA1j610an`%m4rY literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/lammpsgui.cpp b/tools/lammps-gui/lammpsgui.cpp index d5fe1d043a..b340ab766d 100644 --- a/tools/lammps-gui/lammpsgui.cpp +++ b/tools/lammps-gui/lammpsgui.cpp @@ -20,6 +20,7 @@ #include "logwindow.h" #include "preferences.h" #include "setvariables.h" +#include "slideshow.h" #include "stdcapture.h" #include "ui_lammpsgui.h" @@ -96,8 +97,8 @@ static bool has_exe(const QString &exe) LammpsGui::LammpsGui(QWidget *parent, const char *filename) : QMainWindow(parent), ui(new Ui::LammpsGui), highlighter(nullptr), capturer(nullptr), status(nullptr), logwindow(nullptr), imagewindow(nullptr), chartwindow(nullptr), - logupdater(nullptr), dirstatus(nullptr), progress(nullptr), prefdialog(nullptr), - lammpsstatus(nullptr), varwindow(nullptr) + slideshow(nullptr), logupdater(nullptr), dirstatus(nullptr), progress(nullptr), + prefdialog(nullptr), lammpsstatus(nullptr), varwindow(nullptr) { // enforce using the plain ASCII C locale within the GUI. QLocale::setDefault(QLocale("C")); @@ -239,6 +240,7 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : connect(ui->actionView_Log_Window, &QAction::triggered, this, &LammpsGui::view_log); connect(ui->actionView_Graph_Window, &QAction::triggered, this, &LammpsGui::view_chart); connect(ui->actionView_Image_Window, &QAction::triggered, this, &LammpsGui::view_image); + connect(ui->actionView_Slide_Show, &QAction::triggered, this, &LammpsGui::view_slides); connect(ui->actionView_Variable_Window, &QAction::triggered, this, &LammpsGui::view_variables); connect(ui->action_1, &QAction::triggered, this, &LammpsGui::open_recent); connect(ui->action_2, &QAction::triggered, this, &LammpsGui::open_recent); @@ -265,15 +267,19 @@ LammpsGui::LammpsGui(QWidget *parent, const char *filename) : auto *lammpsrun = new QPushButton(QIcon(":/system-run.png"), ""); auto *lammpsstop = new QPushButton(QIcon(":/process-stop.png"), ""); auto *lammpsimage = new QPushButton(QIcon(":/emblem-photos.png"), ""); + auto *lammpsslide = new QPushButton(QIcon(":/image-x-generic.png"), ""); lammpsrun->setToolTip("Run LAMMPS on input"); lammpsstop->setToolTip("Stop LAMMPS"); lammpsimage->setToolTip("Create snapshot image"); + lammpsslide->setToolTip("View Slide Show"); ui->statusbar->addWidget(lammpsrun); ui->statusbar->addWidget(lammpsstop); ui->statusbar->addWidget(lammpsimage); + ui->statusbar->addWidget(lammpsslide); connect(lammpsrun, &QPushButton::released, this, &LammpsGui::run_buffer); connect(lammpsstop, &QPushButton::released, this, &LammpsGui::stop_run); connect(lammpsimage, &QPushButton::released, this, &LammpsGui::render_image); + connect(lammpsslide, &QPushButton::released, this, &LammpsGui::view_slides); status = new QLabel("Ready."); status->setFixedWidth(300); @@ -307,6 +313,7 @@ LammpsGui::~LammpsGui() delete chartwindow; delete dirstatus; delete varwindow; + delete slideshow; } void LammpsGui::new_document() @@ -982,6 +989,15 @@ void LammpsGui::render_image() imagewindow->show(); } +void LammpsGui::view_slides() +{ + if (!slideshow) slideshow = new SlideShow(current_file, &lammps); + if (slideshow->isVisible()) + slideshow->hide(); + else + slideshow->show(); +} + void LammpsGui::view_chart() { QSettings settings; diff --git a/tools/lammps-gui/lammpsgui.h b/tools/lammps-gui/lammpsgui.h index aeda618443..6d80b0aee6 100644 --- a/tools/lammps-gui/lammpsgui.h +++ b/tools/lammps-gui/lammpsgui.h @@ -45,6 +45,7 @@ class StdCapture; class Preferences; class ImageViewer; class ChartWindow; +class SlideShow; class LammpsGui : public QMainWindow { Q_OBJECT @@ -84,6 +85,7 @@ private slots: void stop_run(); void edit_variables(); void render_image(); + void view_slides(); void view_image(); void view_chart(); void view_log(); @@ -107,6 +109,7 @@ private: LogWindow *logwindow; ImageViewer *imagewindow; ChartWindow *chartwindow; + SlideShow *slideshow; QTimer *logupdater; QLabel *dirstatus; QProgressBar *progress; diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index 31f997f05e..15ff13da4b 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -29,6 +29,7 @@ help-browser.png help-faq.png help_index.table + image-x-generic.png object-rotate-left.png object-rotate-right.png ovito.png diff --git a/tools/lammps-gui/lammpsgui.ui b/tools/lammps-gui/lammpsgui.ui index 9ef6525f9b..d6264e48e4 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -93,6 +93,7 @@ + @@ -352,6 +353,17 @@ Ctrl+Shift+C + + + + + + &Slide Show Window + + + Ctrl+Shift+W + + diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp new file mode 100644 index 0000000000..cc8c57d4f0 --- /dev/null +++ b/tools/lammps-gui/slideshow.cpp @@ -0,0 +1,190 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include "slideshow.h" +#include "lammpswrapper.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static const QString blank(" "); + +SlideShow::SlideShow(const QString &fileName, LammpsWrapper *_lammps, QWidget *parent) : + QDialog(parent), imageLabel(new QLabel), scrollArea(new QScrollArea), menuBar(new QMenuBar), + lammps(_lammps) +{ + imageLabel->setBackgroundRole(QPalette::Base); + imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); + imageLabel->setScaledContents(true); + imageLabel->minimumSizeHint(); + + scrollArea->setBackgroundRole(QPalette::Dark); + scrollArea->setWidget(imageLabel); + scrollArea->setVisible(false); + + buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + + QVBoxLayout *mainLayout = new QVBoxLayout; + QSettings settings; + + mainLayout->addWidget(scrollArea); + mainLayout->addWidget(buttonBox); + setWindowTitle(QString("Slide Show: ") + QFileInfo(fileName).fileName()); + createActions(); + + scaleFactor = 1.0; + resize(image.width() + 20, image.height() + 50); + + scrollArea->setVisible(true); + fitToWindowAct->setEnabled(true); + updateActions(); + if (!fitToWindowAct->isChecked()) imageLabel->adjustSize(); + setLayout(mainLayout); +} + +void SlideShow::saveAs() +{ + QString fileName = QFileDialog::getSaveFileName(this, "Save Image File As", QString(), + "Image Files (*.jpg *.png *.bmp *.ppm)"); + saveFile(fileName); +} + +void SlideShow::copy() {} + +void SlideShow::zoomIn() +{ + scaleImage(1.25); +} + +void SlideShow::zoomOut() +{ + scaleImage(0.8); +} + +void SlideShow::normalSize() +{ + imageLabel->adjustSize(); + scaleFactor = 1.0; +} + +void SlideShow::fitToWindow() +{ + bool fitToWindow = fitToWindowAct->isChecked(); + scrollArea->setWidgetResizable(fitToWindow); + if (!fitToWindow) normalSize(); + updateActions(); +} + +void SlideShow::saveFile(const QString &fileName) +{ + if (!fileName.isEmpty()) image.save(fileName); +} + +void SlideShow::createActions() +{ + QMenu *fileMenu = menuBar->addMenu("&File"); + + saveAsAct = fileMenu->addAction("&Save As...", this, &SlideShow::saveAs); + saveAsAct->setIcon(QIcon(":/document-save-as.png")); + saveAsAct->setEnabled(false); + fileMenu->addSeparator(); + copyAct = fileMenu->addAction("&Copy", this, &SlideShow::copy); + copyAct->setIcon(QIcon(":/edit-copy.png")); + copyAct->setShortcut(QKeySequence::Copy); + copyAct->setEnabled(false); + fileMenu->addSeparator(); + QAction *exitAct = fileMenu->addAction("&Close", this, &QWidget::close); + exitAct->setIcon(QIcon(":/window-close.png")); + exitAct->setShortcut(QKeySequence::fromString("Ctrl+W")); + + QMenu *viewMenu = menuBar->addMenu("&View"); + + zoomInAct = viewMenu->addAction("Image Zoom &In (25%)", this, &SlideShow::zoomIn); + zoomInAct->setShortcut(QKeySequence::ZoomIn); + zoomInAct->setIcon(QIcon(":/gtk-zoom-in.png")); + zoomInAct->setEnabled(false); + + zoomOutAct = viewMenu->addAction("Image Zoom &Out (25%)", this, &SlideShow::zoomOut); + zoomOutAct->setShortcut(QKeySequence::ZoomOut); + zoomOutAct->setIcon(QIcon(":/gtk-zoom-out.png")); + zoomOutAct->setEnabled(false); + + normalSizeAct = viewMenu->addAction("&Reset Image Size", this, &SlideShow::normalSize); + normalSizeAct->setShortcut(QKeySequence::fromString("Ctrl+0")); + normalSizeAct->setIcon(QIcon(":/gtk-zoom-fit.png")); + normalSizeAct->setEnabled(false); + + viewMenu->addSeparator(); + + fitToWindowAct = viewMenu->addAction("&Fit to Window", this, &SlideShow::fitToWindow); + fitToWindowAct->setEnabled(false); + fitToWindowAct->setCheckable(true); + fitToWindowAct->setShortcut(QKeySequence::fromString("Ctrl+=")); +} + +void SlideShow::updateActions() +{ + saveAsAct->setEnabled(!image.isNull()); + copyAct->setEnabled(!image.isNull()); + zoomInAct->setEnabled(!fitToWindowAct->isChecked()); + zoomOutAct->setEnabled(!fitToWindowAct->isChecked()); + normalSizeAct->setEnabled(!fitToWindowAct->isChecked()); +} + +void SlideShow::scaleImage(double factor) +{ + scaleFactor *= factor; +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + imageLabel->resize(scaleFactor * imageLabel->pixmap()->size()); +#else + imageLabel->resize(scaleFactor * imageLabel->pixmap(Qt::ReturnByValue).size()); +#endif + + adjustScrollBar(scrollArea->horizontalScrollBar(), factor); + adjustScrollBar(scrollArea->verticalScrollBar(), factor); + zoomInAct->setEnabled(scaleFactor < 3.0); + zoomOutAct->setEnabled(scaleFactor > 0.333); +} + +void SlideShow::adjustScrollBar(QScrollBar *scrollBar, double factor) +{ + scrollBar->setValue( + int(factor * scrollBar->value() + ((factor - 1) * scrollBar->pageStep() / 2))); +} + +// Local Variables: +// c-basic-offset: 4 +// End: diff --git a/tools/lammps-gui/slideshow.h b/tools/lammps-gui/slideshow.h new file mode 100644 index 0000000000..bde011e905 --- /dev/null +++ b/tools/lammps-gui/slideshow.h @@ -0,0 +1,76 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + https://www.lammps.org/, Sandia National Laboratories + LAMMPS development team: developers@lammps.org + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifndef SLIDESHOW_H +#define SLIDESHOW_H + +#include +#include +#include +#include + +class QAction; +class QMenuBar; +class QDialogButtonBox; +class QLabel; +class QObject; +class QScrollArea; +class QScrollBar; +class QStatusBar; +class LammpsWrapper; +class QComboBox; + +class SlideShow : public QDialog { + Q_OBJECT + +public: + explicit SlideShow(const QString &fileName, LammpsWrapper *_lammps, + QWidget *parent = nullptr); + +private slots: + void saveAs(); + void copy(); + void zoomIn(); + void zoomOut(); + void normalSize(); + void fitToWindow(); + +private: + void createActions(); + void updateActions(); + void saveFile(const QString &fileName); + void scaleImage(double factor); + void adjustScrollBar(QScrollBar *scrollBar, double factor); + +private: + QImage image; + QMenuBar *menuBar; + QLabel *imageLabel; + QScrollArea *scrollArea; + QDialogButtonBox *buttonBox; + double scaleFactor = 1.0; + + QAction *saveAsAct; + QAction *copyAct; + QAction *zoomInAct; + QAction *zoomOutAct; + QAction *normalSizeAct; + QAction *fitToWindowAct; + + LammpsWrapper *lammps; +}; +#endif + +// Local Variables: +// c-basic-offset: 4 +// End: