diff --git a/NEWS.md b/NEWS.md index 4f3353e49..d85267c6a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,6 +7,10 @@ * mkvextract: WAV extractor: mkvextract will now write W64 files instead of WAV files if the file name extension is `.w64` or if the final file size is bigger than 4 GB, the file size limit for WAV files. Implements #2458. +* MKVToolNix GUI: preferences: the ten most recently used values for the + "relative output directory" and "fixed output directory" settings are now + saved. The corresponding settings have been changed into combo boxes + allowing quick access to those recent values. ## Bug fixes diff --git a/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui b/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui index 20c284080..9e696b81c 100644 --- a/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui +++ b/src/mkvtoolnix-gui/forms/main_window/preferences_dialog.ui @@ -1010,7 +1010,11 @@ - + + + true + + @@ -1040,7 +1044,17 @@ - + + + + 0 + 0 + + + + true + + @@ -1994,9 +2008,9 @@ rbMAutoSetSameDirectory rbMAutoSetPreviousDirectory rbMAutoSetRelativeDirectory - leMAutoSetRelativeDirectory + cbMAutoSetRelativeDirectory rbMAutoSetFixedDirectory - leMAutoSetFixedDirectory + cbMAutoSetFixedDirectory pbMBrowseAutoSetFixedDirectory cbMUniqueOutputFileNames cbMAutoClearOutputFileName diff --git a/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp b/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp index a0da512c2..2bc99b1b0 100644 --- a/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp +++ b/src/mkvtoolnix-gui/main_window/preferences_dialog.cpp @@ -585,11 +585,19 @@ PreferencesDialog::setupOutputFileNamePolicy() { : Util::Settings::ToRelativeOfFirstInputFile == m_cfg.m_outputFileNamePolicy ? ui->rbMAutoSetRelativeDirectory : ui->rbMAutoSetSameDirectory; + auto dFixed = QDir::toNativeSeparators(m_cfg.m_fixedOutputDir.path()); + auto dRelative = QDir::toNativeSeparators(m_cfg.m_relativeOutputDir.path()); + + m_cfg.m_mergeLastFixedOutputDirs.add(dFixed); + m_cfg.m_mergeLastRelativeOutputDirs.add(dRelative); + ui->cbMAutoSetOutputFileName->setChecked(isChecked); ui->cbMAutoDestinationOnlyForVideoFiles->setChecked(m_cfg.m_autoDestinationOnlyForVideoFiles); rbToCheck->setChecked(true); - ui->leMAutoSetRelativeDirectory->setText(QDir::toNativeSeparators(m_cfg.m_relativeOutputDir.path())); - ui->leMAutoSetFixedDirectory->setText(QDir::toNativeSeparators(m_cfg.m_fixedOutputDir.path())); + ui->cbMAutoSetRelativeDirectory->addItems(m_cfg.m_mergeLastRelativeOutputDirs.items()); + ui->cbMAutoSetRelativeDirectory->setCurrentText(dRelative); + ui->cbMAutoSetFixedDirectory->addItems(m_cfg.m_mergeLastFixedOutputDirs.items()); + ui->cbMAutoSetFixedDirectory->setCurrentText(dFixed); ui->cbMUniqueOutputFileNames->setChecked(m_cfg.m_uniqueOutputFileNames); ui->cbMAutoClearOutputFileName->setChecked(m_cfg.m_autoClearOutputFileName); @@ -829,11 +837,14 @@ PreferencesDialog::save() { : ui->rbMAutoSetPreviousDirectory->isChecked() ? Util::Settings::ToPreviousDirectory : Util::Settings::ToSameAsFirstInputFile; m_cfg.m_autoDestinationOnlyForVideoFiles = ui->cbMAutoDestinationOnlyForVideoFiles->isChecked(); - m_cfg.m_relativeOutputDir = ui->leMAutoSetRelativeDirectory->text(); - m_cfg.m_fixedOutputDir = ui->leMAutoSetFixedDirectory->text(); + m_cfg.m_relativeOutputDir = ui->cbMAutoSetRelativeDirectory->currentText(); + m_cfg.m_fixedOutputDir = ui->cbMAutoSetFixedDirectory->currentText(); m_cfg.m_uniqueOutputFileNames = ui->cbMUniqueOutputFileNames->isChecked(); m_cfg.m_autoClearOutputFileName = ui->cbMAutoClearOutputFileName->isChecked(); + m_cfg.m_mergeLastFixedOutputDirs.add(QDir::toNativeSeparators(m_cfg.m_fixedOutputDir.path())); + m_cfg.m_mergeLastRelativeOutputDirs.add(QDir::toNativeSeparators(m_cfg.m_relativeOutputDir.path())); + m_cfg.m_enableMuxingTracksByLanguage = ui->cbMEnableMuxingTracksByLanguage->isChecked(); m_cfg.m_enableMuxingAllVideoTracks = ui->cbMEnableMuxingAllVideoTracks->isChecked(); m_cfg.m_enableMuxingAllAudioTracks = ui->cbMEnableMuxingAllAudioTracks->isChecked(); @@ -900,15 +911,15 @@ PreferencesDialog::enableOutputFileNameControls() { bool fixedSelected = ui->rbMAutoSetFixedDirectory->isChecked(); Util::enableWidgets(QList{} << ui->gbDestinationDirectory << ui->cbMUniqueOutputFileNames << ui->cbMAutoDestinationOnlyForVideoFiles, isChecked); - Util::enableWidgets(QList{} << ui->leMAutoSetFixedDirectory << ui->pbMBrowseAutoSetFixedDirectory, isChecked && fixedSelected); - ui->leMAutoSetRelativeDirectory->setEnabled(isChecked && relativeSelected); + Util::enableWidgets(QList{} << ui->cbMAutoSetFixedDirectory << ui->pbMBrowseAutoSetFixedDirectory, isChecked && fixedSelected); + ui->cbMAutoSetRelativeDirectory->setEnabled(isChecked && relativeSelected); } void PreferencesDialog::browseFixedOutputDirectory() { - auto dir = Util::getExistingDirectory(this, QY("Select destination directory"), ui->leMAutoSetFixedDirectory->text()); + auto dir = Util::getExistingDirectory(this, QY("Select destination directory"), ui->cbMAutoSetFixedDirectory->currentText()); if (!dir.isEmpty()) - ui->leMAutoSetFixedDirectory->setText(dir); + ui->cbMAutoSetFixedDirectory->setCurrentText(dir); } void diff --git a/src/mkvtoolnix-gui/util/recently_used_strings.cpp b/src/mkvtoolnix-gui/util/recently_used_strings.cpp new file mode 100644 index 000000000..9ddda9913 --- /dev/null +++ b/src/mkvtoolnix-gui/util/recently_used_strings.cpp @@ -0,0 +1,62 @@ +#include "common/common_pch.h" + +#include + +#include "mkvtoolnix-gui/util/recently_used_strings.h" + +namespace mtx { namespace gui { namespace Util { + +class RecentlyUsedStringsPrivate { + friend class RecentlyUsedStrings; + + int m_numItems{}; + QStringList m_items; + + explicit RecentlyUsedStringsPrivate(int numItems) + : m_numItems{numItems} + { + } +}; + +RecentlyUsedStrings::RecentlyUsedStrings(int numItems) + : p_ptr{new RecentlyUsedStringsPrivate{numItems}} +{ +} + +RecentlyUsedStrings::~RecentlyUsedStrings() { +} + +QStringList +RecentlyUsedStrings::items() + const { + return p_func()->m_items; +} + +void +RecentlyUsedStrings::setItems(QStringList const &newItems) { + p_func()->m_items = newItems; + clamp(); +} + +void +RecentlyUsedStrings::add(QString const &item) { + remove(item); + p_func()->m_items.prepend(item); + clamp(); +} + +void +RecentlyUsedStrings::remove(QString const &item) { + p_func()->m_items.removeAll(item); +} + +void +RecentlyUsedStrings::clamp() { + auto p = p_func(); + auto size = p->m_items.size(); + + if (size > p->m_numItems) + p->m_items.erase(p->m_items.begin() + p->m_numItems, p->m_items.end()); +} + +}}} diff --git a/src/mkvtoolnix-gui/util/recently_used_strings.h b/src/mkvtoolnix-gui/util/recently_used_strings.h new file mode 100644 index 000000000..5c5706106 --- /dev/null +++ b/src/mkvtoolnix-gui/util/recently_used_strings.h @@ -0,0 +1,32 @@ +#pragma once + +#include "common/common_pch.h" + +#include + +namespace mtx { namespace gui { namespace Util { + +class RecentlyUsedStringsPrivate; +class RecentlyUsedStrings { +protected: + MTX_DECLARE_PRIVATE(RecentlyUsedStringsPrivate); + + std::unique_ptr const p_ptr; + + explicit RecentlyUsedStrings(RecentlyUsedStringsPrivate &p); + +public: + RecentlyUsedStrings(int numEntries); + virtual ~RecentlyUsedStrings(); + + QStringList items() const; + void setItems(QStringList const &newItems); + + void add(QString const &entry); + void remove(QString const &entry); + +protected: + void clamp(); +}; + +}}} diff --git a/src/mkvtoolnix-gui/util/settings.cpp b/src/mkvtoolnix-gui/util/settings.cpp index d35ec6e4f..d517f7c67 100644 --- a/src/mkvtoolnix-gui/util/settings.cpp +++ b/src/mkvtoolnix-gui/util/settings.cpp @@ -314,7 +314,13 @@ Settings::load() { reg.beginGroup(s_grpUpdates); m_checkForUpdates = reg.value(s_valCheckForUpdates, true).toBool(); m_lastUpdateCheck = reg.value(s_valLastUpdateCheck, QDateTime{}).toDateTime(); + reg.endGroup(); // settings.updates + + m_mergeLastFixedOutputDirs .setItems(reg.value(s_valMergeLastFixedOutputDirs).toStringList()); + m_mergeLastOutputDirs .setItems(reg.value(s_valMergeLastOutputDirs).toStringList()); + m_mergeLastRelativeOutputDirs.setItems(reg.value(s_valMergeLastRelativeOutputDirs).toStringList()); + reg.endGroup(); // settings loadDefaults(reg, guiVersion); @@ -593,6 +599,9 @@ Settings::save() reg.setValue(s_valMergePredefinedTrackNames, m_mergePredefinedTrackNames); reg.setValue(s_valMergePredefinedSplitSizes, m_mergePredefinedSplitSizes); reg.setValue(s_valMergePredefinedSplitDurations, m_mergePredefinedSplitDurations); + reg.setValue(s_valMergeLastFixedOutputDirs, m_mergeLastFixedOutputDirs.items()); + reg.setValue(s_valMergeLastOutputDirs, m_mergeLastOutputDirs.items()); + reg.setValue(s_valMergeLastRelativeOutputDirs, m_mergeLastRelativeOutputDirs.items()); reg.setValue(s_valMergeTrackPropertiesLayout, static_cast(m_mergeTrackPropertiesLayout)); reg.setValue(s_valMergeAddingAppendingFilesPolicy, static_cast(m_mergeAddingAppendingFilesPolicy)); reg.setValue(s_valMergeLastAddingAppendingDecision, static_cast(m_mergeLastAddingAppendingDecision)); diff --git a/src/mkvtoolnix-gui/util/settings.h b/src/mkvtoolnix-gui/util/settings.h index ec1ac657a..088acae9f 100644 --- a/src/mkvtoolnix-gui/util/settings.h +++ b/src/mkvtoolnix-gui/util/settings.h @@ -11,6 +11,7 @@ #include "common/translation.h" #include "mkvtoolnix-gui/info/job_settings.h" #include "mkvtoolnix-gui/merge/enums.h" +#include "mkvtoolnix-gui/util/recently_used_strings.h" class QSettings; class QSplitter; @@ -158,6 +159,7 @@ public: HeaderEditorDroppedFilesPolicy m_headerEditorDroppedFilesPolicy; TrackPropertiesLayout m_mergeTrackPropertiesLayout; MergeMissingAudioTrackPolicy m_mergeWarnMissingAudioTrack; + RecentlyUsedStrings m_mergeLastRelativeOutputDirs{10}, m_mergeLastFixedOutputDirs{10}, m_mergeLastOutputDirs{10}; OutputFileNamePolicy m_outputFileNamePolicy; bool m_autoDestinationOnlyForVideoFiles; diff --git a/src/mkvtoolnix-gui/util/settings_names.h b/src/mkvtoolnix-gui/util/settings_names.h index 7b12999f0..437216e9d 100644 --- a/src/mkvtoolnix-gui/util/settings_names.h +++ b/src/mkvtoolnix-gui/util/settings_names.h @@ -64,6 +64,9 @@ char const * const s_valMergeAlwaysAddDroppedFiles = "mergeAlwaysAddDro char const * const s_valMergeAlwaysShowOutputFileControls = "mergeAlwaysShowOutputFileControls"; char const * const s_valMergeEnableDialogNormGainRemoval = "mergeEnableDialogNormGainRemoval"; char const * const s_valMergeLastAddingAppendingDecision = "mergeLastAddingAppendingDecision"; +char const * const s_valMergeLastFixedOutputDirs = "mergeLastFixedOutputDirs"; +char const * const s_valMergeLastOutputDirs = "mergeLastOutputDirs"; +char const * const s_valMergeLastRelativeOutputDirs = "mergeLastRelativeOutputDirs"; char const * const s_valMergePredefinedSplitDurations = "mergePredefinedSplitDurations"; char const * const s_valMergePredefinedSplitSizes = "mergePredefinedSplitSizes"; char const * const s_valMergePredefinedTrackNames = "mergePredefinedTrackNames";