viewer: automatically update maximum scroll from media length
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_) {
|
||||
|
||||
@@ -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_;
|
||||
|
||||
Reference in New Issue
Block a user