### Shelf Functions Availability LightWave® 6.0 Component Layout, Modeler Header lwshelf.h The shelf is a window where users can store and retrieve presets for your plug-in. The shelf API supplies functions that let you subscribe (connect), set the context (tell the shelf that your interface is the active one), open the shelf window, and add, load and save presets. For some plug-in classes, you don't need to call this global in order to gain access to the shelf's preset management. Beginning with LightWave® 7.0, the user can load and save presets for your plug-in through the VIPER (Versatile Interactive Preview Render) interface. Presets can be added to the shelf or loaded into your plug-in through calls to your regular handler load and save callbacks. Global Call
       LWShelfFuncs *shelff;
       shelff = global( LWSHELFFUNCS_GLOBAL, GFUSE_TRANSIENT );
The global function returns a pointer to an LWShelfFuncs.
       typedef struct st_LWSHELFFUNCS {
          LWShelfCltID (*subscribe)(char *name, char *subName,
                                      void *userData, int flags,
                                      LWShelfLoadOkFunc *,
                                      LWShelfLoadFunc *,
                                      LWShelfSaveFunc *);
          void (*unsubscribe)   (LWShelfCltID);
          void (*open)          (LWShelfCltID);
          int  (*isOpen)        (LWShelfCltID clt);
          void (*close)         (LWShelfCltID);
          void (*setContext)    (LWShelfCltID);
          int  (*addPreset)     (LWShelfCltID, LWPixmapID img,
                                   LWShelfParmList parms);
          void (*load)          (LWShelfCltID, char *filename,
                                   int prompt_user);
          void (*save)          (LWShelfCltID, char *filename,
                                   LWImageID thumimg, LWShelfParmList);
          int  (*addNamedPreset)(LWShelfCltID clt, LWPixmapID img,
                                   LWShelfParmList parms, const char *name,
                                   const char *comment );
       } LWShelfFuncs;
`client = subscribe( class, server, userdata, flags, loadok, load, save )` Initialize the interaction between a plug-in instance and the shelf. The client ID returned by this function is passed as the first argument to all of the others. The user data, typically the instance data for handlers, will be passed as the first argument to the three callbacks. The flags argument is a set of flag bits combined using bitwise-or. They indicate what kind of preset loading and saving the plug-in supports and can be any combination of the following. `SHLF_BIN` Saves to and loads from binary files. `SHLF_ASC` Saves to and loads from ASCII (text) files `SHLF_SEP` Saves to and loads from separate (non-LightWave®) files. `unsubscribe( client )` Conclude your instance's use of the shelf. You should call this before your instance is destroyed. `open( client )` Open the preset shelf window and set the context to your plug-in. The window will display only the presets for your plug-in. `open = isOpen( client )` Returns true if the shelf window is open. `close( client )` Close the shelf window. `setContext( client )` Set the shelf context. `index = addPreset( client, img, params )` Add a preset to the shelf. The `img` is the preset's thumbnail in the shelf window, created using the Image Utility functions. The `params` are passed as a NULL-terminated array of strings (tags) that you can use in your shelf load callback to tell which parameters in this preset should be loaded. In the simplest case, `params` will be NULL. `addPreset` is implemented as a call to `addNamedPreset`, which is passed a default name generated by the shelf system. New code should call `addNamedPreset` directly. `load( client, filename, prompt_user ) save( client, filename, thumb_img, params )` Load or save a preset in an external file. Presets are ordinarily stored in a file managed by the shelf system, but you can use these functions to load and save presets in files you name. For loading, if `prompt_user` is true and the preset contains a parameter list (`params` was non-NULL when `save` was called for the preset), the user is prompted for input. `index = addNamedPreset( client, img, params, name, comment )` Add a named preset to the shelf. Like `addPreset`, but you can also specify a name and a comment that will help the user identify the preset. Callbacks The last three arguments to the `subscribe` function are callbacks that the shelf calls when a preset is to be loaded or saved. The shelf system calls these to actually load and save the preset. For all three callbacks, the first argument is the user data you passed to `subscribe`.
       typedef int  LWShelfLoadOkFunc (void *userdata);
       typedef void LWShelfLoadFunc   (void *userdata, const LWLoadState *,
                                         const char *filename,
                                         LWShelfParmList);
       typedef void LWShelfSaveFunc   (void *userdata, const LWSaveState *,
                                         const char *filename );
`LWShelfLoadOkFunc` Returns a code that tells the shelf system whether to load the preset and whether the user should be prompted first. The code can be one of the following. `SHLC_NOWAY` Do not load. Your plug-in should tell the user why. `SHLC_DFLT` Display the default confirmation dialog. `SHLC_FORCE` Load without consulting the user. Your plug-in can display its own confirmation dialog and then return `NOWAY` or `FORCE` as appropriate, but you'll lose the ability to use parameter lists to selectively load parameters from your presets. `LWShelfLoadFunc` Load the preset. The shelf calls this when the user double-clicks on a preset thumbnail in the shelf window, or when you call the `load` function to load a preset from a file. In the first case, the `filename` argument will be NULL, and you'll read the preset's parameters by calling the LWLoadState functions. Typically, handlers pass this job on to their handler load callback. In the second case, the LWLoadState will be NULL, and you'll read the preset from the file named in `filename`. You can still pass this on to your handler's load callback by creating an LWLoadState for the preset file using the File I/O global. The parameter list is an array of strings. It contains a subset of the parameter list you passed to `addPreset`, `addNamedPreset` or `save`. The default load confirmation dialog presents the list to the user and allows the user to select parameters. Only selected parameters are passed to your load callback. You can use the selections to load only portions of a preset. `LWShelfSaveFunc` Save the preset. The shelf calls this when you call `addPreset`, `addNamedPreset` or `save`. When adding a preset to the shelf, the `filename` argument will be NULL, and you'll store the preset's parameters by calling the LWSaveState functions. Typically, handlers pass this job on to their handler save callback. When saving a preset to a file, the LWSaveState will be NULL, and you'll write the preset to the file named in `filename`. You can still pass this on to your handler's save callback by creating an LWSaveState for the preset file using the File I/O global. The parameter list is an array of strings representing parameters or groups of parameters in your preset data. When the preset is reloaded, the user can select from this list of named parameters, and the user's selection will be passed to the load callback. Example The shelf SDK sample is a Master plug-in that demonstrates the shelf functions. (This is all it does, in fact.) The plug-in's "data" is merely a color. The interface lets you add color presets to the shelf or save them in separate files. You can then load them back into the plug-in's handler instance.