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 #
| Userobject | u_pbt_statusbar |
| Classe d'items | n_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)
// la cle retrouve le panneau plus tard ; largeur 0 = ajustee au texte
uo_status.of_add_panel(/*key*/ "state", /*text*/ "Pret", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "pos", /*text*/ "Ligne 12, Col 4", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
// Mettre un panneau a jour a tout moment, par son identifiant
uo_status.of_panel(/*key*/ "state").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é :
- Identifiant renseigné : le panneau est retrouvable — on change son contenu, on lui pose une info-bulle. Il reste inerte : une barre d'état affiche avant tout, et un panneau comme
Ligne 12, Col 4ne doit pas avoir l'air pressable. Il reçoit pourtant le clic droit (ue_panel_rclicked) : un menu contextuel « Copier » n'est pas une activation. - Identifiant vide : le panneau est purement décoratif. Il n'est ni retrouvable, ni cliquable, et aucune info-bulle ne peut lui être attachée. Donnez un identifiant à tous vos panneaux : ça ne coûte rien et ça garde la porte ouverte. Il compte pourtant dans
of_countet dans les positions, etof_keys_atrend une clé vide pour lui. - Pour rendre un panneau cliquable, demandez-le :
of_panel(/*key*/ "id").ib_clickable = true. Un panneau doté d'une liste déroulante (of_add_menu_item) l'est d'office.
// Le panneau affiche un nouveau texte
uo_status.of_panel(/*key*/ "state").is_text = "3 enregistrements modifies"
Voir Socle commun · Les items.
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
ib_show_resize_grip | boolean | false | Affiche la poignée de redimensionnement dans le coin de fin de barre ; la tirer redimensionne la fenêtre (depuis le coin bas-gauche en lecture de droite à gauche). Elle n'est dessinée que tant que la fenêtre se redimensionne ainsi : maximisée ou sans bord redimensionnable, elle disparaît et la propriété reste posée |
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 |
Méthodes #
| Méthode | Rô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é, -5 si la clé est déjà prise ou contient / ou ` | (une clé vide pose un panneau décoratif), -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 ; elle ouvre le groupe du panneau qui la suit (du côté de celui d'avant quand elle vient en dernier). Un séparateur n'est pas un panneau : il ne compte ni pour of_count / of_keys_at ni dans les positions. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé | |
of_insert_panel (string as_key, string as_text, string as_icon_file, string as_align, integer ai_width, integer ai_index) | Insère un panneau à une position précise, comptée en panneaux à partir de 1 (0 ou moins = en premier, au-delà du dernier = en fin). Mêmes refus que of_add_panel. Renvoie 0 une fois appliqué, -5 si la clé est déjà prise ou contient / ou ` | , -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, comptée en panneaux à partir de 1. Renvoie 0 une fois appliqué, -5 sur une clé vide ou que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_remove_panel (string as_key) | Supprime un seul panneau, avec sa liste déroulante ; les autres conservent leur état. Renvoie 0 une fois appliqué, -5 sur une clé vide ou que la barre n'a jamais reçue, -2 si le composant n'est pas créé | |
of_panel (string as_key) → n_pbt_statusbar_panel | Rend le handle d'un panneau (créé au premier accès). Une clé vide (panneau décoratif), une adresse ou une liste ne désignent rien : leur handle n'écrit nulle part et se relit vide | |
of_flash_panel (string as_key, string as_text, long al_ms) | Affiche un message pendant al_ms millisecondes, puis réaffiche le texte du panneau (al_ms ≤ 0 = 2 secondes). Le message passe PAR-DESSUS le texte : is_text se relit toujours comme le texte du panneau, jamais comme le message. Renvoie 0 une fois appliqué, -5 sur une clé vide, une adresse ou une clé que la barre n'a jamais reçue, -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 une adresse qui n'a pas deux niveaux, un panneau que la barre n'a jamais reçu ou une entrée déjà prise, -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 1). 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. Un séparateur n'a pas d'adresse : seul of_clear_menu le retire, et une liste faite de séparateurs seuls n'est pas une liste (ni chevron ni clic). Renvoie 0 une fois appliqué, -5 sur une clé vide ou un panneau que la barre n'a jamais reçu, -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_item | Rend le handle d'une entrée (créé au premier accès), pour la griser, la cocher ou la renommer. Une adresse qui n'a pas deux niveaux ne désigne rien : son handle n'écrit nulle part et se relit vide | |
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 #
| Argument | Valeurs | Effet |
|---|---|---|
as_keys | libre, ou "" | Clé du panneau, par laquelle on le retrouve ensuite. Vide = panneau décoratif, ni adressable ni cliquable |
as_text | texte | Contenu du panneau. Le balisage riche est accepté |
as_icon_file | chemin d'image, ou "" | Icône affichée avant le texte (formes acceptées) |
as_align | ALIGN_START (défaut) ou ALIGN_END | Cô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_width | pixels, ou 0 | Largeur fixe. 0 = le panneau s'ajuste à son contenu |
Sur un panneau — n_pbt_statusbar_panel #
| Membre | Type | Défaut | Rôle |
|---|---|---|---|
is_text | string | "" | Texte du panneau, balisage riche accepté |
is_image | string | "" | Icône du panneau, modifiable à tout moment |
ib_enabled | boolean | true | Panneau grisé et non cliquable |
ib_visible | boolean | true | Panneau masqué, sans être retiré de la barre |
ii_progress | integer | — | Mini-barre de progression dans le panneau, à côté du texte, de 0 à 100 (au-delà de 100 la barre est pleine et se relit 100) ; une valeur négative la fait disparaître. Se relit -1 quand le panneau n'a pas de barre (et 0 pour une barre à 0 %) |
is_state | string | "" | État sémantique du panneau, qui colore son texte et marque son bord de début : voir les constantes ci-dessous. Toute autre valeur vaut « aucun état » et se relit vide ; un panneau désactivé est grisé, marque d'état comprise |
ib_indeterminate | boolean | false | Barre animée sans valeur, pour un traitement dont la durée est inconnue. Indépendante de ii_progress, qui reste le pourcentage exact |
ib_clickable | boolean | false | Le 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(/*keys*/ "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.
| Membre | Type | Défaut | Rôle |
|---|---|---|---|
is_label | string | "" | Texte de l'entrée |
is_image | string | "" | Image avant le texte, modifiable à tout moment |
ib_enabled | boolean | true | Entrée grisée : affichée, mais impossible à choisir |
ib_checked | boolean | false | Coche devant l'entrée, pour la valeur en cours |
ib_visible | boolean | true | Entrée retirée de la liste sans être supprimée : la remontrer ne demande rien d'autre |
// The menu of the encoding panel, entry by entry
uo_status.of_add_menu_item(/*keys*/ "enc/utf8", /*label*/ "UTF-8")
uo_status.of_add_menu_item(/*keys*/ "enc/ansi", /*label*/ "ANSI")
uo_status.of_menu_item(/*keys*/ "enc/utf8").ib_checked = true // the current value
uo_status.of_menu_item(/*keys*/ "enc/ansi").ib_enabled = false // not available here
Constantes d'état #
| Constante | Valeur | Usage |
|---|---|---|
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 :
// The panel takes the colors of a warning
uo_status.of_panel(/*key*/ "state").is_state = n_pbt_statusbar_panel.STATE_WARNING
Événements #
| Événement | Déclenché quand |
|---|---|
ue_panel_clicked (string as_key) | Un panneau cliquable (ib_clickable) 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 ». Jamais sur un panneau à liste déroulante : son premier clic a ouvert la liste |
ue_panel_rclicked (string as_key, long al_x, long al_y) | Un panneau qui a une clé reçoit un clic droit — cliquable ou non (un menu contextuel n'est pas une activation), jamais s'il est désactivé. Un seul événement par clic droit. al_x et al_y sont des pixels écran ; pour un menu PowerBuilder, PopMenu(PointerX(), PointerY()) de votre fenêtre |
ue_panel_menu_clicked (string as_keys) | Une entrée d'une liste déroulante de panneau est choisie (voir of_add_menu_item). as_keys porte les deux niveaux : le panneau, puis l'entrée — "enc/utf8". Au clavier, Entrée, Espace, Flèche haut ou bas ouvrent la liste. Un panneau retiré, désactivé ou masqué pendant que sa liste est ouverte la ferme, et rien n'est levé |
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.
| Touche | Effet |
|---|---|
| Flèches | Passent au panneau interactif précédent / suivant, en bouclant ; les panneaux d'affichage et les panneaux désactivés sont sautés |
| Début / Fin | Premier / dernier panneau interactif |
| Entrée ou Espace | Dé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_status.of_add_panel(/*key*/ "", /*text*/ "Panneau ajuste au contenu", /*icon_file*/ "", /*align*/ uo_status.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_status.of_add_panel(/*key*/ "pos", /*text*/ "Ligne 1, Col 1", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 150)
// Un panneau pousse a l'extremite opposee
uo_status.of_add_panel(/*key*/ "clock", /*text*/ "12:00", /*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 140)
Icônes et panneaux cliquables #
// Une cle rend le panneau adressable ; ib_clickable le rend cliquable
uo_status.of_add_panel(/*key*/ "save", /*text*/ "Enregistre", /*icon_file*/ "mono:img\save.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_sep() // trait de separation entre deux groupes de panneaux
uo_status.of_add_panel(/*key*/ "conn", /*text*/ "Connecte", /*icon_file*/ "mono:img\plug.svg", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
uo_status.of_add_panel(/*key*/ "user", /*text*/ "Alex Martin", /*icon_file*/ "mono:img\user.svg", /*align*/ uo_status.ALIGN_END, /*width*/ 160)
// Seuls ces deux-la repondent au clic (ue_panel_clicked)
uo_status.of_panel(/*key*/ "conn").ib_clickable = true
uo_status.of_panel(/*key*/ "user").ib_clickable = true
// event ue_panel_clicked de uo_status
choose case as_key
case "conn" ; open(w_connection_settings)
case "user" ; open(w_profile)
end choose
Texte riche dans un panneau #
Les panneaux acceptent le balisage riche : styles, couleurs et petites images directement dans le texte.
// Un accueil a gauche
uo_status.of_add_panel(/*key*/ "", /*text*/ "Bienvenue [b]dans[/b] [accent]PBToolboxAI[/accent]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 0)
// L'etat de la connexion a droite
uo_status.of_add_panel(/*key*/ "", /*text*/ "[green]En ligne[/green] [picture=mono:img\plug.svg,14,14]", &
/*icon_file*/ "", /*align*/ uo_status.ALIGN_END, /*width*/ 0)
// Le texte riche vaut aussi pour les mises a jour
uo_status.of_panel(/*key*/ "state").is_text = "[b]" + String(ll_changed) + "[/b] enregistrements modifies"
Suivre un traitement long #
// Local variables
n_pbt_statusbar_panel lnv_import
// Le panneau d'import, puis son handle pour le suivre
uo_status.of_add_panel(/*key*/ "import", /*text*/ "Import", /*icon_file*/ "", /*align*/ uo_status.ALIGN_START, /*width*/ 220)
lnv_import = uo_status.of_panel(/*key*/ "import")
// Dans la boucle de traitement : la mini-barre suit l'avancement
lnv_import.ii_progress = ll_percent
lnv_import.is_text = "Import " + String(ll_percent) + " %"
// A la fin : masquer la mini-barre et signaler le resultat
lnv_import.ii_progress = -1 // valeur negative = barre masquee
lnv_import.is_text = "Import termine"
lnv_import.is_state = lnv_import.STATE_SUCCESS
Signaler une alerte discrète #
// Local variables
n_pbt_statusbar_panel lnv_panel
// Le panneau de la connexion
lnv_panel = uo_status.of_panel(/*key*/ "conn")
// Hors ligne : le panneau signale une erreur ; connecte : il redevient normal
if not ib_connected then
lnv_panel.is_text = "Hors ligne"
lnv_panel.is_state = lnv_panel.STATE_ERROR
else
lnv_panel.is_text = "Connecte"
lnv_panel.is_state = lnv_panel.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_status.of_panel(/*key*/ "user").ib_visible = ib_user_signed_in
// Le griser quand l'action correspondante n'a pas de sens
uo_status.of_panel(/*key*/ "save").ib_enabled = ib_document_open
// Reorganiser : placer le panneau d'etat en tete (positions comptees a partir de 1)
uo_status.of_move_panel(/*key*/ "state", /*index*/ 1)
// Retirer un panneau devenu inutile
uo_status.of_remove_panel(/*key*/ "import")
La poignée de redimensionnement #
// Tirer la poignee de coin redimensionne la fenetre (masquee quand elle est maximisee)
uo_status.ib_show_resize_grip = true
Bonnes pratiques #
- Donnez une largeur fixe aux panneaux dont le texte change souvent (position du curseur, compteurs) : les panneaux voisins cesseront de sauter à chaque rafraîchissement.
- Un panneau est inerte par défaut : demandez le clic par
ib_clickable, et laissez sans réaction les panneaux qui ne font qu'afficher. - Réservez la fin de barre (
ALIGN_END) aux informations stables (heure, utilisateur, connexion) et le début (ALIGN_START) au contexte courant ; en lecture de droite à gauche, les deux côtés s'inversent d'eux-mêmes. - Employez
is_stateplutôt que des couleurs dans le texte : l'état suit le thème clair comme sombre. - Pensez à repasser
is_stateàSTATE_NONEetii_progressà une valeur négative dès que l'alerte ou le traitement est terminé. - Une barre d'état n'est pas un journal : au-delà de cinq ou six panneaux, préférez une notification toaster.
- Si la progression mérite mieux qu'une mini-barre de panneau, passez à la progressbar.
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.