diff --git a/libcockatrice_card/libcockatrice/card/database/card_database.h b/libcockatrice_card/libcockatrice/card/database/card_database.h index fc6958525..b1af3a2c0 100644 --- a/libcockatrice_card/libcockatrice/card/database/card_database.h +++ b/libcockatrice_card/libcockatrice/card/database/card_database.h @@ -130,6 +130,11 @@ public: /** @brief Notifies listeners that enabled sets changed. */ void notifyEnabledSetsChanged(); + ICardSetPriorityController *getPriorityController() + { + return setPriorityController; + }; + public slots: /** * @brief Adds a card to the database. diff --git a/libcockatrice_card/libcockatrice/card/set/card_set.h b/libcockatrice_card/libcockatrice/card/set/card_set.h index fe4b66522..2cedb597e 100644 --- a/libcockatrice_card/libcockatrice/card/set/card_set.h +++ b/libcockatrice_card/libcockatrice/card/set/card_set.h @@ -181,6 +181,15 @@ public: */ void loadSetOptions(); + void setSortKeyInMemory(unsigned int _sortKey) + { + sortKey = _sortKey; + } + void setEnabledInMemory(bool _enabled) + { + enabled = _enabled; + } + /// @return The sort key assigned to this set. [[nodiscard]] int getSortKey() const { diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/interface_card_set_priority_controller.h b/libcockatrice_interfaces/libcockatrice/interfaces/interface_card_set_priority_controller.h index b8fbbc74a..333190015 100644 --- a/libcockatrice_interfaces/libcockatrice/interfaces/interface_card_set_priority_controller.h +++ b/libcockatrice_interfaces/libcockatrice/interfaces/interface_card_set_priority_controller.h @@ -6,6 +6,12 @@ class ICardSetPriorityController { public: + struct SetSaveData { + QString shortName; + unsigned int sortKey; + bool enabled; + }; + virtual ~ICardSetPriorityController() = default; virtual void setSortKey(QString shortName, unsigned int sortKey) = 0; @@ -15,6 +21,8 @@ public: virtual unsigned int getSortKey(QString shortName) const = 0; virtual bool isEnabled(QString shortName) const = 0; virtual bool isKnown(QString shortName) const = 0; + + virtual void saveSets(const QVector &data) = 0; }; #endif // COCKATRICE_INTERFACE_CARD_SET_PRIORITY_CONTROLLER_H diff --git a/libcockatrice_interfaces/libcockatrice/interfaces/noop_card_set_priority_controller.h b/libcockatrice_interfaces/libcockatrice/interfaces/noop_card_set_priority_controller.h index e5027648c..16fc4c19a 100644 --- a/libcockatrice_interfaces/libcockatrice/interfaces/noop_card_set_priority_controller.h +++ b/libcockatrice_interfaces/libcockatrice/interfaces/noop_card_set_priority_controller.h @@ -28,6 +28,9 @@ public: { return true; } + + void saveSets(const QVector & /* data */) override { + }; }; #endif // COCKATRICE_NOOP_CARD_SET_PRIORITY_CONTROLLER_H diff --git a/libcockatrice_models/libcockatrice/models/database/card_set/card_sets_model.cpp b/libcockatrice_models/libcockatrice/models/database/card_set/card_sets_model.cpp index f6dc4f9cf..c0164ad75 100644 --- a/libcockatrice_models/libcockatrice/models/database/card_set/card_sets_model.cpp +++ b/libcockatrice_models/libcockatrice/models/database/card_set/card_sets_model.cpp @@ -228,16 +228,19 @@ void SetsModel::sort(int column, Qt::SortOrder order) void SetsModel::save(CardDatabase *db) { - // order - for (int i = 0; i < sets.size(); i++) - sets[i]->setSortKey(static_cast(i + 1)); + QVector saveData; + saveData.reserve(sets.size()); - // enabled sets - for (const CardSetPtr &set : sets) - set->setEnabled(enabledSets.contains(set)); + for (int i = 0; i < sets.size(); ++i) { + const unsigned int sortKey = static_cast(i + 1); + const bool enabled = enabledSets.contains(sets[i]); + sets[i]->setSortKeyInMemory(sortKey); + sets[i]->setEnabledInMemory(enabled); + saveData.append({sets[i]->getShortName(), sortKey, enabled}); + } + db->getPriorityController()->saveSets(saveData); sets.sortByKey(); - db->notifyEnabledSetsChanged(); } diff --git a/libcockatrice_settings/libcockatrice/settings/card_database_settings.cpp b/libcockatrice_settings/libcockatrice/settings/card_database_settings.cpp index 26a91a4dd..4887afd2f 100644 --- a/libcockatrice_settings/libcockatrice/settings/card_database_settings.cpp +++ b/libcockatrice_settings/libcockatrice/settings/card_database_settings.cpp @@ -34,3 +34,17 @@ bool CardDatabaseSettings::isKnown(QString shortName) const { return getValue("isknown", "sets", std::move(shortName)).toBool(); } + +void CardDatabaseSettings::saveSets(const QVector &data) +{ + batchWrite([&](QSettings &s) { + s.beginGroup("sets"); + for (const auto &entry : data) { + s.beginGroup(entry.shortName); + s.setValue("sortkey", entry.sortKey); + s.setValue("enabled", entry.enabled); + s.endGroup(); + } + s.endGroup(); + }); +} \ No newline at end of file diff --git a/libcockatrice_settings/libcockatrice/settings/card_database_settings.h b/libcockatrice_settings/libcockatrice/settings/card_database_settings.h index bb946ea80..5dea1b552 100644 --- a/libcockatrice_settings/libcockatrice/settings/card_database_settings.h +++ b/libcockatrice_settings/libcockatrice/settings/card_database_settings.h @@ -26,6 +26,8 @@ public: bool isEnabled(QString shortName) const override; bool isKnown(QString shortName) const override; + void saveSets(const QVector &data) override; + private: explicit CardDatabaseSettings(const QString &settingPath, QObject *parent = nullptr); }; diff --git a/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp b/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp index fbbb57e5e..b66edd630 100644 --- a/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp +++ b/libcockatrice_settings/libcockatrice/settings/settings_manager.cpp @@ -159,6 +159,15 @@ QVariant SettingsManager::getValue(const QString &name, const QString &group, co return value; } +void SettingsManager::batchWrite(std::function batchWriteFunction) +{ + auto settings = getSettings(); + settings.setAtomicSyncRequired(false); + batchWriteFunction(settings); + settings.sync(); // single flush + settings.setAtomicSyncRequired(true); +} + /** * Calls sync on the underlying QSettings object */ diff --git a/libcockatrice_settings/libcockatrice/settings/settings_manager.h b/libcockatrice_settings/libcockatrice/settings/settings_manager.h index f46ca89d1..a02bafcac 100644 --- a/libcockatrice_settings/libcockatrice/settings/settings_manager.h +++ b/libcockatrice_settings/libcockatrice/settings/settings_manager.h @@ -23,6 +23,7 @@ public: QVariant getValue(const QString &name) const; QVariant getValue(const QString &name, const QString &group, const QString &subGroup = QString()) const; + void batchWrite(std::function batchWriteFunction); void sync();