PBToolboxAI v4 ← Site

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 #

Userobjectu_pbt_stepbar
Classe d'itemsn_pbt_stepbar_step (une étape)
Sert àSituer l'utilisateur dans un assistant, un formulaire en plusieurs pages, un processus de validation
PrincipeVous 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ÉtatRendu
Avant l'étape courantedone — terminéePastille cochée
L'étape courantecurrent — en coursPastille mise en avant
Après l'étape courantetodo — à venirPastille 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éTypeDéfautRôle
ii_currentinteger1É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_positionstring"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_modestring"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_modestring"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_stylestring""Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement
is_theme_modestring""Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement
il_theme_accentlong-1Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème)
is_tooltipstring""Info-bulle simple affichée au survol du composant
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie

Propriétés d'une étape — n_pbt_stepbar_step #

Obtenues par of_step(id) :

PropriétéTypeDéfautRôle
is_statestringSTATE_TODOForce 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_textstring—Change le libellé de l'étape, balisage riche accepté
is_descriptionstring""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_imagestring""Icône affichée à la place du rang de l'étape (formes acceptées)
ib_enabledbooleantrueÉtape active ; une étape désactivée ne réagit plus au clic
ib_visiblebooleantrueMasque l'étape sans la retirer du modèle

Méthodes #

MéthodeRô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_stepHandle 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_item du listbar, of_add_panel de la statusbar, of_add_tile du tilesbox). La seconde ligne vient après elle.


Événements #

ÉvénementDé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_mode reste le filtre du clic : NAV_NONE ne lève plus rien du tout, NAV_BACKWARD ne laisse cliquer que les étapes déjà franchies. NAV_VISITED va 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 que NAV_BACKWARD ne 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.

ToucheEffet
FlèchesDé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 / FinPremière / dernière étape atteignable
Entrée ou EspaceRapporte 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
// 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 #

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.

MembresRôleDétaillé dans
of_count · of_keys_at · of_hasParcourir ce que le composant contient3.2 Les items
of_resetRemettre le composant à zéro3.6 Remettre un composant à zéro : of_reset()
of_register_shortcut · of_clear_shortcutsRaccourcis clavier du composant3.5 Les raccourcis clavier
of_is_created · of_is_ready · of_get_last_errorS'il est né, s'il est prêt, ce qui a échoué3.7 Diagnostic
of_save_as_png · of_save_as_jpgExporter le rendu en image3.8 Exporter le rendu en image
of_set_redrawGrouper les modifications en un seul repaint3.10 Bonnes pratiques
of_preload_iconsIcônes affichées sans délaiAffichage instantané : of_icon
of_set_translationTraduire un libellé du composant5.2 Adapter un libellé : of_set_translation
of_focus_webviewDonner le focus au composant6.4 Clavier et focus
of_print · of_print_to_pdfImprimer, ou écrire un PDF6.9 Imprimer
of_set_property · of_get_property · of_component_namePiloter une propriété par son nom3.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.


← Référence des composants · Sommaire du guide