Module: Toolbar
An extension can register a Toolbar Module by defining a getToolbarModule
method. This module is commonly used to define:

Example Toolbar Module
The Toolbar Module should return an array of definitions and a
defaultContext. There are currently a few different variations of definitions,
each one is detailed further down.
export default {
  id: 'example-toolbar-module',
  /**
   * @param {object} params
   * @param {ServicesManager} params.servicesManager
   * @param {CommandsManager} params.commandsManager
   */
  getToolbarModule({ servicesManager, commandsManager }) {
    return {
      definitions: [
        /* Array of definitions */
      ],
      defaultContext: ['ROUTE:VIEWER'],
    };
  },
};
Button Definitions
The simplest definition has the following properties:
{
  id: 'StackScroll',
  label: 'Stack Scroll',
  icon: 'bars',
  type: 'setToolActive',
  commandName: 'setToolActive',
  commandOptions: { toolName: 'StackScroll' },
},
| property | description | values | 
|---|---|---|
id | Unique string identifier for the definition | * | 
label | User/display friendly to show in UI | * | 
icon | A string name for an icon supported by the consuming application. | * | 
type | Used to determine the button's component and behavior | "setToolActive", "command" | 
commandName | (optional) The command to run when the button is used. | Any command registed by a CommandModule | 
commandOptions | (optional) Options to pass the target commandName | * | 
context | (optional) Overrides module's defaultContext | Array of string context names | 
Where a button with a type of setToolActive has an "active" styling applied
when clicked; removing the active styling from all other buttons.
Nested Toolbar Menus
You can indicate that buttons should be grouped and nested in a submenu by
including buttons property in a definition:
{
  id: 'More',
  label: 'More',
  icon: 'ellipse-circle',
  buttons: [
    {
      id: 'cstInvert',
      label: 'Invert',
      icon: 'circle',
      type: 'command',
      commandName: 'invertViewport',
    },
  ],
},

Custom Components
The Toolbar Modules supports rendering custom components in place of the
application's default. In place of the type, commandName, and
commandOptions properties, we instead specify a CustomComponent.
{
  id: 'Custom',
  label: 'Custom',
  icon: 'custom-icon',
  CustomComponent: CustomToolbarComponent,
}
The CustomComponent components will receive the following props:
<CustomComponent
  parentContext="{parentContext}"
  toolbarClickCallback="{_handleToolbarButtonClick.bind(this)}"
  button="{button}"
  key="{button.id}"
  activeButtons="{activeButtonsIds}"
  isActive="{isActive}"
/>
| Property | Type | Description | 
|---|---|---|
activeButtons | string[] | list of active buttons | 
button | object | its own definition object | 
key | string | React key prop | 
isActive | boolean | If current button is active | 
parentContext | ? | The parent component's context? | 
toolbarClickCallback | func | Callback method for clicks |