viewer: automatically update maximum scroll from media length

This commit is contained in:
itsmattkc
2020-02-01 23:09:25 +11:00
parent c0360abee1
commit 9b7cbb3fbd
5 changed files with 66 additions and 3 deletions
+1
View File
@@ -74,6 +74,7 @@ void Config::SetDefaults()
config_map_["AutoscaleByDefault"] = false;
config_map_["Autoscroll"] = AutoScroll::kPage;
config_map_["DefaultViewerDivider"] = 2;
config_map_["AutoSelectDivider"] = false;
config_map_["DiskCachePath"] = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
config_map_["DiskCacheSize"] = 20.0;
+24 -1
View File
@@ -4,7 +4,8 @@
TimeBasedWidget::TimeBasedWidget(bool ruler_text_visible, bool ruler_cache_status_visible, QWidget *parent) :
QWidget(parent),
viewer_node_(nullptr)
viewer_node_(nullptr),
auto_max_scrollbar_(false)
{
ruler_ = new TimeRuler(ruler_text_visible, ruler_cache_status_visible, this);
connect(ruler_, &TimeRuler::TimeChanged, this, &TimeBasedWidget::SetTimeAndSignal);
@@ -31,6 +32,8 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node)
{
if (viewer_node_) {
DisconnectNodeInternal(viewer_node_);
disconnect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll);
}
viewer_node_ = node;
@@ -39,9 +42,20 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node)
if (viewer_node_) {
ConnectNodeInternal(viewer_node_);
connect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll);
}
}
void TimeBasedWidget::UpdateMaximumScroll()
{
if (!viewer_node_ || !auto_max_scrollbar_) {
return;
}
scrollbar_->setMaximum(qMax(0, qCeil(TimeToScene(viewer_node_->Length())) - width()));
}
TimeRuler *TimeBasedWidget::ruler() const
{
return ruler_;
@@ -66,6 +80,13 @@ void TimeBasedWidget::ScaleChangedEvent(const double &scale)
TimelineScaledObject::ScaleChangedEvent(scale);
ruler_->SetScale(scale);
UpdateMaximumScroll();
}
void TimeBasedWidget::SetAutoMaxScrollBar(bool e)
{
auto_max_scrollbar_ = e;
}
void TimeBasedWidget::resizeEvent(QResizeEvent *event)
@@ -74,6 +95,8 @@ void TimeBasedWidget::resizeEvent(QResizeEvent *event)
// Update horizontal scrollbar's page step to the width of the panel
scrollbar()->setPageStep(scrollbar()->width());
UpdateMaximumScroll();
}
void TimeBasedWidget::SetTime(int64_t timestamp)
+7
View File
@@ -66,6 +66,8 @@ protected:
virtual void DisconnectNodeInternal(ViewerOutput*){}
void SetAutoMaxScrollBar(bool e);
virtual void resizeEvent(QResizeEvent *event) override;
signals:
@@ -80,6 +82,11 @@ private:
QScrollBar* scrollbar_;
bool auto_max_scrollbar_;
private slots:
void UpdateMaximumScroll();
};
#endif // TIMEBASEDWIDGET_H
+30 -2
View File
@@ -78,7 +78,7 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
connect(&playback_timer_, &QTimer::timeout, this, &ViewerWidget::PlaybackTimerUpdate);
// FIXME: Magic number
ruler()->SetScale(48.0);
SetScale(48.0);
// Start background renderers
video_renderer_ = new OpenGLBackend(this);
@@ -89,6 +89,8 @@ ViewerWidget::ViewerWidget(QWidget *parent) :
audio_renderer_ = new AudioBackend(this);
connect(PixelService::instance(), &PixelService::FormatChanged, this, &ViewerWidget::UpdateRendererParameters);
SetAutoMaxScrollBar(true);
}
void ViewerWidget::TimeChangedEvent(const int64_t &i)
@@ -130,6 +132,8 @@ void ViewerWidget::ConnectNodeInternal(ViewerOutput *n)
qWarning() << "Failed to find a suitable color manager for the connected viewer node";
}
divider_ = CalculateDivider();
UpdateRendererParameters();
}
@@ -154,6 +158,18 @@ void ViewerWidget::ConnectedNodeChanged(ViewerOutput *n)
audio_renderer_->SetViewerNode(n);
}
void ViewerWidget::resizeEvent(QResizeEvent *event)
{
TimeBasedWidget::resizeEvent(event);
int new_div = CalculateDivider();
if (new_div != divider_) {
divider_ = new_div;
UpdateRendererParameters();
}
}
void ViewerWidget::TogglePlayPause()
{
if (IsPlaying()) {
@@ -259,6 +275,18 @@ void ViewerWidget::PushScrubbedAudio()
}
}
int ViewerWidget::CalculateDivider()
{
if (GetConnectedNode() && Config::Current()["AutoSelectDivider"].toBool()) {
int long_side_of_video = qMax(GetConnectedNode()->video_params().width(), GetConnectedNode()->video_params().height());
int long_side_of_widget = qMax(gl_widget_->width(), gl_widget_->height());
return qMax(1, long_side_of_video / long_side_of_widget);
}
return divider_;
}
void ViewerWidget::UpdateRendererParameters()
{
if (!GetConnectedNode()) {
@@ -279,7 +307,7 @@ void ViewerWidget::UpdateRendererParameters()
void ViewerWidget::ShowContextMenu(const QPoint &pos)
{
QMenu menu;
QMenu menu(this);
// Color options
if (gl_widget_->color_manager() && color_menu_enabled_) {
+4
View File
@@ -122,6 +122,8 @@ protected:
virtual void DisconnectNodeInternal(ViewerOutput *) override;
virtual void ConnectedNodeChanged(ViewerOutput*n) override;
virtual void resizeEvent(QResizeEvent *event) override;
OpenGLBackend* video_renderer_;
AudioBackend* audio_renderer_;
@@ -134,6 +136,8 @@ private:
void PushScrubbedAudio();
int CalculateDivider();
ViewerSizer* sizer_;
ViewerGLWidget* gl_widget_;