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:
itsmattkc
2022-01-12 09:20:00 -08:00
parent d8ccc62d51
commit 1e5ecaace6
3 changed files with 36 additions and 38 deletions
+17 -11
View File
@@ -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_;
+15 -21
View File
@@ -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);