From 7974e6325b5b8b5439321fd0295c9477183e21da Mon Sep 17 00:00:00 2001 From: kozbial Date: Tue, 17 Aug 2021 10:42:11 -0700 Subject: [PATCH] Split classes from core/metrics_manager.js into multiple files --- core/flyout_metrics_manager.js | 99 ++++++++++++++++++++++++++++++++++ core/metrics_manager.js | 88 +----------------------------- tests/deps.js | 3 +- 3 files changed, 102 insertions(+), 88 deletions(-) create mode 100644 core/flyout_metrics_manager.js diff --git a/core/flyout_metrics_manager.js b/core/flyout_metrics_manager.js new file mode 100644 index 000000000..4e8dc8aed --- /dev/null +++ b/core/flyout_metrics_manager.js @@ -0,0 +1,99 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Calculates and reports flyout workspace metrics. + * @author aschmiedt@google.com (Abby Schmiedt) + */ +'use strict'; + +goog.provide('Blockly.FlyoutMetricsManager'); + +goog.require('Blockly.MetricsManager'); +goog.require('Blockly.utils.object'); + +goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.WorkspaceSvg'); + + +/** + * Calculates metrics for a flyout's workspace. + * The metrics are mainly used to size scrollbars for the flyout. + * @param {!Blockly.WorkspaceSvg} workspace The flyout's workspace. + * @param {!Blockly.IFlyout} flyout The flyout. + * @extends {Blockly.MetricsManager} + * @constructor + */ +Blockly.FlyoutMetricsManager = function(workspace, flyout) { + /** + * The flyout that owns the workspace to calculate metrics for. + * @type {!Blockly.IFlyout} + * @protected + */ + this.flyout_ = flyout; + + Blockly.FlyoutMetricsManager.superClass_.constructor.call(this, workspace); +}; +Blockly.utils.object.inherits( + Blockly.FlyoutMetricsManager, Blockly.MetricsManager); + +/** + * Gets the bounding box of the blocks on the flyout's workspace. + * This is in workspace coordinates. + * @return {!SVGRect|{height: number, y: number, width: number, x: number}} The + * bounding box of the blocks on the workspace. + * @private + */ +Blockly.FlyoutMetricsManager.prototype.getBoundingBox_ = function() { + try { + var 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. + var blockBoundingBox = {height: 0, y: 0, width: 0, x: 0}; + } + return blockBoundingBox; +}; + +/** + * @override + */ +Blockly.FlyoutMetricsManager.prototype.getContentMetrics = function( + opt_getWorkspaceCoordinates) { + // The bounding box is in workspace coordinates. + var blockBoundingBox = this.getBoundingBox_(); + var 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 + */ +Blockly.FlyoutMetricsManager.prototype.getScrollMetrics = function( + opt_getWorkspaceCoordinates, opt_viewMetrics, opt_contentMetrics) { + var contentMetrics = opt_contentMetrics || this.getContentMetrics(); + var margin = this.flyout_.MARGIN * this.workspace_.scale; + var 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. + var leftPadding = contentMetrics.left; + + return { + height: (contentMetrics.height + 2 * margin) / scale, + width: (contentMetrics.width + leftPadding + margin) / scale, + top: 0, + left: 0, + }; +}; diff --git a/core/metrics_manager.js b/core/metrics_manager.js index 1288588df..562a1b8b6 100644 --- a/core/metrics_manager.js +++ b/core/metrics_manager.js @@ -10,15 +10,14 @@ */ 'use strict'; -goog.provide('Blockly.FlyoutMetricsManager'); goog.provide('Blockly.MetricsManager'); -goog.requireType('Blockly.IMetricsManager'); goog.require('Blockly.registry'); goog.require('Blockly.utils.Size'); goog.require('Blockly.utils.toolbox'); goog.requireType('Blockly.IFlyout'); +goog.requireType('Blockly.IMetricsManager'); goog.requireType('Blockly.IToolbox'); goog.requireType('Blockly.utils.Metrics'); goog.requireType('Blockly.WorkspaceSvg'); @@ -50,7 +49,6 @@ Blockly.MetricsManager = function(workspace) { * }} */ Blockly.MetricsManager.ToolboxMetrics; - /** * Describes where the viewport starts in relation to the workspace SVG. * @typedef {{ @@ -59,8 +57,6 @@ Blockly.MetricsManager.ToolboxMetrics; * }} */ Blockly.MetricsManager.AbsoluteMetrics; - - /** * All the measurements needed to describe the size and location of a container. * @typedef {{ @@ -71,7 +67,6 @@ Blockly.MetricsManager.AbsoluteMetrics; * }} */ Blockly.MetricsManager.ContainerRegion; - /** * Describes fixed edges of the workspace. * @typedef {{ @@ -82,7 +77,6 @@ Blockly.MetricsManager.ContainerRegion; * }} */ Blockly.MetricsManager.FixedEdges; - /** * Common metrics used for UI elements. * @typedef {{ @@ -92,7 +86,6 @@ Blockly.MetricsManager.FixedEdges; * }} */ Blockly.MetricsManager.UiMetrics; - /** * Gets the dimensions of the given workspace component, in pixel coordinates. * @param {?Blockly.IToolbox|?Blockly.IFlyout} elem The element to get the @@ -477,82 +470,3 @@ Blockly.MetricsManager.prototype.getMetrics = function() { Blockly.registry.register( Blockly.registry.Type.METRICS_MANAGER, Blockly.registry.DEFAULT, Blockly.MetricsManager); - -/** - * Calculates metrics for a flyout's workspace. - * The metrics are mainly used to size scrollbars for the flyout. - * @param {!Blockly.WorkspaceSvg} workspace The flyout's workspace. - * @param {!Blockly.IFlyout} flyout The flyout. - * @extends {Blockly.MetricsManager} - * @constructor - */ -Blockly.FlyoutMetricsManager = function(workspace, flyout) { - /** - * The flyout that owns the workspace to calculate metrics for. - * @type {!Blockly.IFlyout} - * @protected - */ - this.flyout_ = flyout; - - Blockly.FlyoutMetricsManager.superClass_.constructor.call(this, workspace); -}; -Blockly.utils.object.inherits( - Blockly.FlyoutMetricsManager, Blockly.MetricsManager); - -/** - * Gets the bounding box of the blocks on the flyout's workspace. - * This is in workspace coordinates. - * @return {!SVGRect|{height: number, y: number, width: number, x: number}} The - * bounding box of the blocks on the workspace. - * @private - */ -Blockly.FlyoutMetricsManager.prototype.getBoundingBox_ = function() { - try { - var 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. - var blockBoundingBox = {height: 0, y: 0, width: 0, x: 0}; - } - return blockBoundingBox; -}; - -/** - * @override - */ -Blockly.FlyoutMetricsManager.prototype.getContentMetrics = function( - opt_getWorkspaceCoordinates) { - // The bounding box is in workspace coordinates. - var blockBoundingBox = this.getBoundingBox_(); - var 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 - */ -Blockly.FlyoutMetricsManager.prototype.getScrollMetrics = function( - opt_getWorkspaceCoordinates, opt_viewMetrics, opt_contentMetrics) { - var contentMetrics = opt_contentMetrics || this.getContentMetrics(); - var margin = this.flyout_.MARGIN * this.workspace_.scale; - var 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. - var leftPadding = contentMetrics.left; - - return { - height: (contentMetrics.height + 2 * margin) / scale, - width: (contentMetrics.width + leftPadding + margin) / scale, - top: 0, - left: 0, - }; -}; diff --git a/tests/deps.js b/tests/deps.js index 4265efa12..f1caf890b 100644 --- a/tests/deps.js +++ b/tests/deps.js @@ -75,6 +75,7 @@ goog.addDependency('../../core/field_variable.js', ['Blockly.FieldVariable'], [' goog.addDependency('../../core/flyout_base.js', ['Blockly.Flyout'], ['Blockly', 'Blockly.ComponentManager', 'Blockly.DeleteArea', 'Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Events.VarCreate', 'Blockly.FlyoutMetricsManager', 'Blockly.Gesture', 'Blockly.ScrollbarPair', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.Variables', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.blockRendering', 'Blockly.browserEvents', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.toolbox', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/flyout_button.js', ['Blockly.FlyoutButton'], ['Blockly.Css', 'Blockly.browserEvents', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.style'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/flyout_horizontal.js', ['Blockly.HorizontalFlyout'], ['Blockly.DropDownDiv', 'Blockly.Flyout', 'Blockly.Scrollbar', 'Blockly.WidgetDiv', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Rect', 'Blockly.utils.object', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../core/flyout_metrics_manager.js', ['Blockly.FlyoutMetricsManager'], ['Blockly.MetricsManager', 'Blockly.utils.object'], {'lang': 'es5'}); goog.addDependency('../../core/flyout_vertical.js', ['Blockly.VerticalFlyout'], ['Blockly.Block', 'Blockly.DropDownDiv', 'Blockly.Flyout', 'Blockly.Scrollbar', 'Blockly.WidgetDiv', 'Blockly.constants', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Rect', 'Blockly.utils.object', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/generator.js', ['Blockly.Generator'], ['Blockly.common', 'Blockly.internalConstants', 'Blockly.utils.deprecation'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/gesture.js', ['Blockly.Gesture'], ['Blockly.BlockDragger', 'Blockly.BubbleDragger', 'Blockly.Events', 'Blockly.Events.Click', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.Workspace', 'Blockly.WorkspaceDragger', 'Blockly.blockAnimations', 'Blockly.browserEvents', 'Blockly.internalConstants', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); @@ -121,7 +122,7 @@ goog.addDependency('../../core/keyboard_nav/tab_navigate_cursor.js', ['Blockly.T goog.addDependency('../../core/marker_manager.js', ['Blockly.MarkerManager'], [], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/menu.js', ['Blockly.Menu'], ['Blockly.browserEvents', 'Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.style'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/menuitem.js', ['Blockly.MenuItem'], ['Blockly.utils.IdGenerator', 'Blockly.utils.aria', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/metrics_manager.js', ['Blockly.FlyoutMetricsManager', 'Blockly.MetricsManager'], ['Blockly.registry', 'Blockly.utils.Size', 'Blockly.utils.toolbox'], {'lang': 'es5'}); +goog.addDependency('../../core/metrics_manager.js', ['Blockly.MetricsManager'], ['Blockly.registry', 'Blockly.utils.Size', 'Blockly.utils.toolbox'], {'lang': 'es5'}); goog.addDependency('../../core/msg.js', ['Blockly.Msg'], ['Blockly.utils.global']); goog.addDependency('../../core/mutator.js', ['Blockly.Mutator'], ['Blockly.Bubble', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Events.BubbleOpen', 'Blockly.Icon', 'Blockly.Options', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.internalConstants', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.toolbox', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/names.js', ['Blockly.Names'], ['Blockly.Msg', 'Blockly.Variables', 'Blockly.internalConstants'], {'lang': 'es6', 'module': 'goog'});