PBToolboxAI v3 ← Site

radialmenu — u_pbt_radialmenu #

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

Menu contextuel radial : les commandes en couronne autour du curseur, choisies par leur direction plutôt qu'en parcourant une liste.

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


En bref #

Userobjectu_pbt_radialmenu
Classe d'itemsn_pbt_radialmenu_item (of_item(id))
Sert àOffrir quelques commandes fréquentes là où se trouve déjà la main
PrincipeVous décrivez les branches ; la roue, la forme et la navigation sont à nous

Démarrage rapide #

// Une roue montée pour ce qui est sous le curseur
uo_wheel.of_add_item(/*keys*/ "cut",    /*text*/ "Cut")
uo_wheel.of_add_item(/*keys*/ "copy",   /*text*/ "Copy")
uo_wheel.of_add_item(/*keys*/ "paste",  /*text*/ "Paste")
uo_wheel.of_add_item(/*keys*/ "delete", /*text*/ "Delete")
// Elle s'ouvre au relâchement du bouton droit : voir ue_rclicked

Ouvrir, puis choisir #

La roue s'ouvre au relâchement du bouton droit, et il faut un second clic pour choisir. Ce n'est pas un détail d'implémentation : si elle s'ouvrait sur l'appui, le relâchement de ce même clic sélectionnerait aussitôt le secteur tombé sous le curseur, et l'utilisateur déclencherait une commande sans l'avoir vue.

C'est pourquoi of_show() s'appelle depuis l'événement clic droit du contrôle sur lequel l'utilisateur fait le geste (un statictext, un button, une grille…) : à cet instant le bouton est déjà relâché, et le clic suivant est bien celui qui choisit. Le menu radial, lui, n'a aucune surface — donc aucun événement de souris à lui.

Le composant lui-même est invisible : il n'occupe aucune place dans la fenêtre. Posez-le n'importe où, donnez-lui une largeur et une hauteur nulles, il n'existe que le temps où la roue est ouverte.

Le moyeu au centre épelle en entier la branche pointée — c'est ce qui permet à un secteur de porter un libellé court sans mentir sur ce qu'il fait. Cliquer le moyeu referme la roue ; dans une sous-roue, il fait remonter d'un niveau.

// Elle s'ouvre au relâchement du bouton droit : voir ue_rclicked
uo_wheel.of_show()

Les sous-roues #

Une adresse accroche des branches sous une autre : export/pdf. Choisir la branche parente ne choisit rien : la roue est remplacée par celle de ses enfants, et le moyeu devient le retour.

Pourquoi remplacer plutôt qu'ajouter une seconde couronne ? Parce qu'un anneau extérieur diviserait les secteurs par deux à chaque niveau. Huit branches est déjà le maximum lisible ; on n'a pas les moyens d'en afficher deux niveaux à la fois.

L'événement ue_item_selected rapporte le chemin complet (export/pdf), pas l'identifiant de la feuille seule. Deux sous-roues peuvent donc nommer leurs branches pareil sans ambiguïté.

uo_wheel.of_add_item(/*keys*/ "export", /*text*/ "Export")
uo_wheel.of_add_item(/*keys*/ "export/pdf", /*text*/ "PDF")
uo_wheel.of_add_item(/*keys*/ "export/csv", /*text*/ "CSV")

Quand il y a trop de branches #

Une roue se lit par direction, et au-delà de huit secteurs les tranches cessent d'être distinguables. ii_max_sectors fixe ce plafond (de 3 à 12, 8 par défaut).

Les branches en trop ne sont pas perdues : la dernière place de la couronne devient une branche qui les contient toutes, et qui s'ouvre comme une sous-roue. Un menu qui laisserait tomber sa queue serait un menu qui ment sur ce qu'il propose.

Resserrer la couronne est souvent un gain : quatre branches larges se visent plus vite que huit étroites.


Propriétés #

PropriétéTypeDéfautRôle
ii_max_sectorsinteger8Nombre de branches que une couronne peut porter (3 à 12). Ce qui dépasse passe sous une dernière branche qui s'ouvre en sous-roue
is_theme_stylestringfluentStyle visuel du composant (constantes THEME_STYLE_*)
is_theme_modestringlightVariante claire ou sombre (constantes THEME_MODE_*)
il_theme_accentlong-1Couleur d'accent de ce composant (-1 = accent du thème)
is_tooltipstring""Info-bulle simple affichée au survol du composant
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie

Méthodes #

MéthodeRôle
of_add_item (string as_keys, string as_text)Ajoute une branche à la roue ; l'identifiant revient quand elle est choisie. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_add_item (string as_keys, string as_text, string as_image, boolean ab_checked)Même chose, avec l'icône et la marque — l'icône en troisième argument, comme partout ailleurs dans la bibliothèque. Une branche se grise par sa poignée : of_item(keys).ib_enabled = false. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_clear ( )Vide la roue. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé
of_show ( )Ouvre la roue centrée sur le curseur. À appeler depuis le clic droit du contrôle qui reçoit le geste
of_show (long al_x, long al_y)Même chose, centrée sur une position écran en pixels
of_item (string as_keys)Renvoie la poignée d'une branche pour la modifier ensuite (libellé, actif, marqué)
of_reset ( )Vide la roue et remet toutes les propriétés à leur valeur d'origine. Renvoie 0 une fois appliqué, -2 si le composant n'est pas créé

Événements #

ÉvénementDéclenché quand
ue_item_selected (string as_keys)L'utilisateur a choisi une branche. as_keys est le chemin complet (export/pdf), pas l'identifiant de la feuille seule
ue_dismissed ( )La roue s'est refermée sans qu'aucune branche soit choisie : clic sur le moyeu, clic à l'extérieur, ou touche Échap

La fenêtre de la roue est ronde : les coins laissent passer les clics vers l'application qui se trouve derrière, au lieu de les avaler dans un carré invisible.


Propriétés d'item #

PropriétéTypeDéfautRôle
is_textstring""Libellé de la branche. Gardez-le court : un secteur est une tranche, pas une ligne — le moyeu épelle le reste
ib_enabledbooleantrueÀ faux, la branche est grisée et son secteur ignore les clics
ib_visiblebooleantrueÀ faux, la branche sort de la roue — sous-roue comprise — sans être supprimée ; les secteurs se resserrent, et elle revient telle quelle
ib_checkedbooleanfalseÀ vrai, une pastille marque la branche comme active

Exemples #

Une roue par contexte #

// Une roue montée pour ce qui est sous le curseur
uo_wheel.of_clear()
uo_wheel.of_add_item(/*keys*/ "bold", /*text*/ "Bold", /*image*/ "mono:img\packimages.dll:svg/samples/bold", /*checked*/ true)
uo_wheel.of_add_item(/*keys*/ "find", /*text*/ "Find", /*image*/ "mono:img\packimages.dll:svg/samples/find", /*checked*/ false)

Réagir au chemin choisi #

// Evenement ue_item_selected du menu radial
// as_keys porte le chemin complet, ex. "export/pdf"
choose case as_keys
	case "export/pdf"
		of_exporter_pdf()
	case "delete"
		of_supprimer()
end choose

Marquer, griser, resserrer #

// Marquer une branche comme active
uo_wheel.of_item(/*key*/ "bold").ib_checked = true
// Griser celle qui n'a pas de sens ici
uo_wheel.of_item(/*key*/ "paste").ib_enabled = false
uo_wheel.ii_max_sectors = 4

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