PBToolboxAI v1 ← 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
n_pbt_tilesbox_group lnv_grp

// of_add_group rend le handle du groupe : on y accroche ses tuiles
lnv_grp = uo_tuiles.of_add_group(/*group_id*/ "gestion", /*title*/ "Gestion")

lnv_grp.of_add_tile(/*id*/ "clients",   /*label*/ "Clients",   /*icon_file*/ "mono:img\clients.svg",   /*size*/ "medium")
lnv_grp.of_add_tile(/*id*/ "factures",  /*label*/ "Factures",  /*icon_file*/ "mono:img\factures.svg",  /*size*/ "medium")
lnv_grp.of_add_tile(/*id*/ "stock",     /*label*/ "Stock",     /*icon_file*/ "mono:img\stock.svg",     /*size*/ "small")
// event ue_tile_clicked de uo_tuiles : (string as_group, string as_id)
choose case as_group + "/" + as_id
    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, et les ajouts vivent sur le handle du groupe.

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

Les events portent eux aussi le chemin complet (as_group puis as_id). 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_VERTICALSens 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_id)n_pbt_tilesbox_groupRend le handle d'un groupe (créé au premier accès)
of_add_group (string as_group_id, string as_title)n_pbt_tilesbox_groupAjoute un groupe et rend son handle
of_remove_group (string as_id)Supprime un groupe et toutes ses tuiles
of_insert_tile (string as_group, string as_id, string as_text, integer ai_index)Insère une tuile à une position précise dans son groupe (position comptée à partir de 0)
of_insert_tile (string as_group, string as_id, 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
of_move_tile (string as_group, string as_id, integer ai_index)Déplace une tuile existante à une autre position de son groupe, en conservant son état
of_remove_tile (string as_group, string as_id)Supprime une seule tuile, le reste du panneau est préservé
of_clear ( )Vide le panneau (groupes et tuiles)
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
of_reset ( )Vide le contenu et remet les propriétés à leur défaut

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
of_tile (string as_id)n_pbt_tilesbox_tileRend le handle d'une tuile de ce groupe
of_add_tile (as_id, as_label, as_icon_file, as_size)n_pbt_tilesbox_tileAjoute une tuile à ce groupe et rend son handle

Sur une tuile — n_pbt_tilesbox_tile #

MembreTypeDéfautRôle
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
of_add_live_item (string as_text)Ajoute une face au bandeau animé ; à partir de deux faces, la tuile les fait défiler
of_clear_live_items ( )Vide le bandeau animé : la tuile cesse de défiler

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_group, string as_id)Une tuile est cliquée
ue_tile_moved (string as_group, string as_id, string as_to_group, long al_index)Une tuile a été déplacée : as_group est le groupe d'origine, as_to_group le groupe d'arrivée, al_index la nouvelle position
ue_group_toggled (string as_group, boolean ab_collapsed)Un groupe est replié ou déplié depuis son entête
ue_tile_context (string as_group, string as_id)Clic droit sur une tuile
ue_tile_resized (string as_group, string as_id, 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 #

n_pbt_tilesbox_group lnv_grp

uo_tuiles.of_clear()
lnv_grp = uo_tuiles.of_add_group(/*group_id*/ "accueil", /*title*/ "Accueil")

lnv_grp.of_add_tile(/*id*/ "tableau", /*label*/ "Tableau de bord", /*icon_file*/ "mono:img\chart.svg",  /*size*/ "large")
lnv_grp.of_add_tile(/*id*/ "clients", /*label*/ "Clients",         /*icon_file*/ "mono:img\users.svg",  /*size*/ "medium")
lnv_grp.of_add_tile(/*id*/ "agenda",  /*label*/ "Agenda",          /*icon_file*/ "mono:img\cal.svg",    /*size*/ "wide")
lnv_grp.of_add_tile(/*id*/ "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 #

n_pbt_tilesbox_group lnv_admin

lnv_admin = uo_tuiles.of_add_group(/*group_id*/ "admin", /*title*/ "Administration")
lnv_admin.of_add_tile(/*id*/ "users",  /*label*/ "Utilisateurs", /*icon_file*/ "mono:img\users.svg", /*size*/ "medium")
lnv_admin.of_add_tile(/*id*/ "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_group = "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(/*group_id*/ "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_group = groupe d'origine, as_to_group = groupe d'arrivee, al_index = position
if as_group <> as_to_group then
    of_tracer("Tuile " + as_id + " deplacee de " + as_group + " vers " + as_to_group)
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 0)
uo_tuiles.of_move_tile(/*group*/ "accueil", /*id*/ "aide", /*index*/ 0)

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

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

Réagir au clic droit #

// event ue_tile_context de uo_tuiles : (as_group, as_id)
// Retenir la tuile visee, puis ouvrir votre propre menu contextuel
is_groupe_vise = as_group
is_tuile_visee = as_id
of_ouvrir_menu_tuile(PointerX(), PointerY())

Bonnes pratiques #


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