Context Menu Services
Availability LightWave 7.0 | Component Layout, Modeler | Header lwpanel.h
Context menu services are a set of functions for creating and displaying context menus over your panels. A context menu is a modal popup window containing a list of options. You typically display one of these when the user right-clicks or shift-clicks an item in your panel.
Global Call
ContextMenuFuncs *cmenuf; cmenuf = global( LWCONTEXTMENU_GLOBAL, GFUSE_TRANSIENT );
The global function returns a pointer to a ContextMenuFuncs.
typedef struct st_ContextMenuFuncs { LWContextMenuID (*cmenuCreate) (LWPanPopupDesc, void *userdata); int (*cmenuDeploy) (LWContextMenuID, LWPanelID, int item); void (*cmenuDestroy)(LWContextMenuID); } ContextMenuFuncs;
menu = cmenuCreate( popdesc, userdata )
- Create a context menu. The
popdesc
structure, described below, contains your menu parameters and callbacks. Theuserdata
is a pointer that you want your callbacks to receive. selection = cmenuDeploy( menu, panel, item )
- Display the context menu, typically in response to some user action. A context menu is
always displayed in association with a particular
panel
. Theitem
is the 0-based index of the menu item that should be selected when the menu is first displayed, and the return value is the index of the item selected by the user. Either of these can be -1 to indicate no selection. cmenuDestroy( menu )
- Free the menu and related resources allocated by
cmenuCreate
.
Popup Descriptor
The cmenuCreate
function uses an LWPanPopupDesc structure to define the menu.
This is the same structure used by Panels custom popup controls,
but for that purpose, its details are conveniently hidden from you by the CUSTPOPUP_CTL
macro.
typedef struct st_LWPanPopupDesc { LWType type; int width; int (*countFn)(void *userdata); char * (*nameFn) (void *userdata, int item); } LWPanPopupDesc;
type
- Set this to
LWT_POPUP
. width
- The width of the menu in pixels.
nitems = countFn( userdata )
- Your count callback, which returns the number of items in the menu. The
userdata
is whatever you passed as the second argument tocmenuCreate
. itemstring = nameFn( userdata, item )
- Your item name callback, which returns the string that should be displayed for the item.
Example
The following code fragments create and display a simple context menu. First, we'll create a data structure for our menu and define the callbacks.
typedef struct st_MyMenuData { int count; char **name; } MyMenuData; static char *itemname[] = { "New", "Load", "Save", "Copy", "Paste", NULL }; MyMenuData menudata = { 5, itemname }; int menuCount( MyMenuData *data ) { return data->count; } int menuName( MyMenuData *data, int index ) { if ( index >= 0 && index < data->count ) return data->name[ index ]; return NULL; }
Don't forget to initialize the global.
#include <lwpanel.h> ContextMenuFuncs *cmenuf; cmenuf = global( LWCONTEXTMENU_GLOBAL, GFUSE_TRANSIENT ); if ( !cmenuf ) return AFUNC_BADGLOBAL;
Create the menu. Typically you'll do this when you're creating the associated panel and its controls.
LWContextMenuID menu; LWPanPopupDesc desc; desc.type = LWT_POPUP; desc.width = 200; desc.countFn = menuCount; desc.nameFn = menuName; menu = cmenuf->cmenuCreate( &desc, menudata ); if ( !menu ) goto MenuFail;
Display the context menu in response to some user action.
int select, current; select = cmenuf->cmenuDeploy( menu, panel, current ); if ( select != -1 ) { current = select; ...
When you're done with it, free the menu.
cmenuf->cmenuDestroy( menu );