diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index d656a674e..792835af4 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -80,7 +80,7 @@ add_library(libolive-editor # Remove prefix - prevents CMake calling it "liblibolive-editor" set_target_properties(libolive-editor PROPERTIES PREFIX "") -# Add applicaton +# Add application add_executable(olive-editor main.cpp $ diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index 6a2bee79c..0b4f2fa57 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -102,7 +102,7 @@ void AudioManager::StartOutput(AudioPlaybackCache *cache, qint64 offset, int pla // Move to output manager's thread device->moveToThread(&output_thread_); - // Queue to output manger in other thread + // Queue to output manager in other thread QMetaObject::invokeMethod(output_manager_, "PullFromDevice", Qt::QueuedConnection, diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index 7cdc65d5f..0e005bcb7 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -235,7 +235,7 @@ void AudioVisualWaveform::Shift(const rational &from, const rational &to) AudioVisualWaveform::Sample AudioVisualWaveform::GetSummaryFromTime(const rational &start, const rational &length) const { - // Find mipmap that requries + // Find mipmap that requires auto using_mipmap = GetMipmapForScale(length.flipped().toDouble()); double rate_dbl = using_mipmap->first.toDouble(); diff --git a/app/common/commandlineparser.h b/app/common/commandlineparser.h index 51ed706f0..7d131f357 100644 --- a/app/common/commandlineparser.h +++ b/app/common/commandlineparser.h @@ -29,7 +29,7 @@ /** * @brief Command-line argument parser * - * You may be wondering why we don't use QCommandLineParser instead of a custom implmentation like + * You may be wondering why we don't use QCommandLineParser instead of a custom implementation like * this. The reason why is because QCommandLineParser requires a QApplication object of some kind * to already have been created before it can parse anything, but we need to be able to control * whether a QApplication (GUI-mode) or a QCoreApplication (CLI-mode) is created which is set by diff --git a/app/common/rational.cpp b/app/common/rational.cpp index fd5641047..9aa20426c 100644 --- a/app/common/rational.cpp +++ b/app/common/rational.cpp @@ -309,7 +309,7 @@ bool rational::operator<(const rational &rhs) const if (rhs == RATIONAL_MAX || *this == RATIONAL_MIN) { - // We will always wither be LESS THAN (true) or EQUAL (false) + // We will always either be LESS THAN (true) or EQUAL (false) return (*this != rhs); } @@ -342,7 +342,7 @@ bool rational::operator<=(const rational &rhs) const if (rhs == RATIONAL_MAX || *this == RATIONAL_MIN) { - // We will always wither be LESS THAN (true) or EQUAL (true) + // We will always either be LESS THAN (true) or EQUAL (true) return true; } diff --git a/app/dialog/diskcache/diskcachedialog.cpp b/app/dialog/diskcache/diskcachedialog.cpp index 1a409ae10..75c005468 100644 --- a/app/dialog/diskcache/diskcachedialog.cpp +++ b/app/dialog/diskcache/diskcachedialog.cpp @@ -26,6 +26,7 @@ #include #include "config/config.h" +#include "core.h" namespace olive { @@ -53,7 +54,7 @@ DiskCacheDialog::DiskCacheDialog(DiskCacheFolder *folder, QWidget* parent) : row++; clear_cache_btn_ = new QPushButton(tr("Clear Disk Cache")); - connect(clear_cache_btn_, &QPushButton::clicked, this, &DiskCacheDialog::ClearDiskCache); + connect(clear_cache_btn_, &QPushButton::clicked, this, static_cast(&DiskCacheDialog::ClearDiskCache)); layout->addWidget(clear_cache_btn_, row, 1); row++; @@ -86,20 +87,25 @@ void DiskCacheDialog::accept() void DiskCacheDialog::ClearDiskCache() { - if (QMessageBox::question(this, - tr("Clear Disk Cache"), - tr("Are you sure you want to clear the disk cache in '%1'?").arg(Config::Current()["DiskCachePath"].toString()), - QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - clear_cache_btn_->setEnabled(false); + ClearDiskCache(folder_->GetPath(), this, clear_cache_btn_); +} - if (DiskManager::instance()->ClearDiskCache(folder_->GetPath())) { - clear_cache_btn_->setText(tr("Disk Cache Cleared")); +void DiskCacheDialog::ClearDiskCache(const QString &path, QWidget *parent, QPushButton *clear_btn) +{ + if (QMessageBox::question(parent, + tr("Clear Disk Cache"), + tr("Are you sure you want to clear the disk cache in '%1'?").arg(path), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { + if (clear_btn) clear_btn->setEnabled(false); + + if (DiskManager::instance()->ClearDiskCache(path)) { + if (clear_btn) clear_btn->setText(tr("Disk Cache Cleared")); } else { - QMessageBox::information(this, + QMessageBox::information(parent, tr("Clear Disk Cache"), tr("Disk cache failed to fully clear. You may have to delete the cache files manually."), QMessageBox::Ok); - clear_cache_btn_->setText(tr("Disk Cache Partially Cleared")); + if (clear_btn) clear_btn->setText(tr("Disk Cache Partially Cleared")); } } } diff --git a/app/dialog/diskcache/diskcachedialog.h b/app/dialog/diskcache/diskcachedialog.h index ee5e759d1..87317fc77 100644 --- a/app/dialog/diskcache/diskcachedialog.h +++ b/app/dialog/diskcache/diskcachedialog.h @@ -36,6 +36,8 @@ class DiskCacheDialog : public QDialog public: DiskCacheDialog(DiskCacheFolder* folder, QWidget* parent = nullptr); + static void ClearDiskCache(const QString &path, QWidget *parent, QPushButton *clear_btn = nullptr); + public slots: virtual void accept() override; diff --git a/app/render/subtitleparams.cpp b/app/render/subtitleparams.cpp index ceaa06f82..b0bc7c534 100644 --- a/app/render/subtitleparams.cpp +++ b/app/render/subtitleparams.cpp @@ -43,60 +43,67 @@ QString SubtitleParams::GenerateASSHeader() static const int kAssBorderStyle = 1; static const int kAssAlignment = 2; - static const QString kFormatHeader = QStringLiteral( - "[Script Info]\r\n" - "; Script generated by %1 %2\r\n" - "ScriptType: v4.00+\r\n" - "PlayResX: %3\r\n" - "PlayResY: %4\r\n" - "ScaledBorderAndShadow: yes\r\n" - "\r\n" + QString ass_code; - /* ASSv4 header */ - "[V4+ Styles]\r\n" - "Format: Name, " - "Fontname, Fontsize, " - "PrimaryColour, SecondaryColour, OutlineColour, BackColour, " - "Bold, Italic, Underline, StrikeOut, " - "ScaleX, ScaleY, " - "Spacing, Angle, " - "BorderStyle, Outline, Shadow, " - "Alignment, MarginL, MarginR, MarginV, " - "Encoding\r\n" + // Header info + ass_code.append(QStringLiteral("[Script Info]\r\n")); + ass_code.append(QStringLiteral("; Script generated by %1 %2\r\n").arg(QCoreApplication::applicationName(), QCoreApplication::applicationVersion())); + ass_code.append(QStringLiteral("ScriptType: v4.00+\r\n")); + ass_code.append(QStringLiteral("PlayResX: %1\r\n").arg(QString::number(kAssDefaultPlayResX))); + ass_code.append(QStringLiteral("PlayResY: %1\r\n").arg(QString::number(kAssDefaultPlayResY))); + ass_code.append(QStringLiteral("ScaledBorderAndShadow: yes\r\n")); + ass_code.append(QStringLiteral("\r\n")); - "Style: " - "Default," /* Name */ - "%5,%6," /* Font{name,size} */ - "&H%7,&H%8,&H%9,&H%10," /* {Primary,Secondary,Outline,Back}Colour */ - "%11,%12,%13,%14," /* Bold, Italic, Underline, StrikeOut */ - "100,100," /* Scale{X,Y} */ - "0,0," /* Spacing, Angle */ - "%15,1,0," /* BorderStyle, Outline, Shadow */ - "%16,10,10,10," /* Alignment, Margin[LRV] */ - "0\r\n" /* Encoding */ + // ASSv4 header + ass_code.append(QStringLiteral("[V4+ Styles]\r\n")); + ass_code.append(QStringLiteral("Format: Name, ")); + ass_code.append(QStringLiteral("Fontname, Fontsize, ")); + ass_code.append(QStringLiteral("PrimaryColour, SecondaryColour, OutlineColour, BackColour, ")); + ass_code.append(QStringLiteral("Bold, Italic, Underline, StrikeOut, ")); + ass_code.append(QStringLiteral("ScaleX, ScaleY, ")); + ass_code.append(QStringLiteral("Spacing, Angle, ")); + ass_code.append(QStringLiteral("BorderStyle, Outline, Shadow, ")); + ass_code.append(QStringLiteral("Alignment, MarginL, MarginR, MarginV, ")); + ass_code.append(QStringLiteral("Encoding\r\n")); + ass_code.append(QStringLiteral("Style: ")); - "\r\n" - "[Events]\r\n" - "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n" - ); + // Name + ass_code.append(QStringLiteral("Default,")); - return kFormatHeader.arg(QCoreApplication::applicationName(), - QCoreApplication::applicationVersion(), - QString::number(kAssDefaultPlayResX), - QString::number(kAssDefaultPlayResY), - kAssDefaultFont, - QString::number(kAssDefaultFontSize), - QString::number(kAssDefaultPrimaryColor, 16), - QString::number(kAssDefaultSecondaryColor, 16), - QString::number(kAssDefaultOutlineColor, 16), - QString::number(kAssDefaultBackColor, 16), - QString::number(kAssBold), - QString::number(kAssItalic), - QString::number(kAssUnderline), - QString::number(kAssStrike), - QString::number(kAssBorderStyle), - QString::number(kAssAlignment) - ); + // Font{name,size} + ass_code.append(QStringLiteral("%1,%2,").arg(kAssDefaultFont, QString::number(kAssDefaultFontSize))); + + // {Primary,Secondary,Outline,Back}Colour + ass_code.append(QStringLiteral("&H%1,&H%2,&H%3,&H%4,").arg(QString::number(kAssDefaultPrimaryColor, 16), + QString::number(kAssDefaultSecondaryColor, 16), + QString::number(kAssDefaultOutlineColor, 16), + QString::number(kAssDefaultBackColor, 16))); + + // Bold, Italic, Underline, StrikeOut + ass_code.append(QStringLiteral("%1,%2,%3,%4,").arg(QString::number(kAssBold), + QString::number(kAssItalic), + QString::number(kAssUnderline), + QString::number(kAssStrike))); + + // Scale{X,Y} + ass_code.append(QStringLiteral("100,100,")); + + // Spacing, Angle + ass_code.append(QStringLiteral("0,0,")); + + // BorderStyle, Outline, Shadow + ass_code.append(QStringLiteral("%1,1,0,").arg(QString::number(kAssBorderStyle))); + + // Alignment, Margin[LRV] + ass_code.append(QStringLiteral("%1,10,10,10,").arg(QString::number(kAssAlignment))); + + // Encoding + ass_code.append(QStringLiteral("0\r\n")); + ass_code.append(QStringLiteral("\r\n")); + ass_code.append(QStringLiteral("[Events]\r\n")); + ass_code.append(QStringLiteral("Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n")); + + return ass_code; } } diff --git a/app/widget/slider/base/sliderlabel.cpp b/app/widget/slider/base/sliderlabel.cpp index 02073b5bd..b5c851515 100644 --- a/app/widget/slider/base/sliderlabel.cpp +++ b/app/widget/slider/base/sliderlabel.cpp @@ -48,7 +48,7 @@ SliderLabel::SliderLabel(QWidget *parent) : // Allow users to tab to this widget setFocusPolicy(Qt::TabFocus); - // Add ccustom context menu + // Add custom context menu setContextMenuPolicy(Qt::CustomContextMenu); } diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 4ebf91c0d..b87d16dbe 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -263,7 +263,7 @@ private: QMatrix4x4 translate_matrix_; /** - * @breif Scale only matrix. + * @brief Scale only matrix. */ QMatrix4x4 scale_matrix_; diff --git a/app/window/mainwindow/mainmenu.cpp b/app/window/mainwindow/mainmenu.cpp index e9301d32e..b6b37eed9 100644 --- a/app/window/mainwindow/mainmenu.cpp +++ b/app/window/mainwindow/mainmenu.cpp @@ -28,6 +28,7 @@ #include "config/config.h" #include "core.h" #include "dialog/actionsearch/actionsearch.h" +#include "dialog/diskcache/diskcachedialog.h" #include "dialog/task/task.h" #include "panel/panelmanager.h" #include "tool/tool.h" @@ -171,6 +172,10 @@ MainMenu::MainMenu(MainWindow *parent) : sequence_cache_item_ = sequence_menu_->AddItem("seqcache", this, &MainMenu::SequenceCacheTriggered); sequence_cache_in_to_out_item_ = sequence_menu_->AddItem("seqcacheinout", this, &MainMenu::SequenceCacheInOutTriggered); + sequence_menu_->addSeparator(); + + sequence_disk_cache_clear_item_ = sequence_menu_->AddItem("seqcacheclear", this, &MainMenu::SequenceCacheClearTriggered); + // // WINDOW MENU // @@ -614,6 +619,14 @@ void MainMenu::SequenceCacheInOutTriggered() Core::instance()->CacheActiveSequence(true); } +void MainMenu::SequenceCacheClearTriggered() +{ + DiskCacheDialog::ClearDiskCache( + Core::instance()->GetActiveProject()->cache_path(), + Core::instance()->main_window() + ); +} + void MainMenu::HelpFeedbackTriggered() { QDesktopServices::openUrl(QStringLiteral("https://github.com/olive-editor/olive/issues")); @@ -686,6 +699,7 @@ void MainMenu::Retranslate() sequence_menu_->setTitle(tr("&Sequence")); sequence_cache_item_->setText(tr("Cache Entire Sequence")); sequence_cache_in_to_out_item_->setText(tr("Cache Sequence In/Out")); + sequence_disk_cache_clear_item_->setText(tr("Clear Disk Cache")); // Window menu window_menu_->setTitle(tr("&Window")); diff --git a/app/window/mainwindow/mainmenu.h b/app/window/mainwindow/mainmenu.h index 82277344b..ae8ea40e8 100644 --- a/app/window/mainwindow/mainmenu.h +++ b/app/window/mainwindow/mainmenu.h @@ -179,6 +179,7 @@ private slots: void SequenceCacheTriggered(); void SequenceCacheInOutTriggered(); + void SequenceCacheClearTriggered(); void HelpFeedbackTriggered(); @@ -249,6 +250,7 @@ private: Menu* sequence_menu_; QAction* sequence_cache_item_; QAction* sequence_cache_in_to_out_item_; + QAction* sequence_disk_cache_clear_item_; Menu* window_menu_; QAction* window_menu_separator_; diff --git a/docker/scripts/build_ffmpeg.sh b/docker/scripts/build_ffmpeg.sh index ddb43212b..646129a6a 100644 --- a/docker/scripts/build_ffmpeg.sh +++ b/docker/scripts/build_ffmpeg.sh @@ -6,7 +6,7 @@ # # Uses { command } & pattern for parallelism https://gist.github.com/thenadz/6c0584d42fb007582fbc # -# TOOD: Use advanced options such as LTO? e.g. https://code.videolan.org/videolan/x264/-/blob/master/configure +# TODO: Use advanced options such as LTO? e.g. https://code.videolan.org/videolan/x264/-/blob/master/configure # TODO: Enable debug symbols? (Or is it opt-out?) # TODO: Add more ffmpeg libraries? See https://raw.githubusercontent.com/jrottenberg/ffmpeg/master/docker-images/4.2/centos7/Dockerfile