PBToolboxAI v4 ← Site

ribbon — u_pbt_ribbon #

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

Ruban façon Office : onglets, groupes, douze types de contrôles riches, menu applicatif, barre d'accès rapide, onglets contextuels à bandeau et keytips.

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


En bref #

Userobjectu_pbt_ribbon
Classes d'itemsn_pbt_ribbon_tab (onglet), n_pbt_ribbon_group (groupe), n_pbt_ribbon_item (contrôle), n_pbt_ribbon_menu_item (entrée de menu), n_pbt_ribbon_ctx_group (groupe d'onglets contextuels)
Sert àRemplacer une barre de menus et ses barres d'outils par une interface de commande moderne, lisible et hiérarchisée
HauteurIntrinsèque : le ruban se cale toujours sur son contenu, rien à activer — voir Hauteur automatique
Limite en mode démo2 onglets au maximum — voir le mode démo

La règle d'or : tout passe par le chemin #

Le ruban est une hiérarchie à quatre niveaux : onglet → groupe → contrôle → entrée de menu. Vous n'avez aucun identifiant global à gérer : chaque objet s'atteint par le chemin qui y mène, et chaque ajout se fait sur le handle du parent.

// Lire ou piloter un controle : le chemin complet, toujours
uo_ribbon.of_item(/*keys*/ "home/clipboard/paste").ib_enabled = false

Deux conséquences pratiques et confortables : deux groupes différents peuvent utiliser le même identifiant de contrôle sans se marcher dessus, et les événements vous livrent le chemin complet — vous savez toujours d'où vient le clic.


Démarrage rapide #

// event open de la fenetre

// Un onglet
uo_ribbon.of_add_tab(/*key*/ "home", /*title*/ "Accueil")

// Un groupe : un grand bouton et deux petits
uo_ribbon.of_add_group(/*keys*/ "home/clipboard", /*title*/ "Presse-papiers")
uo_ribbon.of_add_big_button(/*keys*/ "home/clipboard/paste", /*label*/ "Coller", /*image*/ "mono:img\paste.svg")
uo_ribbon.of_add_button(/*keys*/ "home/clipboard/cut", /*label*/ "Couper", /*image*/ "mono:img\cut.svg")
uo_ribbon.of_add_button(/*keys*/ "home/clipboard/copy", /*label*/ "Copier", /*image*/ "mono:img\copy.svg")

// Afficher l'onglet
uo_ribbon.of_select_tab(/*key*/ "home")
// event ue_clicked de uo_ribbon : (string as_keys)
choose case as_keys
    case "home/clipboard/paste" ; of_paste()
    case "home/clipboard/cut" ; of_cut()
    case "home/clipboard/copy" ; of_copy()
end choose

Propriétés #

PropriétéTypeDéfautRôle
is_app_buttonstring""Libellé du bouton applicatif, en haut à gauche, qui ouvre le menu applicatif. Le renommer garde son menu ; une chaîne vide retire le bouton, avec son menu. Les entrées du menu applicatif demandent le bouton d'abord
ib_minimizedbooleanfalsetrue replie le ruban sur ses seuls en-têtes d'onglets ; un clic sur un onglet le déroule temporairement. Posé par le code, il lève ue_minimized comme le geste de l'utilisateur — rien quand le ruban est déjà dans cet état ; ue_size_changed dit la nouvelle hauteur
ib_veto_gallerybooleanfalseDemander avant qu'une tuile de galerie ne soit retenue — par l'utilisateur ou par of_select_gallery_item (déclenche ue_gallery_selection_changing, qui peut refuser ; un of_select_gallery_item refusé renvoie -4). Inactif par défaut, comme tout événement annulable : chaque question coûte un aller-retour vers PowerBuilder (~35 ms). Mettez-le à true quand votre application répond
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

Constante — ACCENT_LIGHT (-1) : à passer comme couleur d'un onglet ou d'un groupe contextuel pour qu'il suive l'accent du thème, éclairci, plutôt qu'une couleur figée.

Propriétés d'un onglet — n_pbt_ribbon_tab #

Obtenues par of_tab("tab"), elles se modifient à chaud.

PropriétéTypeDéfautRôle
ib_visiblebooleantruefalse masque l'onglet sans le supprimer — le mécanisme même des onglets contextuels
is_titlestring""Titre de l'onglet. Posé par of_add_tab ; l'écrire ici le change, le lire dit ce que l'onglet affiche
is_keytipstring""Touche d'accès rapide affichée après appui sur Alt ("A" pour Accueil). Une lettre ou plusieurs ("FP", comme dans Office), tapées l'une après l'autre ; Retour arrière reprend la dernière. Lettres et chiffres seulement

Propriétés d'un groupe — n_pbt_ribbon_group #

Obtenues par of_group("tab/group").

PropriétéTypeDéfautRôle
ib_visiblebooleantruefalse masque le groupe et tous ses contrôles
is_titlestring""Libellé sous le groupe. Posé par of_add_group ; l'écrire ici le change
ib_launcherbooleanfalseAffiche la petite flèche en bas à droite du groupe — le lanceur de boîte de dialogue (déclenche ue_launcher). La flèche vit dans la barre de titre du groupe, et un groupe que le ruban a dû replier faute de place la garde au même endroit — elle voyage en plus dans le panneau qu'ouvre le groupe replié

Constantes de mode du sélecteur de couleur : COLORMODE_PALETTE (nuancier de pastilles, mode par défaut) et COLORMODE_OPEN (palette complète avec validation).

Propriétés d'un contrôle — n_pbt_ribbon_item #

Obtenues par of_item("tab/group/control"). Elles s'appliquent à tous les types de contrôles ; les propriétés hors sujet pour un type donné sont simplement ignorées.

PropriétéTypeDéfautRôle
is_labelstring""Libellé du contrôle. Accepte le balisage riche
is_imagestring""Image du contrôle (bouton, grand bouton, bouton partagé, liste déroulante, case, sélecteur de couleur, bouton de la barre d'accès rapide), avec les mêmes préfixes qu'à l'ajout (mono:, tint:). "" la retire. Relue en direct
ib_enabledbooleantruefalse grise le contrôle et bloque son activation
ib_checkedbooleanfalseÉtat enfoncé d'une bascule ou coché d'une case
ib_visiblebooleantruefalse masque le contrôle ; les voisins se resserrent
is_textstring""Texte saisi ou sélectionné dans une zone de liste modifiable
id_valuedouble0Valeur numérique d'un compteur
id_mindouble0Compteur uniquement : borne basse de la plage, modifiable à tout moment. La valeur est ramenée aussitôt dans la nouvelle plage, en silence (aucun ue_value_changed, comme id_value écrit par le code). Sur un autre contrôle, sans effet et relue 0
id_maxdouble0Compteur uniquement : borne haute de la plage, modifiable à tout moment ; la valeur est ramenée dans la plage en silence, comme pour id_min. Sur un autre contrôle, sans effet et relue 0
id_stepdouble0Compteur uniquement : pas des flèches et des touches Haut / Bas, modifiable à tout moment. Un pas de 0 ou moins est ignoré. Sur un autre contrôle, sans effet et relu 0
il_colorlong-1Couleur courante d'un sélecteur de couleur
ii_visible_itemsinteger3Galerie uniquement : nombre de tuiles que la bande repliée montre d'un coup. Les autres restent atteignables par les flèches, ou dans la grille dépliée
is_keytipstring""Touche d'accès rapide du contrôle, affichée après Alt et la lettre de l'onglet. Une lettre ou plusieurs ("FP", comme dans Office), tapées l'une après l'autre ; Retour arrière reprend la dernière. Lettres et chiffres seulement. Un contrôle d'un groupe replié garde sa touche : elle ouvre le panneau du groupe
is_tooltipstring""Info-bulle simple affichée au survol de l'item
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie de l'item (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie de l'item (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie de l'item

Propriétés d'une entrée de menu — n_pbt_ribbon_menu_item #

Obtenues par of_menu_item("tab/group/control/entry").

PropriétéTypeDéfautRôle
is_imagestring""Image de l'entrée de menu. Une chaîne vide la retire
of_is_separator ( ) → boolean——L'entrée est-elle une ligne de séparation ? Lecture seule : ce qu'une entrée est a été décidé à l'ajout
of_is_header ( ) → boolean——L'entrée est-elle un titre non cliquable ? Lecture seule, même raison
of_is_checkable ( ) → boolean——L'entrée porte-t-elle une coche ? Lecture seule ; ib_checked dit si elle est mise
ib_enabledbooleantruefalse grise l'entrée
ib_visiblebooleantruefalse retire l'entrée du menu à sa prochaine ouverture — cascade comprise — sans la supprimer
ib_checkedbooleanfalseCoche d'une entrée créée par of_add_menu_check

Propriétés d'une entrée du menu applicatif — n_pbt_ribbon_app_menu_item #

Obtenues par of_app_menu_item("recent/a.txt"). Elles se modifient à chaud : le menu les prend à sa prochaine ouverture.

PropriétéTypeDéfautRôle
is_labelstring""Texte de l'entrée
is_imagestring""Image de l'entrée. Une chaîne vide la retire
ib_enabledbooleantruefalse grise l'entrée : affichée, jamais choisie — Enregistrer quand il n'y a rien à enregistrer
ib_checkedbooleanfalseCoche devant l'entrée
ib_visiblebooleantruefalse retire l'entrée du menu à sa prochaine ouverture — sous-menu compris — sans la supprimer
of_is_separator ( ) → boolean——L'entrée est-elle une ligne de séparation ? Lecture seule
of_keys_at (long al_index) → string——L'adresse de l'entrée au rang ai_index (à partir de 1) sous celle-ci — ou au premier niveau pour of_app_menu_item("") —, "" au-delà : l'adresse que of_app_menu_item et of_remove_app_menu_item reçoivent

Les douze types de contrôles #

Tous s'ajoutent à l'adresse d'un groupe — "home/clipboard" — et renvoient 0 (-5 sur un argument invalide, -2 si le composant n'est pas créé) ; un menu ou une liste se remplit ensuite à l'adresse du contrôle.

Méthode du groupeContrôle obtenuÉvénement
of_add_big_button (string as_keys, string as_label, string as_image) → longGros bouton pleine hauteur, icône au-dessus du libellé. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_clicked
of_add_big_split (string as_keys, string as_label, string as_image) → longGros bouton scindé : la partie haute agit, la flèche ouvre le menu. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_clicked · ue_menu_selected
of_add_big_dropdown (string as_keys, string as_label, string as_image) → longGros bouton à menu déroulant. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_menu_selected
of_add_button (string as_keys, string as_label, string as_image) → longPetit bouton (empilé par colonnes de trois). Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_clicked
of_add_toggle (string as_keys, string as_label, string as_image) → longPetite bascule qui reste enfoncée. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_toggled
of_add_dropdown (string as_keys, string as_label, string as_image) → longPetit bouton à menu déroulant. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_menu_selected
of_add_checkbox (string as_keys, string as_label) → longCase à cocher. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_toggled
of_add_separator (string as_keys) → longSéparateur vertical entre deux blocs de contrôles. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé—
of_add_combo (string as_keys, integer ai_width_px, boolean ab_editable) → longZone de liste, éditable ou non. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_combo_changed
of_add_spinner (string as_keys, integer ai_width_px, double ad_min, double ad_max, double ad_step, double ad_value) → longCompteur numérique à flèches. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_value_changed
of_add_colorpicker (string as_keys, string as_label, string as_image, long al_color) → longBouton de couleur scindé : le clic réapplique, la flèche ouvre le nuancier. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas crééue_clicked · ue_color_changed
of_add_gallery (string as_keys, integer ai_width_px, integer ai_tile_w, integer ai_tile_h) → longBande de tuiles illustrées, défilanteue_gallery_selection_changed

of_add_colorpicker accepte un cinquième argument as_mode : COLORMODE_PALETTE (nuancier de pastilles) ou COLORMODE_OPEN (palette complète avec boutons Valider et Annuler).


Méthodes #

Construire le ruban #

MéthodeRôle
of_add_tab (string as_key, string as_title)Ajoute un onglet et renvoie 0 (-5 sur un argument invalide, -2 si le composant n'est pas créé) : les groupes s'ajoutent ensuite à son adresse
of_insert_tab (string as_key, string as_title, integer ai_index)Ajoute un onglet à la position que vous choisissez (1 = en tête) au lieu de la fin, et renvoie 0 (-5 sur un argument invalide, -2 si le composant n'est pas créé) comme of_add_tab. Un id déjà pris est refusé
of_tab (string as_key)Handle d'un onglet existant (créé au premier accès)
of_add_group (string as_keys, string as_title)Ajoute un groupe titré à un onglet — "home/clipboard" — et rend 0 (-5 sur un argument invalide, -2 si le composant n'est pas créé)
of_group (string as_keys)Handle d'un groupe existant, par son adresse
of_item (string as_keys)Handle d'un contrôle existant, par son adresse — "home/clipboard/paste"
of_select_tab (string as_key)Active un onglet, comme un clic sur lui : ue_selection_changed suit (juste après votre script, depuis la file d'événements ; rien quand l'onglet est déjà actif), et of_selected_key le relit aussitôt. Contrairement à un clic, il ne déroule pas un ruban replié. Renvoie 0 une fois appliqué, -5 pour un onglet inconnu ou masqué, -2 si le composant n'est pas créé
of_selected_key ( )Clé de l'onglet actif, "" si aucun. Lue en direct dans le composant : dès ue_selection_changed, ou juste après of_select_tab, elle dit déjà le nouvel onglet
of_remove_group (string as_keys)Retire un groupe et tous ses contrôles, par son adresse ; les poignées de ce qui part sont libérées. Renvoie 0 une fois appliqué, -5 quand aucun groupe ne vit à cette adresse, -2 si le composant n'est pas créé
of_remove_item (string as_keys)Retire un contrôle par son adresse (onglet/groupe/contrôle), ou un bouton de la barre d'accès rapide par sa seule clé ; sa poignée est libérée. Renvoie 0 une fois appliqué, -5 quand rien de tel ne vit à cette adresse, -2 si le composant n'est pas créé
of_remove_tab (string as_key)Retire un onglet et tout son contenu ; les poignées de ce qui part sont libérées. Renvoie 0 une fois appliqué, -5 quand aucun onglet ne porte cette clé, -2 si le composant n'est pas créé
of_clear ( )Vide entièrement le ruban : onglets, groupes, contrôles, barre d'accès rapide, menu applicatif. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé

Alimenter les menus et les listes #

Toutes ces méthodes s'appellent sur le composant, avec l'adresse du contrôle (onglet/groupe/contrôle) — l'entrée, le choix ou la tuile en quatrième niveau.

MéthodeRôle
of_add_menu_item (string as_keys, string as_label, string as_image)Entrée du menu d'un bouton déroulant ou scindé : onglet/groupe/contrôle/entrée, un niveau de plus par cascade. Renvoie 0 une fois appliqué, -5 sur une adresse fausse, un parent qui n'est ni un déroulant ni une entrée, ou une clé déjà prise dans ce menu, -2 si le composant n'est pas créé
of_add_menu_check (string as_keys, string as_label) · (id, label, image)Entrée cochable : le clic bascule son état et le rapporte dans ue_menu_selected. 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_header (string as_keys, string as_label)Ligne de titre non cliquable, pour découper un long menu. 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_keys)Ligne de séparation dans un menu : as_keys nomme le contrôle pour son propre menu, ou une entrée pour la cascade placée sous elle. 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 entrée d'un menu, sa cascade avec elle (onglet/groupe/contrôle/entrée, plus profond pour une entrée en cascade) ; ses poignées sont libérées. Renvoie 0 une fois appliqué, -5 quand aucune entrée ne vit à cette adresse, -2 si le composant n'est pas créé
of_clear_menu (string as_keys)Vide le menu d'un bouton déroulant ou scindé (onglet/groupe/contrôle) : une liste de « Fichiers récents » se reconstruit entrée par entrée, sans recréer le contrôle. Renvoie 0 une fois appliqué, -5 quand l'adresse n'est ni un déroulant ni un bouton scindé, -2 si le composant n'est pas créé
of_menu_item (string as_keys)Handle d'une entrée de menu, pour la griser ou la cocher à chaud
of_add_combo_item (string as_keys, string as_label)Ajoute un choix à la liste d'une zone de liste ; un choix a pour clé son libellé. Renvoie 0 une fois appliqué, -5 quand l'adresse n'est pas une zone de liste, ou sur un libellé déjà dans la liste, vide, ou qui contient / ou une barre verticale, -2 si le composant n'est pas créé
of_remove_combo_item (string as_keys)Retire un choix d'une zone de liste : onglet/groupe/liste/libellé. Renvoie 0 une fois appliqué, -5 quand la liste n'a pas ce choix, -2 si le composant n'est pas créé
of_clear_combo (string as_keys)Vide la liste d'une zone de liste (onglet/groupe/liste) ; son texte reste. Renvoie 0 une fois appliqué, -5 quand l'adresse n'est pas une zone de liste, -2 si le composant n'est pas créé
of_add_gallery_item (string as_keys, string as_image, string as_label)Ajoute une tuile à une galerie (onglet/groupe/galerie/tuile) ; son libellé est aussi son nom pour un lecteur d'écran. Renvoie 0 une fois appliqué, -5 sur une adresse fausse, un troisième niveau qui n'est pas une galerie, ou une tuile déjà prise, -2 si le composant n'est pas créé
of_remove_gallery_item (string as_keys)Retire une tuile d'une galerie (onglet/groupe/galerie/tuile). Quand la tuile sélectionnée part, plus rien n'est sélectionné. Renvoie 0 une fois appliqué, -5 quand cette tuile n'existe pas, -2 si le composant n'est pas créé
of_select_gallery_item (string as_keys)Sélectionne une tuile de galerie par programme, par son adresse à quatre niveaux, comme un choix : avec ib_veto_gallery actif, ue_gallery_selection_changing est posée d'abord ; puis ue_gallery_selection_changed suit. Tuile déjà sélectionnée : rien n'est demandé ni levé. Renvoie 0 une fois appliqué (ou déjà sélectionnée), -4 si votre ue_gallery_selection_changing a refusé (la tuile reste), -5 pour une autre profondeur ou une tuile que of_add_gallery_item n'a pas ajoutée, -2 si le composant n'est pas créé
of_open (string as_keys)Ouvre par programme le menu, la liste ou le nuancier du contrôle à cette adresse (onglet/groupe/contrôle) ; l'adresse d'un groupe (onglet/groupe) ouvre son panneau quand la fenêtre trop étroite l'a replié. Renvoie 0 une fois appliqué, -5 pour une adresse qui ne nomme ni contrôle ni groupe (un bouton de la barre d'accès rapide n'a pas de menu à ouvrir), -2 si le composant n'est pas créé
MéthodeRôle
of_add_app_menu_item (string as_keys, string as_label, string as_image)Entrée du menu applicatif (celui qu'ouvre le bouton is_app_button), par son adresse : recent à la racine, recent/a.txt dans le sous-menu de recent. Renvoie 0 une fois appliqué, -5 sur une clé invalide (vide, / ou barre verticale dans un niveau, commençant par __), une clé déjà prise, une entrée parente inconnue, ou sans bouton applicatif, -2 si le composant n'est pas créé
of_add_app_menu_separator (string as_keys)Ligne de séparation dans le menu applicatif. as_keys est son adresse, comme celle d'une entrée : s1 à la racine, saveas/s1 dans le sous-menu de saveas ; une adresse vide reçoit une clé à elle. Renvoie 0 une fois appliqué, -5 sur une clé déjà prise, une entrée parente inconnue, ou sans bouton applicatif, -2 si le composant n'est pas créé
of_remove_app_menu_item (string as_keys)Retire une entrée (ou ligne de séparation) du menu applicatif par son adresse, son sous-menu avec elle ; ses poignées sont libérées. Renvoie 0 une fois appliqué, -5 quand cette entrée n'existe pas, -2 si le composant n'est pas créé
of_app_menu_item (string as_keys)Handle d'une entrée du menu applicatif (save, recent/a.txt), pour la griser, la cocher, la masquer ou la renommer à chaud — voir ci-dessous. of_app_menu_item("") représente le menu lui-même : of_count et of_keys_at parcourent son premier niveau
of_add_qat (string as_key, string as_image, string as_tooltip)Bouton de la barre d'accès rapide, au-dessus des onglets ; son info-bulle est aussi son nom pour un lecteur d'écran. Renvoie 0 une fois appliqué, -5 sur une clé invalide (vide, / ou barre verticale dans un niveau, commençant par __) ou une clé déjà dans la barre, -2 si le composant n'est pas créé
of_qat_item (string as_key)Handle d'un bouton d'accès rapide, pour le griser ou le masquer à chaud

Onglets contextuels #

MéthodeRôle
of_add_contextual_tab (string as_key, string as_title, long al_color)Onglet contextuel isolé : créé masqué, marqué d'un liseré coloré. Passez ACCENT_LIGHT pour suivre l'accent du thème. Renvoie 0 une fois appliqué, -5 sur une clé invalide (vide, / ou barre verticale dans un niveau, commençant par __) ou une clé déjà prise, -2 si le composant n'est pas créé
of_add_contextual_group (string as_key, string as_title) · (id, title, al_color)Groupe d'onglets contextuels : un bandeau titré coloré coiffe ses onglets. Renvoie 0 une fois appliqué, -5 sur une clé invalide (vide, / ou barre verticale dans un niveau, commençant par __) ou une clé déjà prise (sa couleur change par of_ctx_group(clé).il_color), -2 si le composant n'est pas créé
of_ctx_group (string as_key)Retrouve le handle d'un groupe contextuel déjà créé, par sa clé — c'est sur lui que se posent ses propriétés
of_remove_contextual_group (string as_key)Retire un groupe d'onglets contextuels et les onglets qu'il coiffe — ils lui appartiennent ; leurs poignées sont libérées. Renvoie 0 une fois appliqué, -5 quand of_add_contextual_group n'a pas créé ce groupe, -2 si le composant n'est pas créé
of_add_contextual_tab (string as_key, string as_title, string as_group_key)Ajoute un onglet sous un groupe contextuel : créé masqué, coiffé du bandeau coloré du groupe. Renvoie 0 une fois appliqué, -5 sur une clé invalide ou déjà prise, ou un groupe que of_add_contextual_group n'a pas créé, -2 si le composant n'est pas créé
il_color (propriété)Sur un handle de groupe contextuel : recolore le bandeau à chaud (ACCENT_LIGHT pour revenir à l'accent)

Communes #

MéthodeRôle
of_reset ( )Vide le ruban et le ramène à son état neuf, propriétés comprises. 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_preload_icons (string as_icons[])Préchauffe un lot d'icônes au démarrage : un onglet ouvert plus tard affiche les siennes instantanément. 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éé

Événements #

Tous les événements de contrôle portent le chemin complet : vous n'avez jamais besoin d'un identifiant unique dans toute l'application.

ÉvénementDéclenché quand
ue_clicked (string as_keys)L'utilisateur clique un bouton, un gros bouton, la partie principale d'un bouton scindé ou un bouton de la barre d'accès rapide — dans le ruban, dans le panneau d'un groupe replié, ou par sa touche d'accès rapide. as_keys est l'adresse onglet/groupe/contrôle, ou la seule clé d'un bouton d'accès rapide
ue_toggled (string as_keys, boolean ab_checked)L'utilisateur bascule un bouton bascule ou une case à cocher (dans le ruban ou le panneau d'un groupe replié) ; ab_checked porte le nouvel état. Écrire ib_checked par le code ne lève rien
ue_menu_selected (string as_keys, boolean ab_checked)L'utilisateur choisit une entrée du menu d'un bouton déroulant ou scindé. as_keys est son adresse complète : onglet, groupe, contrôle porteur, puis l'entrée — un niveau de plus par cascade. Une entrée cochable bascule d'abord, et ab_checked porte son nouvel état. Une entrée grisée ou masquée ne se choisit pas
ue_combo_changed (string as_keys, string as_text)L'utilisateur valide le texte d'une zone de liste : un choix dans sa liste, Entrée dans le champ, ou la sortie du champ après une saisie. Échap abandonne la saisie sans rien lever ; écrire is_text par le code ne lève rien non plus
ue_value_changed (string as_keys, double ad_value)L'utilisateur change la valeur d'un compteur : ses flèches, Haut / Bas dans le champ, Entrée ou la sortie du champ après une saisie (Échap l'abandonne). ad_value est la nouvelle valeur, bornée à la plage du compteur. Écrire id_value par le code ne lève rien
ue_color_changed (string as_keys, long al_color)L'utilisateur choisit une couleur (nuancier ou sélecteur), ou clique la partie principale d'un sélecteur de couleur pour réappliquer sa couleur courante ; al_color est la couleur PowerBuilder. Écrire il_color par le code ne lève rien
ue_gallery_selection_changed (string as_from_keys, string as_keys)Une tuile de galerie a été retenue — par l'utilisateur ou par of_select_gallery_item (un ordre de votre code le lève aussi). Mêmes arguments que ue_gallery_selection_changing : la question et son issue se lisent pareil, et as_from_keys est la tuile quittée
ue_gallery_selection_changing (string as_from_keys, string as_keys) → booleanAnnulable, posé avant que la tuile ne soit retenue. Levé seulement quand ib_veto_gallery = true. as_from_keys est la tuile courante. Posé aussi pour of_select_gallery_item. Renvoyez false pour la conserver (un style que le document ne peut pas encore prendre) : of_select_gallery_item renvoie alors -4
ue_launcher (string as_keys)L'utilisateur clique la flèche de lanceur d'un groupe (aussi depuis le panneau d'un groupe replié) : as_keys est l'adresse du groupe onglet/groupe — ouvrez votre fenêtre d'options
ue_selection_changed (string as_keys)Un autre onglet passe au premier plan : un clic, la molette au-dessus du ruban, une touche d'accès rapide, ou of_select_tab (un ordre de votre code le lève aussi). as_keys est la clé de l'onglet — vide quand il n'en reste aucun, après que l'onglet actif a été masqué ou retiré
ue_app_button ( )Le bouton applicatif est cliqué
ue_app_menu_selected (string as_keys)L'utilisateur choisit une entrée du menu applicatif : as_keys est son adresse (saveas/as_pdf). Une entrée grisée ou masquée ne se choisit pas
ue_minimized (boolean ab_minimized)Le ruban se replie ou se déplie : le chevron au bout de la rangée d'onglets, un double-clic sur un onglet, ou ib_minimized posé par votre code (un ordre le lève aussi) ; ue_size_changed dit la nouvelle hauteur dans tous les cas
ue_size_changed (long al_height, boolean ab_minimized)La hauteur du ruban a changé d'elle-même : repli, dépli, onglet contextuel affiché, fenêtre plus étroite qui perd une rangée. Contrairement à ue_auto_height — qui ne parle que si le composant se redimensionne lui-même — celui-ci se déclenche que la hauteur automatique soit active ou non : c'est de l'information pure, pour replacer ce qui se trouve dessous
ue_keytips (boolean ab_on, integer ai_level)Les keytips apparaissent (true) ou disparaissent (false). ai_level dit où en est la navigation : 1 = les onglets sont lettrés, 2 = les commandes de l'onglet courant le sont, 0 = plus aucun keytip
ue_auto_height (long al_height)Le ruban annonce sa hauteur idéale et vient de s'y ajuster — toujours actif : la hauteur d'un ruban est intrinsèque
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)

Exemples #

Un ruban complet, du menu applicatif aux groupes #

// event open : on regroupe toute la construction en un seul rendu

// Geler l'affichage, et nommer le bouton d'application
uo_ribbon.of_set_redraw(/*on*/ false)
uo_ribbon.is_app_button = "Fichier"

// Menu applicatif, avec une cascade sous "Enregistrer sous"
uo_ribbon.of_add_app_menu_item(/*keys*/ "new", /*label*/ "Nouveau", /*image*/ "mono:img\new.svg")
uo_ribbon.of_add_app_menu_item(/*keys*/ "open", /*label*/ "Ouvrir...", /*image*/ "mono:img\open.svg")
uo_ribbon.of_add_app_menu_item(/*keys*/ "save_as", /*label*/ "Enregistrer sous", /*image*/ "mono:img\saveas.svg")
uo_ribbon.of_add_app_menu_item(/*keys*/ "save_as/as_pdf", /*label*/ "Document PDF", /*image*/ "")
uo_ribbon.of_add_app_menu_item(/*keys*/ "save_as/as_csv", /*label*/ "Fichier CSV", /*image*/ "")
uo_ribbon.of_add_app_menu_separator(/*keys*/ "sep1")
uo_ribbon.of_add_app_menu_item(/*keys*/ "quit", /*label*/ "Quitter", /*image*/ "mono:img\exit.svg")

// Barre d'acces rapide, au-dessus des onglets
uo_ribbon.of_add_qat(/*key*/ "qat_save", /*image*/ "mono:img\save.svg", /*tooltip*/ "Enregistrer")
uo_ribbon.of_add_qat(/*key*/ "qat_undo", /*image*/ "mono:img\undo.svg", /*tooltip*/ "Annuler")

// Onglet Accueil
uo_ribbon.of_add_tab(/*key*/ "home", /*title*/ "Accueil")
uo_ribbon.of_tab(/*key*/ "home").is_keytip = "A"

// Un groupe : un bouton partage avec son menu, puis deux petits boutons
uo_ribbon.of_add_group(/*keys*/ "home/clipboard", /*title*/ "Presse-papiers")
uo_ribbon.of_add_big_split(/*keys*/ "home/clipboard/paste", /*label*/ "Coller", /*image*/ "mono:img\paste.svg")
uo_ribbon.of_add_menu_item(/*keys*/ "home/clipboard/paste/paste_text", /*label*/ "Coller sans mise en forme", /*image*/ "")
uo_ribbon.of_add_menu_item(/*keys*/ "home/clipboard/paste/paste_link", /*label*/ "Coller comme lien", /*image*/ "")
uo_ribbon.of_add_button(/*keys*/ "home/clipboard/cut", /*label*/ "Couper", /*image*/ "mono:img\cut.svg")
uo_ribbon.of_add_button(/*keys*/ "home/clipboard/copy", /*label*/ "Copier", /*image*/ "mono:img\copy.svg")
uo_ribbon.of_group(/*keys*/ "home/clipboard").ib_launcher = true       // fleche d'options en bas a droite

// Tout dessiner d'un coup, puis afficher l'onglet
uo_ribbon.of_set_redraw(/*on*/ true)
uo_ribbon.of_select_tab(/*key*/ "home")

Un aiguillage de clics unique #

// event ue_clicked de uo_ribbon : (string as_keys)
// Le chemin complet arrive avec l'evenement : un seul aiguillage suffit,
// et deux groupes peuvent reutiliser le meme identifiant sans se gener.
choose case as_keys
    case "clipboard/cut" ; of_cut()
    case "clipboard/copy" ; of_copy()
    case "clipboard/paste" ; of_paste()
    case "font/bold"          ; of_toggle_bold()
end choose

Piloter l'état des contrôles selon les droits #

// Toujours par le chemin : onglet > groupe > controle
uo_ribbon.of_item(/*keys*/ "home/clipboard/paste").ib_enabled = of_clipboard_has_data()
uo_ribbon.of_item(/*keys*/ "home/tools/brush").ib_checked = true
uo_ribbon.of_tab(/*key*/ "admin").ib_visible = gb_administrator

// Griser une entree DANS un menu deroulant (niveau 4)
uo_ribbon.of_item(/*keys*/ "home/clipboard/paste") &
        .of_menu_item(/*keys*/ "paste_link").ib_enabled = false

Onglets contextuels à bandeau #

Le principe d'Office : des onglets qui n'apparaissent que lorsque la sélection les justifie, coiffés d'un bandeau titré coloré.

// event open : on prepare le groupe contextuel, masque par defaut

// Sans couleur, le bandeau suit l'accent du theme ; RGB(...) pour l'imposer
uo_ribbon.of_add_contextual_group(/*key*/ "img", /*title*/ "Outils Image", &
                                           /*color*/ RGB(/*red*/ 224, /*green*/ 32, /*blue*/ 96))
uo_ribbon.of_add_contextual_tab(/*key*/ "format", /*title*/ "Format", /*group_key*/ "img")
uo_ribbon.of_add_group(/*keys*/ "format/adjust", /*title*/ "Ajuster")
uo_ribbon.of_add_big_button(/*keys*/ "format/adjust/crop", /*label*/ "Rogner", /*image*/ "mono:img\crop.svg")
uo_ribbon.of_add_button(/*keys*/ "format/adjust/rotate", /*label*/ "Pivoter", /*image*/ "mono:img\rotate.svg")
// A la selection d'une image : on revele l'onglet et on l'active
uo_ribbon.of_tab(/*key*/ "format").ib_visible = true
uo_ribbon.of_select_tab(/*key*/ "format")
// A la deselection : on le masque, le bandeau disparait avec lui
uo_ribbon.of_tab(/*key*/ "format").ib_visible = false

Zone de liste, compteur, sélecteur de couleur et galerie #


// Un nouveau groupe dans l'onglet
uo_ribbon.of_add_group(/*keys*/ "home/font", /*title*/ "Police")

// Zone de liste editable : on l'alimente par son handle
uo_ribbon.of_add_combo(/*keys*/ "home/font/font_name", /*width_px*/ 140, /*editable*/ true)
uo_ribbon.of_add_combo_item(/*keys*/ "home/font/font_name", /*label*/ "Segoe UI")
uo_ribbon.of_add_combo_item(/*keys*/ "home/font/font_name", /*label*/ "Arial")
uo_ribbon.of_add_combo_item(/*keys*/ "home/font/font_name", /*label*/ "Calibri")
uo_ribbon.of_item(/*keys*/ "home/font/font_name").is_text = "Segoe UI"

// Compteur numerique : mini, maxi, pas, valeur initiale
uo_ribbon.of_add_spinner(/*keys*/ "home/font/size", /*width_px*/ 70, /*min*/ 6, /*max*/ 96, &
                          /*step*/ 1, /*value*/ 11)

// Selecteur de couleur en mode palette complete (avec Valider / Annuler)
uo_ribbon.of_add_colorpicker(/*keys*/ "home/font/color", /*label*/ "Couleur", &
                              /*image*/ "mono:img\font-color.svg", &
                              /*color*/ RGB(/*red*/ 0, /*green*/ 0, /*blue*/ 0), &
                              /*mode*/ u_pbt_ribbon.COLORMODE_OPEN)

// Galerie de styles : tuiles illustrees defilantes
uo_ribbon.of_add_gallery(/*keys*/ "home/font/styles", /*width_px*/ 220, &
                                     /*tile_w*/ 64, /*tile_h*/ 48)
uo_ribbon.of_add_gallery_item(/*keys*/ "home/font/styles/st_normal", /*image*/ "img\style-normal.png", /*label*/ "Normal")
uo_ribbon.of_add_gallery_item(/*keys*/ "home/font/styles/st_title",  /*image*/ "img\style-titre.png",  /*label*/ "Titre")
uo_ribbon.of_add_gallery_item(/*keys*/ "home/font/styles/st_note",   /*image*/ "img\style-note.png",   /*label*/ "Note")
uo_ribbon.of_add_gallery_item(/*keys*/ "home/font/styles/st_code",   /*image*/ "img\style-code.png",   /*label*/ "Code")

// La bande repliee montre 4 vignettes a la fois ; les autres restent
// atteignables par les fleches, ou dans la grille deplie.
uo_ribbon.of_item(/*keys*/ "home/font/styles").ii_visible_items = 4

// Le style selectionne au depart
uo_ribbon.of_select_gallery_item(/*keys*/ "home/font/styles/st_normal")
// event ue_value_changed de uo_ribbon : (string as_keys, double ad_value)
n_pbt_utils lnv_utils   // autoinstantiate : rien a creer, rien a detruire
if lnv_utils.of_leaf(/*keys*/ as_keys) = "size" then of_apply_size(ad_value)

La plage et le pas d'un compteur se changent après coup par id_min, id_max et id_step de sa poignée : la valeur est ramenée aussitôt dans la nouvelle plage, sans lever ue_value_changed. Son image, comme celle de tout contrôle, se change par is_image.

// La taille maximale depend de la police choisie : 96 puis 400 par pas de 2
uo_ribbon.of_item(/*keys*/ "home/font/size").id_max = 400
uo_ribbon.of_item(/*keys*/ "home/font/size").id_step = 2
// event ue_color_changed de uo_ribbon : (string as_keys, long al_color)
n_pbt_utils lnv_utils   // autoinstantiate : rien a creer, rien a detruire
if lnv_utils.of_leaf(/*keys*/ as_keys) = "color" then of_apply_color(al_color)

Refuser le choix d'une vignette de galerie #

// La question n'est posee que sur demande : cette ligne l'active, et
// ue_gallery_selection_changing decide alors de chaque vignette.
uo_ribbon.ib_veto_gallery = true
// event ue_gallery_selection_changing de uo_ribbon :
//   (string as_from_keys, string as_keys)
// Renvoyer FALSE conserve la vignette courante (as_from_keys).
n_pbt_utils lnv_utils   // autoinstantiate : rien a creer, rien a detruire
if lnv_utils.of_leaf(/*keys*/ as_keys) = "st_code" and not of_document_supports_code() then
    MessageBox("Style", "Ce document ne peut pas prendre le style Code.")
    return false
end if
return true

Le lanceur de boîte de dialogue #

// La petite fleche en bas a droite du groupe
uo_ribbon.of_group(/*keys*/ "home/font").ib_launcher = true
// event ue_launcher de uo_ribbon : (string as_keys)
// Le chemin identifie le groupe : on ouvre la fenetre d'options correspondante.
n_pbt_utils lnv_utils   // autoinstantiate : rien a creer, rien a detruire
choose case lnv_utils.of_leaf(/*keys*/ as_keys)
    case "font"        ; open(w_font_options)
    case "clipboard" ; open(w_paste_options)
end choose

Keytips : conduire le ruban au clavier #

// Alt affiche les lettres ; Alt puis A puis C declenche "copy"
uo_ribbon.of_tab(/*key*/ "home").is_keytip = "A"
uo_ribbon.of_item(/*keys*/ "home/clipboard/copy").is_keytip = "C"
uo_ribbon.of_item(/*keys*/ "home/clipboard/cut").is_keytip = "X"

Un appui sur Alt où que soit le focus dans la fenêtre donne la main au ruban : il prend le focus clavier et lève ses lettres. Vous n'avez rien à câbler — il suffit qu'au moins un keytip soit déclaré. Échap, un second Alt ou le choix d'une commande rendent le focus au contrôle que l'utilisateur avait quitté. Une touche peut avoir plusieurs lettres ("FP", comme dans Office) : l'utilisateur les tape l'une après l'autre, les badges qui ne commencent plus par ce qu'il a tapé s'effacent, et Retour arrière les rend. Un contrôle d'un groupe replié garde sa touche : elle ouvre le panneau du groupe.

ue_keytips vous prévient à chaque changement d'état, et vous donne le niveau courant :

// event ue_keytips de uo_ribbon : (boolean ab_on, integer ai_level)
// Le clavier pilote le ruban : effacer l'aide de la barre d'etat, qui parle
// de la souris, et la remettre quand les lettres retombent.
if ab_on then
    uo_statusbar.of_item(/*keys*/ "main").is_text = "Tapez une lettre (niveau " + String(ai_level) + ")"
else
    uo_statusbar.of_item(/*keys*/ "main").is_text = ""
end if

Info-bulles enrichies sur un contrôle #


// La super info-bulle du bouton Coller : un titre, un texte, une image
lnv_item = uo_ribbon.of_item(/*keys*/ "home/clipboard/paste")
lnv_item.is_super_tooltip_title = "Coller (Ctrl+V)"
lnv_item.is_super_tooltip_text  = "Insere le contenu du presse-papiers." &
                                + "[br][br][size-=15]Utilisez la fleche pour coller sans mise en forme.[/size-=15]"
lnv_item.is_super_tooltip_image = "img\paste.png"

Ces quatre propriétés sont exactement les mêmes que sur tout autre item de la bibliothèque. Pour une info-bulle d'une seule ligne, is_tooltip suffit.

Hauteur automatique #

Le ruban se dimensionne seul : il n'y a rien à activer. Il vous prévient à chaque changement de hauteur (repli, onglet contextuel, changement de thème) pour que vous replaciez ce qui est en dessous.

// event ue_auto_height de uo_ribbon : (long al_height)
// Le ruban s'est deja redimensionne : on replace ce qui est en dessous.
uo_content.y      = uo_ribbon.y + uo_ribbon.height
uo_content.height = this.height - uo_content.y

Replier le ruban pour gagner de la place #

// Start with the ribbon folded: only the tab headers show
uo_ribbon.ib_minimized = true
// event ue_minimized de uo_ribbon : (boolean ab_minimized)
// On memorise la preference de l'utilisateur pour la prochaine ouverture.
of_save_preference("ribbon_collapsed", ab_minimized)

Repartir d'un ruban vide #

// of_reset vide onglets, groupes, controles, barre d'acces rapide et menu
uo_ribbon.of_reset()
uo_ribbon.of_add_tab(/*key*/ "home", /*title*/ "Accueil")

Depuis un menu PowerBuilder existant #

Une application PowerBuilder a déjà décrit ses commandes une fois : dans son menu. Libellés, raccourcis, images, séparateurs, sous-menus, info-bulles — tout y est. n_pbt_menu2ribbon relit ce menu par RTTI et écrit le PowerScript qui construit le ruban correspondant.

// Une seule fois, a la main : le generateur ECRIT du code, il ne s'execute pas
// en production. Collez son resultat dans l'open de votre fenetre.
n_pbt_menu2ribbon lnv_gen
string ls_code

// Generer le code a partir du menu
lnv_gen = create n_pbt_menu2ribbon
ls_code = lnv_gen.of_generate(/*menu*/ m_principal, /*ribbon_var*/ "uo_ribbon")
destroy lnv_gen

// Le copier, pret a coller
ClipBoard(ls_code)

La conversion est déterministe : aucune IA, aucun appel réseau, rien qui sorte du poste. Chaque clé générée est le ClassName de l'item de menu (m_fichier, m_ouvrir) : l'adresse que le ruban rapporte (m_fichier/g1/m_ouvrir) ramène donc à l'item, et le routeur écrit à la fin du code déclenche son Clicked depuis ue_clicked, ue_toggled et ue_menu_selected - votre code existant s'exécute tel quel. Les sous-menus sont repris à toute profondeur, un item masqué est écarté, un item grisé reste grisé, un item coché devient une bascule ou une entrée cochable qui démarre cochée.

Le code produit est un point de départ à relire, pas un livrable : un menu est une liste, un ruban est une mise en page. Regroupez, choisissez vos gros boutons, supprimez ce qui n'a pas sa place en permanence. L'exemple 9 de la page ruban de l'application de démonstration montre un résultat complet.


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