sequencedialog: fixed catastrophic save bug
This commit also switches to shared ptrs because this dialog has caused a surprising amount of memory-related mistakes that it really ought not to and ptrs will take a lot of the memory management burden off us.
This commit is contained in:
@@ -63,6 +63,8 @@ private:
|
||||
|
||||
};
|
||||
|
||||
using PresetPtr = std::shared_ptr<Preset>;
|
||||
|
||||
template <typename T>
|
||||
class PresetManager
|
||||
{
|
||||
@@ -80,7 +82,7 @@ public:
|
||||
if (reader.name() == QStringLiteral("presets")) {
|
||||
while (XMLReadNextStartElement(&reader)) {
|
||||
if (reader.name() == QStringLiteral("preset")) {
|
||||
Preset* p = new T();
|
||||
PresetPtr p = std::make_unique<T>();
|
||||
|
||||
p->Load(&reader);
|
||||
|
||||
@@ -110,7 +112,7 @@ public:
|
||||
|
||||
writer.writeStartElement(QStringLiteral("presets"));
|
||||
|
||||
foreach (Preset* p, custom_preset_data_) {
|
||||
foreach (PresetPtr p, custom_preset_data_) {
|
||||
writer.writeStartElement(QStringLiteral("preset"));
|
||||
|
||||
p->Save(&writer);
|
||||
@@ -124,8 +126,6 @@ public:
|
||||
|
||||
preset_file.close();
|
||||
}
|
||||
|
||||
qDeleteAll(custom_preset_data_);
|
||||
}
|
||||
|
||||
QString GetPresetName(QString start) const
|
||||
@@ -159,7 +159,13 @@ public:
|
||||
return start;
|
||||
}
|
||||
|
||||
bool SavePreset(Preset* preset)
|
||||
enum SaveStatus {
|
||||
kAppended,
|
||||
kReplaced,
|
||||
kNotSaved
|
||||
};
|
||||
|
||||
SaveStatus SavePreset(PresetPtr preset)
|
||||
{
|
||||
QString preset_name;
|
||||
int existing_preset;
|
||||
@@ -169,7 +175,7 @@ public:
|
||||
|
||||
if (preset_name.isEmpty()) {
|
||||
// Dialog cancelled - leave function entirely
|
||||
return false;
|
||||
return kNotSaved;
|
||||
}
|
||||
|
||||
existing_preset = -1;
|
||||
@@ -194,10 +200,10 @@ public:
|
||||
|
||||
if (existing_preset >= 0) {
|
||||
custom_preset_data_.replace(existing_preset, preset);
|
||||
return false;
|
||||
return kReplaced;
|
||||
} else {
|
||||
custom_preset_data_.append(preset);
|
||||
return true;
|
||||
return kAppended;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -206,7 +212,7 @@ public:
|
||||
return QDir(FileFunctions::GetConfigurationLocation()).filePath(preset_name_);
|
||||
}
|
||||
|
||||
Preset* GetPreset(int index)
|
||||
PresetPtr GetPreset(int index)
|
||||
{
|
||||
return custom_preset_data_.at(index);
|
||||
}
|
||||
@@ -221,13 +227,13 @@ public:
|
||||
return custom_preset_data_.size();
|
||||
}
|
||||
|
||||
const QVector<Preset*>& GetPresetData() const
|
||||
const QVector<PresetPtr>& GetPresetData() const
|
||||
{
|
||||
return custom_preset_data_;
|
||||
}
|
||||
|
||||
private:
|
||||
QVector<Preset*> custom_preset_data_;
|
||||
QVector<PresetPtr> custom_preset_data_;
|
||||
|
||||
QString preset_name_;
|
||||
|
||||
|
||||
@@ -79,19 +79,13 @@ SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) :
|
||||
}
|
||||
}
|
||||
|
||||
SequenceDialogPresetTab::~SequenceDialogPresetTab()
|
||||
{
|
||||
qDeleteAll(default_preset_data_);
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::SaveParametersAsPreset(SequencePreset preset)
|
||||
{
|
||||
Preset* preset_ptr = new SequencePreset(preset);
|
||||
PresetPtr preset_ptr = std::make_shared<SequencePreset>(preset);
|
||||
|
||||
if (SavePreset(preset_ptr)) {
|
||||
// If replaced, no need to make another item. If not saved, shared ptr will delete itself
|
||||
if (SavePreset(preset_ptr) == kAppended) {
|
||||
AddCustomItem(my_presets_folder_, preset_ptr, GetNumberOfPresets() - 1);
|
||||
} else {
|
||||
delete preset_ptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,7 +102,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na
|
||||
const VideoParams::Format default_format = static_cast<VideoParams::Format>(Config::Current()["OfflinePixelFormat"].toInt());
|
||||
const bool default_autocache = Config::Current()[QStringLiteral("DefaultSequenceAutoCache")].toBool();
|
||||
QTreeWidgetItem* parent = CreateFolder(name);
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 23.976 FPS").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 23.976 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(24000, 1001),
|
||||
@@ -119,7 +113,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 25 FPS").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 25 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(25, 1),
|
||||
@@ -130,7 +124,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 29.97 FPS").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 29.97 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(30000, 1001),
|
||||
@@ -141,7 +135,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 50 FPS").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 50 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(50, 1),
|
||||
@@ -152,7 +146,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 59.94 FPS").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 59.94 FPS").arg(name),
|
||||
width,
|
||||
height,
|
||||
rational(60000, 1001),
|
||||
@@ -172,7 +166,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &na
|
||||
const bool default_autocache = Config::Current()[QStringLiteral("DefaultSequenceAutoCache")].toBool();
|
||||
QTreeWidgetItem* parent = CreateFolder(name);
|
||||
preset_tree_->addTopLevelItem(parent);
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 Standard").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 Standard").arg(name),
|
||||
width,
|
||||
height,
|
||||
frame_rate,
|
||||
@@ -183,7 +177,7 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &na
|
||||
divider,
|
||||
default_format,
|
||||
default_autocache));
|
||||
AddStandardItem(parent, new SequencePreset(tr("%1 Widescreen").arg(name),
|
||||
AddStandardItem(parent, std::make_shared<SequencePreset>(tr("%1 Widescreen").arg(name),
|
||||
width,
|
||||
height,
|
||||
frame_rate,
|
||||
@@ -221,19 +215,19 @@ QTreeWidgetItem *SequenceDialogPresetTab::GetSelectedCustomPreset()
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::AddStandardItem(QTreeWidgetItem *folder, Preset* preset, const QString& description)
|
||||
void SequenceDialogPresetTab::AddStandardItem(QTreeWidgetItem *folder, PresetPtr preset, const QString& description)
|
||||
{
|
||||
int index = default_preset_data_.size();
|
||||
default_preset_data_.append(preset);
|
||||
AddItemInternal(folder, preset, false, index, description);
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::AddCustomItem(QTreeWidgetItem *folder, Preset* preset, int index, const QString &description)
|
||||
void SequenceDialogPresetTab::AddCustomItem(QTreeWidgetItem *folder, PresetPtr preset, int index, const QString &description)
|
||||
{
|
||||
AddItemInternal(folder, preset, true, index, description);
|
||||
}
|
||||
|
||||
void SequenceDialogPresetTab::AddItemInternal(QTreeWidgetItem *folder, Preset* preset, bool is_custom, int index, const QString &description)
|
||||
void SequenceDialogPresetTab::AddItemInternal(QTreeWidgetItem *folder, PresetPtr preset, bool is_custom, int index, const QString &description)
|
||||
{
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
|
||||
@@ -254,11 +248,11 @@ void SequenceDialogPresetTab::SelectedItemChanged(QTreeWidgetItem* current, QTre
|
||||
if (current->data(0, kDataIsPreset).toBool()) {
|
||||
int preset_index = current->data(0, kDataPresetDataRole).toInt();
|
||||
|
||||
Preset* preset_data = (current->data(0, kDataPresetIsCustomRole).toBool())
|
||||
PresetPtr preset_data = (current->data(0, kDataPresetIsCustomRole).toBool())
|
||||
? GetPreset(preset_index)
|
||||
: default_preset_data_.at(preset_index);
|
||||
|
||||
emit PresetChanged(*static_cast<SequencePreset*>(preset_data));
|
||||
emit PresetChanged(*static_cast<SequencePreset*>(preset_data.get()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,8 +36,6 @@ class SequenceDialogPresetTab : public QWidget, public PresetManager<SequencePre
|
||||
public:
|
||||
SequenceDialogPresetTab(QWidget* parent = nullptr);
|
||||
|
||||
virtual ~SequenceDialogPresetTab() override;
|
||||
|
||||
public slots:
|
||||
void SaveParametersAsPreset(SequencePreset preset);
|
||||
|
||||
@@ -56,17 +54,17 @@ private:
|
||||
QTreeWidgetItem* GetSelectedItem();
|
||||
QTreeWidgetItem* GetSelectedCustomPreset();
|
||||
|
||||
void AddStandardItem(QTreeWidgetItem* folder, Preset* preset, const QString &description = QString());
|
||||
void AddStandardItem(QTreeWidgetItem* folder, PresetPtr preset, const QString &description = QString());
|
||||
|
||||
void AddCustomItem(QTreeWidgetItem* folder, Preset* preset, int index, const QString& description = QString());
|
||||
void AddCustomItem(QTreeWidgetItem* folder, PresetPtr preset, int index, const QString& description = QString());
|
||||
|
||||
void AddItemInternal(QTreeWidgetItem* folder, Preset* preset, bool is_custom, int index, const QString& description = QString());
|
||||
void AddItemInternal(QTreeWidgetItem* folder, PresetPtr preset, bool is_custom, int index, const QString& description = QString());
|
||||
|
||||
QTreeWidget* preset_tree_;
|
||||
|
||||
QTreeWidgetItem* my_presets_folder_;
|
||||
|
||||
QVector<Preset*> default_preset_data_;
|
||||
QVector<PresetPtr> default_preset_data_;
|
||||
|
||||
private slots:
|
||||
void SelectedItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
|
||||
|
||||
Reference in New Issue
Block a user