From 9aa68442b6357547e521c78c289c39c1cc1980dd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 30 Aug 2023 01:07:27 -0400 Subject: [PATCH] complete implementation of slideshow window --- tools/lammps-gui/go-first.png | Bin 0 -> 4175 bytes tools/lammps-gui/go-last.png | Bin 0 -> 4292 bytes tools/lammps-gui/go-next-2.png | Bin 0 -> 4207 bytes tools/lammps-gui/go-previous-2.png | Bin 0 -> 3809 bytes tools/lammps-gui/lammpsgui.cpp | 47 ++- tools/lammps-gui/lammpsgui.qrc | 103 ++++--- tools/lammps-gui/lammpsgui.ui | 2 +- tools/lammps-gui/media-playback-start-2.png | Bin 0 -> 3981 bytes tools/lammps-gui/media-playlist-repeat.png | Bin 0 -> 2706 bytes tools/lammps-gui/preferences.cpp | 6 + tools/lammps-gui/slideshow.cpp | 311 ++++++++++++-------- tools/lammps-gui/slideshow.h | 46 ++- 12 files changed, 305 insertions(+), 210 deletions(-) create mode 100644 tools/lammps-gui/go-first.png create mode 100644 tools/lammps-gui/go-last.png create mode 100644 tools/lammps-gui/go-next-2.png create mode 100644 tools/lammps-gui/go-previous-2.png create mode 100644 tools/lammps-gui/media-playback-start-2.png create mode 100644 tools/lammps-gui/media-playlist-repeat.png diff --git a/tools/lammps-gui/go-first.png b/tools/lammps-gui/go-first.png new file mode 100644 index 0000000000000000000000000000000000000000..d01804987646f5144fdb3c232a615c06b5de4a66 GIT binary patch literal 4175 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 bb~>BM|0##ZUXxHG)dSiZ2I?Pf*<=3${Ohq@ literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/go-last.png b/tools/lammps-gui/go-last.png new file mode 100644 index 0000000000000000000000000000000000000000..fe382ca6cb77cb8dd9c8ca5d10119d90579fee5a GIT binary patch literal 4292 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 Vr4wYO?vU*PJuM^6Y7NJj{{STU<-7m@ literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/go-previous-2.png b/tools/lammps-gui/go-previous-2.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd558bc20d8b5e6a318df410bada89819740716 GIT binary patch literal 3809 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" Directory: ") + current_dir); status->setText("Ready."); + if (slideshow) { + delete slideshow; + slideshow = nullptr; + } update_variables(); } @@ -717,20 +721,25 @@ void LammpsGui::logupdate() } } + // get timestep + int step = 0; + void *ptr = lammps.last_thermo("step", 0); + if (ptr) { + if (lammps.extract_setting("bigint") == 4) + step = *(int *)ptr; + else + step = (int)*(int64_t *)ptr; + } + // extract cached thermo data if (chartwindow) { // thermo data is not yet valid during setup void *ptr = lammps.last_thermo("setup", 0); if (ptr && *(int *)ptr) return; - ptr = lammps.last_thermo("step", 0); + ptr = lammps.last_thermo("num", 0); if (ptr) { - int step = 0; - if (lammps.extract_setting("bigint") == 4) - step = *(int *)ptr; - else - step = (int)*(int64_t *)ptr; - int ncols = *(int *)lammps.last_thermo("num", 0); + int ncols = *(int *)ptr; // check if the column assignment has changed // if yes, delete charts and start over @@ -775,6 +784,22 @@ void LammpsGui::logupdate() } } } + + // update list of available image file names + + QString imagefile = (const char *)lammps.last_thermo("imagename", 0); + if (!imagefile.isEmpty()) { + if (!slideshow) { + slideshow = new SlideShow(current_file); + if (QSettings().value("viewslide", true).toBool()) + slideshow->show(); + else + slideshow->hide(); + } else { + slideshow->setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + current_file); + } + slideshow->add_image(imagefile); + } } void LammpsGui::modified() @@ -963,6 +988,12 @@ void LammpsGui::do_run(bool use_buffer) else chartwindow->hide(); + if (slideshow) { + slideshow->setWindowTitle("LAMMPS-GUI - Slide Show"); + slideshow->clear(); + slideshow->hide(); + } + logupdater = new QTimer(this); connect(logupdater, &QTimer::timeout, this, &LammpsGui::logupdate); logupdater->start(100); @@ -991,7 +1022,7 @@ void LammpsGui::render_image() void LammpsGui::view_slides() { - if (!slideshow) slideshow = new SlideShow(current_file, &lammps); + if (!slideshow) slideshow = new SlideShow(current_file); if (slideshow->isVisible()) slideshow->hide(); else diff --git a/tools/lammps-gui/lammpsgui.qrc b/tools/lammps-gui/lammpsgui.qrc index 15ff13da4b..a27d6abbea 100644 --- a/tools/lammps-gui/lammpsgui.qrc +++ b/tools/lammps-gui/lammpsgui.qrc @@ -1,50 +1,57 @@ + - - lammps-icon-128x128.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-revert.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 - gtk-go-down.png - gtk-go-up.png - gtk-zoom-fit.png - gtk-zoom-in.png - gtk-zoom-out.png - hd-img.png - help-about.png - help-browser.png - help-faq.png - help_index.table - image-x-generic.png - object-rotate-left.png - object-rotate-right.png - ovito.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 - + + lammps-icon-128x128.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-revert.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 + go-first.png + go-last.png + go-next-2.png + go-previous-2.png + gtk-go-down.png + gtk-go-up.png + gtk-zoom-fit.png + gtk-zoom-in.png + gtk-zoom-out.png + hd-img.png + help-about.png + help-browser.png + help-faq.png + help_index.table + image-x-generic.png + media-playback-start-2.png + media-playlist-repeat.png + object-rotate-left.png + object-rotate-right.png + ovito.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 f5d9f92949..77257b23c2 100644 --- a/tools/lammps-gui/lammpsgui.ui +++ b/tools/lammps-gui/lammpsgui.ui @@ -361,7 +361,7 @@ &Slide Show Window - Ctrl+Shift+W + Ctrl+L diff --git a/tools/lammps-gui/media-playback-start-2.png b/tools/lammps-gui/media-playback-start-2.png new file mode 100644 index 0000000000000000000000000000000000000000..82bfaea9a493d1c779fc622b5cf7eac2a6942c57 GIT binary patch literal 3981 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 literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/media-playlist-repeat.png b/tools/lammps-gui/media-playlist-repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..8845699912a05e0198622bed59eda8d375a8efd4 GIT binary patch literal 2706 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 W&(#n*pYkFFUclPI&b$WWnfPxlr_U7t literal 0 HcmV?d00001 diff --git a/tools/lammps-gui/preferences.cpp b/tools/lammps-gui/preferences.cpp index bdb7d39dbf..eb8d0fc8e2 100644 --- a/tools/lammps-gui/preferences.cpp +++ b/tools/lammps-gui/preferences.cpp @@ -161,6 +161,8 @@ void Preferences::accept() if (box) settings->setValue("viewlog", box->isChecked()); box = tabWidget->findChild("viewchart"); if (box) settings->setValue("viewchart", box->isChecked()); + box = tabWidget->findChild("viewslide"); + if (box) settings->setValue("viewslide", box->isChecked()); if (need_relaunch) { QMessageBox msg(QMessageBox::Information, QString("Relaunching LAMMPS-GUI"), @@ -192,6 +194,9 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa auto *pltv = new QCheckBox("Show chart window by default"); pltv->setObjectName("viewchart"); pltv->setCheckState(settings->value("viewchart", true).toBool() ? Qt::Checked : Qt::Unchecked); + auto *sldv = new QCheckBox("Show slide show by default"); + sldv->setObjectName("viewslide"); + sldv->setCheckState(settings->value("viewslide", true).toBool() ? Qt::Checked : Qt::Unchecked); auto *logr = new QCheckBox("Replace log window on new run"); logr->setObjectName("logreplace"); logr->setCheckState(settings->value("logreplace", false).toBool() ? Qt::Checked @@ -232,6 +237,7 @@ GeneralTab::GeneralTab(QSettings *_settings, LammpsWrapper *_lammps, QWidget *pa layout->addWidget(cite); layout->addWidget(logv); layout->addWidget(pltv); + layout->addWidget(sldv); layout->addWidget(logr); layout->addWidget(pltr); layout->addWidget(imgr); diff --git a/tools/lammps-gui/slideshow.cpp b/tools/lammps-gui/slideshow.cpp index cc8c57d4f0..d949907668 100644 --- a/tools/lammps-gui/slideshow.cpp +++ b/tools/lammps-gui/slideshow.cpp @@ -12,177 +12,240 @@ ------------------------------------------------------------------------- */ #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 +#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) +SlideShow::SlideShow(const QString &fileName, QWidget *parent) : + QDialog(parent), playtimer(nullptr), imageLabel(new QLabel), imageName(new QLabel("(none)")), + do_loop(true) { imageLabel->setBackgroundRole(QPalette::Base); - imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); - imageLabel->setScaledContents(true); - imageLabel->minimumSizeHint(); + imageLabel->setScaledContents(false); + imageLabel->setMinimumSize(100, 100); - scrollArea->setBackgroundRole(QPalette::Dark); - scrollArea->setWidget(imageLabel); - scrollArea->setVisible(false); + imageName->setFrameStyle(QFrame::Raised); + imageName->setFrameShape(QFrame::Panel); + imageName->setAlignment(Qt::AlignCenter); + + auto *shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this); + QObject::connect(shortcut, &QShortcut::activated, this, &SlideShow::close); 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; + auto *mainLayout = new QVBoxLayout; + auto *navLayout = new QHBoxLayout; - mainLayout->addWidget(scrollArea); + auto *gofirst = new QPushButton(QIcon(":/go-first.png"), ""); + gofirst->setToolTip("Go to first Image"); + auto *goprev = new QPushButton(QIcon(":/go-previous-2.png"), ""); + goprev->setToolTip("Go to previous Image"); + auto *goplay = new QPushButton(QIcon(":/media-playback-start-2.png"), ""); + goplay->setToolTip("Play animation"); + goplay->setCheckable(true); + goplay->setChecked(playtimer); + goplay->setObjectName("play"); + auto *gonext = new QPushButton(QIcon(":/go-next-2.png"), ""); + gonext->setToolTip("Go to next Image"); + auto *golast = new QPushButton(QIcon(":/go-last.png"), ""); + golast->setToolTip("Go to last Image"); + auto *goloop = new QPushButton(QIcon(":/media-playlist-repeat.png"), ""); + goloop->setToolTip("Loop animation"); + goloop->setCheckable(true); + goloop->setChecked(do_loop); + + auto *zoomin = new QPushButton(QIcon(":/gtk-zoom-in.png"), ""); + zoomin->setToolTip("Zoom in by 10 percent"); + auto *zoomout = new QPushButton(QIcon(":/gtk-zoom-out.png"), ""); + zoomout->setToolTip("Zoom out by 10 percent"); + auto *normal = new QPushButton(QIcon(":/gtk-zoom-fit.png"), ""); + normal->setToolTip("Reset zoom to normal"); + + connect(gofirst, &QPushButton::released, this, &SlideShow::first); + connect(goprev, &QPushButton::released, this, &SlideShow::prev); + connect(goplay, &QPushButton::released, this, &SlideShow::play); + connect(gonext, &QPushButton::released, this, &SlideShow::next); + connect(golast, &QPushButton::released, this, &SlideShow::last); + connect(goloop, &QPushButton::released, this, &SlideShow::loop); + connect(zoomin, &QPushButton::released, this, &SlideShow::zoomIn); + connect(zoomout, &QPushButton::released, this, &SlideShow::zoomOut); + connect(gofirst, &QPushButton::released, this, &SlideShow::first); + connect(normal, &QPushButton::released, this, &SlideShow::normalSize); + + navLayout->addWidget(imageName); + navLayout->addSpacerItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum)); + navLayout->addWidget(gofirst); + navLayout->addWidget(goprev); + navLayout->addWidget(goplay); + navLayout->addWidget(gonext); + navLayout->addWidget(golast); + navLayout->addWidget(goloop); + + navLayout->addWidget(zoomin); + navLayout->addWidget(zoomout); + navLayout->addWidget(normal); + + mainLayout->addWidget(imageLabel); + mainLayout->addLayout(navLayout); mainLayout->addWidget(buttonBox); - setWindowTitle(QString("Slide Show: ") + QFileInfo(fileName).fileName()); - createActions(); + setWindowTitle(QString("LAMMPS-GUI - Slide Show: ") + QFileInfo(fileName).fileName()); + imagefiles.clear(); scaleFactor = 1.0; - resize(image.width() + 20, image.height() + 50); + current = 0; - scrollArea->setVisible(true); - fitToWindowAct->setEnabled(true); - updateActions(); - if (!fitToWindowAct->isChecked()) imageLabel->adjustSize(); setLayout(mainLayout); } -void SlideShow::saveAs() +void SlideShow::add_image(const QString &filename) { - QString fileName = QFileDialog::getSaveFileName(this, "Save Image File As", QString(), - "Image Files (*.jpg *.png *.bmp *.ppm)"); - saveFile(fileName); + if (!imagefiles.contains(filename)) { + int lastidx = imagefiles.size(); + imagefiles.append(filename); + loadImage(lastidx); + } } -void SlideShow::copy() {} +void SlideShow::clear() +{ + imagefiles.clear(); + image.fill(Qt::black); + imageLabel->setPixmap(QPixmap::fromImage(image)); + imageLabel->adjustSize(); + imageName->setText("(none)"); + repaint(); +} + +void SlideShow::loadImage(int idx) +{ + if ((idx < 0) || (idx >= imagefiles.size())) return; + + do { + QImageReader reader(imagefiles[idx]); + reader.setAutoTransform(true); + const QImage newImage = reader.read(); + + // There was an error reading the image file. Try reading the previous image instead. + if (newImage.isNull()) { + --idx; + } else { + int newheight = (int)newImage.height() * scaleFactor; + int newwidth = (int)newImage.width() * scaleFactor; + image = newImage.scaled(newwidth, newheight, Qt::IgnoreAspectRatio, + Qt::SmoothTransformation); + imageLabel->setPixmap(QPixmap::fromImage(image)); + imageLabel->setMinimumSize(newwidth, newheight); + imageName->setText(imagefiles[idx]); + adjustSize(); + current = idx; + break; + } + } while (idx >= 0); +} + +void SlideShow::first() +{ + current = 0; + loadImage(current); +} + +void SlideShow::last() +{ + current = imagefiles.size() - 1; + loadImage(current); +} + +void SlideShow::play() +{ + // if we do not loop, start animation from beginning + if (!do_loop) current = 0; + + if (playtimer) { + playtimer->stop(); + delete playtimer; + playtimer = nullptr; + } else { + playtimer = new QTimer(this); + connect(playtimer, &QTimer::timeout, this, &SlideShow::next); + playtimer->start(100); + } + + // reset push button state. use findChild() if not triggered from button. + QPushButton *button = qobject_cast(sender()); + if (!button) button = findChild("play"); + if (button) button->setChecked(playtimer); +} + +void SlideShow::next() +{ + ++current; + if (current >= imagefiles.size()) { + if (do_loop) { + current = 0; + } else { + // stop animation + if (playtimer) play(); + --current; + } + } + loadImage(current); +} + +void SlideShow::prev() +{ + --current; + if (current < 0) { + if (do_loop) + current = imagefiles.size() - 1; + else + current = 0; + } + loadImage(current); +} + +void SlideShow::loop() +{ + QPushButton *button = qobject_cast(sender()); + do_loop = !do_loop; + button->setChecked(do_loop); +} void SlideShow::zoomIn() { - scaleImage(1.25); + scaleImage(1.1); } void SlideShow::zoomOut() { - scaleImage(0.8); + scaleImage(0.9); } 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()); + scaleImage(1.0); } 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))); + if (scaleFactor > 2.0) scaleFactor = 2.0; + if (scaleFactor < 0.25) scaleFactor = 0.25; + loadImage(current); } // Local Variables: diff --git a/tools/lammps-gui/slideshow.h b/tools/lammps-gui/slideshow.h index bde011e905..1bf62a99bb 100644 --- a/tools/lammps-gui/slideshow.h +++ b/tools/lammps-gui/slideshow.h @@ -14,60 +14,48 @@ #ifndef SLIDESHOW_H #define SLIDESHOW_H -#include #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 QTimer; class SlideShow : public QDialog { Q_OBJECT public: - explicit SlideShow(const QString &fileName, LammpsWrapper *_lammps, - QWidget *parent = nullptr); + explicit SlideShow(const QString &fileName, QWidget *parent = nullptr); + void add_image(const QString &filename); + void clear(); private slots: - void saveAs(); - void copy(); + void first(); + void last(); + void next(); + void prev(); + void play(); + void loop(); 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); + void loadImage(int idx); private: QImage image; - QMenuBar *menuBar; - QLabel *imageLabel; - QScrollArea *scrollArea; + QTimer *playtimer; + QLabel *imageLabel, *imageName; QDialogButtonBox *buttonBox; double scaleFactor = 1.0; - QAction *saveAsAct; - QAction *copyAct; - QAction *zoomInAct; - QAction *zoomOutAct; - QAction *normalSizeAct; - QAction *fitToWindowAct; - - LammpsWrapper *lammps; + int current; + bool do_loop; + QStringList imagefiles; }; #endif