fix(sessions): lista vuota sul device — modello C++ con ruoli (v0.1.2)

Causa: su Qt 5.6 (kit Sailfish 5.1) una QVariantList di QVariantMap
usata come model non fa risolvere i campi nei delegate QML
(model.title/message_count/updated_at = undefined -> righe vuote), pur
con payload corretto dal server (verificato con cattura reale del 12/09).

- Nuovo src/sessionsmodel.{h,cpp}: QAbstractListModel con ruoli
  session_id/title/message_count/updated_at; api.sessions ora e' il
  modello, api.sessionsCount per lo stato "nessuna sessione"
- /api/sessions con sidebar_source=webui&exclude_hidden=1 (come la
  sidebar del browser: solo sessioni WebUI, niente CLI/cron/nascoste)
- SessionsPage: describe(message_count, updated_at) con parametri espliciti
- PROTOCOL.md: payload sessions verificato + nota del pitfall Qt 5.6
This commit is contained in:
2026-09-12 08:47:28 +02:00
parent 98139be96a
commit 479edb0f99
11 changed files with 157 additions and 30 deletions
+16 -3
View File
@@ -15,6 +15,7 @@ ApiClient::ApiClient(Settings *settings, QObject *parent)
: QObject(parent)
, m_settings(settings)
, m_jar(new CookieJar(this))
, m_sessionsModel(new SessionsModel(this))
, m_loggedIn(false)
, m_busy(false)
, m_streaming(false)
@@ -170,7 +171,7 @@ void ApiClient::logout()
});
m_jar->clear();
setLoggedIn(false);
m_sessions.clear();
m_sessionsModel->setSessions(QVariantList());
emit sessionsChanged();
m_session.clear();
emit sessionChanged();
@@ -181,7 +182,14 @@ void ApiClient::logout()
void ApiClient::refreshSessions()
{
setBusy(true);
QNetworkReply *reply = m_nam.get(jsonRequest(QStringLiteral("/api/sessions")));
// Stessi parametri della sidebar del WebUI: solo sessioni WebUI visibili
// (senza parametri arriverebbero anche le CLI/cron e le nascoste).
QUrl url = apiUrl(QStringLiteral("/api/sessions"));
QUrlQuery q;
q.addQueryItem(QStringLiteral("sidebar_source"), QStringLiteral("webui"));
q.addQueryItem(QStringLiteral("exclude_hidden"), QStringLiteral("1"));
url.setQuery(q);
QNetworkReply *reply = m_nam.get(QNetworkRequest(url));
connect(reply, &QNetworkReply::finished, this, [this, reply]() {
reply->deleteLater();
setBusy(false);
@@ -192,11 +200,16 @@ void ApiClient::refreshSessions()
}
const QJsonObject obj = QJsonDocument::fromJson(body).object();
const QJsonArray arr = obj.value(QStringLiteral("sessions")).toArray();
m_sessions = arr.toVariantList();
m_sessionsModel->setSessions(arr.toVariantList());
emit sessionsChanged();
});
}
int ApiClient::sessionsCount() const
{
return m_sessionsModel->rowCount();
}
void ApiClient::openSession(const QString &id)
{
setLastError(QString());