From d8c89f056bcf7326519784633c374fdda5999736 Mon Sep 17 00:00:00 2001 From: Crystalwarrior Date: Sat, 30 Jul 2022 05:06:34 +0300 Subject: [PATCH] Add private evidence autosaving into inventories/autosave.ini (#778) * Add private evidence autosaving into inventories/autosave.ini * Make evidence autosave more robust by accounting for evidence transfers and deleteions Fix the ini not using UTF-8 codec Correct save/load functions working on local evidence list (displayed) rather than the proper private one * set ini codec Co-authored-by: oldmud0 Co-authored-by: Salanto <62221668+Salanto@users.noreply.github.com> Co-authored-by: stonedDiscord Co-authored-by: oldmud0 --- include/courtroom.h | 2 ++ src/evidence.cpp | 88 ++++++++++++++++++++++++++++++--------------- 2 files changed, 61 insertions(+), 29 deletions(-) diff --git a/include/courtroom.h b/include/courtroom.h index d2d4107..d981bff 100644 --- a/include/courtroom.h +++ b/include/courtroom.h @@ -986,6 +986,8 @@ private slots: void evidence_switch(bool global); void on_evidence_save_clicked(); void on_evidence_load_clicked(); + void evidence_save(QString filename); + void evidence_load(QString filename); bool compare_evidence_changed(evi_type evi_a, evi_type evi_b); void on_back_to_lobby_clicked(); diff --git a/src/evidence.cpp b/src/evidence.cpp index 13634ec..7fcad61 100644 --- a/src/evidence.cpp +++ b/src/evidence.cpp @@ -103,6 +103,7 @@ void Courtroom::initialize_evidence() &Courtroom::on_evidence_edited); ui_evidence->hide(); + evidence_load("inventories/autosave.ini"); } void Courtroom::refresh_evidence() @@ -571,6 +572,9 @@ void Courtroom::on_evidence_delete_clicked() local_evidence_list.remove(current_evidence); private_evidence_list = local_evidence_list; set_evidence_page(); + + // Autosave private evidence + evidence_save("inventories/autosave.ini"); } current_evidence = 0; @@ -634,6 +638,11 @@ void Courtroom::on_evidence_ok_clicked() set_evidence_page(); } } + + // Autosave private evidence + if (!current_evidence_global) { + evidence_save("inventories/autosave.ini"); + } } void Courtroom::on_evidence_switch_clicked() @@ -664,6 +673,9 @@ void Courtroom::on_evidence_transfer_clicked() evi_type f_evi = local_evidence_list.at(current_evidence); name = f_evi.name; private_evidence_list.append(f_evi); + + // Autosave private evidence + evidence_save("inventories/autosave.ini"); } QMessageBox *msgBox = new QMessageBox; @@ -743,25 +755,19 @@ void Courtroom::on_evidence_save_clicked() return; // Don't allow saving/loading operations when in global inventory // mode for now + // "Inventories" dir keeps our private evidence data + if (!dir_exists("inventories")) { + // Create one if it doesn't yet exist + QDir("inventories").mkdir("inventories"); + } + QString p_path = QFileDialog::getSaveFileName( - this, tr("Save Inventory"), "base/inventories/", tr("Ini Files (*.ini)")); - if (p_path.isEmpty()) - return; + this, tr("Save Inventory"), "inventories/", tr("Ini Files (*.ini)")); evidence_close(); ui_evidence_name->setText(""); - QSettings inventory(p_path, QSettings::IniFormat); - inventory.setIniCodec("UTF-8"); - inventory.clear(); - for (int i = 0; i < local_evidence_list.size(); i++) { - inventory.beginGroup(QString::number(i)); - inventory.setValue("name", local_evidence_list[i].name); - inventory.setValue("description", local_evidence_list[i].description); - inventory.setValue("image", local_evidence_list[i].image); - inventory.endGroup(); - } - inventory.sync(); + evidence_save(p_path); } void Courtroom::on_evidence_load_clicked() @@ -771,35 +777,59 @@ void Courtroom::on_evidence_load_clicked() // mode for now QString p_path = QFileDialog::getOpenFileName( - this, tr("Open Inventory"), "base/inventories/", tr("Ini Files (*.ini)")); + this, tr("Open Inventory"), "inventories/", tr("Ini Files (*.ini)")); if (p_path.isEmpty()) return; evidence_close(); ui_evidence_name->setText(""); + evidence_load(p_path); + local_evidence_list = private_evidence_list; + set_evidence_page(); +} - QSettings inventory(p_path, QSettings::IniFormat); - inventory.setIniCodec("UTF-8"); - local_evidence_list.clear(); - QMap sorted_evi; - for (const auto &s : inventory.childGroups()) { - sorted_evi[s.toInt()] = s; +void Courtroom::evidence_load(QString filename) +{ + if (!file_exists(filename)) { + qWarning() << "Trying to load a non-existant evidence save file:" << filename; + return; } - QStringList evilist(sorted_evi.values()); - for (const QString &evi : evilist) { + QSettings inventory(filename, QSettings::IniFormat); + inventory.setIniCodec("UTF-8"); + private_evidence_list.clear(); + foreach (QString evi, inventory.childGroups()) { if (evi == "General") continue; evi_type f_evi; - f_evi.name = inventory.value(evi + "/name", tr("UNKNOWN")).value(); + f_evi.name = inventory.value(evi + "/name", "").value(); f_evi.description = - inventory.value(evi + "/description", tr("UNKNOWN")).value(); + inventory.value(evi + "/description", "").value(); f_evi.image = - inventory.value(evi + "/image", "UNKNOWN.png").value(); - local_evidence_list.append(f_evi); + inventory.value(evi + "/image", "empty.png").value(); + private_evidence_list.append(f_evi); } - private_evidence_list = local_evidence_list; - set_evidence_page(); +} + +void Courtroom::evidence_save(QString filename) +{ + // "Inventories" dir keeps our private evidence data + if (!dir_exists("inventories")) { + // Create one if it doesn't yet exist + QDir("inventories").mkdir("inventories"); + } + + QSettings inventory(filename, QSettings::IniFormat); + inventory.setIniCodec("UTF-8"); + inventory.clear(); + for (int i = 0; i < private_evidence_list.size(); i++) { + inventory.beginGroup(QString::number(i)); + inventory.setValue("name", private_evidence_list[i].name); + inventory.setValue("description", private_evidence_list[i].description); + inventory.setValue("image", private_evidence_list[i].image); + inventory.endGroup(); + } + inventory.sync(); } bool Courtroom::compare_evidence_changed(evi_type evi_a, evi_type evi_b)