diff --git a/app/render/videoparams.cpp b/app/render/videoparams.cpp index c40ff3684..c9db6f408 100644 --- a/app/render/videoparams.cpp +++ b/app/render/videoparams.cpp @@ -200,6 +200,15 @@ int VideoParams::GetBytesPerPixel(VideoParams::Format format, int channels) return GetBytesPerChannel(format) * channels; } +QString VideoParams::GetNameForDivider(int div) +{ + if (div == 1) { + return QCoreApplication::translate("VideoParams", "Full"); + } else { + return QCoreApplication::translate("VideoParams", "1/%1").arg(div); + } +} + bool VideoParams::FormatIsFloat(VideoParams::Format format) { switch (format) { diff --git a/app/render/videoparams.h b/app/render/videoparams.h index 564985dc4..f3cedd28b 100644 --- a/app/render/videoparams.h +++ b/app/render/videoparams.h @@ -231,6 +231,8 @@ public: return GetBufferSize(width_, height_, format_, channel_count_); } + static QString GetNameForDivider(int div); + static bool FormatIsFloat(Format format); static QString GetFormatName(Format format); diff --git a/app/widget/standardcombos/videodividercombobox.h b/app/widget/standardcombos/videodividercombobox.h index 05c068458..caaeb74da 100644 --- a/app/widget/standardcombos/videodividercombobox.h +++ b/app/widget/standardcombos/videodividercombobox.h @@ -35,15 +35,7 @@ public: QComboBox(parent) { foreach (int d, VideoParams::kSupportedDividers) { - QString name; - - if (d == 1) { - name = tr("Full"); - } else { - name = tr("1/%1").arg(d); - } - - this->addItem(name, d); + this->addItem(VideoParams::GetNameForDivider(d), d); } } diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index e0f01c404..dedca355c 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -45,6 +45,7 @@ #include "viewerpreventsleep.h" #include "widget/menu/menu.h" #include "window/mainwindow/mainwindow.h" +#include "widget/nodeparamview/nodeparamviewundo.h" #include "widget/timelinewidget/tool/add.h" #include "widget/timeruler/timeruler.h" @@ -205,6 +206,7 @@ void ViewerWidget::ConnectNodeEvent(ViewerOutput *n) connect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); connect(n, &ViewerOutput::InterlacingChanged, this, &ViewerWidget::InterlacingChangedSlot); connect(n, &ViewerOutput::VideoParamsChanged, this, &ViewerWidget::UpdateRendererVideoParameters); + connect(n, &ViewerOutput::VideoParamsChanged, this, &ViewerWidget::UpdateTextureFromNode, Qt::QueuedConnection); connect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); connect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); connect(n, &ViewerOutput::TextureInputChanged, this, &ViewerWidget::UpdateWaveformViewFromMode); @@ -249,6 +251,7 @@ void ViewerWidget::DisconnectNodeEvent(ViewerOutput *n) disconnect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); disconnect(n, &ViewerOutput::InterlacingChanged, this, &ViewerWidget::InterlacingChangedSlot); disconnect(n, &ViewerOutput::VideoParamsChanged, this, &ViewerWidget::UpdateRendererVideoParameters); + disconnect(n, &ViewerOutput::VideoParamsChanged, this, &ViewerWidget::UpdateTextureFromNode); disconnect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); disconnect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); disconnect(n, &ViewerOutput::TextureInputChanged, this, &ViewerWidget::UpdateWaveformViewFromMode); @@ -1037,6 +1040,17 @@ void ViewerWidget::ContextMenuSetFullScreen(QAction *action) SetFullScreen(QGuiApplication::screens().at(action->data().toInt())); } +void ViewerWidget::ContextMenuSetPlaybackRes(QAction *action) +{ + int div = action->data().toInt(); + + auto vp = GetConnectedNode()->GetVideoParams(); + vp.set_divider(div); + + auto c = new NodeParamSetStandardValueCommand(NodeKeyframeTrackReference(NodeInput(GetConnectedNode(), ViewerOutput::kVideoParamsInput, 0)), QVariant::fromValue(vp)); + Core::instance()->undo_stack()->push(c); +} + void ViewerWidget::ContextMenuDisableSafeMargins() { context_menu_widget_->SetSafeMargins(ViewerSafeMarginInfo(false)); @@ -1194,6 +1208,18 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) connect(full_screen_menu, &QMenu::triggered, this, &ViewerWidget::ContextMenuSetFullScreen); } + { + // Playback Resolution Menu + Menu *playback_res_menu = new Menu(tr("Playback Resolution"), &menu); + menu.addMenu(playback_res_menu); + + for (int d : VideoParams::kSupportedDividers) { + playback_res_menu->AddActionWithData(VideoParams::GetNameForDivider(d), d, GetConnectedNode()->GetVideoParams().divider()); + } + + connect(playback_res_menu, &QMenu::triggered, this, &ViewerWidget::ContextMenuSetPlaybackRes); + } + { // Deinterlace Option if (GetConnectedNode()->GetVideoParams().interlacing() != VideoParams::kInterlaceNone) { @@ -1260,21 +1286,9 @@ void ViewerWidget::ShowContextMenu(const QPoint &pos) auto waveform_menu = new Menu(tr("Audio Waveform"), &menu); menu.addMenu(waveform_menu); - auto auto_showhide = waveform_menu->addAction(tr("Automatically Show/Hide")); - auto show_waveform = waveform_menu->addAction(tr("Show Waveform Only")); - auto show_both = waveform_menu->addAction(tr("Show Both Viewer And Waveform")); - - auto_showhide->setCheckable(true); - show_waveform->setCheckable(true); - show_both->setCheckable(true); - - auto_showhide->setData(kWFAutomatic); - show_waveform->setData(kWFWaveformOnly); - show_both->setData(kWFViewerAndWaveform); - - auto_showhide->setChecked(waveform_mode_ == kWFAutomatic); - show_waveform->setChecked(waveform_mode_ == kWFWaveformOnly); - show_both->setChecked(waveform_mode_ == kWFViewerAndWaveform); + waveform_menu->AddActionWithData(tr("Automatically Show/Hide"), kWFAutomatic, waveform_mode_); + waveform_menu->AddActionWithData(tr("Show Waveform Only"), kWFWaveformOnly, waveform_mode_); + waveform_menu->AddActionWithData(tr("Show Both Viewer And Waveform"), kWFViewerAndWaveform, waveform_mode_); connect(waveform_menu, &Menu::triggered, this, &ViewerWidget::UpdateWaveformModeFromMenu); } diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 86b8969c4..ebb5c7ba5 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -312,6 +312,8 @@ private slots: void ContextMenuSetFullScreen(QAction* action); + void ContextMenuSetPlaybackRes(QAction* action); + void ContextMenuDisableSafeMargins(); void ContextMenuSetSafeMargins();