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";