Files
shipheart-qt/ephemeride.qml
T

312 lines
13 KiB
QML

import QtQuick 2.12
import QtQuick.Layouts 1.12
import qt.koriolan.shipheart 1.0
import"fonctions.js" as Fonctions
import"fonctions_date_heure.js" as Fonctions_date_heure
import"suncalc.js" as Suncalc
Shipheart_page {
id: page_ephemeride
// Mis en forme :
readonly property double pourcentage_largeur_page_affichage_date_heure: 0.6
readonly property double espace_colonnes_principales: 30
// Affichage :
property bool bouton_bandeau_bas_zone_zone_retour_actif: false
// Données :
property string jour_semaine_courant
property string date_courante
property string heure_courante
property string langue: "FR"
property double test:0
// Modèles :
// Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes
//===========================================================
// Timer 1 seconde :
//===========================================================
Timer {
id: timer_secondes
interval: 1000
triggeredOnStart: true
running: true
repeat: true
onTriggered: {
// Calcul de la date et de l'heure + mise en forme
var date = Fonctions_date_heure.date_courante(null, shipheart_fuseau_horaire, shipheart_heure_ete);
jour_semaine_courant = Fonctions_date_heure.chaine_jour_semaine(date)
date_courante = Fonctions_date_heure.chaine_date_longue(date, shipheart_langue)
heure_courante = Fonctions_date_heure.chaine_heure(date);
// Position :
mise_a_jour();
}
}
// Titre de la page :
Shipheart_titre_1 {titre:qsTr("Ephéméride"); hauteur: shipheart_hauteur_bandeau_haut}
//-------------------------------------------------------
// Ecran de gauche :
//-------------------------------------------------------
Rectangle {
x: 0
y: shipheart_hauteur_bandeau_haut;
width: (shipheart_largeur_page * pourcentage_largeur_page_affichage_date_heure) - (espace_colonnes_principales / 2);
height: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas;
color: "transparent"
Text {
id: texte_jour_semaine
text: jour_semaine_courant
anchors {
verticalCenter: parent.verticalCenter
verticalCenterOffset: -200
horizontalCenter: parent.horizontalCenter
}
// font.family: "Montserrat"
font.pixelSize: 60
color: couleur_blanc_casse
}
Text {
id: texte_date
text: date_courante
textFormat: Text.RichText // Autorise la prise en compte de <sup> par exemple...
anchors {
verticalCenter: parent.verticalCenter
verticalCenterOffset: -100
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 60
color: couleur_blanc_casse
}
Text {
id: texte_heure
text: heure_courante
anchors {
verticalCenter: parent.verticalCenter
verticalCenterOffset: 100
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 100
// font.weight: Font.Bold
color: couleur_blanc_casse
}
Text {
id: texte_fuseau
text: (shipheart_fuseau_horaire > 0) ? "[ UTC +" + shipheart_fuseau_horaire + " ]" : ((shipheart_fuseau_horaire < 0) ? "[ UTC " + shipheart_fuseau_horaire + " ]" : "[ UTC ]" )
// NB : Il n'y a pas de '-' dans le second cas car il est mis automatiquement par la valeur numérique (qui est négative).
anchors {
verticalCenter: parent.verticalCenter
verticalCenterOffset: 250
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 20
color: couleur_blanc_casse
}
Text {
id: texte_heure_ete
text: (shipheart_heure_ete === 0) ? qsTr("Heure d'hiver") : qsTr("Heure d'été")
anchors {
verticalCenter: parent.verticalCenter
verticalCenterOffset: 250 + texte_fuseau.height + 10
horizontalCenter: parent.horizontalCenter
}
font.pixelSize: 16
// font.italic: true
color: couleur_gris_fonce
}
}
//-------------------------------------------------------
// Ecran de droite :
//-------------------------------------------------------
Rectangle {
x: (shipheart_largeur_page * pourcentage_largeur_page_affichage_date_heure) + espace_colonnes_principales;
y: shipheart_hauteur_bandeau_haut;
width: ((shipheart_largeur_page * (1 - pourcentage_largeur_page_affichage_date_heure)) - (espace_colonnes_principales / 2)) * 0.8;
height: shipheart_hauteur_page - shipheart_hauteur_bandeau_haut - shipheart_hauteur_bandeau_bas;
color: "transparent"
ColumnLayout {
width: parent.width
anchors.verticalCenter: parent.verticalCenter
spacing: 0
ListModel {
id: modele_ephemeride
ListElement { evenement: qsTr("Aube nautique"); heure: "00:00"; ligne_sup: 1; ligne_inf: 1; hauteur:40; image: ""; }
ListElement { evenement: qsTr("Lever du soleil"); heure: "00:00"; ligne_sup: 0; ligne_inf: 1; hauteur:40; image: ""; }
ListElement { evenement: qsTr("Zénith"); heure: "00:00"; ligne_sup: 0; ligne_inf: 1; hauteur:40; image: ""; }
ListElement { evenement: qsTr("Coucher du soleil"); heure: "00:00"; ligne_sup: 0; ligne_inf: 1; hauteur:40; image: ""; }
ListElement { evenement: qsTr("Crépuscule nautique"); heure: "00:00"; ligne_sup: 0; ligne_inf: 1; hauteur:40; image: ""; }
ListElement { evenement: ""; heure: ""; ligne_sup: 0; ligne_inf: 1; hauteur:60; image: ""; }
ListElement { evenement: qsTr("Lune"); heure: ""; ligne_sup: 0; ligne_inf: 1; hauteur:60; image: "/images/lune_1.png"; }
ListElement { evenement: ""; heure: ""; ligne_sup: 0; ligne_inf: 1; hauteur:60; image: ""; }
ListElement { evenement: qsTr("Latitude"); heure: "Inconnue"; ligne_sup: 0; ligne_inf: 1; hauteur:40; image: ""; }
ListElement { evenement: qsTr("Longitude"); heure: "Inconnue"; ligne_sup: 0; ligne_inf: 1; hauteur:40; image: ""; }
}
Repeater {
model: modele_ephemeride
Rectangle {
Layout.alignment: Qt.AlignCenter
Layout.preferredWidth: parent.width
Layout.preferredHeight: model.hauteur
color: "transparent"
Rectangle {
id: ligne_sup
height:1
width:parent.width
color: couleur_gris_tres_fonce_transparent
visible: model.ligne_sup ? 1 : 0;
}
Text {
id: titre_ligne
width: parent.width / 2;
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Text.AlignLeft
leftPadding: 10
text: model.evenement
font.pixelSize: 18
color: couleur_blanc_casse
}
Text {
x: titre_ligne.width;
width: parent.width - titre_ligne.width;
anchors.verticalCenter: parent.verticalCenter
horizontalAlignment: Text.AlignRight
rightPadding: 10
text: model.heure
font.pixelSize: 18
color: couleur_blanc_casse
visible: (model.image === "") ? true : false;
}
Image {
visible: (model.image === "") ? false : true;
source: model.image;
anchors.right: parent.right
anchors.rightMargin: 20
anchors.verticalCenter: parent.verticalCenter
sourceSize.height: 40;
}
Rectangle {
id: ligne_inf
anchors.top: parent.bottom;
height:1
width:parent.width
color: couleur_gris_tres_fonce_transparent
visible: model.ligne_inf ? 1 : 0;
}
}
}
}
}
//-------------------------------------------------------
// Bandeau bas :
//-------------------------------------------------------
Row {
x: 0
y: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas;
width: shipheart_largeur_page;
height: shipheart_hauteur_bandeau_bas;
spacing: 5
padding: 5
//.................................................
// Bouton retour
//.................................................
Rectangle {
id: bandeau_bas_zone_retour
width: parent.width - (2 * parent.padding)
height: shipheart_hauteur_bandeau_bas - parent.topPadding - parent.bottomPadding;
radius: 5
color: shipheart_couleur_fond_bouton
Image {
source: "/images/icone_retour.png"
sourceSize.height: 30
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
}
MouseArea { // Zone d'interaction. On est obligé de la mettre dans la grille pour que Rectangle et MouseArea soient frères ou parent/enfant ET qu'on n'occupe qu'un espace dans la grille.
id: mouse_area_bandeau_bas_zone_retour
anchors.fill: parent
onClicked: {
shipheart_clic();
stackView.pop()
}
}
}
}
//===========================================================
// Economiseur : Doit être placé en fin de page pour fonctionner
//===========================================================
MouseArea {
anchors.fill: parent
preventStealing: true // Permet que cela fonctionne même si un élément flickable (notamment) soit derrière et "vole" le click
enabled: flag_economiseur_actif
onClicked: {
mise_en_veille(0);
}
}
//=============================================================================================================
// Mise à jour de la position
//=============================================================================================================
function mise_a_jour()
{
var req, res
var lat, lon;
var altitude = 0;
// Latitude :
modele_ephemeride.set(8, {"heure": Fonctions.chaine_latitude(shipheart_latitude) })
// Longitude :
modele_ephemeride.set(9, {"heure": Fonctions.chaine_longitude(shipheart_longitude) })
// Informations sur le soleil :
modele_ephemeride.set(0, {"heure": shipheart_heure_aube_nautique });
modele_ephemeride.set(1, {"heure": shipheart_heure_lever_soleil });
modele_ephemeride.set(2, {"heure": shipheart_heure_zenith });
modele_ephemeride.set(3, {"heure": shipheart_heure_coucher_soleil });
modele_ephemeride.set(4, {"heure": shipheart_heure_crepuscule_nautique });
// Ajout du calcul de la hauteur du soleil au zénith :
// NON TESTE !! A Tester !!
//var sun_positions = Suncalc.SunCalc.getPosition(Fonctions_date_heure.date_courante(null, shipheart_fuseau_horaire, shipheart_heure_ete), lat, lon);
//console.log("Hauteur du soleil au Zénith : " + (sun_positions.altitude * (180/3.141592653)).toFixed(1) + "°"); // La valeur d'altitude est retournée en radians
//console.log("Azimuth du soleil au Zénith : " + (sun_positions.azimuth * (180/3.141592653)).toFixed(1) + "°"); // La valeur d'azimuth est retournée en radians
// Informations sur la lune :
//console.time('calcul_heures_lune')
var moon_status = Suncalc.SunCalc.getMoonIllumination(Fonctions_date_heure.date_courante(null, shipheart_fuseau_horaire, shipheart_heure_ete));
//console.timeEnd('calcul_heures_lune')
var phase = Number(moon_status.phase);
modele_ephemeride.set(6, {"image": "/images/lune_" + Number(Math.trunc(phase * 16) + 1) + ".png" }) // Sélection d'une image entre 'lune_1.png' et 'lune_16.png'
}
}