Files
harbour-hermes/qml/pages/SessionsPage.qml
T
kaneda 98139be96a fix(qml): correzioni Silica post-primo-test su device (v0.1.1)
Pagine non caricabili ("Impossibile caricare la pagina") per API
inesistenti nella Silica del kit Sailfish 5.1 / Qt 5.6 — verificate
sui docs ufficiali (pagine -members) e incrociate coi pattern
provati su device (tide/calibreweb/quill):

- TextField: rimosso onAccepted (segnale "accepted" inesistente)
  -> EnterKey.enabled/.onClicked (LoginPage, ChatPage)
- Button: rimosso "highlighted" (inesistente su Button) dal mic
- ComboBox: menu con MenuItem espliciti (via Repeater non provato)
- Theme.highlightDimmerColor -> Theme.rgba(highlightBackgroundColor)
- Azioni nei menu instradate via funzioni della Page (pattern tide)
- SessionsPage: titolo delegato piu' robusto (no "undefined")
2026-09-12 08:09:30 +02:00

128 lines
3.5 KiB
QML

import QtQuick 2.0
import Sailfish.Silica 1.0
// Lista delle sessioni della Web UI di Hermes (sidebar).
Page {
id: page
// true solo quando e' questa pagina a chiedere una nuova sessione:
// serve a distinguere la creazione dall'apertura di una sessione esistente.
property bool expectNewSession: false
SilicaListView {
id: list
anchors.fill: parent
model: api.sessions
spacing: Theme.paddingSmall
header: PageHeader { title: qsTr("Sessions") }
PullDownMenu {
MenuItem {
text: qsTr("New session")
onClicked: page.createSession()
}
MenuItem {
text: qsTr("Refresh")
onClicked: page.refresh()
}
MenuItem {
text: qsTr("Settings")
onClicked: page.openSettings()
}
MenuItem {
text: qsTr("Sign out")
onClicked: page.signOut()
}
}
delegate: ListItem {
id: item
contentHeight: col.height + Theme.paddingMedium
Column {
id: col
x: Theme.horizontalPageMargin
width: parent.width - 2 * Theme.horizontalPageMargin
anchors.verticalCenter: parent.verticalCenter
spacing: Theme.paddingSmall / 2
Label {
width: parent.width
truncationMode: TruncationMode.Fade
color: item.highlighted ? Theme.highlightColor : Theme.primaryColor
text: model.title ? model.title : model.session_id
}
Label {
width: parent.width
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.secondaryColor
text: page.describe(model)
}
}
onClicked: page.openSession(model.session_id)
}
ViewPlaceholder {
enabled: api.sessions.length === 0 && !api.busy
text: qsTr("No sessions")
hintText: qsTr("Pull down to create a new session")
}
VerticalScrollDecorator {}
}
BusyIndicator {
anchors.centerIn: parent
size: BusyIndicatorSize.Large
running: api.busy
}
Connections {
target: api
onLoggedInChanged: {
if (!api.loggedIn)
pageStack.replace(Qt.resolvedUrl("LoginPage.qml"))
}
onSessionOpened: {
if (page.expectNewSession) {
page.expectNewSession = false
pageStack.push(Qt.resolvedUrl("ChatPage.qml"),
{ sessionId: api.session.session_id })
}
}
}
Component.onCompleted: api.refreshSessions()
function refresh() {
api.refreshSessions()
}
function openSettings() {
pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
}
function signOut() {
api.logout()
}
function openSession(id) {
expectNewSession = false
pageStack.push(Qt.resolvedUrl("ChatPage.qml"), { sessionId: id })
}
function createSession() {
expectNewSession = true
chat.newSession()
}
function describe(m) {
var n = m.message_count ? m.message_count : 0
var d = new Date((m.updated_at ? m.updated_at : 0) * 1000)
return n + qsTr(" messages") + " · " + Qt.formatDateTime(d, "dd/MM HH:mm")
}
}