PBToolboxAI v2 ← 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_etapes.of_add_step(/*key*/ "compte",  /*libelle*/ "Compte")
uo_etapes.of_add_step(/*key*/ "profil",  /*libelle*/ "Profil")
uo_etapes.of_add_step(/*key*/ "paiement", /*libelle*/ "Paiement")
uo_etapes.of_add_step(/*key*/ "fin",     /*libelle*/ "Confirmation")

// Etape en cours (1 = la premiere)
uo_etapes.ii_current = 1
// Bouton Suivant de l'assistant
uo_etapes.ii_current = uo_etapes.ii_current + 1

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

Un quatrième état, error, ne s'obtient jamais automatiquement : vous le forcez sur une étape qui a échoué (voir plus bas).


Propriétés #

PropriétéTypeDéfautRôle
ii_currentinteger1Étape en cours, numérotée à partir de 1
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) 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_stylestringfluentStyle visuel du composant (constantes THEME_STYLE_*)
is_theme_modestringlightVariante claire ou sombre (constantes THEME_MODE_*)
il_theme_accentlong-1Couleur d'accent de ce composant (-1 = accent 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_AUTO = retour au calcul automatique ; la relecture rend l'état effectif de l'étape, pas le forçage
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 un argument invalide (clé vide, adresse fausse), -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 un argument invalide (clé vide, adresse fausse), -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 un argument invalide (clé vide, adresse fausse), -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 0). Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -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 un argument invalide (clé vide, adresse fausse), -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 un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_move_step (string as_key, integer ai_index)Déplace une étape existante. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -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. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_clear_steps ( )Vide le fil. 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é, ou of_next / of_previous appelé. 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. C'est ce couple qui permet d'écrire « on peut revenir en arrière, mais pas sauter en avant » en une ligne.

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.


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. Atteindre une étape pose une question à votre application : parcourir une barre de huit étapes en enverrait huit, et un refus en cours de route laisserait le focus et l'étape courante désynchronisés.

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 #

uo_etapes.of_add_step(/*key*/ "compte",   /*libelle*/ "Compte")
uo_etapes.of_add_step(/*key*/ "profil",   /*libelle*/ "Profil")
uo_etapes.of_add_step(/*key*/ "paiement", /*libelle*/ "Paiement")
uo_etapes.of_add_step(/*key*/ "fin",      /*libelle*/ "Confirmation")

// Les etapes 1 et 2 passent automatiquement en "terminee" (coche)
uo_etapes.ii_current = 3

Signaler une étape en erreur #

// L'etat d'une etape se force par son handle
uo_etapes.of_step(/*key*/ "profil").is_state = n_pbt_stepbar_step.STATE_ERROR
// Une fois le probleme corrige, on rend la main au calcul automatique
uo_etapes.of_step(/*key*/ "profil").is_state = n_pbt_stepbar_step.STATE_AUTO

Fil vertical #

// left / right : le fil se dessine verticalement, ideal en marge d'un formulaire
uo_etapes.is_position = uo_etapes.POSITION_START

// Le TROISIEME argument est l'icone : elle prend la place du rang de l'etape
uo_etapes.of_add_step(/*key*/ "compte", /*libelle*/ "Compte", /*icone*/ "mono:img\packimages.dll:svg/samples/folder-open")

Libellés enrichis sur deux lignes #

// Le libelle d'une etape accepte le balisage riche
uo_etapes.of_add_step("compte",   "[b]Compte[/b][br][size=9](connexion)")
uo_etapes.of_add_step("profil",   "[b]Profil[/b][br][size=9](vos informations)")
uo_etapes.of_add_step("paiement", "[b]Paiement[/b][br][size=9](carte)")
uo_etapes.of_add_step("fin",      "[accent][b]Termine[/b][/accent]")

uo_etapes.ii_current = 2
// event ue_step_clicked de uo_etapes : (integer ai_index, string as_key)
// La barre n'a PAS bouge : c'est ici qu'on decide.
if ai_index > uo_etapes.ii_current then
    MessageBox("Assistant", "Terminez l'etape en cours avant de continuer.")
    return
end if
uo_etapes.ii_current = ai_index

Étape conditionnelle #

// Un client deja connu n'a pas d'etape "Profil" a remplir
uo_etapes.of_step("profil").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

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