wrote functional playback controls

This commit is contained in:
itsmattkc
2019-09-05 10:29:21 +10:00
parent faa7f798ff
commit 9fe8c102b7
6 changed files with 152 additions and 6 deletions
@@ -21,7 +21,6 @@
#include "playbackcontrols.h"
#include <QHBoxLayout>
#include <QPushButton>
#include "common/timecodefunctions.h"
#include "config/config.h"
@@ -76,10 +75,24 @@ PlaybackControls::PlaybackControls(QWidget *parent) :
connect(prev_frame_btn, SIGNAL(clicked(bool)), this, SIGNAL(PrevFrameClicked()));
// Play/Pause Button
QPushButton* play_btn = new QPushButton();
play_btn->setIcon(olive::icon::Play);
lower_middle_layout->addWidget(play_btn);
connect(play_btn, SIGNAL(clicked(bool)), this, SIGNAL(PlayClicked()));
playpause_stack_ = new QStackedWidget();
lower_middle_layout->addWidget(playpause_stack_);
play_btn_ = new QPushButton();
play_btn_->setIcon(olive::icon::Play);
playpause_stack_->addWidget(play_btn_);
connect(play_btn_, SIGNAL(clicked(bool)), this, SIGNAL(PlayClicked()));
connect(play_btn_, SIGNAL(clicked(bool)), this, SLOT(PlayPauseClickedInternal()));
pause_btn_ = new QPushButton();
pause_btn_->setIcon(olive::icon::Pause);
playpause_stack_->addWidget(pause_btn_);
connect(pause_btn_, SIGNAL(clicked(bool)), this, SIGNAL(PauseClicked()));
connect(pause_btn_, SIGNAL(clicked(bool)), this, SLOT(PlayPauseClickedInternal()));
// Default to showing play button
playpause_stack_->setCurrentWidget(play_btn_);
playpause_stack_->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
// Next Frame Button
QPushButton* next_frame_btn = new QPushButton();
@@ -127,3 +140,13 @@ void PlaybackControls::SetTime(const int64_t &r)
cur_tc_lbl_->setText(olive::timestamp_to_timecode(r, time_base_, kTimecodeDisplay));
}
void PlaybackControls::PlayPauseClickedInternal()
{
if (sender() == play_btn_) {
// Play was clicked, toggle to pause
playpause_stack_->setCurrentWidget(pause_btn_);
} else {
playpause_stack_->setCurrentWidget(play_btn_);
}
}
+17 -1
View File
@@ -23,6 +23,8 @@
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QStackedWidget>
#include "common/rational.h"
@@ -59,10 +61,15 @@ signals:
void PrevFrameClicked();
/**
* @brief Signal emitted when "Play/Pause" is clicked
* @brief Signal emitted when "Play" is clicked
*/
void PlayClicked();
/**
* @brief Signal emitted when "Pause" is clicked
*/
void PauseClicked();
/**
* @brief Signal emitted when "Next Frame" is clicked
*/
@@ -81,6 +88,15 @@ private:
QLabel* end_tc_lbl_;
rational time_base_;
QPushButton* play_btn_;
QPushButton* pause_btn_;
QStackedWidget* playpause_stack_;
private slots:
void PlayPauseClickedInternal();
};
#endif // PLAYBACKCONTROLS_H
+5
View File
@@ -92,6 +92,11 @@ void TimeRuler::SetTimebase(const rational &r)
update();
}
const int64_t &TimeRuler::Time()
{
return time_;
}
void TimeRuler::SetTime(const int64_t &r)
{
time_ = r;
+2
View File
@@ -42,6 +42,8 @@ public:
void SetCenteredText(bool c);
const int64_t& Time();
public slots:
void SetTime(const int64_t &r);
+75
View File
@@ -20,8 +20,10 @@
#include "viewer.h"
#include <QDateTime>
#include <QLabel>
#include <QResizeEvent>
#include <QtMath>
#include <QVBoxLayout>
#include "viewersizer.h"
@@ -58,8 +60,17 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
controls_ = new PlaybackControls(this);
controls_->SetTimecodeEnabled(true);
controls_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
connect(controls_, SIGNAL(PlayClicked()), this, SLOT(Play()));
connect(controls_, SIGNAL(PauseClicked()), this, SLOT(Pause()));
connect(controls_, SIGNAL(PrevFrameClicked()), this, SLOT(PrevFrame()));
connect(controls_, SIGNAL(NextFrameClicked()), this, SLOT(NextFrame()));
connect(controls_, SIGNAL(BeginClicked()), this, SLOT(GoToStart()));
connect(controls_, SIGNAL(EndClicked()), this, SLOT(GoToEnd()));
layout->addWidget(controls_);
// Connect timer
connect(&playback_timer_, SIGNAL(timeout()), this, SLOT(PlaybackTimerUpdate()));
// FIXME: Magic number
ruler_->SetScale(48.0);
}
@@ -67,9 +78,12 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
void ViewerWidget::SetTimebase(const rational &r)
{
time_base_ = r;
time_base_dbl_ = r.toDouble();
ruler_->SetTimebase(r);
controls_->SetTimebase(r);
playback_timer_.setInterval(qFloor(r.toDouble()));
}
const double &ViewerWidget::scale()
@@ -82,6 +96,12 @@ void ViewerWidget::SetScale(const double &scale_)
ruler_->SetScale(scale_);
}
void ViewerWidget::SetTime(const int64_t &time)
{
ruler_->SetTime(time);
RulerTimeChange(time);
}
void ViewerWidget::SetTexture(GLuint tex)
{
gl_widget_->SetTexture(tex);
@@ -96,6 +116,61 @@ void ViewerWidget::RulerTimeChange(int64_t i)
emit TimeChanged(time_set);
}
void ViewerWidget::Play()
{
if (time_base_.isNull()) {
qWarning() << "ViewerWidget can't play with an invalid timebase";
return;
}
start_msec_ = QDateTime::currentMSecsSinceEpoch();
start_timestamp_ = ruler_->Time();
playback_timer_.start();
}
void ViewerWidget::Pause()
{
playback_timer_.stop();
}
void ViewerWidget::GoToStart()
{
Pause();
SetTime(0);
}
void ViewerWidget::PrevFrame()
{
Pause();
SetTime(ruler_->Time() - 1);
}
void ViewerWidget::NextFrame()
{
Pause();
SetTime(ruler_->Time() + 1);
}
void ViewerWidget::GoToEnd()
{
Pause();
qWarning() << "No end frame support yet";
}
void ViewerWidget::PlaybackTimerUpdate()
{
int64_t real_time = QDateTime::currentMSecsSinceEpoch() - start_msec_;
int64_t frames_since_start = qRound(static_cast<double>(real_time) / (time_base_dbl_ * 1000));
SetTime(start_timestamp_ + frames_since_start);
}
void ViewerWidget::resizeEvent(QResizeEvent *event)
{
// Set scrollbar page step to the width
+25
View File
@@ -24,6 +24,7 @@
#include <QLabel>
#include <QPushButton>
#include <QScrollBar>
#include <QTimer>
#include <QWidget>
#include "common/rational.h"
@@ -50,6 +51,8 @@ public:
void SetScale(const double& scale_);
void SetTime(const int64_t& time);
public slots:
/**
* @brief Set the texture to draw and draw it
@@ -77,8 +80,30 @@ private:
rational time_base_;
double time_base_dbl_;
QTimer playback_timer_;
qint64 start_msec_;
int64_t start_timestamp_;
private slots:
void RulerTimeChange(int64_t i);
void Play();
void Pause();
void GoToStart();
void PrevFrame();
void NextFrame();
void GoToEnd();
void PlaybackTimerUpdate();
};
#endif // VIEWER_WIDGET_H