From 35a9244fb09d13995133aba5e5492b9fe3e64d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole-Andr=C3=A9=20Rodlie?= Date: Fri, 19 Jul 2024 23:24:21 +0200 Subject: [PATCH] Adjust scene to clip: changes/fixes Add an improved dialog and settings integration. --- src/app/GUI/mainwindow.cpp | 39 +++---- src/core/Private/esettings.cpp | 14 +++ src/core/Private/esettings.h | 8 ++ src/ui/CMakeLists.txt | 2 + src/ui/dialogs/adjustscenedialog.cpp | 135 ++++++++++++++++++++++++ src/ui/dialogs/adjustscenedialog.h | 42 ++++++++ src/ui/widgets/canvassettingswidget.cpp | 22 ++++ src/ui/widgets/canvassettingswidget.h | 2 + 8 files changed, 245 insertions(+), 19 deletions(-) create mode 100644 src/ui/dialogs/adjustscenedialog.cpp create mode 100644 src/ui/dialogs/adjustscenedialog.h diff --git a/src/app/GUI/mainwindow.cpp b/src/app/GUI/mainwindow.cpp index d12eb1e40..14cb0f7d0 100644 --- a/src/app/GUI/mainwindow.cpp +++ b/src/app/GUI/mainwindow.cpp @@ -72,6 +72,7 @@ #include "themesupport.h" #include "widgets/assetswidget.h" +#include "dialogs/adjustscenedialog.h" MainWindow *MainWindow::sInstance = nullptr; @@ -2076,7 +2077,13 @@ void MainWindow::writeRecentFiles() void MainWindow::handleNewVideoClip(const VideoBox::VideoSpecs &specs) { - if (specs.fps < 1 || specs.dim.height() < 1 || specs.dim.width() < 1) { return; } + int act = eSettings::instance().fAdjustSceneFromFirstClip; + + // never apply or bad specs? + if (act == eSettings::AdjustSceneNever || + specs.fps < 1 || + specs.dim.height() < 1 || + specs.dim.width() < 1) { return; } const auto scene = *mDocument.fActiveScene; if (!scene) { return; } @@ -2089,22 +2096,16 @@ void MainWindow::handleNewVideoClip(const VideoBox::VideoSpecs &specs) scene->getFps() == specs.fps && scene->getFrameRange().fMax == specs.range.fMax) { return; } - const auto reply = QMessageBox::question(this, - tr("Adjust scene to clip?"), - tr("Video clip and scene do not match, adjust scene to clip?\n\n" - "Clip: %1x%2 Fps: %3 Frames: %4\n\n" - "Scene: %5x%6 Fps: %7 Frames: %8") - .arg(QString::number(specs.dim.width()), - QString::number(specs.dim.height()), - QString::number(specs.fps), - QString::number(specs.range.fMax), - QString::number(scene->getCanvasWidth()), - QString::number(scene->getCanvasHeight()), - QString::number(scene->getFps()), - QString::number(scene->getFrameRange().fMax))); - if (reply != QMessageBox::Yes) { return; } - scene->setCanvasSize(specs.dim.width(), - specs.dim.height()); - scene->setFps(specs.fps); - scene->setFrameRange(specs.range); + // always apply? + if (act == eSettings::AdjustSceneAlways) { + scene->setCanvasSize(specs.dim.width(), + specs.dim.height()); + scene->setFps(specs.fps); + scene->setFrameRange(specs.range); + return; + } + + // open dialog if ask + AdjustSceneDialog dialog(scene, specs, this); + dialog.exec(); } diff --git a/src/core/Private/esettings.cpp b/src/core/Private/esettings.cpp index 00a27d598..c6000742c 100644 --- a/src/core/Private/esettings.cpp +++ b/src/core/Private/esettings.cpp @@ -236,6 +236,10 @@ eSettings::eSettings(const int cpuThreads, fPathControlScaling, "pathControlScaling", 1.); + gSettings << std::make_shared(fAdjustSceneFromFirstClip, + "AdjustSceneFromFirstClip", + AdjustSceneAsk); + /*gSettings << std::make_shared( fTimelineAlternateRow, "timelineAlternateRow", true); @@ -347,3 +351,13 @@ void eSettings::saveToFile() setting->writeValue(); } } + +void eSettings::saveKeyToFile(const QString &key) +{ + for (const auto& setting : gSettings) { + if (key == setting->fName) { + setting->writeValue(); + return; + } + } +} diff --git a/src/core/Private/esettings.h b/src/core/Private/esettings.h index 4465ce3f3..733998e54 100644 --- a/src/core/Private/esettings.h +++ b/src/core/Private/esettings.h @@ -55,6 +55,11 @@ class CORE_EXPORT eSettings : public QObject Q_OBJECT public: + enum AdjustSceneArgs { + AdjustSceneAsk, + AdjustSceneAlways, + AdjustSceneNever + }; eSettings(const int cpuThreads, const intKB ramKB); @@ -70,6 +75,7 @@ class CORE_EXPORT eSettings : public QObject void loadDefaults(); void loadFromFile(); void saveToFile(); + void saveKeyToFile(const QString &key); // general QString fUserSettingsDir; @@ -120,6 +126,8 @@ class CORE_EXPORT eSettings : public QObject QColor fPathControlColor; QColor fPathControlSelectedColor; + int fAdjustSceneFromFirstClip = AdjustSceneAsk; + // timeline settings bool fTimelineAlternateRow = true; QColor fTimelineAlternateRowColor = QColor(0, 0, 0, 25); diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index b81f1ea48..d1b5ed3b1 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -42,6 +42,7 @@ include_directories( set( SOURCES + dialogs/adjustscenedialog.cpp dialogs/applyexpressiondialog.cpp dialogs/durationrectsettingsdialog.cpp dialogs/exportsvgdialog.cpp @@ -101,6 +102,7 @@ set( set( HEADERS ui_global.h + dialogs/adjustscenedialog.h dialogs/applyexpressiondialog.h dialogs/durationrectsettingsdialog.h dialogs/exportsvgdialog.h diff --git a/src/ui/dialogs/adjustscenedialog.cpp b/src/ui/dialogs/adjustscenedialog.cpp new file mode 100644 index 000000000..088b801b6 --- /dev/null +++ b/src/ui/dialogs/adjustscenedialog.cpp @@ -0,0 +1,135 @@ +/* +# +# Friction - https://friction.graphics +# +# Copyright (c) Friction contributors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# See 'README.md' for more information. +# +*/ + +#include "adjustscenedialog.h" + +#include +#include +#include +#include + +#include "Private/esettings.h" + +AdjustSceneDialog::AdjustSceneDialog(Canvas *scene, + const VideoBox::VideoSpecs &specs, + QWidget *parent) + : QDialog(parent) +{ + if (!scene || + specs.dim.width() < 1 || + specs.dim.height() < 1 || + specs.fps < 1) { + reject(); + return; + } + + setMinimumWidth(400); + setWindowTitle(tr("Adjust scene to clip?")); + + const auto mLayout = new QVBoxLayout(this); + + const auto infoWidget = new QWidget(this); + const auto infoLayout = new QHBoxLayout(infoWidget); + + const auto buttonsWidget = new QWidget(this); + const auto buttonsLayout = new QHBoxLayout(buttonsWidget); + + const auto pixLabel = new QLabel(this); + pixLabel->setMaximumWidth(96); + pixLabel->setPixmap(QIcon::fromTheme("seq_preview").pixmap(96, 96)); + + const auto infoLabel = new QLabel(this); + infoLabel->setTextFormat(Qt::RichText); + infoLabel->setWordWrap(true); + infoLabel->setText(QString("" + "

%9

" + "" + "" + "" + "" + "" + "" + "
%13 %10%13 %11%13 %12
%1x%2%3%4
%14 %10%14 %11%14 %12
%5x%6%7%8
") + .arg(QString::number(specs.dim.width()), + QString::number(specs.dim.height()), + QString::number(specs.fps), + QString::number(specs.range.fMax), + QString::number(scene->getCanvasWidth()), + QString::number(scene->getCanvasHeight()), + QString::number(scene->getFps()), + QString::number(scene->getFrameRange().fMax), + tr("Adjust scene to clip?"), + tr("Dimension"), + tr("Fps"), + tr("Frames"), + tr("Clip"), + tr("Scene"))); + + const auto buttonYes = new QPushButton(tr("Yes"), this); + const auto buttonNo = new QPushButton(tr("No"), this); + const auto buttonAlways = new QPushButton(tr("Always"), this); + const auto buttonNever = new QPushButton(tr("Never"), this); + + mLayout->addWidget(infoWidget); + mLayout->addStretch(); + mLayout->addWidget(buttonsWidget); + infoLayout->addWidget(pixLabel); + infoLayout->addWidget(infoLabel); + buttonsLayout->addWidget(buttonAlways); + buttonsLayout->addWidget(buttonNever); + buttonsLayout->addStretch(); + buttonsLayout->addWidget(buttonYes); + buttonsLayout->addWidget(buttonNo); + + connect(buttonYes, &QPushButton::clicked, + this, [scene, &specs, this] { + scene->setCanvasSize(specs.dim.width(), + specs.dim.height()); + scene->setFps(specs.fps); + scene->setFrameRange(specs.range); + accept(); + }); + + connect(buttonAlways, &QPushButton::clicked, + this, [scene, &specs, this]() { + const auto settings = eSettings::sInstance; + settings->fAdjustSceneFromFirstClip = eSettings::AdjustSceneAlways; + settings->saveKeyToFile("AdjustSceneFromFirstClip"); + scene->setCanvasSize(specs.dim.width(), + specs.dim.height()); + scene->setFps(specs.fps); + scene->setFrameRange(specs.range); + accept(); + }); + + connect(buttonNo, &QPushButton::clicked, + this, [this]() { reject(); }); + + connect(buttonNever, &QPushButton::clicked, + this, [this]() { + const auto settings = eSettings::sInstance; + settings->fAdjustSceneFromFirstClip = eSettings::AdjustSceneNever; + settings->saveKeyToFile("AdjustSceneFromFirstClip"); + reject(); + }); +} diff --git a/src/ui/dialogs/adjustscenedialog.h b/src/ui/dialogs/adjustscenedialog.h new file mode 100644 index 000000000..3d3bf431b --- /dev/null +++ b/src/ui/dialogs/adjustscenedialog.h @@ -0,0 +1,42 @@ +/* +# +# Friction - https://friction.graphics +# +# Copyright (c) Friction contributors +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# See 'README.md' for more information. +# +*/ + +#ifndef ADJUSTSCENEDIALOG_H +#define ADJUSTSCENEDIALOG_H + +#include "ui_global.h" + +#include + +#include "canvas.h" +#include "Boxes/videobox.h" + +class UI_EXPORT AdjustSceneDialog : public QDialog +{ +public: + AdjustSceneDialog(Canvas *scene, + const VideoBox::VideoSpecs &specs, + QWidget *parent = nullptr); +}; + +#endif // ADJUSTSCENEDIALOG_H diff --git a/src/ui/widgets/canvassettingswidget.cpp b/src/ui/widgets/canvassettingswidget.cpp index e7c73bdde..19dc35578 100644 --- a/src/ui/widgets/canvassettingswidget.cpp +++ b/src/ui/widgets/canvassettingswidget.cpp @@ -76,6 +76,19 @@ CanvasSettingsWidget::CanvasSettingsWidget(QWidget* const parent) : mRtlSupport = new QCheckBox("RTL language support", this); addWidget(mRtlSupport); + const auto mAdjustSceneWidget = new QWidget(this); + const auto mAdjustSceneLayout = new QHBoxLayout(mAdjustSceneWidget); + const auto mAdjustSceneLabel = new QLabel(tr("Adjust scene to first clip"), this); + + mAdjustSceneFromFirstClip = new QComboBox(this); + mAdjustSceneFromFirstClip->addItem(tr("Ask"), eSettings::AdjustSceneAsk); + mAdjustSceneFromFirstClip->addItem(tr("Always"), eSettings::AdjustSceneAlways); + mAdjustSceneFromFirstClip->addItem(tr("Never"), eSettings::AdjustSceneNever); + + mAdjustSceneLayout->addWidget(mAdjustSceneLabel); + mAdjustSceneLayout->addWidget(mAdjustSceneFromFirstClip); + addWidget(mAdjustSceneWidget); + eSizesUI::widget.add(mRtlSupport, [this](const int size) { mRtlSupport->setFixedHeight(size); mRtlSupport->setStyleSheet(QString("QCheckBox::indicator { width: %1px; height: %1px;}").arg(size/1.5)); @@ -96,6 +109,8 @@ void CanvasSettingsWidget::applySettings() { mSett.fPathControlSelectedColor = mPathControlSelectedColor->color(); mSett.fCanvasRtlSupport = mRtlSupport->isChecked(); + + mSett.fAdjustSceneFromFirstClip = mAdjustSceneFromFirstClip->currentData().toInt(); } void CanvasSettingsWidget::updateSettings(bool restore) @@ -114,4 +129,11 @@ void CanvasSettingsWidget::updateSettings(bool restore) mPathControlSelectedColor->setColor(mSett.fPathControlSelectedColor); mRtlSupport->setChecked(mSett.fCanvasRtlSupport); + + for (int i = 0; i < mAdjustSceneFromFirstClip->count(); i++) { + if (mAdjustSceneFromFirstClip->itemData(i).toInt() == mSett.fAdjustSceneFromFirstClip) { + mAdjustSceneFromFirstClip->setCurrentIndex(i); + return; + } + } } diff --git a/src/ui/widgets/canvassettingswidget.h b/src/ui/widgets/canvassettingswidget.h index 6bbcbf400..6059b8698 100644 --- a/src/ui/widgets/canvassettingswidget.h +++ b/src/ui/widgets/canvassettingswidget.h @@ -32,6 +32,7 @@ #include #include +#include class ColorAnimatorButton; class QSlider; @@ -54,6 +55,7 @@ class UI_EXPORT CanvasSettingsWidget : public SettingsWidget { QSlider* mPathControlSize; ColorAnimatorButton* mPathControlColor = nullptr; ColorAnimatorButton* mPathControlSelectedColor = nullptr; + QComboBox* mAdjustSceneFromFirstClip = nullptr; }; #endif // CANVASSETTINGSWIDGET_H