fix(settings): le impostazioni ora persistono davvero dal launcher (v0.5.3)

Causa (il "solito" problema dei progetti Sailfish): QSettings di default
scrive in ~/.config/harbour/hermes.conf, FUORI dalla directory che la
sandbox SailJail rende persistente (~/.config/harbour/hermes/). Dal
launcher le modifiche finivano in una vista effimera e sparivano a ogni
riavvio; da terminale invece restavano (da qui l'effetto "a volte si' a
volte no"). Stesso problema gia' risolto in harbour-calibreweb e
harbour-quill con il percorso esplicito.

- Settings: QSettings(configPath(), IniFormat) con configPath() =
  AppConfigLocation + "/hermes.conf" (mkpath della directory)
- store(): ogni setter fa setValue + sync immediato (nessuna modifica
  persa se il sistema termina l'app)
- migrateIfNeeded(): al primo avvio importa i valori rimasti nel vecchio
  percorso di default (~/.config/harbour/hermes.conf, piu' i path legacy
  nemo/defaultuser)
- diagnostica: log del file impostazioni e dei valori letti all'avvio
- core-test: test di persistenza (scrittura con una istanza, rilettura
  con una SECONDA istanza: prova che passa dal file su disco)
This commit is contained in:
2026-09-13 13:53:17 +02:00
parent 7428d42b92
commit db75d5fea1
7 changed files with 125 additions and 21 deletions
+2 -2
View File
@@ -21,9 +21,9 @@ Q_DECL_EXPORT int main(int argc, char *argv[])
// AppConfigLocation = ~/.config/harbour/hermes (zona persistente della sandbox).
app->setOrganizationName(QStringLiteral("harbour"));
app->setApplicationName(QStringLiteral("hermes"));
app->setApplicationVersion(QStringLiteral("0.5.2"));
app->setApplicationVersion(QStringLiteral("0.5.3"));
qDebug() << "harbour-hermes v0.5.2 build" << __DATE__ << __TIME__;
qDebug() << "harbour-hermes v0.5.3 build" << __DATE__ << __TIME__;
// Traduzioni: it/fr/de da /usr/share/harbour-hermes/translations, in base
// alla lingua di sistema (l'inglese e' la lingua sorgente: nessun .qm).
+74 -12
View File
@@ -1,5 +1,11 @@
#include "settings.h"
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QStandardPaths>
#include <QVariant>
// Nessuna configurazione personale e' compilata nel binario: i default sono
// neutri e TUTTO si imposta dalle Impostazioni dell'app (QSettings in
// ~/.config/harbour/hermes.conf). Vuoto = "decide il server".
@@ -7,9 +13,65 @@ static const char *kDefaultBaseUrl = "";
static const char *kDefaultTtsVoice = "";
static const char *kDefaultTtsEngine = "";
QString Settings::configPath()
{
// Path canonico per la sandbox SailJail di Sailfish 5.x: con org/app
// dichiarati (harbour/hermes, vedi main.cpp e X-Sailjail nel desktop
// file) AppConfigLocation = ~/.config/harbour/hermes e' l'unica zona
// config che la sandbox rende PERSISTENTE tra gli avvii. NB: il
// QSettings "di default" scriverebbe in ~/.config/harbour/hermes.conf,
// FUORI da questa directory: dal launcher le impostazioni andrebbero
// perse a ogni riavvio (era il bug del "non salva le impostazioni").
const QString dir = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);
QDir().mkpath(dir);
return dir + QStringLiteral("/hermes.conf");
}
Settings::Settings(QObject *parent)
: QObject(parent)
, m_settings(configPath(), QSettings::IniFormat)
{
migrateIfNeeded();
// Diagnostica visibile nel log del device: dove vivono le impostazioni.
qDebug() << "Settings file:" << m_settings.fileName();
if (m_settings.status() != QSettings::NoError)
qDebug() << "Settings WARNING: file di configurazione non accessibile";
qDebug() << "Settings read: baseUrl=[" << baseUrl() << "] voice=["
<< ttsVoice() << "] profile=[" << profile() << "]";
}
void Settings::migrateIfNeeded()
{
if (QFile::exists(m_settings.fileName()))
return; // c'e' gia' il file canonico: nessuna migrazione da fare
// Importa i valori rimasti nella vecchia posizione "di default"
// (~/.config/harbour/hermes.conf), ad esempio lasciati dagli avvii da
// terminale prima del fix del percorso. La prima sorgente con valori vince.
const QStringList candidates = QStringList()
<< QDir::homePath() + QStringLiteral("/.config/harbour/hermes.conf")
<< QStringLiteral("/home/defaultuser/.config/harbour/hermes.conf")
<< QStringLiteral("/home/nemo/.config/harbour/hermes.conf");
for (const QString &cand : candidates) {
if (cand == m_settings.fileName() || !QFile::exists(cand))
continue;
QSettings src(cand, QSettings::IniFormat);
const QStringList keys = src.allKeys();
if (keys.isEmpty())
continue;
for (const QString &k : keys)
m_settings.setValue(k, src.value(k));
m_settings.sync();
qDebug() << "Settings: importati" << keys.size() << "valori da" << cand;
return;
}
}
void Settings::store(const QString &key, const QVariant &value)
{
m_settings.setValue(key, value);
// Flush immediato: se l'app viene terminata dal sistema, le modifiche
// alle impostazioni restano comunque su disco.
m_settings.sync();
}
QString Settings::baseUrl() const
@@ -28,7 +90,7 @@ void Settings::setBaseUrl(const QString &url)
v.chop(1);
if (v == baseUrl())
return;
m_settings.setValue(QStringLiteral("baseUrl"), v);
store(QStringLiteral("baseUrl"), v);
emit baseUrlChanged();
}
@@ -41,7 +103,7 @@ void Settings::setTtsVoice(const QString &voice)
{
if (voice == ttsVoice())
return;
m_settings.setValue(QStringLiteral("ttsVoice"), voice);
store(QStringLiteral("ttsVoice"), voice);
emit ttsVoiceChanged();
}
@@ -54,7 +116,7 @@ void Settings::setTtsEngine(const QString &engine)
{
if (engine == ttsEngine())
return;
m_settings.setValue(QStringLiteral("ttsEngine"), engine);
store(QStringLiteral("ttsEngine"), engine);
emit ttsEngineChanged();
}
@@ -67,7 +129,7 @@ void Settings::setTtsAutoRead(bool on)
{
if (on == ttsAutoRead())
return;
m_settings.setValue(QStringLiteral("ttsAutoRead"), on);
store(QStringLiteral("ttsAutoRead"), on);
emit ttsAutoReadChanged();
}
@@ -80,7 +142,7 @@ void Settings::setDictationAutoSend(bool on)
{
if (on == dictationAutoSend())
return;
m_settings.setValue(QStringLiteral("dictationAutoSend"), on);
store(QStringLiteral("dictationAutoSend"), on);
emit dictationAutoSendChanged();
}
@@ -93,7 +155,7 @@ void Settings::setVadSilenceMs(int ms)
{
if (ms == vadSilenceMs())
return;
m_settings.setValue(QStringLiteral("vadSilenceMs"), ms);
store(QStringLiteral("vadSilenceMs"), ms);
emit vadSilenceMsChanged();
}
@@ -106,7 +168,7 @@ void Settings::setVadThreshold(int threshold)
{
if (threshold == vadThreshold())
return;
m_settings.setValue(QStringLiteral("vadThreshold"), threshold);
store(QStringLiteral("vadThreshold"), threshold);
emit vadThresholdChanged();
}
@@ -119,7 +181,7 @@ void Settings::setVadMaxMs(int ms)
{
if (ms == vadMaxMs())
return;
m_settings.setValue(QStringLiteral("vadMaxMs"), ms);
store(QStringLiteral("vadMaxMs"), ms);
emit vadMaxMsChanged();
}
@@ -135,7 +197,7 @@ void Settings::setProfile(const QString &name)
const QString clean = name.trimmed();
if (clean == profile())
return;
m_settings.setValue(QStringLiteral("profile"), clean);
store(QStringLiteral("profile"), clean);
emit profileChanged();
}
@@ -154,7 +216,7 @@ void Settings::setTtsVoices(const QStringList &list)
}
if (clean == ttsVoices())
return;
m_settings.setValue(QStringLiteral("ttsVoices"), clean);
store(QStringLiteral("ttsVoices"), clean);
emit ttsVoicesChanged();
}
@@ -173,7 +235,7 @@ void Settings::setTtsEngines(const QStringList &list)
}
if (clean == ttsEngines())
return;
m_settings.setValue(QStringLiteral("ttsEngines"), clean);
store(QStringLiteral("ttsEngines"), clean);
emit ttsEnginesChanged();
}
@@ -186,6 +248,6 @@ void Settings::setDefaultWorkspace(const QString &ws)
{
if (ws == defaultWorkspace())
return;
m_settings.setValue(QStringLiteral("defaultWorkspace"), ws);
store(QStringLiteral("defaultWorkspace"), ws);
emit defaultWorkspaceChanged();
}
+8
View File
@@ -5,6 +5,7 @@
#include <QSettings>
#include <QString>
#include <QStringList>
#include <QVariant>
// Impostazioni persistenti dell'app.
// QSettings con OrganizationName "harbour" / ApplicationName "hermes" (impostati
@@ -40,6 +41,10 @@ class Settings : public QObject
public:
explicit Settings(QObject *parent = nullptr);
// Percorso del file impostazioni, nella zona persistente della sandbox
// SailJail (~/.config/harbour/hermes/hermes.conf). Pubblico per i test.
static QString configPath();
QString baseUrl() const;
void setBaseUrl(const QString &url);
@@ -93,6 +98,9 @@ signals:
void defaultWorkspaceChanged();
private:
void migrateIfNeeded();
void store(const QString &key, const QVariant &value);
QSettings m_settings;
};