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 } } } }