Files
blockly/core/separator_flyout_inflater.ts
2024-12-04 12:15:19 -08:00

70 lines
2.6 KiB
TypeScript

/**
* @license
* Copyright 2024 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import {FlyoutSeparator, SeparatorAxis} from './flyout_separator.js';
import type {IBoundedElement} from './interfaces/i_bounded_element.js';
import type {IFlyoutInflater} from './interfaces/i_flyout_inflater.js';
import * as registry from './registry.js';
import type {SeparatorInfo} from './utils/toolbox.js';
import type {WorkspaceSvg} from './workspace_svg.js';
/**
* Class responsible for creating separators for flyouts.
*/
export class SeparatorFlyoutInflater implements IFlyoutInflater {
/**
* Inflates a dummy flyout separator.
*
* The flyout automatically creates separators between every element with a
* size determined by calling gapForElement on the relevant inflater.
* Additionally, users can explicitly add separators in the flyout definition.
* When separators (implicitly or explicitly created) follow one another, the
* gap of the last one propagates backwards and flattens to one separator.
* This flattening is not additive; if there are initially separators of 2, 3,
* and 4 pixels, after normalization there will be one separator of 4 pixels.
* Therefore, this method returns a zero-width separator, which will be
* replaced by the one implicitly created by the flyout based on the value
* returned by gapForElement, which knows the default gap, unlike this method.
*
* @param _state A JSON representation of a flyout separator.
* @param flyoutWorkspace The workspace the separator belongs to.
* @returns A newly created FlyoutSeparator.
*/
load(_state: object, flyoutWorkspace: WorkspaceSvg): IBoundedElement {
const flyoutAxis = flyoutWorkspace.targetWorkspace?.getFlyout()
?.horizontalLayout
? SeparatorAxis.X
: SeparatorAxis.Y;
return new FlyoutSeparator(0, flyoutAxis);
}
/**
* Returns the size of the separator. See `load` for more details.
*
* @param state A JSON representation of a flyout separator.
* @param defaultGap The default spacing for flyout items.
* @returns The desired size of the separator.
*/
gapForElement(state: object, defaultGap: number): number {
const separatorState = state as SeparatorInfo;
const newGap = parseInt(String(separatorState['gap']));
return newGap ?? defaultGap;
}
/**
* Disposes of the given separator. Intentional no-op.
*
* @param _element The flyout separator to dispose of.
*/
disposeElement(_element: IBoundedElement): void {}
}
registry.register(
registry.Type.FLYOUT_INFLATER,
'sep',
SeparatorFlyoutInflater,
);