105 lines
3.7 KiB
QML
105 lines
3.7 KiB
QML
import QtQuick 2.0
|
|
import Sailfish.Silica 1.0
|
|
import "../js/tides.js" as Tides
|
|
|
|
// Calendario maree: i prossimi 30 giorni con le ore di alta e bassa marea.
|
|
Page {
|
|
id: page
|
|
|
|
property var port
|
|
|
|
// abbreviazioni giorni localizzate (context unico "Tide")
|
|
property var dayNames: [
|
|
qsTranslate("Tide", "Sun"), qsTranslate("Tide", "Mon"),
|
|
qsTranslate("Tide", "Tue"), qsTranslate("Tide", "Wed"),
|
|
qsTranslate("Tide", "Thu"), qsTranslate("Tide", "Fri"),
|
|
qsTranslate("Tide", "Sat")
|
|
]
|
|
|
|
SilicaListView {
|
|
id: list
|
|
anchors.fill: parent
|
|
model: ListModel { id: dayModel }
|
|
|
|
header: PageHeader {
|
|
title: page.port ? page.port[0] : ""
|
|
description: qsTr("Next 30 days — high and low tides")
|
|
}
|
|
|
|
delegate: Item {
|
|
width: parent.width
|
|
height: model.isDay ? Theme.itemSizeSmall : Theme.itemSizeSmall * 0.8
|
|
|
|
// riga del giorno
|
|
Rectangle {
|
|
visible: model.isDay
|
|
anchors.fill: parent
|
|
color: Theme.rgba(Theme.highlightBackgroundColor, 0.2)
|
|
Label {
|
|
text: model.day
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Theme.horizontalPageMargin
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
color: Theme.highlightColor
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
}
|
|
}
|
|
|
|
// riga evento (alta/bassa)
|
|
Label {
|
|
visible: !model.isDay
|
|
text: model.kind === "high" ? "▲" : "▼"
|
|
color: model.kind === "high" ? Theme.highlightColor : Theme.errorColor
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Theme.horizontalPageMargin
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
Label {
|
|
visible: !model.isDay
|
|
text: model.time
|
|
color: Theme.primaryColor
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Theme.horizontalPageMargin + 36
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
Label {
|
|
visible: !model.isDay
|
|
text: model.height
|
|
color: Theme.secondaryColor
|
|
font.pixelSize: Theme.fontSizeSmall
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Theme.horizontalPageMargin
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
}
|
|
}
|
|
|
|
VerticalScrollDecorator {}
|
|
}
|
|
|
|
Component.onCompleted: build()
|
|
|
|
function build() {
|
|
dayModel.clear()
|
|
if (!port) {
|
|
console.log("[tide] calendar: port undefined")
|
|
return
|
|
}
|
|
console.log("[tide] calendar build:", port[0])
|
|
var now = new Date()
|
|
for (var g = 0; g < 30; g++) {
|
|
var d = new Date(now.getFullYear(), now.getMonth(), now.getDate() + g)
|
|
var ex = Tides.extrema(port, d, 1)
|
|
dayModel.append({ isDay: true, day: Tides.fmtDate(d.getTime(), page.dayNames),
|
|
time: "", kind: "", height: "" })
|
|
for (var i = 0; i < ex.length; i++) {
|
|
dayModel.append({ isDay: false, day: "",
|
|
time: Tides.fmtHM(ex[i].t),
|
|
kind: ex[i].kind,
|
|
height: Tides.fmtH(ex[i].h, appSettings.unit) })
|
|
}
|
|
}
|
|
console.log("[tide] calendar giorni:", 30, "righe:", dayModel.count)
|
|
}
|
|
}
|