diff --git a/app/widget/timelinewidget/timelinescaledobject.cpp b/app/widget/timelinewidget/timelinescaledobject.cpp index 278efb07e..cd0fb9bcc 100644 --- a/app/widget/timelinewidget/timelinescaledobject.cpp +++ b/app/widget/timelinewidget/timelinescaledobject.cpp @@ -3,8 +3,11 @@ #include #include +#include "common/clamp.h" + TimelineScaledObject::TimelineScaledObject() : scale_(1.0), + min_scale_(0), max_scale_(DBL_MAX) { @@ -64,6 +67,15 @@ void TimelineScaledObject::SetMaximumScale(const double &max) } } +void TimelineScaledObject::SetMinimumScale(const double &min) +{ + min_scale_ = min; + + if (GetScale() < min_scale_) { + SetScale(min_scale_); + } +} + const double& TimelineScaledObject::GetScale() const { return scale_; @@ -73,7 +85,7 @@ void TimelineScaledObject::SetScale(const double& scale) { Q_ASSERT(scale > 0); - scale_ = qMin(scale, max_scale_); + scale_ = clamp(scale, min_scale_, max_scale_); ScaleChangedEvent(scale_); } diff --git a/app/widget/timelinewidget/timelinescaledobject.h b/app/widget/timelinewidget/timelinescaledobject.h index b8afc1bd1..0889064c8 100644 --- a/app/widget/timelinewidget/timelinescaledobject.h +++ b/app/widget/timelinewidget/timelinescaledobject.h @@ -32,6 +32,8 @@ protected: void SetMaximumScale(const double& max); + void SetMinimumScale(const double& min); + private: rational timebase_; @@ -39,6 +41,8 @@ private: double scale_; + double min_scale_; + double max_scale_; }; diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index f8c329237..742690c2e 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -202,6 +202,8 @@ void ViewerWidget::resizeEvent(QResizeEvent *event) UpdateRendererParameters(); } + + UpdateMinimumScale(); } void ViewerWidget::TogglePlayPause() @@ -324,6 +326,15 @@ int ViewerWidget::CalculateDivider() return divider_; } +void ViewerWidget::UpdateMinimumScale() +{ + if (!GetConnectedNode()) { + return; + } + + SetMinimumScale(static_cast(ruler()->width()) / GetConnectedNode()->Length().toDouble()); +} + void ViewerWidget::UpdateStack() { if (!GetConnectedNode() || GetConnectedNode()->texture_input()->IsConnected()) { @@ -554,6 +565,7 @@ void ViewerWidget::LengthChangedSlot(const rational &length) { controls_->SetEndTime(Timecode::time_to_timestamp(length, timebase())); ruler()->SetCacheStatusLength(length); + UpdateMinimumScale(); } void ViewerWidget::ColorDisplayChanged(QAction* action) diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 5a702b9bc..88aab38b7 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -134,6 +134,8 @@ private: int CalculateDivider(); + void UpdateMinimumScale(); + QStackedWidget* stack_; ViewerSizer* sizer_;