6#include "TourCaptureDialog.h"
7#include "ui_TourCaptureDialog.h"
14#include "MovieCapture.h"
15#include "TourPlayback.h"
19TourCaptureDialog::TourCaptureDialog(MarbleWidget *widget,
QWidget *parent) :
21 ui(new Ui::TourCaptureDialog),
22 m_recorder(new MovieCapture(widget, parent)),
24 m_writingPossible( true ),
25 m_current_position( 0.0 )
28 m_recorder->setSnapshotMethod(MovieCapture::DataDriven);
29 ui->progressBar->setValue(0);
31 connect(ui->fpsSlider, SIGNAL(valueChanged(
int)),
32 ui->fpsSpin, SLOT(setValue(
int)));
34 connect(ui->fpsSpin, SIGNAL(valueChanged(
int)),
35 ui->fpsSlider, SLOT(setValue(
int)));
37 connect(ui->fpsSlider, SIGNAL(valueChanged(
int)),
38 m_recorder, SLOT(setFps(
int)));
40 connect(ui->closeButton, SIGNAL(clicked()),
43 connect(ui->startButton, SIGNAL(clicked()),
44 this, SLOT(startRecording()));
46 connect(ui->openButton, SIGNAL(clicked()),
47 this, SLOT(loadDestinationFile()));
49 connect(m_recorder, SIGNAL(rateCalculated(
double)),
50 this, SLOT(setRate(
double))) ;
52 connect(m_recorder, SIGNAL(errorOccured()),
53 this, SLOT(handleError()) );
56TourCaptureDialog::~TourCaptureDialog()
61void TourCaptureDialog::loadDestinationFile()
65 QMessageBox::warning(
this, tr(
"Codecs are unavailable" ), tr(
"Supported codecs are not found. (ffmpeg/avconv needs to be installed and in PATH.)" ) );
69 for(
int i = 1; i < formats.
size(); i++ )
74 ui->destinationEdit->text().
isEmpty() ? m_defaultFileName : ui->destinationEdit->text();
84 bool supported =
false;
85 for(
const MovieFormat &format: formats) {
94 for(
int i = 1; i < formats.
size(); ++i )
99 tr(
"This file format is not supported. "
100 "Please, use %1 instead").arg( formatsExtensions ) );
104 ui->destinationEdit->setText(destination);
105 m_recorder->setFilename(destination);
108void TourCaptureDialog::startRecording()
110 if( ui->startButton->text() == tr(
"Start") ){
111 ui->startButton->setText(tr(
"Cancel"));
112 ui->closeButton->setDisabled(
true);
117 tr(
"Destination video file is not set. "
118 "I don't know where to save recorded "
119 "video. Please, specify one."));
123 m_recorder->setSnapshotMethod( MovieCapture::DataDriven );
124 m_recorder->setFps(ui->fpsSlider->value());
125 m_recorder->startRecording();
126 m_current_position = 0.0;
130 ui->startButton->setText(tr(
"Start"));
131 m_recorder->cancelRecording();
132 ui->progressBar->setValue(0);
133 ui->closeButton->setEnabled(
true);
137void TourCaptureDialog::updateProgress(
double position)
139 ui->progressBar->setValue(position);
142void TourCaptureDialog::recordNextFrame()
144 double const shift = 1.0 / ( ui->fpsSlider->value() );
145 double const duration = m_playback->duration();
147 if (!m_writingPossible) {
148 ui->rate->setText(
QString(
"<font color=\"red\">%1</font>").
arg(tr(
"Video writing failed.")));
156 if (m_current_position <= duration) {
157 m_playback->seek( m_current_position );
158 m_recorder->recordFrame();
159 updateProgress( m_current_position * 100 );
160 m_current_position += shift;
163 m_recorder->stopRecording();
164 ui->progressBar->setValue(duration*100);
165 ui->startButton->setText(tr(
"Start"));
166 ui->rate->setText(
QString(
"<font color=\"green\">%1</font>").arg(tr(
"Video export completed.")));
167 ui->closeButton->setEnabled(
true);
171void TourCaptureDialog::setRate(
double rate)
173 ui->rate->setText(
QString(
"%1 KBytes/sec").arg(rate));
176void TourCaptureDialog::stopRecording()
178 m_recorder->stopRecording();
181void TourCaptureDialog::setTourPlayback( TourPlayback* playback )
183 m_playback = playback;
184 ui->progressBar->setMaximum(playback->duration() * 100);
187void TourCaptureDialog::setDefaultFilename(
const QString &filename)
189 m_defaultFileName = filename;
192void TourCaptureDialog::handleError()
194 m_writingPossible =
false;
199#include "moc_TourCaptureDialog.cpp"
QString path(const QString &relativePath)
const QList< QKeySequence > & close()
Binds a QML item to a specific geodetic location in screen coordinates.
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
const_reference at(qsizetype i) const const
bool isEmpty() const const
qsizetype size() const const
StandardButton warning(QWidget *parent, const QString &title, const QString &text, StandardButtons buttons, StandardButton defaultButton)
QString arg(Args &&... args) const const
bool endsWith(QChar c, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
QFuture< void > filter(QThreadPool *pool, Sequence &sequence, KeepFunctor &&filterFunction)
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)