aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/studiowelcome/userpresets.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/studiowelcome/userpresets.cpp')
-rw-r--r--src/plugins/studiowelcome/userpresets.cpp151
1 files changed, 106 insertions, 45 deletions
diff --git a/src/plugins/studiowelcome/userpresets.cpp b/src/plugins/studiowelcome/userpresets.cpp
index d468c3522e..e32c010bd6 100644
--- a/src/plugins/studiowelcome/userpresets.cpp
+++ b/src/plugins/studiowelcome/userpresets.cpp
@@ -24,43 +24,75 @@
****************************************************************************/
#include "userpresets.h"
+#include "algorithm.h"
+
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QJsonArray>
+#include <QJsonValue>
#include <coreplugin/icore.h>
-#include <utils/algorithm.h>
+#include <memory>
#include <utils/qtcassert.h>
using namespace StudioWelcome;
-constexpr char PREFIX[] = "UserPresets";
+FileStoreIo::FileStoreIo(const QString &fileName)
+ : m_file{std::make_unique<QFile>(fullFilePath(fileName))}
+{}
+
+QByteArray FileStoreIo::read() const
+{
+ m_file->open(QFile::ReadOnly | QFile::Text);
+ QByteArray data = m_file->readAll();
+ m_file->close();
+
+ return data;
+}
+
+void FileStoreIo::write(const QByteArray &data)
+{
+ m_file->open(QFile::WriteOnly | QFile::Text);
+ m_file->write(data);
+ m_file->close();
+}
-UserPresetsStore::UserPresetsStore()
+QString FileStoreIo::fullFilePath(const QString &fileName) const
{
- m_settings = std::make_unique<QSettings>(fullFilePath(), QSettings::IniFormat);
+ return Core::ICore::userResourcePath(fileName).toString();
}
-UserPresetsStore::UserPresetsStore(std::unique_ptr<QSettings> &&settings)
- : m_settings{std::move(settings)}
+UserPresetsStore::UserPresetsStore(const QString &fileName, StorePolicy policy)
+ : m_store{std::make_unique<FileStoreIo>(fileName)}
+ , m_policy{policy}
+{}
+
+UserPresetsStore::UserPresetsStore(std::unique_ptr<StoreIo> &&fileStore,
+ StorePolicy policy)
+ : m_store{std::move(fileStore)}
+ , m_policy{policy}
{}
-void UserPresetsStore::savePresets(const std::vector<UserPresetData> &presets)
+void UserPresetsStore::savePresets(const std::vector<UserPresetData> &presetItems)
{
- m_settings->beginWriteArray(PREFIX, static_cast<int>(presets.size()));
-
- for (size_t i = 0; i < presets.size(); ++i) {
- m_settings->setArrayIndex(static_cast<int>(i));
- const auto &preset = presets[i];
-
- m_settings->setValue("categoryId", preset.categoryId);
- m_settings->setValue("wizardName", preset.wizardName);
- m_settings->setValue("name", preset.name);
- m_settings->setValue("screenSize", preset.screenSize);
- m_settings->setValue("useQtVirtualKeyboard", preset.useQtVirtualKeyboard);
- m_settings->setValue("qtVersion", preset.qtVersion);
- m_settings->setValue("styleName", preset.styleName);
+ QJsonArray jsonArray;
+
+ for (const auto &preset : presetItems) {
+ QJsonObject obj({{"categoryId", preset.categoryId},
+ {"wizardName", preset.wizardName},
+ {"name", preset.name},
+ {"screenSize", preset.screenSize},
+ {"useQtVirtualKeyboard", preset.useQtVirtualKeyboard},
+ {"qtVersion", preset.qtVersion},
+ {"styleName", preset.styleName}});
+
+ jsonArray.append(QJsonValue{obj});
}
- m_settings->endArray();
- m_settings->sync();
+ QJsonDocument doc(jsonArray);
+ QByteArray data = doc.toJson();
+
+ m_store->write(data);
}
bool UserPresetsStore::save(const UserPresetData &newPreset)
@@ -68,12 +100,30 @@ bool UserPresetsStore::save(const UserPresetData &newPreset)
QTC_ASSERT(newPreset.isValid(), return false);
std::vector<UserPresetData> presetItems = fetchAll();
- if (Utils::anyOf(presetItems,
- [&newPreset](const UserPresetData &p) { return p.name == newPreset.name; })) {
- return false;
+
+ if (m_policy == StorePolicy::UniqueNames) {
+ if (Utils::anyOf(presetItems, [&newPreset](const UserPresetData &p) {
+ return p.name == newPreset.name;
+ })) {
+ return false;
+ }
+ } else if (m_policy == StorePolicy::UniqueValues) {
+ if (Utils::containsItem(presetItems, newPreset))
+ return false;
+ }
+
+ if (m_reverse)
+ Utils::prepend(presetItems, newPreset);
+ else
+ presetItems.push_back(newPreset);
+
+ if (m_maximum > -1 && static_cast<int>(presetItems.size()) > m_maximum) {
+ if (m_reverse)
+ presetItems.pop_back();
+ else
+ presetItems.erase(std::cbegin(presetItems));
}
- presetItems.push_back(newPreset);
savePresets(presetItems);
return true;
@@ -92,34 +142,45 @@ void UserPresetsStore::remove(const QString &category, const QString &name)
savePresets(presetItems);
}
+std::vector<UserPresetData> UserPresetsStore::remove(const UserPresetData &preset)
+{
+ std::vector<UserPresetData> presetItems = fetchAll();
+ bool erased = Utils::erase_one(presetItems, preset);
+ if (erased)
+ savePresets(presetItems);
+
+ return presetItems;
+}
+
std::vector<UserPresetData> UserPresetsStore::fetchAll() const
{
+ QByteArray data = m_store->read();
+
+ const QJsonDocument doc = QJsonDocument::fromJson(data);
+ if (!doc.isArray())
+ return {};
+
std::vector<UserPresetData> result;
- int size = m_settings->beginReadArray(PREFIX);
- if (size >= 0)
- result.reserve(static_cast<size_t>(size) + 1);
+ const QJsonArray jsonArray = doc.array();
- for (int i = 0; i < size; ++i) {
- m_settings->setArrayIndex(i);
+ for (const QJsonValue &value: jsonArray) {
+ if (!value.isObject())
+ continue;
+ const QJsonObject obj = value.toObject();
UserPresetData preset;
- preset.categoryId = m_settings->value("categoryId").toString();
- preset.wizardName = m_settings->value("wizardName").toString();
- preset.name = m_settings->value("name").toString();
- preset.screenSize = m_settings->value("screenSize").toString();
- preset.useQtVirtualKeyboard = m_settings->value("useQtVirtualKeyboard").toBool();
- preset.qtVersion = m_settings->value("qtVersion").toString();
- preset.styleName = m_settings->value("styleName").toString();
+
+ preset.categoryId = obj["categoryId"].toString();
+ preset.wizardName = obj["wizardName"].toString();
+ preset.name = obj["name"].toString();
+ preset.screenSize = obj["screenSize"].toString();
+ preset.useQtVirtualKeyboard = obj["useQtVirtualKeyboard"].toBool();
+ preset.qtVersion = obj["qtVersion"].toString();
+ preset.styleName = obj["styleName"].toString();
if (preset.isValid())
- result.push_back(std::move(preset));
+ result.push_back(preset);
}
- m_settings->endArray();
return result;
}
-
-QString UserPresetsStore::fullFilePath() const
-{
- return Core::ICore::userResourcePath("UserPresets.ini").toString();
-}