PBToolboxAI v2 ← Site

statusbar — u_pbt_statusbar #

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

Barre d'état à panneaux : texte riche, icônes, largeurs fixes ou automatiques, alignement à gauche ou à droite, panneaux cliquables, mini-barre de progression et états colorés.

▶ Le voir en vrai — Application de démonstration, tuile Statusbar : l'aperçu, le code qui le produit et cette page, côte à côte.


En bref #

Userobjectu_pbt_statusbar
Classe d'itemsn_pbt_statusbar_panel (panneau) · n_pbt_statusbar_menu_item (entrée de liste)
Sert àAfficher en bas de fenêtre l'état de l'application : contexte, avancement, alertes discrètes
Options opt-in—

Démarrage rapide #

// event open de la fenetre
// of_add_panel(id, texte, icone, alignement, largeur)
// id vide = panneau simplement informatif ; largeur 0 = ajustee au texte
uo_statut.of_add_panel(/*key*/ "etat",  /*text*/ "Pret",           /*icon_file*/ "", /*align*/ uo_statut.ALIGN_START,  /*width*/ 0)
uo_statut.of_add_panel(/*key*/ "",      /*text*/ "Ligne 12, Col 4", /*icon_file*/ "", /*align*/ uo_statut.ALIGN_START,  /*width*/ 0)
uo_statut.of_add_panel(/*key*/ "heure", /*text*/ "12:00",          /*icon_file*/ "", /*align*/ uo_statut.ALIGN_END, /*width*/ 140)
// Mettre un panneau a jour a tout moment, par son identifiant
uo_statut.of_panel("etat").is_text = "Enregistrement en cours..."

Le modèle : des panneaux à clé #

La barre est une suite de panneaux, ajoutés dans l'ordre. Un panneau reçoit un identifiant à la création : c'est par lui qu'on le retrouve ensuite pour changer son texte, son icône ou son état.

L'identifiant est une clé d'adressage, pas un interrupteur d'interactivité :

uo_statut.of_panel("etat").is_text = "3 enregistrements modifies"

Voir Socle commun · Les items.


Propriétés #

PropriétéTypeDéfautRôle
ib_show_resize_gripbooleanfalseAffiche la poignée de redimensionnement dans le coin de fin de barre
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

Méthodes #

MéthodeRôle
of_add_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width)Ajoute un panneau en fin de barre. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_add_sep ( )Insère une rupture de groupe à la position courante. Les panneaux se séparent déjà d'un filet fin : celle-ci est plus large, pour que les panneaux d'avant et d'après se lisent comme deux groupes. À appeler entre deux of_add_panel. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_insert_panel (as_keys, as_text, as_icon_file, as_align, ai_width, ai_index)Insère un panneau à une position précise (comptée à partir de 0). Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_move_panel (string as_key, integer ai_index)Déplace un panneau existant à une autre position. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_remove_panel (string as_key)Supprime un seul panneau ; 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_panel (string as_key) → n_pbt_statusbar_panelRend le handle d'un panneau (créé au premier accès)
of_flash_panel (string as_key, string as_text, long al_ms)Affiche un message pendant al_ms millisecondes, puis remet le texte précédent (al_ms ≤ 0 = 2 secondes). Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_add_menu_item (string as_keys, string as_label) · (as_keys, as_label, as_image)Ajoute une entrée à la liste déroulante d'un panneau : as_keys a deux niveaux, le panneau puis l'entrée ("enc/utf8"). Dès la première entrée le panneau devient un sélecteur : le clic ouvre la liste, et le choix revient par ue_panel_menu_clicked avec la même adresse. Un libellé vide reprend la clé. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_insert_menu_item (string as_keys, string as_label, integer ai_index) · (as_keys, as_label, as_image, ai_index)Insère une entrée à une position précise (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_add_menu_separator (string as_key)Ligne de séparation dans la liste du panneau as_key. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_remove_menu_item (string as_keys)Retire une seule entrée ; la dernière partie, le panneau retrouve le comportement que lui donne ib_clickable. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_move_menu_item (string as_keys, integer ai_index)Déplace une entrée à une autre position dans sa liste. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_menu_item (string as_keys) → n_pbt_statusbar_menu_itemRend le handle d'une entrée (créé au premier accès), pour la griser, la cocher ou la renommer
of_clear_menu (string as_key)Retire toute la liste déroulante ; le panneau retrouve le comportement que lui donne ib_clickable. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_clear ( )Vide la barre : tous les panneaux et tous les séparateurs. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_reset ( )Vide la barre et remet les propriétés à leur défaut. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé

Les arguments de of_add_panel #

ArgumentValeursEffet
as_keyslibre, ou ""Clé du panneau, par laquelle on le retrouve ensuite. Vide = panneau décoratif, ni adressable ni cliquable
as_texttexteContenu du panneau. Le balisage riche est accepté
as_icon_filechemin d'image, ou ""Icône affichée avant le texte (formes acceptées)
as_alignALIGN_START (défaut) ou ALIGN_ENDCôté vers lequel le panneau est poussé. Valeurs logiques : START = début de lecture (gauche en écriture de gauche à droite). Les alias physiques "left" / "right" restent acceptés
ai_widthpixels, ou 0Largeur fixe. 0 = le panneau s'ajuste à son contenu

Sur un panneau — n_pbt_statusbar_panel #

MembreTypeDéfautRôle
is_textstring""Texte du panneau, balisage riche accepté
is_imagestring""Icône du panneau, modifiable à tout moment
ib_enabledbooleantruePanneau grisé et non cliquable
ib_visiblebooleantruePanneau masqué, sans être retiré de la barre
ii_progressinteger—Mini-barre de progression dans le panneau, de 0 à 100 ; une valeur négative la fait disparaître
is_statestring""État sémantique du panneau, qui le colore : voir les constantes ci-dessous
ib_indeterminatebooleanfalseBarre animée sans valeur, pour un traitement dont la durée est inconnue. Indépendante de ii_progress, qui reste le pourcentage exact
ib_clickablebooleanfalseLe panneau réagit-il au clic. Opt-in : un panneau reste inerte tant qu'on ne le demande pas, tout en gardant sa clé — il est piloté et porte une info-bulle. Un panneau à liste déroulante est cliquable d'office

Sur une entrée de liste — n_pbt_statusbar_menu_item #

Obtenue par of_menu_item("enc/utf8") : l'adresse a deux niveaux, le panneau puis l'entrée. La liste est un menu natif : une propriété changée pendant qu'il est ouvert se voit à l'ouverture suivante.

MembreTypeDéfautRôle
is_labelstring""Texte de l'entrée
is_imagestring""Image avant le texte, modifiable à tout moment
ib_enabledbooleantrueEntrée grisée : affichée, mais impossible à choisir
ib_checkedbooleanfalseCoche devant l'entrée, pour la valeur en cours
ib_visiblebooleantrueEntrée retirée de la liste sans être supprimée : la remontrer ne demande rien d'autre
uo_statut.of_add_menu_item("enc/utf8", "UTF-8")
uo_statut.of_add_menu_item("enc/ansi", "ANSI")
uo_statut.of_menu_item("enc/utf8").ib_checked = true     // la valeur en cours
uo_statut.of_menu_item("enc/ansi").ib_enabled = false    // pas disponible ici

Constantes d'état #

ConstanteValeurUsage
STATE_NONE""Aucun état : apparence normale
STATE_INFO"info"Information
STATE_WARNING"warning"Avertissement
STATE_ERROR"error"Erreur
STATE_SUCCESS"success"Succès

Comme pour toute propriété à valeurs prédéfinies, utilisez la constante plutôt que la chaîne :

uo_statut.of_panel("etat").is_state = n_pbt_statusbar_panel.STATE_WARNING

Événements #

ÉvénementDéclenché quand
ue_panel_clicked (string as_key)Un panneau cliquable est cliqué
ue_panel_double_clicked (string as_key)Un panneau cliquable est double-cliqué — le raccourci classique derrière Ligne 12, Col 4 qui ouvre un « Aller à la ligne »
ue_panel_rclicked (string as_key, long al_x, long al_y)Un panneau reçoit un clic droit. al_x et al_y sont des pixels écran : à passer tels quels pour ouvrir un menu contextuel là où l'utilisateur a visé
ue_panel_menu_clicked (string as_keys)Une entrée d'une liste déroulante de panneau est choisie (voir of_add_menu_item)
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)

Au clavier #

La barre est un seul arrêt de tabulation : seuls les panneaux faits pour être cliqués y entrent, et les flèches les parcourent.

ToucheEffet
FlèchesPassent au panneau interactif précédent / suivant, en bouclant ; les panneaux d'affichage et les panneaux désactivés sont sautés
Début / FinPremier / dernier panneau interactif
Entrée ou EspaceDéclenche le panneau — c'est-à-dire ue_panel_clicked, ou l'ouverture de sa liste déroulante s'il en a une

Un panneau qui se contente d'afficher n'est pas un contrôle : il n'est ni focalisable ni annoncé comme tel. Un panneau cliquable mais désactivé reste, lui, annoncé comme indisponible plutôt que de passer pour du texte. Une barre de progression annonce sa valeur, et une progression indéterminée n'en annonce aucune — cette absence est le sens du mot.

Le focus survit à la reconstruction de la barre : elle se redessine à chaque changement de texte, et sans cela le focus tomberait à chaque seconde sur une barre qui affiche une horloge.


Exemples #

Largeurs fixes et largeurs automatiques #

// Largeur 0 : le panneau prend exactement la place de son texte
uo_statut.of_add_panel(/*key*/ "", /*text*/ "Panneau ajuste au contenu", /*icon_file*/ "", /*align*/ uo_statut.ALIGN_START, /*width*/ 0)

// Largeur fixe en pixels : utile quand le texte change souvent,
// pour que les panneaux voisins ne bougent pas a chaque mise a jour
uo_statut.of_add_panel(/*key*/ "pos", /*text*/ "Ligne 1, Col 1", /*icon_file*/ "", /*align*/ uo_statut.ALIGN_START, /*width*/ 150)

// Un panneau pousse a l'extremite opposee
uo_statut.of_add_panel(/*key*/ "heure", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_statut.ALIGN_END, /*width*/ 140)

Icônes et panneaux cliquables #

// Un identifiant non vide rend le panneau cliquable
uo_statut.of_add_panel(/*key*/ "save", /*text*/ "Enregistre", /*icon_file*/ "mono:img\save.svg", /*align*/ uo_statut.ALIGN_START, /*width*/ 0)
uo_statut.of_add_sep()   // trait de separation entre deux groupes de panneaux
uo_statut.of_add_panel(/*key*/ "conn", /*text*/ "Connecte",   /*icon_file*/ "mono:img\plug.svg", /*align*/ uo_statut.ALIGN_START, /*width*/ 0)
uo_statut.of_add_panel(/*key*/ "user", /*text*/ "Guillaume",  /*icon_file*/ "mono:img\user.svg", /*align*/ uo_statut.ALIGN_END, /*width*/ 160)
// event ue_panel_clicked de uo_statut
choose case as_keys
    case "conn" ; open(w_parametres_connexion)
    case "user" ; open(w_profil)
end choose

Texte riche dans un panneau #

Les panneaux acceptent le balisage riche : styles, couleurs et petites images directement dans le texte.

uo_statut.of_add_panel(/*key*/ "", /*text*/ "Bienvenue [b]dans[/b] [accent]PBToolboxAI[/accent]", &
                       /*icon_file*/ "", /*align*/ uo_statut.ALIGN_START, /*width*/ 0)

uo_statut.of_add_panel(/*key*/ "", /*text*/ "[green]En ligne[/green] [picture=mono:img\plug.svg,14,14]", &
                       /*icon_file*/ "", /*align*/ uo_statut.ALIGN_END, /*width*/ 0)
// Le texte riche vaut aussi pour les mises a jour
uo_statut.of_panel("etat").is_text = "[b]" + String(ll_modifies) + "[/b] enregistrements modifies"

Suivre un traitement long #

n_pbt_statusbar_panel lnv_avance

uo_statut.of_add_panel(/*key*/ "import", /*text*/ "Import", /*icon_file*/ "", /*align*/ uo_statut.ALIGN_START, /*width*/ 220)
lnv_avance = uo_statut.of_panel("import")
// Dans la boucle de traitement : la mini-barre suit l'avancement
lnv_avance.ii_progress = ll_pourcentage
lnv_avance.is_text     = "Import " + String(ll_pourcentage) + " %"
// A la fin : masquer la mini-barre et signaler le resultat
lnv_avance.ii_progress = -1                       // valeur negative = barre masquee
lnv_avance.is_text     = "Import termine"
lnv_avance.is_state    = lnv_avance.STATE_SUCCESS

Signaler une alerte discrète #

n_pbt_statusbar_panel lnv_panneau
lnv_panneau = uo_statut.of_panel("conn")

if not ib_connecte then
    lnv_panneau.is_text  = "Hors ligne"
    lnv_panneau.is_state = lnv_panneau.STATE_ERROR
else
    lnv_panneau.is_text  = "Connecte"
    lnv_panneau.is_state = lnv_panneau.STATE_NONE   // retour a l'apparence normale
end if

Adapter la barre au contexte #

// Masquer un panneau sans le supprimer : il retrouvera sa place plus tard
uo_statut.of_panel("user").ib_visible = ib_utilisateur_identifie

// Le griser quand l'action correspondante n'a pas de sens
uo_statut.of_panel("save").ib_enabled = ib_document_ouvert

// Reorganiser : placer le panneau d'etat en tete (positions comptees a partir de 0)
uo_statut.of_move_panel(/*key*/ "etat", /*index*/ 0)

// Retirer un panneau devenu inutile
uo_statut.of_remove_panel(/*key*/ "import")

La poignée de redimensionnement #

// Sur une fenetre redimensionnable, la poignee de coin est un repere familier
uo_statut.ib_show_resize_grip = true

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