GUI: prefs: remember 10 recently used "fixed/relative output directories"

Inspired by the feature requested in #2468.
This commit is contained in:
Moritz Bunkus 2018-12-30 18:27:13 +01:00
parent f097b1feb4
commit 0aee0cc2a6
No known key found for this signature in database
GPG Key ID: 74AF00ADF2E32C85
8 changed files with 149 additions and 12 deletions

View File

@ -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

View File

@ -1010,7 +1010,11 @@
</spacer>
</item>
<item>
<widget class="QLineEdit" name="leMAutoSetRelativeDirectory"/>
<widget class="QComboBox" name="cbMAutoSetRelativeDirectory">
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
@ -1040,7 +1044,17 @@
</spacer>
</item>
<item>
<widget class="QLineEdit" name="leMAutoSetFixedDirectory"/>
<widget class="QComboBox" name="cbMAutoSetFixedDirectory">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="editable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pbMBrowseAutoSetFixedDirectory">
@ -1994,9 +2008,9 @@
<tabstop>rbMAutoSetSameDirectory</tabstop>
<tabstop>rbMAutoSetPreviousDirectory</tabstop>
<tabstop>rbMAutoSetRelativeDirectory</tabstop>
<tabstop>leMAutoSetRelativeDirectory</tabstop>
<tabstop>cbMAutoSetRelativeDirectory</tabstop>
<tabstop>rbMAutoSetFixedDirectory</tabstop>
<tabstop>leMAutoSetFixedDirectory</tabstop>
<tabstop>cbMAutoSetFixedDirectory</tabstop>
<tabstop>pbMBrowseAutoSetFixedDirectory</tabstop>
<tabstop>cbMUniqueOutputFileNames</tabstop>
<tabstop>cbMAutoClearOutputFileName</tabstop>

View File

@ -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<QWidget *>{} << ui->gbDestinationDirectory << ui->cbMUniqueOutputFileNames << ui->cbMAutoDestinationOnlyForVideoFiles, isChecked);
Util::enableWidgets(QList<QWidget *>{} << ui->leMAutoSetFixedDirectory << ui->pbMBrowseAutoSetFixedDirectory, isChecked && fixedSelected);
ui->leMAutoSetRelativeDirectory->setEnabled(isChecked && relativeSelected);
Util::enableWidgets(QList<QWidget *>{} << 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

View File

@ -0,0 +1,62 @@
#include "common/common_pch.h"
#include <QDebug>
#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());
}
}}}

View File

@ -0,0 +1,32 @@
#pragma once
#include "common/common_pch.h"
#include <QStringList>
namespace mtx { namespace gui { namespace Util {
class RecentlyUsedStringsPrivate;
class RecentlyUsedStrings {
protected:
MTX_DECLARE_PRIVATE(RecentlyUsedStringsPrivate);
std::unique_ptr<RecentlyUsedStringsPrivate> 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();
};
}}}

View File

@ -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<int>(m_mergeTrackPropertiesLayout));
reg.setValue(s_valMergeAddingAppendingFilesPolicy, static_cast<int>(m_mergeAddingAppendingFilesPolicy));
reg.setValue(s_valMergeLastAddingAppendingDecision, static_cast<int>(m_mergeLastAddingAppendingDecision));

View File

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

View File

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