PBToolboxAI v3 ← Site

tilesbox — u_pbt_tilesbox #

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

Panneau de tuiles groupées façon écran d'accueil : quatre tailles de tuile, couleurs, pastilles, tuiles animées, groupes repliables et réorganisation à la souris.

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


En bref #

Userobjectu_pbt_tilesbox
Classes d'itemsn_pbt_tilesbox_group (groupe) → n_pbt_tilesbox_tile (tuile)
Sert àOffrir un écran d'accueil ou un lanceur de fonctions : des tuiles cliquables, lisibles de loin, rangées par thème
Options opt-in—

Démarrage rapide #

// event open de la fenetre

// Une tuile s ajoute a son ADRESSE : le groupe, puis son propre identifiant
uo_tuiles.of_add_group(/*key*/ "gestion", /*title*/ "Gestion")

uo_tuiles.of_add_tile(/*keys*/ "gestion/clients",   /*label*/ "Clients",   /*icon_file*/ "mono:img\clients.svg",   /*size*/ "medium")
uo_tuiles.of_add_tile(/*keys*/ "gestion/factures",  /*label*/ "Factures",  /*icon_file*/ "mono:img\factures.svg",  /*size*/ "medium")
uo_tuiles.of_add_tile(/*keys*/ "gestion/stock",     /*label*/ "Stock",     /*icon_file*/ "mono:img\stock.svg",     /*size*/ "small")
// event ue_tile_clicked de uo_tuiles : (string as_keys)
choose case as_keys
    case "gestion/clients"  ; open(w_clients)
    case "gestion/factures" ; open(w_factures)
    case "gestion/stock"    ; open(w_stock)
end choose

Le modèle : groupes et tuiles #

Le panneau contient des groupes, chacun avec son titre et son entête repliable. Les tuiles appartiennent à un groupe : leur identifiant n'est unique qu'à l'intérieur de ce groupe. L'accès passe donc toujours par le chemin complet. Les ajouts, eux, vivent sur le composant : un handle ne porte que des propriétés.

// Chemin obligatoire : groupe puis tuile
uo_tuiles.of_tile("gestion/factures").is_badge = "12"

Les events portent eux aussi l'adresse complete (as_keys, le groupe puis la tuile). Voir Socle commun · Les items.


Propriétés #

PropriétéTypeDéfautRôle
ib_reorderablebooleanfalseAutorise l'utilisateur à déplacer les tuiles à la souris (déclenche ue_tile_moved)
is_scrollstringSCROLL_HORIZONTALSens de défilement : SCROLL_VERTICAL (les tuiles passent à la ligne) ou SCROLL_HORIZONTAL (colonnes façon écran d'accueil)
ib_show_group_headersbooleantruefalse masque les entêtes de groupe. Utile quand le panneau ne contient qu'un seul groupe : il n'y a rien à nommer et l'entête ne fait que manger de la hauteur. Sans entête il n'y a plus de chevron : les groupes s'affichent toujours dépliés
ii_anim_durationinteger180Durée en millisecondes de l'animation de repli / dépli d'un groupe ; 0 = instantané
ii_tile_unitinteger0Taille de base d une tuile, en pixels : chaque format (petite, moyenne, large, grande) en est un multiple, donc une valeur rend tout le tableau plus dense ou plus aéré. 0 la rend au thème
ii_badge_sizeinteger0Hauteur des pastilles de tuile en pixels, pour toute la boîte (0 = la taille qui vient du thème). La taille de la police suit toute seule. La couleur d une pastille appartient à la tuile parce qu elle veut dire quelque chose ; sa taille, non
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_group (string as_key) → n_pbt_tilesbox_groupRend le handle d'un groupe (créé au premier accès)
of_add_group (string as_key, string as_title) → longAjoute un groupe et renvoie 0 (-5 sur un argument invalide, -2 si le composant n'est pas créé)
of_add_tile (string as_keys, string as_text, string as_image, string as_size) → longAjoute une tuile à son adresse, "gestion/clients" : le groupe où elle atterrit, puis son propre identifiant. Renvoie 0 (-5 sur un argument invalide, -2 si le composant n'est pas créé) — -5 si le parent n'est pas un groupe. Une surcharge omet l'icône et la taille
of_tile (string as_keys) → n_pbt_tilesbox_tileRend le handle d'une tuile, par son adresse (créé au premier accès)
of_add_live_item (string as_keys, string as_text) → longAjoute une face au bandeau animé d'une tuile, à son adresse ; à partir de deux faces, la tuile les fait défiler. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_clear_live_items (string as_keys) → longVide le bandeau animé d'une tuile : elle cesse de défiler et retrouve sa face simple. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_remove_group (string as_key)Supprime un groupe et toutes ses tuiles. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_insert_tile (string as_keys, string as_text, integer ai_index)Insère une tuile à une position précise dans son groupe (position 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_insert_tile (string as_keys, string as_text, string as_image, string as_size, integer ai_index)Idem, avec l’icône et la taille (small / medium / wide / large) : une tuile est une image avec un libellé dessous, et sa taille se voit dans la grille. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_move_tile (string as_keys, integer ai_index)Déplace une tuile existante à une autre position de son groupe, en conservant son état. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_remove_tile (string as_keys)Supprime une seule tuile, le reste du panneau est préservé. 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 le panneau (groupes et tuiles). Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_get_layout ( )Relit la disposition courante en JSON : groupes, tuiles, ordre et tailles. À stocker, puis à rendre par of_set_layout
of_set_layout (string as_state_json)Restaure une disposition lue avec of_get_layout ou reçue par ue_layout_changed. Renvoie 0 une fois appliqué, -5 sur un argument invalide (clé vide, adresse fausse), -2 si le composant n'est pas créé
of_reset ( )Vide le contenu et remet les propriétés à leur défaut. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé

Sur un groupe — n_pbt_tilesbox_group #

MembreTypeDéfautRôle
is_titlestring""Titre affiché dans l'entête, balisage riche accepté
ib_collapsedbooleanfalseGroupe replié : ses tuiles sont masquées sous l'entête
ib_enabledbooleantrueGroupe entier grisé et inerte
ib_visiblebooleantrueGroupe masqué, sans être supprimé du modèle

Sur une tuile — n_pbt_tilesbox_tile #

MembreTypeDéfautRôle
is_titlestring""Texte affiché sur la tuile. Posé par of_add_tile ; l'écrire ici le change, le lire dit ce que la tuile affiche en ce moment
is_imagestring""Icône de la tuile (chemin disque ou resources.dll:nom). Une chaîne vide retire l'icône
is_sizestringSIZE_MEDIUMTaille : SIZE_SMALL, SIZE_MEDIUM, SIZE_WIDE, SIZE_LARGE
il_back_color · il_text_colorlong-1Fond et texte propres à la tuile, en RGB(r,v,b) (-1 = ce que donne le thème)
il_back_color_hover · il_text_color_hoverlong-1Les deux mêmes, mais sous le pointeur
is_badgestring""Pastille affichée dans l'angle de la tuile (un compteur, un état court)
il_badge_colorlong0Fond de la pastille, en RGB PowerBuilder (0 = la couleur qui vient du thème)
is_live_textstring""Texte superposé à la tuile, balisage riche accepté
ib_enabledbooleantrueTuile grisée et non cliquable
ib_visiblebooleantrueTuile masquée, sans être retirée de son groupe

Les icônes acceptent toutes les formes reconnues par la bibliothèque : chemin, mono:, tint:, ressource de DLL. Sur une grande tuile, préférez une image nette en haute définition ou un SVG.


Les quatre tailles #

TailleEncombrementUsage typique
small1 caseRaccourci secondaire ; le libellé n'est pas affiché, l'info-bulle prend le relais
medium2 × 2 casesTaille de référence : icône et libellé
wide4 × 2 casesTuile allongée, idéale pour un texte animé
large4 × 4 casesTuile vedette de l'écran

Événements #

ÉvénementDéclenché quand
ue_tile_clicked (string as_keys)Une tuile est cliquée
ue_tile_moved (string as_keys, string as_to_keys, long al_index)Une tuile a été déplacée : as_keys est l'adresse de départ, as_to_keys le groupe d'arrivée, al_index la nouvelle position
ue_group_toggled (string as_key, boolean ab_collapsed)Un groupe est replié ou déplié depuis son entête
ue_tile_context (string as_keys)Clic droit sur une tuile
ue_tile_resized (string as_keys, string as_size)La taille d'une tuile a changé ; as_size porte la nouvelle taille
ue_layout_changed (string as_layout_json)L'arrangement a changé — l'utilisateur a déplacé ou redimensionné une tuile. Porte la disposition entière, pas seulement ce qui a bougé
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 #

Tailles mélangées dans un même groupe #


uo_tuiles.of_clear()
uo_tuiles.of_add_group(/*key*/ "accueil", /*title*/ "Accueil")

uo_tuiles.of_add_tile(/*keys*/ "accueil/tableau", /*label*/ "Tableau de bord", /*icon_file*/ "mono:img\chart.svg",  /*size*/ "large")
uo_tuiles.of_add_tile(/*keys*/ "accueil/clients", /*label*/ "Clients",         /*icon_file*/ "mono:img\users.svg",  /*size*/ "medium")
uo_tuiles.of_add_tile(/*keys*/ "accueil/agenda",  /*label*/ "Agenda",          /*icon_file*/ "mono:img\cal.svg",    /*size*/ "wide")
uo_tuiles.of_add_tile(/*keys*/ "accueil/aide",    /*label*/ "Aide",            /*icon_file*/ "mono:img\help.svg",   /*size*/ "small")

Pastille, couleur et tuile animée #

n_pbt_tilesbox_tile lnv_tuile

// Une pastille signale un nombre d'elements en attente
uo_tuiles.of_group("accueil").of_tile("clients").is_badge = String(ll_nouveaux)

// Rouge quand le retard devient critique, couleur du theme sinon (0)
if ll_nouveaux > 50 then
    uo_tuiles.of_group("accueil").of_tile("clients").il_badge_color = RGB(200, 30, 30)
else
    uo_tuiles.of_group("accueil").of_tile("clients").il_badge_color = 0
end if

// Une couleur propre met une tuile en avant : fond, texte, et ce que
// chacun devient sous le pointeur
lnv_tuile = uo_tuiles.of_group("accueil").of_tile("tableau")
lnv_tuile.il_back_color = RGB(0, 103, 192)
lnv_tuile.il_back_color_hover = RGB(0, 80, 150)
lnv_tuile.il_text_color = RGB(255, 255, 255)

// Tuile ANIMEE : chaque face ajoutee defile a son tour sur la tuile
lnv_tuile = uo_tuiles.of_group("accueil").of_tile("agenda")
lnv_tuile.of_clear_live_items()
lnv_tuile.of_add_live_item(/*text*/ "3 rendez-vous aujourd'hui")
lnv_tuile.of_add_live_item(/*text*/ "Reunion equipe a 14h00")
lnv_tuile.of_add_live_item(/*text*/ "2 relances en retard")

Un texte fixe plutôt qu'un défilement #

// is_live_text pose UN texte permanent sur la tuile (balisage riche accepte)
uo_tuiles.of_group("accueil").of_tile("tableau").is_live_text = "[b]48[/b] commandes du jour"

Groupes repliables #


uo_tuiles.of_add_group(/*key*/ "admin", /*title*/ "Administration")
uo_tuiles.of_add_tile(/*keys*/ "admin/users",  /*label*/ "Utilisateurs", /*icon_file*/ "mono:img\users.svg", /*size*/ "medium")
uo_tuiles.of_add_tile(/*keys*/ "admin/params", /*label*/ "Parametres",   /*icon_file*/ "mono:img\gear.svg",  /*size*/ "medium")

// Ce groupe demarre replie : l'utilisateur l'ouvre s'il en a besoin
lnv_admin.ib_collapsed = true

// Un groupe entier peut aussi etre grise selon les droits
lnv_admin.ib_enabled = (is_profil = "ADMIN")
// event ue_group_toggled de uo_tuiles
if as_keys = "admin" and not ab_collapsed then of_tracer("Ouverture du volet administration")

Un panneau à groupe unique, sans entête #

// Un seul groupe n'a rien a nommer : son entete ne fait que manger de la hauteur.
// Sans entete, plus de chevron non plus : les tuiles restent toujours visibles.
uo_tuiles.ib_show_group_headers = false
uo_tuiles.of_add_group(/*key*/ "tout", /*title*/ "")

Déplacer une tuile entre deux groupes #

Avec ib_reorderable = true, l'utilisateur fait glisser une tuile où il veut, y compris d'un groupe vers un autre. L'event ue_tile_moved livre les deux groupes et la nouvelle position.

uo_tuiles.ib_reorderable = true    // faux par defaut : a demander
// event ue_tile_moved de uo_tuiles
// as_keys = d'ou elle vient, as_to_keys = ou elle va, al_index = position
n_pbt_utils lnv_utils   // autoinstantiate : rien a creer, rien a detruire
if as_keys <> as_to_keys then
    of_tracer("Tuile " + lnv_utils.of_leaf(as_keys) + " deplacee de " + lnv_utils.of_parent(as_keys) + " vers " + as_to_keys)
end if
uo_tuiles.of_get_layout()    // demander la disposition pour la conserver
// event ue_layout_changed de uo_tuiles : conserver la disposition choisie
is_disposition = as_layout_json
// A l'ouverture suivante : restituer l'ecran tel que l'utilisateur l'avait range
if is_disposition <> "" then uo_tuiles.of_set_layout(is_disposition)

Pour figer l'écran, il suffit de couper la réorganisation :

uo_tuiles.ib_reorderable = false

Réorganiser depuis le code #

// Placer la tuile "aide" en tete de son groupe (positions comptees a partir de 1)
uo_tuiles.of_move_tile(/*group*/ "accueil", /*key*/ "aide", /*index*/ 1)

// Inserer une nouvelle tuile en deuxieme position
uo_tuiles.of_insert_tile(/*group*/ "accueil", /*key*/ "devis", /*text*/ "Devis", /*index*/ 2)

// Retirer une tuile sans toucher au reste
uo_tuiles.of_remove_tile(/*group*/ "accueil", /*key*/ "aide")

Réagir au clic droit #

// event ue_tile_context de uo_tuiles : (as_keys)
// Retenir la tuile visee, puis ouvrir votre propre menu contextuel
n_pbt_utils lnv_utils   // autoinstantiate : rien a creer, rien a detruire
// Une seule adresse : la decouper si les deux moities servent.
is_groupe_vise = lnv_utils.of_parent(as_keys)
is_tuile_visee = lnv_utils.of_leaf(as_keys)
of_ouvrir_menu_tuile(PointerX(), PointerY())

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