Première tranche verticale : domaine circuit via DataProvider/API
This commit is contained in:
+22
@@ -0,0 +1,22 @@
|
||||
# Dossiers de build CMake/Qt Creator
|
||||
build/
|
||||
CMakeFiles/
|
||||
CMakeCache.txt
|
||||
cmake_install.cmake
|
||||
Makefile
|
||||
Testing/
|
||||
.qt/
|
||||
.qtc_clangd/
|
||||
.qtcreator/
|
||||
|
||||
# Fichier de version régénéré à chaque build (cf generate_version.cmake)
|
||||
_version.h
|
||||
|
||||
# Objets compilés
|
||||
*.o
|
||||
*.obj
|
||||
|
||||
# Fichiers de session/éditeur
|
||||
*.autosave
|
||||
*~
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(shipheart_wasm LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS
|
||||
Quick
|
||||
Qml
|
||||
QuickControls2
|
||||
Network
|
||||
)
|
||||
|
||||
qt_add_executable(shipheart_wasm
|
||||
main.cpp
|
||||
dataprovider.cpp
|
||||
dataprovider.h
|
||||
mock/mock_bdd.cpp
|
||||
mock/mock_bdd.h
|
||||
mock/mock_systeme.h
|
||||
mock/mock_tbmesures.h
|
||||
qml.qrc
|
||||
)
|
||||
|
||||
target_link_libraries(shipheart_wasm PRIVATE
|
||||
Qt6::Quick
|
||||
Qt6::Qml
|
||||
Qt6::QuickControls2
|
||||
Qt6::Network
|
||||
)
|
||||
|
||||
# Safari iOS a un plafond de mémoire par onglet bien plus bas que les valeurs
|
||||
# par défaut de Qt pour wasm (cf §19.4 de la synthèse).
|
||||
set_target_properties(shipheart_wasm PROPERTIES
|
||||
QT_WASM_INITIAL_MEMORY 134217728 # 128 Mo
|
||||
QT_WASM_MAXIMUM_MEMORY 536870912 # 512 Mo
|
||||
)
|
||||
|
||||
install(TARGETS shipheart_wasm
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
||||
@@ -0,0 +1,60 @@
|
||||
#include "dataprovider.h"
|
||||
#include <QNetworkRequest>
|
||||
#include <QNetworkReply>
|
||||
#include <QJsonDocument>
|
||||
#include <QJsonObject>
|
||||
#include <QUrl>
|
||||
#include <QUrlQuery>
|
||||
|
||||
DataProvider::DataProvider(QObject *parent) : QObject(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void DataProvider::get_familles(const QString &type)
|
||||
{
|
||||
QUrl url(m_baseUrl + "/elements/familles");
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("type", type);
|
||||
url.setQuery(query);
|
||||
|
||||
auto reply = m_manager.get(QNetworkRequest(url));
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply]() {
|
||||
reply->deleteLater();
|
||||
if (reply->error() != QNetworkReply::NoError) {
|
||||
emit erreur(reply->errorString());
|
||||
return;
|
||||
}
|
||||
const auto doc = QJsonDocument::fromJson(reply->readAll());
|
||||
const auto obj = doc.object();
|
||||
if (obj["status"].toString() != "ok") {
|
||||
emit erreur(obj["message"].toString());
|
||||
return;
|
||||
}
|
||||
emit famillesRecues(obj["familles"].toArray());
|
||||
});
|
||||
}
|
||||
|
||||
void DataProvider::get_elements(const QString &type, int famille)
|
||||
{
|
||||
QUrl url(m_baseUrl + "/elements");
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("type", type);
|
||||
query.addQueryItem("famille", QString::number(famille));
|
||||
url.setQuery(query);
|
||||
|
||||
auto reply = m_manager.get(QNetworkRequest(url));
|
||||
connect(reply, &QNetworkReply::finished, this, [this, reply]() {
|
||||
reply->deleteLater();
|
||||
if (reply->error() != QNetworkReply::NoError) {
|
||||
emit erreur(reply->errorString());
|
||||
return;
|
||||
}
|
||||
const auto doc = QJsonDocument::fromJson(reply->readAll());
|
||||
const auto obj = doc.object();
|
||||
if (obj["status"].toString() != "ok") {
|
||||
emit erreur(obj["message"].toString());
|
||||
return;
|
||||
}
|
||||
emit elementsRecus(obj["elements"].toArray());
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
#include <QObject>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QJsonArray>
|
||||
|
||||
// ============================================================================
|
||||
// DataProvider - couche d'accès aux données du client WASM (cas 2/3).
|
||||
// ----------------------------------------------------------------------------
|
||||
// Remplace, pour les domaines déjà portés, les appels bdd.* directs du cas 1
|
||||
// (qui reste inchangé, cf décision §21.1 de la synthèse). Toute la logique
|
||||
// HTTP/JSON est encapsulée ici - le QML ne voit que des signaux avec des
|
||||
// tableaux déjà prêts à l'emploi.
|
||||
//
|
||||
// Portée actuelle : uniquement le domaine "circuit" (première tranche
|
||||
// verticale). À généraliser aux 3 autres domaines une fois ce pattern validé.
|
||||
// ============================================================================
|
||||
class DataProvider : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DataProvider(QObject *parent = nullptr);
|
||||
|
||||
// TODO : rendre l'adresse de base configurable (IP locale du CM5 en cas 2,
|
||||
// domaine VPS en cas 3 - cf QR code d'accès, §"Architecture cible"/Cas 2-3
|
||||
// de la synthèse) - en dur sur l'IP locale pour cette première tranche.
|
||||
Q_INVOKABLE void get_familles(const QString &type);
|
||||
Q_INVOKABLE void get_elements(const QString &type, int famille);
|
||||
|
||||
signals:
|
||||
void famillesRecues(const QJsonArray &familles);
|
||||
void elementsRecus(const QJsonArray &elements);
|
||||
void erreur(const QString &message);
|
||||
|
||||
private:
|
||||
QNetworkAccessManager m_manager;
|
||||
QString m_baseUrl = QStringLiteral("http://192.168.1.220:8080");
|
||||
};
|
||||
@@ -0,0 +1,61 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QCursor>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQmlContext>
|
||||
#include <QtQml>
|
||||
|
||||
#include "mock/mock_bdd.h"
|
||||
#include "mock/mock_systeme.h"
|
||||
#include "mock/mock_tbmesures.h"
|
||||
#include "dataprovider.h"
|
||||
|
||||
// ============================================================================
|
||||
// main.cpp - shipheart_wasm
|
||||
// ----------------------------------------------------------------------------
|
||||
// Dérivé du main.cpp du POC (§19). Ajout : enregistrement de DataProvider,
|
||||
// qui vient s'ajouter aux mocks existants (toujours nécessaires pour
|
||||
// Shipheart_page.qml/main.qml, qui appellent encore bdd.*/systeme.* pour les
|
||||
// fonctions non liées aux circuits - synchro, veille, etc., cf §19.4).
|
||||
// ============================================================================
|
||||
|
||||
static QJSValue appVersionSingletonProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
|
||||
{
|
||||
Q_UNUSED(engine)
|
||||
|
||||
QJSValue appInfo = scriptEngine->newObject();
|
||||
appInfo.setProperty("adresse_shipbase", QString());
|
||||
appInfo.setProperty("etat_connexion_bdd", 1);
|
||||
appInfo.setProperty("version", QStringLiteral("3.0.0-wasm"));
|
||||
appInfo.setProperty("type_installation", QStringLiteral("0"));
|
||||
appInfo.setProperty("taille_ecran", QString());
|
||||
return appInfo;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QGuiApplication app(argc, argv);
|
||||
app.setOverrideCursor(Qt::BlankCursor);
|
||||
|
||||
QGuiApplication::setApplicationName("ShipHeart_Wasm");
|
||||
QGuiApplication::setApplicationVersion("3.0.0-wasm");
|
||||
|
||||
qmlRegisterType<Bdd>("qt.koriolan.shipheart", 1, 0, "Bdd");
|
||||
qmlRegisterType<TbMesuresModel>("qt.koriolan.shipheart", 1, 0, "TbMesuresModel");
|
||||
qmlRegisterType<Systeme>("qt.koriolan.shipheart", 1, 0, "Systeme");
|
||||
qmlRegisterType<DataProvider>("qt.koriolan.shipheart", 1, 0, "DataProvider");
|
||||
qmlRegisterSingletonType("qt.koriolan.shipheart", 1, 0, "AppInfo", appVersionSingletonProvider);
|
||||
|
||||
auto engine = new QQmlApplicationEngine(&app);
|
||||
engine->setObjectName("currentEngine");
|
||||
|
||||
const QUrl url(QStringLiteral("qrc:/main.qml"));
|
||||
QObject::connect(engine, &QQmlApplicationEngine::objectCreated,
|
||||
&app, [url](QObject *obj, const QUrl &objUrl)
|
||||
{
|
||||
if (!obj && url == objUrl) QCoreApplication::exit(-1);
|
||||
}, Qt::QueuedConnection);
|
||||
|
||||
engine->load(url);
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
#include "mock_bdd.h"
|
||||
|
||||
// ============================================================================
|
||||
// Valeurs fixes du POC - à modifier ici si besoin d'un autre scénario de test.
|
||||
// ============================================================================
|
||||
QVariant Bdd::requete_unique(const QString &req)
|
||||
{
|
||||
// --- Lectures (SELECT) utilisées par le chemin main.qml -> home_attente.qml -> home_accueil.qml ---
|
||||
|
||||
if (req.contains("Nom=\"Specifique_client\""))
|
||||
return QVariantList{ "0" }; // 0 = shipheart_specifique_client_tous -> mène à home_accueil.qml
|
||||
|
||||
if (req.contains("Nom=\"Theme\""))
|
||||
return QVariantList{ "0" }; // Thème 0 = "Original"
|
||||
|
||||
if (req.contains("Nom=\"Version_cm\""))
|
||||
return QVariantList{ "CM5" }; // Doit contenir "CM5" -> shipheart_generation_shipbase_v3
|
||||
|
||||
if (req.contains("Nom=\"Nom_du_bateau\""))
|
||||
return QVariantList{ "Bateau de test (POC WASM)" };
|
||||
|
||||
if (req.contains("Validation_economiseur"))
|
||||
return QVariantList{ "0" }; // Économiseur désactivé par défaut pour ce POC
|
||||
|
||||
// --- Écritures (UPDATE) : Veille, Synchro, New_bip, Theme (cas dépassement d'index) ---
|
||||
// Valeur de retour jamais utilisée par l'appelant dans ces cas -> valeur neutre.
|
||||
return QVariantList{ QString() };
|
||||
}
|
||||
|
||||
int Bdd::requete(const QString &req)
|
||||
{
|
||||
m_derniere_requete = req;
|
||||
|
||||
if (req.contains("Nom=\"Fichier_image_accueil\""))
|
||||
return 1; // 1 ligne de résultat "trouvée"
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
QVariant Bdd::lecture_ligne()
|
||||
{
|
||||
if (m_derniere_requete.contains("Nom=\"Fichier_image_accueil\""))
|
||||
return QVariantList{ "" }; // "" -> l'image par défaut est utilisée (cf home_accueil.qml)
|
||||
|
||||
return QVariantList{};
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#pragma once
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
#include <QVariant>
|
||||
#include <QVariantList>
|
||||
|
||||
// ============================================================================
|
||||
// Bdd (MOCK) - POC WebAssembly
|
||||
// ----------------------------------------------------------------------------
|
||||
// Bouchon de la classe Bdd réelle (bdd.h/bdd.cpp non disponibles à ce stade).
|
||||
// Ne se connecte à aucune base de données : reconnaît le texte de chaque
|
||||
// requête reçue et renvoie une valeur fixe cohérente avec le comportement
|
||||
// attendu par main.qml / Shipheart_page.qml / home_attente.qml / home_accueil.qml.
|
||||
//
|
||||
// Signatures alignées sur l'usage observé dans ces 4 fichiers QML :
|
||||
// - requete_unique(req) -> une seule valeur de résultat (SELECT ou UPDATE)
|
||||
// - requete(req)/lecture_ligne() -> requête à plusieurs lignes potentielles
|
||||
// (ici, une seule ligne utilisée : "Fichier_image_accueil")
|
||||
// ============================================================================
|
||||
class Bdd : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Bdd(QObject *parent = nullptr) : QObject(parent) {}
|
||||
|
||||
Q_INVOKABLE QVariant requete_unique(const QString &req);
|
||||
|
||||
Q_INVOKABLE int requete(const QString &req);
|
||||
Q_INVOKABLE QVariant lecture_ligne();
|
||||
|
||||
private:
|
||||
QString m_derniere_requete;
|
||||
};
|
||||
@@ -0,0 +1,26 @@
|
||||
#pragma once
|
||||
#include <QObject>
|
||||
#include <QString>
|
||||
|
||||
// ============================================================================
|
||||
// Systeme (MOCK) - POC WebAssembly
|
||||
// ----------------------------------------------------------------------------
|
||||
// Bouchon de la classe Systeme réelle (systeme.h/systeme.cpp non disponibles
|
||||
// à ce stade). commande_shell() n'est appelée, dans les fichiers du POC, que
|
||||
// pour les installations "écran déporté" (synchro_repertoires_shiprs() dans
|
||||
// home_attente.qml) - hors scope du chemin ShipBase standard testé ici.
|
||||
// Bouchon neutre par sécurité, au cas où il serait tout de même invoqué.
|
||||
// ============================================================================
|
||||
class Systeme : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit Systeme(QObject *parent = nullptr) : QObject(parent) {}
|
||||
|
||||
Q_INVOKABLE QString commande_shell(const QString &commande, const QString &fichier_sortie)
|
||||
{
|
||||
Q_UNUSED(commande)
|
||||
Q_UNUSED(fichier_sortie)
|
||||
return QString();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,17 @@
|
||||
#pragma once
|
||||
#include <QObject>
|
||||
|
||||
// ============================================================================
|
||||
// TbMesuresModel (MOCK) - POC WebAssembly
|
||||
// ----------------------------------------------------------------------------
|
||||
// Bouchon minimal : dans le périmètre de ce POC (main.qml jusqu'à
|
||||
// home_accueil.qml), ce modèle n'est instancié qu'au niveau racine
|
||||
// (property TbMesuresModel tbmesuresModel : TbMesuresModel{}) et jamais
|
||||
// utilisé au-delà - un QObject vide suffit à ce stade.
|
||||
// ============================================================================
|
||||
class TbMesuresModel : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit TbMesuresModel(QObject *parent = nullptr) : QObject(parent) {}
|
||||
};
|
||||
@@ -0,0 +1,9 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file alias="main.qml">qml/main.qml</file>
|
||||
<file alias="Shipheart_page.qml">qml/Shipheart_page.qml</file>
|
||||
<file alias="home_attente.qml">qml/home_attente.qml</file>
|
||||
<file alias="home_accueil.qml">qml/home_accueil.qml</file>
|
||||
<file alias="home.qml">qml/home.qml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -0,0 +1,171 @@
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
// Shipheart_page est un composant au sens QML. Il commence donc par une majuscule.
|
||||
// Il peut être utilisé partout dans le projet.
|
||||
|
||||
Page {
|
||||
|
||||
id: page
|
||||
|
||||
background: Rectangle { // Attention : Background ne peut avoir qu'un seul élément [a priori, pas complètement sûr...] => on créé un Rectangle de plus haut niveau et on met ensuite dedans ce qu'on veut...
|
||||
anchors.fill: parent
|
||||
color: shipheart_theme_couleur_fond_ecran
|
||||
|
||||
Image {
|
||||
anchors.fill: parent
|
||||
fillMode: Image.Tile
|
||||
// fillMode: Image.PreserveAspectCrop
|
||||
source: shipheart_theme_fichier_fond_ecran
|
||||
visible: (shipheart_theme_fichier_fond_ecran !== "")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//=================================================================================================
|
||||
// Fonction : Shipheart_clic
|
||||
// Cette fonction est normalement appelé à chaque appel d'un 'MouseArea.OnClick'
|
||||
//=================================================================================================
|
||||
function shipheart_clic()
|
||||
{
|
||||
emission_bip();
|
||||
reload_economiseur();
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// Fonction : Vérifie si la configuration en cours nécessite l'émission d'un bip.
|
||||
// Si oui, met à jour le champ correspondant dans la BDD et fait une demande
|
||||
// de synchro pour que celle-ci soit prise en compte rapidmeent.
|
||||
// Reçoit : Rien
|
||||
// Retour : Rien
|
||||
//=====================================================================================
|
||||
function emission_bip()
|
||||
{
|
||||
|
||||
if ((shipheart_bips !== "") && // Si shipheart_bips = "", il n'y a aucun bip à émettre...
|
||||
(shipheart_type_installation === shipheart_type_installation_shipbase)) // SDIR 317 : ... et si on est sur ShipRS, on n'émet pas de bips
|
||||
{
|
||||
bdd.requete_unique("UPDATE TB_Systeme SET Valeur='" + shipheart_bips + "/0/0/0' WHERE Nom='New_bip'");
|
||||
synchro_bdd(shipheart_type_synchro_data);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Fonction : Réarmement économiseur
|
||||
//=================================================================================================
|
||||
function reload_economiseur()
|
||||
{
|
||||
var req, res;
|
||||
|
||||
/* // La valeur est relue à chaque fois dans la BDD pour être certain d'avoir la dernière valeur :
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom LIKE "%Time_out_economiseur%" ';
|
||||
res = bdd.requete_unique(req);
|
||||
shipheart_compteur_economiseur = Number(res[0]);
|
||||
*/
|
||||
shipheart_compteur_economiseur = shipheart_time_out_economiseur;
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Fonction : Demande de mise en veille (on ou off)
|
||||
//=================================================================================================
|
||||
function mise_en_veille(veille)
|
||||
{
|
||||
if (shipheart_type_installation !== shipheart_type_installation_shipbase) return; // SDIR #251
|
||||
|
||||
if (veille === 0) // On sort toujours du mode veille si c'est demandé
|
||||
{
|
||||
bdd.requete_unique('UPDATE TB_Systeme SET Valeur=' + veille + ' WHERE Nom="Veille"');
|
||||
synchro_bdd(shipheart_type_synchro_data);
|
||||
//console.log("Sortie de veille");
|
||||
|
||||
flag_economiseur_actif = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((veille === 1) && (get_validation_economiseur() === 1)) // On ne rentre en veille que si c'est demandé (le time-out a expiré ET l'économiseur est valide)
|
||||
{
|
||||
bdd.requete_unique('UPDATE TB_Systeme SET Valeur=' + veille + ' WHERE Nom="Veille"');
|
||||
synchro_bdd(shipheart_type_synchro_data);
|
||||
|
||||
flag_economiseur_actif = true;
|
||||
}
|
||||
//else console.log("Demande d'activation de l'économiseur alors qu'il est dévalidé")
|
||||
}
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Fonction : Change l'état de la validation économiseur
|
||||
//=================================================================================================
|
||||
function changer_validation_economiseur()
|
||||
{
|
||||
var req, res;
|
||||
var new_val;
|
||||
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom LIKE "%Validation_economiseur%" ';
|
||||
res = bdd.requete_unique(req);
|
||||
|
||||
if (Number(res[0]) === 0) new_val = '1';
|
||||
else new_val = '0';
|
||||
|
||||
bdd.requete_unique('UPDATE TB_Configuration SET Valeur=' + new_val + ' WHERE Nom LIKE "%Validation_economiseur%" ');
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Fonction : Retourne l'état actuel de la validation de l'économiseur
|
||||
//=================================================================================================
|
||||
function get_validation_economiseur()
|
||||
{
|
||||
var req, res;
|
||||
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom LIKE "%Validation_economiseur%" ';
|
||||
res = bdd.requete_unique(req);
|
||||
|
||||
return(Number(res[0]));
|
||||
}
|
||||
|
||||
//=================================================================================================
|
||||
// Fonction : Charge les paramètres du thème en cours
|
||||
//=================================================================================================
|
||||
function chargement_theme()
|
||||
{
|
||||
var req, res;
|
||||
|
||||
// Récupération du paramètre 'TB_Configuration.Theme'
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Theme" ';
|
||||
res = bdd.requete_unique(req);
|
||||
|
||||
// Vérifie que la n° de thème sélectionné est bien compatible avec les thèmes présents sur cette version (on peut imaginer qu'on en ait supprimé...) :
|
||||
if (Number(res[0]) >= shipheart_config_themes.length)
|
||||
{
|
||||
shipheart_theme = 0; // Valeur par défaut
|
||||
req = 'UPDATE TB_Configuration '; // Mise à jour dans la BDD pour les prochains démarrages
|
||||
req += ' SET Valeur="' + shipheart_theme + '" ';
|
||||
req += ' WHERE Nom="Theme" ';
|
||||
//console.log("Requête = " + req)
|
||||
bdd.requete_unique(req);
|
||||
}
|
||||
else shipheart_theme = Number(res[0]); // Cas normal
|
||||
|
||||
// Mise à jour des paramètres d'affcihage liés au thème choisit :
|
||||
shipheart_theme_fichier_fond_ecran = shipheart_config_themes[shipheart_theme][shipheart_index_theme_fichier_fond_ecran];
|
||||
shipheart_theme_couleur_fond_ecran = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_ecran];
|
||||
shipheart_couleur_fond_bouton_actif = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_bouton_actif];
|
||||
shipheart_couleur_texte_titre_1 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_titre_1];
|
||||
shipheart_couleur_texte_titre_2 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_titre_2];
|
||||
shipheart_couleur_texte_titre_3 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_titre_3];
|
||||
shipheart_couleur_fond_boite_dialogue_niveau_0 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_boite_dialogue_niveau_0];
|
||||
shipheart_couleur_fond_boite_dialogue_niveau_1 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_boite_dialogue_niveau_1];
|
||||
shipheart_couleur_fond_boite_dialogue_niveau_2 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_fond_boite_dialogue_niveau_2];
|
||||
shipheart_couleur_texte_boite_dialogue_niveau_0 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_boite_dialogue_niveau_0];
|
||||
shipheart_couleur_texte_boite_dialogue_niveau_1 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_boite_dialogue_niveau_1];
|
||||
shipheart_couleur_texte_boite_dialogue_niveau_2 = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_boite_dialogue_niveau_2];
|
||||
shipheart_couleur_texte_slider = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_texte_slider];
|
||||
shipheart_couleur_bordure_courbes = shipheart_config_themes[shipheart_theme][shipheart_index_theme_couleur_bordure_courbes];
|
||||
|
||||
//console.log("Thème d'affichage à utiliser = " + shipheart_theme + " [fichier = '" + shipheart_theme_fichier_fond_ecran + "' et couleur = '" + shipheart_theme_couleur_fond_ecran + "']");
|
||||
}
|
||||
}
|
||||
+183
@@ -0,0 +1,183 @@
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
import QtQuick.Layouts 1.12
|
||||
|
||||
import qt.koriolan.shipheart 1.0
|
||||
|
||||
// ============================================================================
|
||||
// home.qml (EMBRYON - POC WASM production, domaine circuit uniquement)
|
||||
// ----------------------------------------------------------------------------
|
||||
// Version très réduite du vrai home.qml (~3880 lignes, tous domaines) :
|
||||
// couvre uniquement l'affichage des circuits, via l'API réelle (DataProvider)
|
||||
// au lieu de bdd.*. Objectif : valider la chaîne complète (HTTP réel, JSON,
|
||||
// affichage QML) sur un seul domaine avant de généraliser.
|
||||
//
|
||||
// Simplifications volontaires par rapport au vrai home.qml :
|
||||
// - Lecture seule (pas de changement de consigne au clic - l'endpoint
|
||||
// d'écriture n'est pas encore construit côté API, cf synthèse §20.7)
|
||||
// - Un seul domaine affiché (pas de batteries/réservoirs/capteurs/pages
|
||||
// personnalisées/messages/réveils/minuteur)
|
||||
// - Délégué d'affichage simplifié (pas Shipheart_bouton_circuit, qui
|
||||
// embarque des actions d'écriture non encore branchées)
|
||||
// - mise_a_jour_onglets_circuits() n'existe plus : l'API renvoie déjà
|
||||
// l'état agrégé par famille dans /elements/familles (cf §20.7/21.5)
|
||||
// ============================================================================
|
||||
|
||||
Shipheart_page {
|
||||
id: page_accueil
|
||||
|
||||
readonly property int deport_haut_masquage_onglets: 20
|
||||
readonly property int rayon_onglets: 20
|
||||
property int nombre_colonnes_affichage_circuits: 2
|
||||
property int nombre_circuits_affiches_sur_une_colonne: 4
|
||||
property int id_groupe_circuits: 0
|
||||
|
||||
ListModel { id: modele_onglets_circuits }
|
||||
ListModel { id: modele_circuits }
|
||||
|
||||
property DataProvider dataProvider: DataProvider {}
|
||||
|
||||
Connections {
|
||||
target: dataProvider
|
||||
|
||||
function onFamillesRecues(familles) {
|
||||
modele_onglets_circuits.clear();
|
||||
for (var i = 0; i < familles.length; i++) {
|
||||
var f = familles[i];
|
||||
modele_onglets_circuits.append({
|
||||
"id": f.id,
|
||||
"libelle": f.nom,
|
||||
"etat": f.etat,
|
||||
"actif": (f.id === id_groupe_circuits)
|
||||
});
|
||||
// Sélectionne la première famille par défaut si aucune n'est choisie :
|
||||
if (id_groupe_circuits === 0 && i === 0) {
|
||||
id_groupe_circuits = f.id;
|
||||
dataProvider.get_elements("circuit", id_groupe_circuits);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onElementsRecus(elements) {
|
||||
modele_circuits.clear();
|
||||
for (var j = 0; j < elements.length; j++) {
|
||||
modele_circuits.append(elements[j]);
|
||||
}
|
||||
}
|
||||
|
||||
function onErreur(message) {
|
||||
console.log("DataProvider erreur : " + message);
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
dataProvider.get_familles("circuit");
|
||||
}
|
||||
|
||||
// Rafraîchissement périodique (remplace mise_a_jour_circuits(), appelée chaque seconde côté natif) :
|
||||
Timer {
|
||||
interval: 1000
|
||||
running: true
|
||||
repeat: true
|
||||
onTriggered: {
|
||||
if (id_groupe_circuits > 0) dataProvider.get_elements("circuit", id_groupe_circuits);
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
spacing: 10
|
||||
|
||||
//-----------------------------------------------------------
|
||||
// Onglets (familles) :
|
||||
Rectangle {
|
||||
id: onglets_circuits
|
||||
Layout.fillWidth: true
|
||||
height: shipheart_hauteur_bandeau_haut
|
||||
color: "transparent"
|
||||
visible: modele_onglets_circuits.count > 1
|
||||
|
||||
GridView {
|
||||
id: grille_onglets_circuits
|
||||
anchors.fill: parent
|
||||
cellWidth: width / Math.max(1, Math.min(modele_onglets_circuits.count, 5))
|
||||
cellHeight: shipheart_hauteur_bandeau_haut
|
||||
model: modele_onglets_circuits
|
||||
clip: true
|
||||
|
||||
delegate: Rectangle {
|
||||
width: grille_onglets_circuits.cellWidth - 2
|
||||
height: grille_onglets_circuits.cellHeight
|
||||
radius: rayon_onglets
|
||||
color: model.actif ? shipheart_couleur_fond_bouton_actif : shipheart_couleur_fond_bouton
|
||||
|
||||
Text {
|
||||
text: model.libelle
|
||||
anchors.centerIn: parent
|
||||
color: couleur_blanc_casse
|
||||
font.pixelSize: 14
|
||||
font.bold: model.actif
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
id_groupe_circuits = model.id;
|
||||
for (var k = 0; k < modele_onglets_circuits.count; k++) {
|
||||
modele_onglets_circuits.set(k, {"actif": (modele_onglets_circuits.get(k).id === model.id)});
|
||||
}
|
||||
dataProvider.get_elements("circuit", id_groupe_circuits);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------
|
||||
// Circuits de la famille sélectionnée :
|
||||
GridView {
|
||||
id: circuits_grid
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
cellWidth: width / nombre_colonnes_affichage_circuits
|
||||
cellHeight: height / nombre_circuits_affiches_sur_une_colonne
|
||||
model: modele_circuits
|
||||
clip: true
|
||||
|
||||
delegate: Rectangle {
|
||||
width: circuits_grid.cellWidth - 4
|
||||
height: circuits_grid.cellHeight - 4
|
||||
radius: 10
|
||||
color: shipheart_couleur_fond_bouton
|
||||
border.color: (model.etat === 2) ? "red" : (model.etat === 1) ? "orange" : "transparent"
|
||||
border.width: 2
|
||||
|
||||
Column {
|
||||
anchors.centerIn: parent
|
||||
spacing: 4
|
||||
|
||||
Text {
|
||||
text: model.nom
|
||||
color: couleur_blanc_casse
|
||||
font.pixelSize: 14
|
||||
font.bold: true
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
Text {
|
||||
text: model.tension.toFixed(1) + " V " + model.intensite.toFixed(2) + " A"
|
||||
color: couleur_blanc_casse
|
||||
font.pixelSize: 12
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
anchors.centerIn: parent
|
||||
visible: circuits_grid.count === 0
|
||||
text: qsTr("Aucun circuit dans ce groupe.")
|
||||
color: couleur_rouge_transparent
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,222 @@
|
||||
//========================================================================================================================================================================
|
||||
// HOME_ACCUEIL.QML
|
||||
// Ce fichier est la page d'accueil par défaut. Il propose l'affichage du logo ShipHeart et le nom du bateau.
|
||||
// La page est appelée depuis la page main.qml lorsque le paramètre 'shipheart_specifique_client[0]' est égal à 0
|
||||
//========================================================================================================================================================================
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
import qt.koriolan.shipheart 1.0
|
||||
|
||||
|
||||
|
||||
Shipheart_page {
|
||||
id: page_home_o_yachts
|
||||
|
||||
|
||||
// Mis en forme :
|
||||
readonly property double pourcentage_hauteur_ligne_haut: 0.7
|
||||
readonly property double espace_lignes_principales: 0 // L'espace ne sert à rien et est même contre-productif pour avoir le logo centré entre haut de l'écran et le texte "Bienvenue à bord...."
|
||||
readonly property double affichage_hauteur_utile: shipheart_hauteur_page - shipheart_hauteur_bandeau_bas
|
||||
|
||||
readonly property int periode_raffraichissement_parametres: 1000 // En ms
|
||||
readonly property int duree_affichage: 15 // En s
|
||||
|
||||
// Affichage :
|
||||
|
||||
// Données :
|
||||
property string nom_du_bateau: ""
|
||||
property int compteur_affichage: 0
|
||||
|
||||
// Modèles :
|
||||
// Note : les modèles chargés dans 'main.qml' n'ont pas à être rechargés dans les pages suivantes
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// Ouverture :
|
||||
//-------------------------------------------------
|
||||
StackView.onActivating: { // Le 'onActivating' permet de ne pas voir la mise à jour puisqu'elle est lancée dès que la page va être chargée
|
||||
init_page();
|
||||
timer_raffraichissement_parametres.start();
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// Fermeture :
|
||||
//-------------------------------------------------
|
||||
StackView.onDeactivating: {
|
||||
timer_raffraichissement_parametres.stop();
|
||||
}
|
||||
|
||||
//===========================================================
|
||||
// Timer periode raffraichissement parametres :
|
||||
//===========================================================
|
||||
Timer {
|
||||
id: timer_raffraichissement_parametres
|
||||
interval: periode_raffraichissement_parametres
|
||||
triggeredOnStart: false
|
||||
running: true
|
||||
repeat: true
|
||||
onTriggered: {
|
||||
if (++ compteur_affichage > duree_affichage) sortie_page();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------
|
||||
// Ecran Haut :
|
||||
//-------------------------------------------------------
|
||||
Rectangle {
|
||||
id: zone_affichage_haut_gauche
|
||||
x: 0
|
||||
y: 0
|
||||
width: shipheart_largeur_page
|
||||
height: (affichage_hauteur_utile * pourcentage_hauteur_ligne_haut) - (espace_lignes_principales);
|
||||
color: "transparent"
|
||||
|
||||
Image {
|
||||
source: (shipheart_fichier_image_accueil !== "")
|
||||
? "file://" + shipheart_repertoire_config + shipheart_sous_repertoire_images_accueil + "/" + shipheart_fichier_image_accueil
|
||||
: "/images/" + shipheart_nom_fichier_image_accueil_par_defaut
|
||||
sourceSize.height: parent.height * 0.7
|
||||
anchors {
|
||||
verticalCenter: parent.verticalCenter
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//-------------------------------------------------------
|
||||
// Ecran Bas :
|
||||
//-------------------------------------------------------
|
||||
Rectangle {
|
||||
id: zone_affichage_bas_gauche
|
||||
x: 0
|
||||
y: zone_affichage_haut_gauche.height + espace_lignes_principales;
|
||||
width: shipheart_largeur_page
|
||||
height: (affichage_hauteur_utile * (1 - pourcentage_hauteur_ligne_haut)) - (espace_lignes_principales);
|
||||
color: "transparent"
|
||||
|
||||
Text {
|
||||
anchors {
|
||||
top: parent.top // Permet que ce texte soit juste en-dessous de la zone haute (sur laquelle le logo est centré => donc le logo est centré entre haut de l'écran et ce texte)
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
}
|
||||
font.pixelSize: 24
|
||||
text: qsTr("Bienvenue à bord de");
|
||||
color: couleur_blanc_casse
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors {
|
||||
verticalCenter: parent.verticalCenter
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
verticalCenterOffset: -20 // Remonté légèrement le nom du bateau...
|
||||
}
|
||||
font.pixelSize: 50
|
||||
text: '" ' + nom_du_bateau + ' "';
|
||||
color: couleur_blanc_casse
|
||||
font.weight: Font.Black
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//-------------------------------------------------------
|
||||
// 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
|
||||
|
||||
Rectangle {
|
||||
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
color: shipheart_couleur_fond_bouton //"transparent"
|
||||
|
||||
Rectangle { // Barre augmentant selon l'évolution du compteur_affichage
|
||||
width: (compteur_affichage / duree_affichage) * parent.width
|
||||
height: parent.height
|
||||
color: shipheart_couleur_fond_bouton_actif
|
||||
opacity: 0.5
|
||||
radius: shipheart_rayon_bouton
|
||||
Behavior on width { NumberAnimation { duration: periode_raffraichissement_parametres } }
|
||||
}
|
||||
|
||||
Image {
|
||||
source: "/images/right_sombre.png"
|
||||
sourceSize.height: parent.height * 0.5
|
||||
anchors {
|
||||
verticalCenter: parent.verticalCenter
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
horizontalCenterOffset: -10
|
||||
}
|
||||
}
|
||||
Image {
|
||||
source: "/images/right_sombre.png"
|
||||
sourceSize.height: parent.height * 0.5
|
||||
anchors {
|
||||
verticalCenter: parent.verticalCenter
|
||||
horizontalCenter: parent.horizontalCenter
|
||||
horizontalCenterOffset: +10
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
shipheart_clic();
|
||||
sortie_page();
|
||||
//stackView.push("parametres_avances.qml");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================================================
|
||||
// Init de la page
|
||||
//=============================================================================================================
|
||||
function init_page()
|
||||
{
|
||||
var req, res
|
||||
|
||||
mise_en_veille(0);
|
||||
console.log("Init de Home_accueil...");
|
||||
|
||||
// Mise à jour du nom du bateau :
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Nom_du_bateau" ';
|
||||
res = bdd.requete_unique(req);
|
||||
nom_du_bateau = res[0];
|
||||
|
||||
compteur_affichage = 0;
|
||||
}
|
||||
|
||||
//=============================================================================================================
|
||||
// Sortie de la page
|
||||
//=============================================================================================================
|
||||
function sortie_page()
|
||||
{
|
||||
|
||||
compteur_affichage = 0; // Pour le cas où on réouvrirait la page (via le bouton paramètres / appui long) ; dans ce cas, la remise à 0 du compteur prend quelques secondes (ce sera donc fait avant si on le remet de suite à 0)
|
||||
stackView.push("home.qml");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,285 @@
|
||||
//========================================================================================================================================================================
|
||||
// HOME_ATTENTE.QML
|
||||
// Ce fichier affiche un fond d'écran standard mais avec rien dedans. Il est utilisé au démarrage, pour attendre que l'ApplicationWindow soit prête
|
||||
// et que l'accès à la BDD permette de décider quelle page d'accueil lancer.
|
||||
// Sans cette page, la StackView affiche une page toute blanche pendant 1-2s avant que la première Home page soit chargée...
|
||||
//========================================================================================================================================================================
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12
|
||||
|
||||
import qt.koriolan.shipheart 1.0
|
||||
|
||||
|
||||
|
||||
Shipheart_page {
|
||||
id: page_home_attente
|
||||
|
||||
|
||||
//==============================================================
|
||||
// Recherche de la Home Page à utiliser :
|
||||
//==============================================================
|
||||
Timer {
|
||||
id: timer_recherche_home_page
|
||||
interval: 300
|
||||
running: true
|
||||
repeat: true
|
||||
onTriggered: {
|
||||
|
||||
console.log("Adresse de ShipBase = " + AppInfo.adresse_shipbase)
|
||||
console.log("Etat de la connexion à la BDD = " + AppInfo.etat_connexion_bdd)
|
||||
console.log("Type d'installation = " + AppInfo.type_installation)
|
||||
console.log("Taille de l'écran = " + AppInfo.taille_ecran)
|
||||
|
||||
//----------------------------------------------------
|
||||
// Valeurs correspondant au type d'installation :
|
||||
//----------------------------------------------------
|
||||
switch (Number(AppInfo.type_installation))
|
||||
{
|
||||
default:
|
||||
case shipheart_type_installation_shipbase:
|
||||
shipheart_type_installation = shipheart_type_installation_shipbase;
|
||||
break;
|
||||
|
||||
case shipheart_type_installation_ecran_deporte:
|
||||
switch (Number(AppInfo.taille_ecran))
|
||||
{
|
||||
default:
|
||||
case 7:
|
||||
shipheart_type_installation = shipheart_type_installation_ecran_deporte_7_pouces;
|
||||
break;
|
||||
case 10:
|
||||
shipheart_type_installation = shipheart_type_installation_ecran_deporte_10_pouces;
|
||||
break;
|
||||
case 22:
|
||||
shipheart_type_installation = shipheart_type_installation_ecran_deporte_22_pouces;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
console.log("Type d'installation = " + shipheart_type_installation)
|
||||
//shipheart_type_installation = shipheart_type_installation_shipbase
|
||||
//shipheart_type_installation = shipheart_type_installation_ecran_deporte_22_pouces
|
||||
|
||||
// Valeurs par défaut :
|
||||
// shipheart_largeur_page = 1280
|
||||
// shipheart_hauteur_page = 800
|
||||
shipheart_largeur_page = Qt.application.screens[0].width
|
||||
shipheart_hauteur_page = Qt.application.screens[0].height
|
||||
|
||||
shipheart_hauteur_bandeau_haut = 60
|
||||
shipheart_hauteur_titre_2 = 50
|
||||
shipheart_hauteur_bandeau_bas = 80
|
||||
shipheart_hauteur_clavier = 305
|
||||
|
||||
|
||||
//----------------------------------------------------
|
||||
// Cas où la connexion à la BDD n'a pas été possible :
|
||||
//----------------------------------------------------
|
||||
if ((AppInfo.etat_connexion_bdd === 0) && (Number(AppInfo.type_installation) === shipheart_type_installation_ecran_deporte))
|
||||
{
|
||||
stackView.push("config_shiprs.qml", {"connexion_impossible": true})
|
||||
timer_recherche_home_page.stop(); // Arret du timer car il n'est plus utile maintenant
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
//----------------------------------------------------
|
||||
// Paramètres spécifiques dans le cas des ShipRS :
|
||||
// NB il est important de ne PAS faire ce traitement avant l'appel
|
||||
// à 'connexion_impossible.qml' car, sinon, on peut se trouver dans une
|
||||
// config de 22" (par exemple) et ne plus avoir accès aux boutons de
|
||||
// configuration !!
|
||||
//----------------------------------------------------
|
||||
switch (shipheart_type_installation)
|
||||
{
|
||||
//---------------------------------------------------------------------------
|
||||
case shipheart_type_installation_ecran_deporte_7_pouces:
|
||||
shipheart_largeur_page = 1280;
|
||||
shipheart_hauteur_page = 800;
|
||||
synchro_repertoires_shiprs();
|
||||
break;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
case shipheart_type_installation_ecran_deporte_10_pouces:
|
||||
shipheart_largeur_page = 1280; // Spec de l'écran DENSITRON de ShipBase
|
||||
shipheart_hauteur_page = 800; // Spec de l'écran DENSITRON de ShipBase
|
||||
synchro_repertoires_shiprs();
|
||||
break;
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
case shipheart_type_installation_ecran_deporte_22_pouces:
|
||||
shipheart_largeur_page = 1920;
|
||||
shipheart_hauteur_page = 1080;
|
||||
synchro_repertoires_shiprs();
|
||||
break;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
default: // Dans ce cas, ce sont les valeurs par défaut qui sont conservées.
|
||||
case shipheart_type_installation_shipbase:
|
||||
break;
|
||||
}
|
||||
|
||||
//----------------------------------------------------
|
||||
// Recherche de la version de ShipBase :
|
||||
//----------------------------------------------------
|
||||
init_shipheart_version_cm();
|
||||
|
||||
//----------------------------------------------------
|
||||
// Recherche du thème d'affichage :
|
||||
//----------------------------------------------------
|
||||
init_shipheart_theme();
|
||||
|
||||
|
||||
//----------------------------------------------------
|
||||
// Première page à afficher selon le client :
|
||||
//----------------------------------------------------
|
||||
var shipheart_nom_initial_page = "";
|
||||
switch (Number(init_shipheart_specifique_client()))
|
||||
{
|
||||
//---------------------------------
|
||||
default:
|
||||
case shipheart_specifique_client_tous:
|
||||
shipheart_nom_initial_page = "qrc:/home_accueil.qml"
|
||||
break;
|
||||
|
||||
//---------------------------------
|
||||
case shipheart_specifique_client_suncy:
|
||||
shipheart_nom_initial_page = "qrc:/home_suncy.qml";
|
||||
break;
|
||||
}
|
||||
|
||||
if ((shipheart_generation_shipbase != shipheart_generation_shipbase_inconnue) && // A priori, ne devrait pas arriver mais si on n'a pas trouvé, on va reommencer la recherche après une période de timer.
|
||||
(shipheart_nom_initial_page !== ""))
|
||||
{
|
||||
timer_recherche_home_page.stop(); // Arret du timer car il n'est plus utile maintenant
|
||||
stackView.push(shipheart_nom_initial_page)
|
||||
//console.log("La Home Page sélectionnée est '" + shipheart_nom_initial_page + "'")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
// Réactivation de la recherche lors d'un retour sur cette page :
|
||||
//==============================================================
|
||||
StackView.onActivated: {
|
||||
//console.log("!!! Page Home_attente activée")
|
||||
timer_recherche_home_page.start(); // Relance le timer pour faire une nouvelle recherche
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
// Zone d'affichage :
|
||||
//==============================================================
|
||||
Rectangle {
|
||||
x: 0
|
||||
y: 0
|
||||
width: 5000 // Permet d'être qûr qu'on couvre tout l'écran, quel qu'il soit
|
||||
height: 5000 // Permet d'être qûr qu'on couvre tout l'écran
|
||||
color: "transparent" // C'est la ligne importante qui permet de ne pas avoir un "flash' blanc au démarrage
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
// Fonction : Récpère dans la BDD la valeur de 'Specifique_client' dans
|
||||
// TB_Configuration. sépare chaque champs (séparés par des ';').
|
||||
// Met à jour la propriété globale 'shipheart_specifique_client'
|
||||
// avec toutes les valeurs. Renvoi la première.
|
||||
// Reçoit : Rien
|
||||
// Retour : La valeur de 'shipheart_specifique_client[0]'
|
||||
//============================================================================
|
||||
function init_shipheart_specifique_client()
|
||||
{
|
||||
var req, res
|
||||
|
||||
// Récupération du paramètre 'TB_Configuration.Specifique_client'
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Specifique_client" ';
|
||||
res = bdd.requete_unique(req);
|
||||
|
||||
shipheart_specifique_client = res[0].split(';') // Mémorisation de l'ensemble du tableau
|
||||
|
||||
return(shipheart_specifique_client[0]); // Renvoi de la première valeur
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
// Fonction : Récupère dans la BDD la valeur de 'Theme' dans
|
||||
// TB_Configuration et met à jour la propriété globale 'shipheart_theme'.
|
||||
// Reçoit : Rien
|
||||
// Retour : Rien
|
||||
//============================================================================
|
||||
function init_shipheart_theme()
|
||||
{
|
||||
var req, res;
|
||||
var nb;
|
||||
|
||||
// Chargement du thème demandé en config :
|
||||
chargement_theme();
|
||||
|
||||
// Récupération du paramètre 'TB_Configuration.Fichier_image_accueil'
|
||||
req = 'SELECT Valeur FROM TB_Configuration WHERE Nom="Fichier_image_accueil" ';
|
||||
//console.log("Requête = [ " + req + "; ]");
|
||||
nb = bdd.requete(req);
|
||||
//console.log("NB = "+nb);
|
||||
if (nb >0)
|
||||
{
|
||||
res = bdd.lecture_ligne();
|
||||
if (!res.isEmpty)
|
||||
{
|
||||
shipheart_fichier_image_accueil = res[0];
|
||||
console.log("Le fichier d'image d'accueil est : [" + shipheart_fichier_image_accueil + "]");
|
||||
}
|
||||
else
|
||||
{
|
||||
shipheart_fichier_image_accueil = "";
|
||||
console.log("/!\ Erreur dans le traitementr de la requête de recherche de fichier d'image d'accueil a échouée. Le nom de fichier est mis à sa valeur par défaut...");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
shipheart_fichier_image_accueil = "";
|
||||
console.log("/!\ La requête de recherche de fichier d'image d'accueil a échouée. Le nom de fichier est mis à sa valeur par défaut...");
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
// Fonction : Récupère dans la BDD la valeur de 'Version_cm' dans
|
||||
// TB_Systeme et met à jour la propriété globale 'shipheart_generation_shipbase'.
|
||||
// Reçoit : Rien
|
||||
// Retour : Rien
|
||||
//============================================================================
|
||||
function init_shipheart_version_cm()
|
||||
{
|
||||
var req, res
|
||||
|
||||
// Récupération du paramètre 'TB_Systeme.Version_cm'
|
||||
req = 'SELECT Valeur FROM TB_Systeme WHERE Nom="Version_cm" ';
|
||||
res = bdd.requete_unique(req);
|
||||
|
||||
if (res[0].indexOf("CM3+") !== -1) shipheart_generation_shipbase = shipheart_generation_shipbase_v1;
|
||||
else if (res[0].indexOf("CM4") !== -1) shipheart_generation_shipbase = shipheart_generation_shipbase_v2;
|
||||
else if (res[0].indexOf("CM5") !== -1) shipheart_generation_shipbase = shipheart_generation_shipbase_v3;
|
||||
else shipheart_generation_shipbase = shipheart_generation_shipbase_inconnue;
|
||||
console.log("Génération de ShipBase = " + shipheart_generation_shipbase);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//=============================================================================================================
|
||||
// Synchroniser répertoire docs ShipRS
|
||||
//=============================================================================================================
|
||||
function synchro_repertoires_shiprs()
|
||||
{
|
||||
var commande;
|
||||
|
||||
commande = "rsync -aPs --delete -e \"ssh -p 2022 -o StrictHostKeyChecking=no \" koriolan@" + AppInfo.adresse_shipbase + ":" + shipheart_repertoire_config + "/ " + shipheart_repertoire_config + "/";
|
||||
systeme.commande_shell(commande, "");
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
+1069
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user