Marble

MovieCaptureDialog.cpp
1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2013 Illya Kovalevskyy <[email protected]>
4 //
5 
6 #include "MovieCaptureDialog.h"
7 #include "ui_MovieCaptureDialog.h"
8 
9 #include <QFileDialog>
10 #include <QMessageBox>
11 
12 #include "MarbleWidget.h"
13 #include "MovieCapture.h"
14 
15 namespace Marble {
16 
17 MovieCaptureDialog::MovieCaptureDialog(MarbleWidget *widget, QWidget *parent) :
18  QDialog(parent),
19  ui(new Ui::MovieCaptureDialog),
20  m_recorder(new MovieCapture(widget, parent))
21 {
22  ui->setupUi(this);
23  m_recorder->setSnapshotMethod(MovieCapture::TimeDriven);
24  QPushButton *startButton = ui->buttonBox->addButton(tr("&Start", "Start recording a movie"), QDialogButtonBox::ActionRole);
25 
26  connect(ui->fpsSlider, SIGNAL(valueChanged(int)),
27  ui->fpsSpin, SLOT(setValue(int)));
28 
29  connect(ui->fpsSpin, SIGNAL(valueChanged(int)),
30  ui->fpsSlider, SLOT(setValue(int)));
31 
32  connect(ui->fpsSlider, SIGNAL(valueChanged(int)),
33  m_recorder, SLOT(setFps(int)));
34 
35  connect(ui->buttonBox, SIGNAL(rejected()),
36  this, SLOT(close()));
37 
38  connect(startButton, SIGNAL(clicked()),
39  this, SLOT(startRecording()));
40 
41  connect(ui->openButton, SIGNAL(clicked()),
42  this, SLOT(loadDestinationFile()));
43 }
44 
45 MovieCaptureDialog::~MovieCaptureDialog()
46 {
47  delete ui;
48 }
49 
50 void MovieCaptureDialog::loadDestinationFile()
51 {
52  const QVector<MovieFormat> formats = m_recorder->availableFormats();
53  if( formats.isEmpty() ) {
54  QMessageBox::warning( this, tr( "Codecs are unavailable" ), tr( "Supported codecs are not found." ) );
55  return;
56  }
57  QString filter = formats.first().name() + QLatin1String(" (*.") + formats.first().extension() + QLatin1Char(')');
58  for( int i = 1; i < formats.size(); i++ )
59  {
60  filter += QLatin1String(";;") + formats.at(i).name() + QLatin1String(" (*.") + formats.at(i).extension() + QLatin1Char(')');
61  }
62  const QString defaultFileName =
63  ui->destinationEdit->text().isEmpty() ? "" : ui->destinationEdit->text();
64 
65  const QString destination =
66  QFileDialog::getSaveFileName(this, tr("Save video file"), defaultFileName,
67  filter );
68 
69  if (destination.isEmpty()) {
70  return;
71  }
72 
73  bool supported = false;
74  for(const MovieFormat &format: formats) {
75  if (destination.endsWith(QLatin1Char('.') + format.extension())) {
76  supported = true;
77  break;
78  }
79  }
80 
81  if (!supported) {
82  QString formatsExtensions = QLatin1Char('.') + formats.at(0).extension();
83  for( int i = 1; i < formats.size(); ++i )
84  {
85  formatsExtensions += QLatin1String(", .") + formats.at(i).extension();
86  }
87  QMessageBox::warning(this, tr("Filename is not valid"),
88  tr("This file format is not supported. "
89  "Please, use %1 instead").arg( formatsExtensions ) );
90  return;
91  }
92 
93  ui->destinationEdit->setText(destination);
94  m_recorder->setFilename(destination);
95 }
96 
97 void MovieCaptureDialog::startRecording()
98 {
99  const QString path = ui->destinationEdit->text();
100 
101  if (path.isEmpty()) {
102  QMessageBox::warning(this, tr("Missing filename"),
103  tr("Destination video file is not set. "
104  "I don't know where to save recorded "
105  "video. Please, specify one."));
106  return;
107  }
108 
109  hide();
110 
111  m_recorder->setFps(ui->fpsSlider->value());
112  if (m_recorder->startRecording())
113  emit started();
114 }
115 
116 void MovieCaptureDialog::stopRecording()
117 {
118  m_recorder->stopRecording();
119 }
120 
121 } // namespace Marble
122 
123 #include "moc_MovieCaptureDialog.cpp"
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton)
T & first()
QLatin1Char at(int pos) const const
const T & at(int i) const const
bool isEmpty() const const
QAction * close(const QObject *recvr, const char *slot, QObject *parent)
QFuture< void > filter(Sequence &sequence, KeepFunctor filterFunction)
Binds a QML item to a specific geodetic location in screen coordinates.
void setupUi(QWidget *widget)
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options)
int size() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Thu May 26 2022 04:07:50 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.