summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/settings.cpp69
-rw-r--r--src/settingsutilities.cpp8
-rw-r--r--src/settingsutilities.h4
3 files changed, 52 insertions, 29 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 14189be3..8ae7c343 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -221,9 +221,19 @@ std::vector<std::map<QString, QVariant>> Settings::executables() const
void Settings::setExecutables(const std::vector<std::map<QString, QVariant>>& v)
{
- removeSection(m_Settings, "customExecutables");
+ const auto current = executables();
- ScopedWriteArray swa(m_Settings, "customExecutables");
+ if (current == v) {
+ // no change
+ return;
+ }
+
+ if (current.size() > v.size()) {
+ // Qt can't remove array elements, the section must be cleared
+ removeSection(m_Settings, "customExecutables");
+ }
+
+ ScopedWriteArray swa(m_Settings, "customExecutables", v.size());
for (const auto& map : v) {
swa.next();
@@ -1156,9 +1166,9 @@ void PluginSettings::addBlacklistPlugin(const QString &fileName)
void PluginSettings::writePluginBlacklist()
{
- removeSection(m_Settings, "PluginBlacklist");
+ removeSection(m_Settings, "pluginBlacklist");
- ScopedWriteArray swa(m_Settings, "PluginBlacklist");
+ ScopedWriteArray swa(m_Settings, "pluginBlacklist");
for (const QString &plugin : m_PluginBlacklist) {
swa.next();
@@ -1222,7 +1232,7 @@ std::map<QString, QString> PathSettings::recent() const
{
std::map<QString, QString> map;
- ScopedReadArray sra(m_Settings, "RecentDirectories");
+ ScopedReadArray sra(m_Settings, "recentDirectories");
sra.for_each([&] {
const QVariant name = sra.get<QVariant>("name");
@@ -1238,9 +1248,14 @@ std::map<QString, QString> PathSettings::recent() const
void PathSettings::setRecent(const std::map<QString, QString>& map)
{
- removeSection(m_Settings, "RecentDirectories");
+ const auto current = recent();
- ScopedWriteArray swa(m_Settings, "recentDirectories");
+ if (current.size() > map.size()) {
+ // Qt can't remove array elements, the section must be cleared
+ removeSection(m_Settings, "recentDirectories");
+ }
+
+ ScopedWriteArray swa(m_Settings, "recentDirectories", map.size());
for (auto&& p : map) {
swa.next();
@@ -1472,33 +1487,37 @@ ServerList NetworkSettings::serversFromOldMap() const
return list;
}
-void NetworkSettings::updateServers(ServerList servers)
+void NetworkSettings::updateServers(ServerList newServers)
{
// clean up unavailable servers
- servers.cleanup();
+ newServers.cleanup();
- removeSection(m_Settings, "Servers");
+ const auto current = servers();
- {
- ScopedWriteArray swa(m_Settings, "Servers");
+ if (current.size() > newServers.size()) {
+ // Qt can't remove array elements, the section must be cleared
+ removeSection(m_Settings, "Servers");
+ }
- for (const auto& server : servers) {
- swa.next();
- swa.set("name", server.name());
- swa.set("premium", server.isPremium());
- swa.set("lastSeen", server.lastSeen().toString(Qt::ISODate));
- swa.set("preferred", server.preferred());
+ ScopedWriteArray swa(m_Settings, "Servers", newServers.size());
- QString lastDownloads;
- for (const auto& speed : server.lastDownloads()) {
- if (speed > 0) {
- lastDownloads += QString("%1 ").arg(speed);
- }
- }
+ for (const auto& server : newServers) {
+ swa.next();
- swa.set("lastDownloads", lastDownloads.trimmed());
+ swa.set("name", server.name());
+ swa.set("premium", server.isPremium());
+ swa.set("lastSeen", server.lastSeen().toString(Qt::ISODate));
+ swa.set("preferred", server.preferred());
+
+ QString lastDownloads;
+ for (const auto& speed : server.lastDownloads()) {
+ if (speed > 0) {
+ lastDownloads += QString("%1 ").arg(speed);
+ }
}
+
+ swa.set("lastDownloads", lastDownloads.trimmed());
}
}
diff --git a/src/settingsutilities.cpp b/src/settingsutilities.cpp
index 7ac95b5f..d5e2dd9a 100644
--- a/src/settingsutilities.cpp
+++ b/src/settingsutilities.cpp
@@ -100,10 +100,12 @@ QStringList ScopedReadArray::keys() const
}
-ScopedWriteArray::ScopedWriteArray(QSettings& s, const QString& section)
- : m_settings(s), m_section(section), m_i(0)
+ScopedWriteArray::ScopedWriteArray(
+ QSettings& s, const QString& section, std::size_t size)
+ : m_settings(s), m_section(section), m_i(0)
{
- m_settings.beginWriteArray(section);
+ m_settings.beginWriteArray(
+ section, size == NoSize ? -1 : static_cast<int>(size));
}
ScopedWriteArray::~ScopedWriteArray()
diff --git a/src/settingsutilities.h b/src/settingsutilities.h
index b70e55ef..ca754759 100644
--- a/src/settingsutilities.h
+++ b/src/settingsutilities.h
@@ -204,7 +204,9 @@ private:
class ScopedWriteArray
{
public:
- ScopedWriteArray(QSettings& s, const QString& section);
+ static const auto NoSize = std::numeric_limits<std::size_t>::max();
+
+ ScopedWriteArray(QSettings& s, const QString& section, std::size_t size=NoSize);
~ScopedWriteArray();
ScopedWriteArray(const ScopedWriteArray&) = delete;