@jupyterlab/apputils
Version:
JupyterLab - Application Utilities
171 lines (161 loc) • 5.05 kB
text/typescript
/*
* Copyright (c) Jupyter Development Team.
* Distributed under the terms of the Modified BSD License.
*/
import {
CommandToolbarButton,
LabIcon,
Toolbar
} from '@jupyterlab/ui-components';
import { CommandRegistry } from '@lumino/commands';
import { Widget } from '@lumino/widgets';
import { IToolbarWidgetRegistry, ToolbarRegistry } from '../tokens';
import { ISignal, Signal } from '@lumino/signaling';
/**
* Concrete implementation of IToolbarWidgetRegistry interface
*/
export class ToolbarWidgetRegistry implements IToolbarWidgetRegistry {
constructor(options: ToolbarRegistry.IOptions) {
this._defaultFactory = options.defaultFactory;
}
/**
* Default toolbar item factory
*/
get defaultFactory(): (
widgetFactory: string,
widget: Widget,
toolbarItem: ToolbarRegistry.IWidget
) => Widget {
return this._defaultFactory;
}
set defaultFactory(
factory: (
widgetFactory: string,
widget: Widget,
toolbarItem: ToolbarRegistry.IWidget
) => Widget
) {
this._defaultFactory = factory;
}
/**
* A signal emitted when a factory widget has been added.
*/
get factoryAdded(): ISignal<this, string> {
return this._factoryAdded;
}
/**
* Create a toolbar item widget
*
* @param widgetFactory The widget factory name that creates the toolbar
* @param widget The newly widget containing the toolbar
* @param toolbarItem The toolbar item definition
* @returns The widget to be inserted in the toolbar.
*/
createWidget(
widgetFactory: string,
widget: Widget,
toolbarItem: ToolbarRegistry.IWidget
): Widget {
const factory = this._widgets.get(widgetFactory)?.get(toolbarItem.name);
return factory
? factory(widget)
: this._defaultFactory(widgetFactory, widget, toolbarItem);
}
/**
* Add a new toolbar item factory
*
* @param widgetFactory The widget factory name that creates the toolbar
* @param toolbarItemName The unique toolbar item
* @param factory The factory function that receives the widget containing the toolbar and returns the toolbar widget.
* @returns The previously defined factory
*/
addFactory<T extends Widget = Widget>(
widgetFactory: string,
toolbarItemName: string,
factory: (main: T) => Widget
): ((main: T) => Widget) | undefined {
let namespace = this._widgets.get(widgetFactory);
const oldFactory = namespace?.get(toolbarItemName);
if (!namespace) {
namespace = new Map<string, (main: Widget) => Widget>();
this._widgets.set(widgetFactory, namespace);
}
namespace.set(toolbarItemName, factory);
this._factoryAdded.emit(toolbarItemName);
return oldFactory;
}
/**
* Register a new toolbar item factory
*
* @param widgetFactory The widget factory name that creates the toolbar
* @param toolbarItemName The unique toolbar item
* @param factory The factory function that receives the widget containing the toolbar and returns the toolbar widget.
* @returns The previously defined factory
*
* @deprecated since v4 use `addFactory` instead
*/
registerFactory<T extends Widget = Widget>(
widgetFactory: string,
toolbarItemName: string,
factory: (main: T) => Widget
): ((main: T) => Widget) | undefined {
return this.addFactory(widgetFactory, toolbarItemName, factory);
}
protected _defaultFactory: (
widgetFactory: string,
widget: Widget,
toolbarItem: ToolbarRegistry.IWidget
) => Widget;
protected _widgets: Map<string, Map<string, (main: Widget) => Widget>> =
new Map<string, Map<string, (main: Widget) => Widget>>();
protected _factoryAdded = new Signal<this, string>(this);
}
/**
* Create the default toolbar item widget factory
*
* @param commands Application commands registry
* @returns Default factory
*/
export function createDefaultFactory(
commands: CommandRegistry
): (
widgetFactory: string,
widget: Widget,
toolbarItem: ToolbarRegistry.IWidget
) => Widget {
return (
widgetFactory: string,
widget: Widget,
toolbarItem: ToolbarRegistry.IWidget
) => {
switch (toolbarItem.type ?? 'command') {
case 'command': {
const {
command: tId,
args: tArgs,
label: tLabel,
caption: tCaption,
icon: tIcon
} = toolbarItem;
const id = tId ?? '';
const args = { toolbar: true, ...tArgs };
const icon = tIcon ? LabIcon.resolve({ icon: tIcon }) : undefined;
// If there is an icon, undefined label will results in no label
// otherwise the label will be set using the setting or the command label
const label = icon ?? commands.icon(id, args) ? tLabel ?? '' : tLabel;
return new CommandToolbarButton({
commands,
id,
args,
icon,
label,
caption: tCaption as string
});
}
case 'spacer':
return Toolbar.createSpacerItem();
default:
return new Widget();
}
};
}