diff --git a/app/config/config.cpp b/app/config/config.cpp index f4214bd35..a0b0abc8b 100644 --- a/app/config/config.cpp +++ b/app/config/config.cpp @@ -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; diff --git a/app/widget/timebased/timebased.cpp b/app/widget/timebased/timebased.cpp index df76eeb44..ed836ea58 100644 --- a/app/widget/timebased/timebased.cpp +++ b/app/widget/timebased/timebased.cpp @@ -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) diff --git a/app/widget/timebased/timebased.h b/app/widget/timebased/timebased.h index 518c5fdf1..7c5b77304 100644 --- a/app/widget/timebased/timebased.h +++ b/app/widget/timebased/timebased.h @@ -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 diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index e625757b5..6f1cc50e7 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -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_) { diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 02ab0f5df..17cd5c620 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -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_;