diff options
Diffstat (limited to 'gui/basewindow.cc')
| -rw-r--r-- | gui/basewindow.cc | 54 | 
1 files changed, 54 insertions, 0 deletions
diff --git a/gui/basewindow.cc b/gui/basewindow.cc index c3dbc131..7f767c58 100644 --- a/gui/basewindow.cc +++ b/gui/basewindow.cc @@ -23,7 +23,9 @@  #include <QFileDialog>
  #include <QGridLayout>
  #include <QIcon>
 +#include <QImageWriter>
  #include <QInputDialog>
 +#include <QMessageBox>
  #include <QSplitter>
  #include <fstream>
  #include "designwidget.h"
 @@ -252,6 +254,18 @@ void BaseMainWindow::createMenusAndBars()      actionDisplayGroups->setChecked(true);
      connect(actionDisplayGroups, &QAction::triggered, this, &BaseMainWindow::enableDisableDecals);
 +    actionScreenshot = new QAction("Screenshot", this);
 +    actionScreenshot->setIcon(QIcon(":/icons/resources/camera.png"));
 +    actionScreenshot->setStatusTip("Taking a screenshot");
 +    connect(actionScreenshot, &QAction::triggered, this, &BaseMainWindow::screenshot);
 +
 +    actionMovie = new QAction("Recording", this);
 +    actionMovie->setIcon(QIcon(":/icons/resources/film.png"));
 +    actionMovie->setStatusTip("Saving a movie");
 +    actionMovie->setCheckable(true);
 +    actionMovie->setChecked(false);
 +    connect(actionMovie, &QAction::triggered, this, &BaseMainWindow::saveMovie);
 +
      // set initial state
      fpgaView->enableDisableDecals(actionDisplayBel->isChecked(), actionDisplayWire->isChecked(),
                                    actionDisplayPip->isChecked(), actionDisplayGroups->isChecked());
 @@ -317,6 +331,9 @@ void BaseMainWindow::createMenusAndBars()      deviceViewToolBar->addAction(actionDisplayWire);
      deviceViewToolBar->addAction(actionDisplayPip);
      deviceViewToolBar->addAction(actionDisplayGroups);
 +    deviceViewToolBar->addSeparator();
 +    deviceViewToolBar->addAction(actionScreenshot);
 +    deviceViewToolBar->addAction(actionMovie);
      // Add status bar with progress bar
      statusBar = new QStatusBar();
 @@ -362,6 +379,43 @@ void BaseMainWindow::save_json()      }
  }
 +void BaseMainWindow::screenshot()
 +{
 +    QString fileName = QFileDialog::getSaveFileName(this, QString("Save screenshot"), QString(), QString("*.png"));
 +    if (!fileName.isEmpty()) {
 +        QImage image = fpgaView->grabFramebuffer();
 +        if (!fileName.endsWith(".png"))
 +            fileName += ".png";
 +        QImageWriter imageWriter(fileName, "png");
 +        if (imageWriter.write(image))
 +            log("Saving screenshot successful.\n");
 +        else
 +            log("Saving screenshot failed.\n");
 +    }
 +}
 +
 +void BaseMainWindow::saveMovie()
 +{
 +    if (actionMovie->isChecked()) {
 +        QString dir = QFileDialog::getExistingDirectory(this, tr("Select Movie Directory"), QDir::currentPath(),
 +                                                        QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
 +        if (!dir.isEmpty()) {
 +            bool ok;
 +            int frames =
 +                    QInputDialog::getInt(this, "Recording", tr("Frames to skip (1 frame = 50ms):"), 5, 0, 1000, 1, &ok);
 +            if (ok) {
 +                QMessageBox::StandardButton reply =
 +                        QMessageBox::question(this, "Recording", "Skip identical frames ?",
 +                                              QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
 +                fpgaView->movieStart(dir, frames, (reply == QMessageBox::Yes));
 +            } else
 +                actionMovie->setChecked(false);
 +        } else
 +            actionMovie->setChecked(false);
 +    } else {
 +        fpgaView->movieStop();
 +    }
 +}
  void BaseMainWindow::pack_finished(bool status)
  {
      disableActions();
  | 
