Import initial du projet shipheart_cm5

This commit is contained in:
2026-08-13 09:19:38 +02:00
commit 53e47729fb
533 changed files with 127946 additions and 0 deletions
+316
View File
@@ -0,0 +1,316 @@
import QtQuick 2.12
import QtQuick.Controls 2.12
Popup {
id: boite_dialogue_validation_securisee
// Propriétés fixes :
readonly property double pourcentage_largeur_page_popup: 0.6
readonly property double pourcentage_hauteur_page_popup: 0.7
readonly property int padding_popup: 50
readonly property double pourcentage_boite_dialogue_titre: 0.25
readonly property double pourcentage_boite_dialogue_message: 1 - pourcentage_boite_dialogue_titre - pourcentage_boite_dialogue_ligne_boutons
readonly property double pourcentage_boite_dialogue_ligne_boutons: 0.15
readonly property int bouton_largeur: 200
readonly property int step_timer_appui_long: 30 // en ms
// Propriétés :
property int valeur_timer_appui_long: 0
property int niveau: 0
property string message: "--"
property int type: 0 // Utilisé uniquement par la page appelante pour distinguer les différents appels dans la même page
// Propriétés alias :
property alias boutonOk: bouton_ok.visible
property alias boutonAnnuler: bouton_annuler.visible
property alias boutonSecurise: bouton_securise.visible
property alias boutonOkTexte: bouton_ok_label.text
property alias boutonAnnulerTexte: bouton_annuler_label.text
property alias boutonSecuriseTexte: bouton_securise_label.text
property alias alignementMessage: texte_message.horizontalAlignment
property alias imageTitreSource: image_titre.source
property alias affichageAscenseur: ascenseur.visible
// Signaux :
signal clicked(int bouton) // Valeur à lire lorsque le "OnClicked' est activé
//===========================================================
// Timer pour gérer les appuis longs :
//===========================================================
Timer {
id: timer_appui_long
interval: step_timer_appui_long
triggeredOnStart: false
repeat: true
onTriggered: {
if (valeur_timer_appui_long < shipheart_mouse_press_and_hold_interval_tres_long) valeur_timer_appui_long+= step_timer_appui_long;
else // Le fait de ne pas utilise le OnPressandHold permet d'être sût que la sortie se fait au même moment que la fin du comptage (sinon, on peut avoir de petits décalages)
{
timer_appui_long.running = false;
valeur_timer_appui_long = 0;
if (mousearea_bouton_securise.pressed)
{
boite_dialogue_validation_securisee.clicked(shipheart_boite_dialogue_bouton_4);
}
}
}
}
x: (shipheart_largeur_page * (1 - pourcentage_largeur_page_popup)) / 2;
y: (shipheart_hauteur_page * (1 - pourcentage_hauteur_page_popup)) / 2;
width: shipheart_largeur_page * pourcentage_largeur_page_popup;
height: shipheart_hauteur_page * pourcentage_hauteur_page_popup;
padding: padding_popup
modal: true
// focus: true // SDIR # 224 : Il ne faut PAS activer le focus. Sinon, à la fermeture, le focus précédent est réactivé (comme le dernier TextField par exemple)
closePolicy: Popup.NoAutoClose //Popup.CloseOnPressOutside
background: Rectangle {
radius: 20
color: {
switch(boite_dialogue_validation_securisee.niveau)
{
default:
case 0: color: shipheart_couleur_fond_boite_dialogue_niveau_0; break;
case 1: color: shipheart_couleur_fond_boite_dialogue_niveau_1; break;
case 2: color: shipheart_couleur_fond_boite_dialogue_niveau_2; break;
}
}
}
Column {
id: affichage_boite_dialogue
spacing: 20
//=========================================================================
// Titre :
//=========================================================================
Rectangle {
id: titre_boite_dialogue
width: boite_dialogue_validation_securisee.width - (2 * padding_popup)
height: (boite_dialogue_validation_securisee.height - (2 * padding_popup) - (2 * affichage_boite_dialogue.spacing)) * pourcentage_boite_dialogue_titre
color: "transparent"
Image {
id: image_titre
source: ""
sourceSize.height: parent.height
anchors {
verticalCenter: parent.verticalCenter
horizontalCenter: parent.horizontalCenter
}
visible: true
}
}
//=========================================================================
// Message :
//=========================================================================
Rectangle {
id: message_boite_dialogue
width: boite_dialogue_validation_securisee.width - (2 * padding_popup)
height: (boite_dialogue_validation_securisee.height - (2 * padding_popup) - (2 * affichage_boite_dialogue.spacing)) * pourcentage_boite_dialogue_message
color: "transparent"
Flickable {
anchors.fill: parent
anchors {
verticalCenter: parent.verticalCenter
}
contentWidth: texte_message.width
contentHeight: texte_message.height
flickableDirection: Flickable.VerticalFlick
clip: true
ScrollBar.vertical: ScrollBar { // Important car permet de voir que la partie affichée n'est pas complète dans le message...
id: ascenseur
policy: ScrollBar.AlwaysOn
width: 10
visible: false
}
TextEdit {
id: texte_message
width: message_boite_dialogue.width - ascenseur.width - 5 // Le '-5' permet de détacher le texte de l'ascenseur
height: Math.max(message_boite_dialogue.height, implicitHeight) // Permet d'avoir la hauteur de la zone si le texte est "court" (et donc de centrer verticalement) puis la hauteur totale si le texte est "long" (et pouvoir se déplacer vers la fin et pas centré sur le milieu !)
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
readOnly:true
wrapMode: Text.Wrap
textFormat: Text.RichText
text: boite_dialogue_validation_securisee.message
color: {
switch(boite_dialogue_validation_securisee.niveau)
{
default:
case 0: shipheart_couleur_texte_boite_dialogue_niveau_0; break;
case 1: shipheart_couleur_texte_boite_dialogue_niveau_1; break;
case 2: shipheart_couleur_texte_boite_dialogue_niveau_2; break;
}
}
font.pixelSize:18
}
}
}
//=========================================================================
// Boutons :
//=========================================================================
Row {
height: (boite_dialogue_validation_securisee.height - (2 * padding_popup) - (2 * affichage_boite_dialogue.spacing)) * pourcentage_boite_dialogue_ligne_boutons
anchors.horizontalCenter: parent.horizontalCenter
spacing: 20
//--------------------------------------------------------------------
// Bouton Ok :
Rectangle {
id: bouton_ok
width: bouton_largeur
height: parent.height
anchors.verticalCenter: parent.verticalCenter
radius: shipheart_rayon_bouton
color: couleur_gris_tres_fonce
visible: true
Label {
id: bouton_ok_label
anchors.centerIn: parent
text: qsTr("OK")
color: couleur_blanc_casse
font.pixelSize:20
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
boite_dialogue_validation_securisee.clicked(shipheart_boite_dialogue_bouton_1);
}
}
}
//--------------------------------------------------------------------
// Bouton Annuler :
Rectangle {
id: bouton_annuler
width: bouton_largeur
height: parent.height
anchors.verticalCenter: parent.verticalCenter
radius: shipheart_rayon_bouton
color: couleur_gris_tres_fonce
visible: false
Label {
id: bouton_annuler_label
anchors.centerIn: parent
text: qsTr("Annuler")
color: couleur_blanc_casse
font.pixelSize:20
}
MouseArea {
anchors.fill: parent
onClicked: {
shipheart_clic();
boite_dialogue_validation_securisee.clicked(shipheart_boite_dialogue_bouton_2);
}
}
}
//--------------------------------------------------------------------
// Bouton Sécurisé :
Rectangle {
id: bouton_securise
width: bouton_largeur
height: parent.height
anchors.verticalCenter: parent.verticalCenter
radius: shipheart_rayon_bouton
color: couleur_gris_tres_fonce
visible: false
Rectangle { // Barre grandissante pour montrer durée d'appui vs tempo nécessaire :
width: (valeur_timer_appui_long / shipheart_mouse_press_and_hold_interval_tres_long) * parent.width
height: parent.height
color: couleur_rouge_transparent
radius: shipheart_rayon_bouton
visible: mousearea_bouton_securise.pressed
}
Label {
id: bouton_securise_label
anchors.centerIn: parent
text: qsTr("---")
color: couleur_blanc_casse
font.pixelSize:20
}
MouseArea {
id: mousearea_bouton_securise
anchors.fill: parent
onPressed: { // Déclenché lors de l'appui inital
timer_appui_long.running = true;
valeur_timer_appui_long = 0;
shipheart_clic();
}
onClicked: { // Déclenché si l'appui n'a pas été suffisement long pour avoir un Press&Hold :
timer_appui_long.running = false;
valeur_timer_appui_long = 0;
}
onExited: { // Déclenché si le doigt sort de la zone du bouton (sinon, on continue à compter alors qu'on est sorti de la zone et même relaché le doigt !!)
timer_appui_long.running = false;
valeur_timer_appui_long = 0;
}
}
}
}
}
enter: Transition {
ParallelAnimation {
NumberAnimation {
property: "opacity";
from: 0.0;
to: 1.0;
//easing.type: Easing.InElastic;
duration: 200
}
NumberAnimation {
property: "scale";
from: 0.0;
to: 1.0;
// easing.type: Easing.OutBack
duration: 200
}
}
}
exit: Transition {
ParallelAnimation {
NumberAnimation {
property: "opacity";
from: 1.0
to: 0.0;
duration: 200
}
NumberAnimation {
property: "scale";
from: 1.0
to: 0.0;
duration: 200
}
}
}
}