Menu
Un menu au clavier avec bannières, sous-menus, sliders, listes et panneaux latéraux — fire-and-forget via des callbacks par item.
Un menu au clavier avec bannières, sous-menus, sliders, listes et panneaux latéraux — fire-and-forget via des callbacks par item.
lib.menu ouvre un menu navigable au clavier (flèches + Enter + Backspace + Escape). C'est
du fire-and-forget : tu réagis via les callbacks de chaque item, pas via une valeur de retour.
lib.menu({
title = 'Admin',
items = {
{ type = 'button', label = 'Réanimer', onSelected = revivePlayer },
{ type = 'checkbox', label = 'God mode', default = false, onChange = toggleGod },
},
})lib.menu(options)
titlestringrequiredTitre du menu.
itemsMenuItem[]requiredLa liste des items (types ci-dessous).
bannerstring | tableoptionalBannière optionnelle — une image ou un bandeau coloré. Voir Bannière ci-dessous.
itemsPerPagenumberoptionalItems affichés avant pagination. Défaut 10.
onClosefunctionoptionalAppelé à la fermeture du menu racine.
L'option banner a trois modes :
| Mode | Valeur | Rendu |
|---|---|---|
| Image | string (url / nui://… / data URI) | Une image en haut, header sobre dessous |
| Colorée | { color, text?, textColor? } | Un bandeau coloré avec text (défaut : title) ; textColor auto-contrasté |
| Aucune | nil | Header sobre seul (titre + compteur) |
string (url / nui://… / data URI){ color, text?, textColor? }text (défaut : title) ; textColor auto-contrasténil-- Image
lib.menu({ title = 'Garage', banner = 'nui://mon_garage/img/banner.png', items = {} })
-- Bandeau coloré (couleur du texte auto-contrastée)
lib.menu({ title = 'Garage', banner = { color = '#148CE1', text = 'GARAGE' }, items = {} })
-- Aucune (header sobre)
lib.menu({ title = 'Garage', items = {} })| Type | Comportement |
|---|---|
button | Exécute onSelected() sur Enter — ou ouvre submenu s'il est défini. |
checkbox | Toggle ; onChange(value) reçoit le nouveau booléen. default = état initial. |
slider | min / max / step ; onChange(value) reçoit le nombre. |
list | Cycle values[] avec gauche / droite ; onChange(value) reçoit la string. |
separator | Une ligne visuelle (label optionnel), non focusable. |
buttononSelected() sur Enter — ou ouvre submenu s'il est défini.checkboxonChange(value) reçoit le nouveau booléen. default = état initial.slidermin / max / step ; onChange(value) reçoit le nombre.listvalues[] avec gauche / droite ; onChange(value) reçoit la string.separatorlabel optionnel), non focusable.Tout item peut porter un panel (title, image, values, statistics, text) pour afficher des infos contextuelles à droite quand il est en focus.
lib.menu({
title = 'Paramètres',
items = {
{ type = 'button', label = 'Affichage', submenu = {
title = 'Affichage',
items = {
{ type = 'slider', label = 'FOV', min = 30, max = 90, default = 50, onChange = applyFov },
},
}},
},
})lib.closeMenu() ferme toute la pile ; lib.isMenuOpen() renvoie un booléen.
lib.menu ne bloque pas et ne renvoie rien — réagis via onSelected / onChange. Le rappeler remplace le menu courant (pas d'empilement). Modifier items après coup n'a aucun effet : reconstruis la table et rappelle lib.menu.