stepbar — u_pbt_stepbar #
← Référence des composants · Sommaire du guide
Fil d'étapes d'un assistant : les étapes franchies, celle en cours et celles à venir, en horizontal ou en vertical.
▶ Le voir en vrai — Application de démonstration, tuile Stepbar : l'aperçu, le code qui le produit et cette page, côte à côte.
En bref #
| Userobject | u_pbt_stepbar |
| Classe d'items | n_pbt_stepbar_step (une étape) |
| Sert à | Situer l'utilisateur dans un assistant, un formulaire en plusieurs pages, un processus de validation |
| Principe | Vous déclarez les étapes, puis vous déplacez ii_current : les états se calculent tout seuls |
Démarrage rapide #
// event open de la fenetre
uo_steps.of_add_step(/*key*/ "account", /*label*/ "Compte")
uo_steps.of_add_step(/*key*/ "profile", /*label*/ "Profil")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "Paiement")
uo_steps.of_add_step(/*key*/ "done", /*label*/ "Confirmation")
// Etape en cours (1 = la premiere)
uo_steps.ii_current = 1
// Bouton Suivant de l'assistant : l'etape suivante, en sautant les masquees et les desactivees
uo_steps.of_next()
// Bouton Precedent
uo_steps.of_previous()
Le modèle : une étape, trois états automatiques #
Une étape n'a pas d'état à gérer à la main. Il se déduit de sa position par rapport à ii_current :
| Position | État | Rendu |
|---|---|---|
| Avant l'étape courante | done — terminée | Pastille cochée |
| L'étape courante | current — en cours | Pastille mise en avant |
| Après l'étape courante | todo — à venir | Pastille numérotée, teinte discrète |
Trois autres états ne s'obtiennent jamais automatiquement : vous les forcez sur une étape — error quand elle a échoué, warning quand elle est franchie mais qu'un point reste à revoir, skipped quand elle a été ignorée (voir plus bas).
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
ii_current | integer | 1 | Étape en cours, numérotée à partir de 1 (nombre d'étapes + 1 = tout terminé). La poser lève ue_step_changed quand la barre bouge. L'étape en cours est suivie par son identité : ajouter, retirer ou déplacer une étape avant elle ne change pas d'étape en cours. Posée avant les étapes, la valeur est gardée et appliquée dès que l'étape existe. Une étape en cours masquée ne laisse aucune étape « en cours » à l'écran. « Tout terminé » est ancré sur la dernière étape du moment : une étape ajoutée après elle devient l'étape en cours (et lève ue_step_changed) ; une étape insérée avant ne change rien |
is_position | string | "top" | Orientation : top / bottom (fil horizontal) ou start / end (fil vertical) — constantes POSITION_TOP, POSITION_BOTTOM, POSITION_START, POSITION_END. START/END sont logiques et suivent le sens d'écriture |
is_navigation_mode | string | "free" | Ce qu'un clic peut atteindre : NAV_FREE (n'importe quelle étape, le défaut), NAV_BACKWARD (uniquement les étapes déjà passées — revenir en arrière, jamais sauter en avant), NAV_VISITED (toute étape déjà atteinte, sauf celle en cours — après un retour en arrière, les étapes atteintes plus loin restent à un clic) ou NAV_NONE (rien : un simple indicateur de progression, piloté par votre code seul). Ce qui reste cliquable déclenche ue_step_clicked ; la barre, elle, ne bouge jamais sur un clic |
is_overflow_mode | string | "auto" | Trop d'étapes pour la largeur : OVERFLOW_AUTO compacte la barre sous un plancher lisible par étape (chaque étape devient un point, seule l'étape courante garde son libellé, et toutes restent cliquables), OVERFLOW_SCROLL garde les libellés et fait défiler en gardant l'étape courante en vue, OVERFLOW_SHRINK les écrase jusqu'à l'ellipse. Un fil vertical ne compacte jamais |
is_theme_style | string | "" | Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement |
is_theme_mode | string | "" | Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement |
il_theme_accent | long | -1 | Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème) |
is_tooltip | string | "" | Info-bulle simple affichée au survol du composant |
is_super_tooltip_title | string | "" | Titre de l'info-bulle enrichie (prend le pas sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'info-bulle enrichie (balisage riche accepté) |
is_super_tooltip_image | string | "" | Image de l'info-bulle enrichie |
Propriétés d'une étape — n_pbt_stepbar_step #
Obtenues par of_step(id) :
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
is_state | string | STATE_TODO | Force l'état de l'étape : STATE_TODO, STATE_CURRENT, STATE_DONE, STATE_ERROR, STATE_WARNING (franchie, mais avec un point à revoir : pastille ambre marquée « ! », libellé ambre), STATE_SKIPPED (ignorée, ni faite ni à faire : pastille creuse à anneau en pointillés marquée « – », libellé en italique). Les lecteurs d'écran les annoncent « avec un avertissement » et « ignorée » ; après l'une ou l'autre, le trait est parcouru comme après une étape faite. STATE_AUTO = retour au calcul automatique ; la relecture rend l'état effectif de l'étape, pas le forçage. Posé sur une clé qui ne nomme aucune étape, il est ignoré |
is_text | string | — | Change le libellé de l'étape, balisage riche accepté |
is_description | string | "" | Seconde ligne de l'étape — « Facultatif », une date, un montant. Balisage riche accepté. Annoncée à un lecteur d'écran comme la description de l'étape, après son nom. Une chaîne vide la retire ; une barre compactée l'abandonne pour tenir sur une ligne |
is_image | string | "" | Icône affichée à la place du rang de l'étape (formes acceptées) |
ib_enabled | boolean | true | Étape active ; une étape désactivée ne réagit plus au clic |
ib_visible | boolean | true | Masque l'étape sans la retirer du modèle |
Méthodes #
| Méthode | Rôle | |
|---|---|---|
of_add_step (string as_key, string as_label) | Ajoute une étape en fin de fil. Renvoie 0 une fois appliqué, -5 sur une clé vide, contenant / ou ` | , ou déjà présente dans la barre, -2` si le composant n'est pas créé |
of_add_step (string as_key, string as_label, string as_icon_file) | Même chose, avec l'icône affichée à la place du rang de l'étape. Renvoie 0 une fois appliqué, -5 sur une clé vide, contenant / ou ` | , ou déjà présente dans la barre, -2` si le composant n'est pas créé |
of_add_step (string as_key, string as_label, string as_icon_file, string as_desc) | Même chose, avec l'icône et la seconde ligne. Renvoie 0 une fois appliqué, -5 sur une clé vide, contenant / ou ` | , ou déjà présente dans la barre, -2` si le composant n'est pas créé |
of_insert_step (string as_key, string as_label, integer ai_index) | Insère une étape à la position donnée (comptée à partir de 1 ; 0 ou moins = en tête, au-delà de la fin = en fin). Renvoie 0 une fois appliqué, -5 sur une clé vide, contenant / ou ` | , ou déjà présente dans la barre, -2` si le composant n'est pas créé |
of_insert_step (string as_key, string as_label, string as_icon_file, integer ai_index) | Même chose, avec l'icône. Renvoie 0 une fois appliqué, -5 sur une clé vide, contenant / ou ` | , ou déjà présente dans la barre, -2` si le composant n'est pas créé |
of_insert_step (string as_key, string as_label, string as_icon_file, string as_desc, integer ai_index) | Même chose, avec l'icône et la seconde ligne. Renvoie 0 une fois appliqué, -5 sur une clé vide, contenant / ou ` | , ou déjà présente dans la barre, -2` si le composant n'est pas créé |
of_move_step (string as_key, integer ai_index) | Déplace une étape existante ; l'étape en cours le reste. Renvoie 0 une fois appliqué, -5 sur une clé vide ou qui ne désigne aucune étape, -2 si le composant n'est pas créé | |
of_next ( ) | Passe à l'étape suivante, en sautant les masquées et les désactivées — celles sur lesquelles ii_current + 1 atterrirait. S'arrête sur la dernière atteignable. Le mode de navigation n'est pas consulté : il bride l'utilisateur, pas votre code. Aucune question n'est posée, mais ue_step_changed est levé. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_previous ( ) | Revient à l'étape précédente, mêmes règles. Depuis la position « tout est terminé », revient sur la dernière étape. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_remove_step (string as_key) | Retire une étape ; les autres conservent leur état. Retirer l'étape en cours passe à la suivante atteignable (ou à « tout terminé ») et lève ue_step_changed. Renvoie 0 une fois appliqué, -5 sur une clé vide ou qui ne désigne aucune étape, -2 si le composant n'est pas créé | |
of_clear_steps ( ) | Vide le fil. La barre repart sur sa première étape : les étapes ajoutées ensuite forment un nouveau parcours. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_step (string as_key) → n_pbt_stepbar_step | Handle d'une étape, pour poser ses propriétés | |
of_reset ( ) | Vide les étapes et remet toutes les propriétés à leur défaut. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_set_redraw (boolean) | Regroupe une rafale de modifications en un seul rendu. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_save_as_png (string) · of_save_as_jpg (string) | Exporte le rendu en image. Renvoie 0 une fois l'image écrite, -4 si l'écriture échoue, -2 si le composant n'est pas créé |
Le troisième argument est l'icône, comme partout ailleurs dans la bibliothèque (
of_add_itemdu listbar,of_add_panelde la statusbar,of_add_tiledu tilesbox). La seconde ligne vient après elle.
Événements #
| Événement | Déclenché quand |
|---|---|
ue_step_clicked (integer ai_index, string as_key) | L'utilisateur a cliqué une étape. La barre ne bouge pas : scriptez cet événement, faites vos contrôles, puis posez ii_current si vous acceptez |
ue_step_changed (integer ai_from_index, string as_from_key, integer ai_index, string as_key) | La barre a bougé : ii_current a été posé sur une autre étape, of_next / of_previous appelé, l'étape en cours retirée, ou une étape ajoutée après « tout terminé ». Un clic n'arrive jamais ici |
ue_ready ( ) | Le composant a fini de charger ; tout ce qui a été envoyé avant a été rejoué |
ue_runtime_missing ( ) | Le runtime WebView2 est absent : le composant reste vide |
ue_bg_color (long al_color) | Le composant a calculé sa couleur de fond de thème ; l'userobject l'a déjà adoptée (backcolor) |
La barre ne navigue pas toute seule. Un clic rapporte (ue_step_clicked) et rien d'autre : la barre reste où elle est. C'est vous qui la déplacez, en posant ii_current ou en appelant of_next / of_previous — et ces déplacements-là s'annoncent par ue_step_changed.
Ce partage n'est pas une contrainte, c'est le sens du composant : une barre d'étapes reflète un parcours que votre application pilote. Atteindre l'étape 3 veut dire qu'un formulaire était valide et qu'un enregistrement est parti ; aucun clic ne peut en décider à votre place.
ue_step_clicked porte l'étape visée, ue_step_changed porte en plus l'étape quittée — par identifiant métier autant que par rang. Ce couple sert à journaliser ou à enregistrer l'étape que l'on quitte ; la règle « on peut revenir en arrière, mais pas sauter en avant » s'écrit, elle, avec NAV_BACKWARD.
is_navigation_modereste le filtre du clic :NAV_NONEne lève plus rien du tout,NAV_BACKWARDne laisse cliquer que les étapes déjà franchies.NAV_VISITEDva plus loin : toute étape déjà atteinte reste cliquable, même en avant de l'étape en cours — l'utilisateur revenu corriger l'étape 2 retourne d'un clic à l'étape 4 qu'il avait atteinte, ce queNAV_BACKWARDne permet jamais. Une nouvelle liste d'étapes oublie ce qui a été atteint, et une étape insérée n'a jamais été atteinte.
Au clavier #
La barre est un seul arrêt de tabulation : une fois atteinte, elle se parcourt entièrement au clavier.
| Touche | Effet |
|---|---|
| Flèches | Déplacent le focus d'une étape à l'autre, en bouclant ; les étapes masquées, désactivées ou hors de portée (voir is_navigation_mode) sont sautées |
| Début / Fin | Première / dernière étape atteignable |
| Entrée ou Espace | Rapporte un clic sur l'étape focalisée (ue_step_clicked) — la barre ne bouge pas pour autant |
Les flèches ne sélectionnent pas, à la différence des onglets d'un dockcontainer : elles déplacent le focus. Entrée ou Espace sur une étape rapporte le clic (ue_step_clicked), comme la souris ; c'est votre application qui déplace la barre. Parcourir une barre de huit étapes au clavier ne doit pas envoyer huit clics.
Chaque étape est un vrai bouton : elle porte son libellé et son état dans son nom parlé (« Compte - terminée »), l'étape courante est marquée aria-current="step", et une étape désactivée est un bouton désactivé — pas seulement un texte grisé. La pastille numérotée n'est pas lue à voix haute : un rang n'apprend rien.
Exemples #
Avancer dans l'assistant #
// Les quatre etapes de l'assistant, dans l'ordre
uo_steps.of_add_step(/*key*/ "account", /*label*/ "Compte")
uo_steps.of_add_step(/*key*/ "profile", /*label*/ "Profil")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "Paiement")
uo_steps.of_add_step(/*key*/ "done", /*label*/ "Confirmation")
// Les etapes 1 et 2 passent automatiquement en "terminee" (coche)
uo_steps.ii_current = 3
Signaler une étape en erreur #
// L'etat d'une etape se force par son handle
uo_steps.of_step(/*key*/ "profile").is_state = n_pbt_stepbar_step.STATE_ERROR
// Une fois le probleme corrige, on rend la main au calcul automatique
uo_steps.of_step(/*key*/ "profile").is_state = n_pbt_stepbar_step.STATE_AUTO
Étape ignorée, étape à revoir, retour en avant #
// Les quatre etapes de la commande
uo_steps.of_add_step(/*key*/ "cart", /*label*/ "Panier")
uo_steps.of_add_step(/*key*/ "coupon", /*label*/ "Code promo")
uo_steps.of_add_step(/*key*/ "delivery", /*label*/ "Livraison")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "Paiement")
// Le client n'a pas de code promo : l'etape est ignoree, ni faite ni a faire
uo_steps.of_step(/*key*/ "coupon").is_state = n_pbt_stepbar_step.STATE_SKIPPED
// Adresse non verifiee : l'etape est franchie, mais elle est a revoir
uo_steps.of_step(/*key*/ "delivery").is_state = n_pbt_stepbar_step.STATE_WARNING
// Toute etape deja atteinte reste cliquable, meme en avant de l'etape en cours
uo_steps.is_navigation_mode = u_pbt_stepbar.NAV_VISITED
// L'assistant a atteint l'etape 4 puis revient au panier : les etapes 2 a 4 restent a un clic
uo_steps.ii_current = 4
uo_steps.ii_current = 1
Fil vertical #
// POSITION_START / POSITION_END : le fil se dessine verticalement, ideal en marge d'un formulaire
uo_steps.is_position = uo_steps.POSITION_START
// Le TROISIEME argument est l'icone : elle prend la place du rang de l'etape
uo_steps.of_add_step(/*key*/ "account", /*label*/ "Compte", /*icon_file*/ "mono:img\packimages.dll:svg/samples/folder-open")
Libellés enrichis sur deux lignes #
// Le libelle d'une etape accepte le balisage riche
uo_steps.of_add_step(/*key*/ "account", /*label*/ "[b]Compte[/b][br][size=9](connexion)")
uo_steps.of_add_step(/*key*/ "profile", /*label*/ "[b]Profil[/b][br][size=9](vos informations)")
uo_steps.of_add_step(/*key*/ "payment", /*label*/ "[b]Paiement[/b][br][size=9](carte)")
uo_steps.of_add_step(/*key*/ "done", /*label*/ "[accent][b]Termine[/b][/accent]")
// L'utilisateur est a l'etape 2 : l'etape 1 s'affiche terminee
uo_steps.ii_current = 2
Navigation au clic #
// event ue_step_clicked de uo_steps : (integer ai_index, string as_key)
// La barre n'a PAS bouge : c'est ici qu'on decide.
if ai_index > uo_steps.ii_current then
MessageBox("Assistant", "Terminez l'etape en cours avant de continuer.")
return
end if
uo_steps.ii_current = ai_index
Étape conditionnelle #
// Un client deja connu n'a pas d'etape "Profil" a remplir
uo_steps.of_step(/*key*/ "profile").ib_visible = false
Bonnes pratiques #
- Donnez à chaque étape un identifiant métier stable (
"payment") : c'est lui que vous recevez dansue_step_clicked, pas un numéro qui bouge à la moindre insertion. - Laissez le composant calculer les états ; ne forcez
is_stateque pour l'erreur. - Le clic sur une étape est un simple signal : c'est à vous d'autoriser (ou non) le saut, en particulier vers une étape non encore atteinte.
- Encadrez la déclaration des étapes par
of_set_redraw(false)/of_set_redraw(true)quand elles sont nombreuses. - Appelez
of_reset()avant de réutiliser le même fil pour un autre assistant.
Hérité du socle commun #
Ces membres existent sur tous les composants visuels — ils ne sont pas propres à celui-ci. Ils sont détaillés une seule fois, dans les chapitres transverses ; cette table dit seulement où les lire.
| Membres | Rôle | Détaillé dans |
|---|---|---|
of_count · of_keys_at · of_has | Parcourir ce que le composant contient | 3.2 Les items |
of_reset | Remettre le composant à zéro | 3.6 Remettre un composant à zéro : of_reset() |
of_register_shortcut · of_clear_shortcuts | Raccourcis clavier du composant | 3.5 Les raccourcis clavier |
of_is_created · of_is_ready · of_get_last_error | S'il est né, s'il est prêt, ce qui a échoué | 3.7 Diagnostic |
of_save_as_png · of_save_as_jpg | Exporter le rendu en image | 3.8 Exporter le rendu en image |
of_set_redraw | Grouper les modifications en un seul repaint | 3.10 Bonnes pratiques |
of_preload_icons | Icônes affichées sans délai | Affichage instantané : of_icon |
of_set_translation | Traduire un libellé du composant | 5.2 Adapter un libellé : of_set_translation |
of_focus_webview | Donner le focus au composant | 6.4 Clavier et focus |
of_print · of_print_to_pdf | Imprimer, ou écrire un PDF | 6.9 Imprimer |
of_set_property · of_get_property · of_component_name | Piloter une propriété par son nom | 3.1 Le moteur de propriétés |
Deux aides ne sont pas héritées : of_icon et of_escape_markup vivent sur n_pbt_utils. Déclarez-en une — n_pbt_utils lnv_utils, rien à créer — et appelez-les dessus.