mirror of
https://github.com/google/blockly.git
synced 2025-12-16 06:10:12 +01:00
* refactor: Remove uses of AnyDuringMigration from flyout_base.ts. * refactor: Remove uses of AnyDuringMigration from flyout_metrics_manager.ts. * refactor: Remove uses of AnyDuringMigration from variables_dynamic.ts. * refactor: Remove uses of AnyDuringMigration from procedures.ts. * refactor: Remove uses of AnyDuringMigration from generator.ts. * refactor: Remove some uses of AnyDuringMigration from menu.ts. * refactor: Remove uses of AnyDuringMigration from mutator.ts. * refactor: Remove uses of AnyDuringMigration from variables.ts. * refactor: Remove uses of AnyDuringMigration from array.ts. * refactor: Remove uses of AnyDuringMigration from aria.ts. * refactor: Remove uses of AnyDuringMigration in basic_cursor.ts. * refactor: Remove uses of AnyDuringMigration in dropdowndiv.ts. * refactor: Remove uses of AnyDuringMigration in utils.ts. * refactor: Remove uses of AnyDuringMigration from menuitem.ts. * refactor: Remove uses of AnyDuringMigration from idgenerator.ts. * refactor: Remove uses of AnyDuringMigration in block_animations.ts. * refactor: Initialize definitions and functionNames in generator.ts by default.
93 lines
2.9 KiB
TypeScript
93 lines
2.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2021 Google LLC
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* Calculates and reports flyout workspace metrics.
|
|
*
|
|
* @class
|
|
*/
|
|
import * as goog from '../closure/goog/goog.js';
|
|
goog.declareModuleId('Blockly.FlyoutMetricsManager');
|
|
|
|
import type {IFlyout} from './interfaces/i_flyout.js';
|
|
import {ContainerRegion, MetricsManager} from './metrics_manager.js';
|
|
import type {WorkspaceSvg} from './workspace_svg.js';
|
|
|
|
|
|
/**
|
|
* Calculates metrics for a flyout's workspace.
|
|
* The metrics are mainly used to size scrollbars for the flyout.
|
|
*
|
|
* @alias Blockly.FlyoutMetricsManager
|
|
*/
|
|
export class FlyoutMetricsManager extends MetricsManager {
|
|
/** The flyout that owns the workspace to calculate metrics for. */
|
|
protected flyout_: IFlyout;
|
|
|
|
/**
|
|
* @param workspace The flyout's workspace.
|
|
* @param flyout The flyout.
|
|
*/
|
|
constructor(workspace: WorkspaceSvg, flyout: IFlyout) {
|
|
super(workspace);
|
|
this.flyout_ = flyout;
|
|
}
|
|
|
|
/**
|
|
* Gets the bounding box of the blocks on the flyout's workspace.
|
|
* This is in workspace coordinates.
|
|
*
|
|
* @returns The bounding box of the blocks on the workspace.
|
|
*/
|
|
private getBoundingBox_(): SVGRect|
|
|
{height: number, y: number, width: number, x: number} {
|
|
let blockBoundingBox;
|
|
try {
|
|
blockBoundingBox = this.workspace_.getCanvas().getBBox();
|
|
} catch (e) {
|
|
// Firefox has trouble with hidden elements (Bug 528969).
|
|
// 2021 Update: It looks like this was fixed around Firefox 77 released in
|
|
// 2020.
|
|
blockBoundingBox = {height: 0, y: 0, width: 0, x: 0};
|
|
}
|
|
return blockBoundingBox;
|
|
}
|
|
|
|
override getContentMetrics(opt_getWorkspaceCoordinates?: boolean) {
|
|
// The bounding box is in workspace coordinates.
|
|
const blockBoundingBox = this.getBoundingBox_();
|
|
const scale = opt_getWorkspaceCoordinates ? 1 : this.workspace_.scale;
|
|
|
|
return {
|
|
height: blockBoundingBox.height * scale,
|
|
width: blockBoundingBox.width * scale,
|
|
top: blockBoundingBox.y * scale,
|
|
left: blockBoundingBox.x * scale,
|
|
};
|
|
}
|
|
|
|
override getScrollMetrics(
|
|
opt_getWorkspaceCoordinates?: boolean, opt_viewMetrics?: ContainerRegion,
|
|
opt_contentMetrics?: ContainerRegion) {
|
|
// AnyDuringMigration because: Expected 1 arguments, but got 0.
|
|
const contentMetrics = opt_contentMetrics || this.getContentMetrics();
|
|
const margin = this.flyout_.MARGIN * this.workspace_.scale;
|
|
const scale = opt_getWorkspaceCoordinates ? this.workspace_.scale : 1;
|
|
|
|
// The left padding isn't just the margin. Some blocks are also offset by
|
|
// tabWidth so that value and statement blocks line up.
|
|
// The contentMetrics.left value is equivalent to the variable left padding.
|
|
const leftPadding = contentMetrics.left;
|
|
|
|
return {
|
|
height: (contentMetrics.height + 2 * margin) / scale,
|
|
width: (contentMetrics.width + leftPadding + margin) / scale,
|
|
top: 0,
|
|
left: 0,
|
|
};
|
|
}
|
|
}
|