mirror of
https://github.com/google/blockly.git
synced 2026-01-10 10:27:08 +01:00
Merge pull request #5203 from gonfunko/mutator
Migrate core/mutator.js to goog.module syntax
This commit is contained in:
300
core/mutator.js
300
core/mutator.js
@@ -11,81 +11,88 @@
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
goog.provide('Blockly.Mutator');
|
||||
goog.module('Blockly.Mutator');
|
||||
goog.module.declareLegacyNamespace();
|
||||
|
||||
goog.require('Blockly.Bubble');
|
||||
goog.require('Blockly.Events');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const Abstract = goog.requireType('Blockly.Events.Abstract');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const Block = goog.requireType('Blockly.Block');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const BlockSvg = goog.requireType('Blockly.BlockSvg');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const Blockly = goog.requireType('Blockly');
|
||||
const Bubble = goog.require('Blockly.Bubble');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const Connection = goog.requireType('Blockly.Connection');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const Coordinate = goog.requireType('Blockly.utils.Coordinate');
|
||||
const Events = goog.require('Blockly.Events');
|
||||
const Icon = goog.require('Blockly.Icon');
|
||||
const Options = goog.require('Blockly.Options');
|
||||
const Svg = goog.require('Blockly.utils.Svg');
|
||||
/* eslint-disable-next-line no-unused-vars */
|
||||
const Workspace = goog.requireType('Blockly.Workspace');
|
||||
const WorkspaceSvg = goog.require('Blockly.WorkspaceSvg');
|
||||
const Xml = goog.require('Blockly.Xml');
|
||||
const dom = goog.require('Blockly.utils.dom');
|
||||
const internalConstants = goog.require('Blockly.internalConstants');
|
||||
const object = goog.require('Blockly.utils.object');
|
||||
const toolbox = goog.require('Blockly.utils.toolbox');
|
||||
const xml = goog.require('Blockly.utils.xml');
|
||||
/** @suppress {extraRequire} */
|
||||
goog.require('Blockly.Events.BlockChange');
|
||||
/** @suppress {extraRequire} */
|
||||
goog.require('Blockly.Events.BubbleOpen');
|
||||
goog.require('Blockly.Icon');
|
||||
goog.require('Blockly.internalConstants');
|
||||
goog.require('Blockly.Options');
|
||||
goog.require('Blockly.utils');
|
||||
goog.require('Blockly.utils.dom');
|
||||
goog.require('Blockly.utils.object');
|
||||
goog.require('Blockly.utils.Svg');
|
||||
goog.require('Blockly.utils.toolbox');
|
||||
goog.require('Blockly.utils.xml');
|
||||
goog.require('Blockly.WorkspaceSvg');
|
||||
goog.require('Blockly.Xml');
|
||||
|
||||
goog.requireType('Blockly.Block');
|
||||
goog.requireType('Blockly.BlockSvg');
|
||||
goog.requireType('Blockly.Connection');
|
||||
goog.requireType('Blockly.Events.Abstract');
|
||||
goog.requireType('Blockly.utils.Coordinate');
|
||||
goog.requireType('Blockly.Workspace');
|
||||
|
||||
|
||||
/**
|
||||
* Class for a mutator dialog.
|
||||
* @param {!Array<string>} quarkNames List of names of sub-blocks for flyout.
|
||||
* @extends {Blockly.Icon}
|
||||
* @extends {Icon}
|
||||
* @constructor
|
||||
*/
|
||||
Blockly.Mutator = function(quarkNames) {
|
||||
Blockly.Mutator.superClass_.constructor.call(this, null);
|
||||
const Mutator = function(quarkNames) {
|
||||
Mutator.superClass_.constructor.call(this, null);
|
||||
this.quarkNames_ = quarkNames;
|
||||
};
|
||||
Blockly.utils.object.inherits(Blockly.Mutator, Blockly.Icon);
|
||||
object.inherits(Mutator, Icon);
|
||||
|
||||
/**
|
||||
* Workspace in the mutator's bubble.
|
||||
* @type {?Blockly.WorkspaceSvg}
|
||||
* @type {?WorkspaceSvg}
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.workspace_ = null;
|
||||
Mutator.prototype.workspace_ = null;
|
||||
|
||||
/**
|
||||
* Width of workspace.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.workspaceWidth_ = 0;
|
||||
Mutator.prototype.workspaceWidth_ = 0;
|
||||
|
||||
/**
|
||||
* Height of workspace.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.workspaceHeight_ = 0;
|
||||
Mutator.prototype.workspaceHeight_ = 0;
|
||||
|
||||
/**
|
||||
* Set the block this mutator is associated with.
|
||||
* @param {!Blockly.BlockSvg} block The block associated with this mutator.
|
||||
* @param {!BlockSvg} block The block associated with this mutator.
|
||||
* @package
|
||||
*/
|
||||
Blockly.Mutator.prototype.setBlock = function(block) {
|
||||
Mutator.prototype.setBlock = function(block) {
|
||||
this.block_ = block;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the workspace inside this mutator icon's bubble.
|
||||
* @return {?Blockly.WorkspaceSvg} The workspace inside this mutator icon's
|
||||
* @return {?WorkspaceSvg} The workspace inside this mutator icon's
|
||||
* bubble or null if the mutator isn't open.
|
||||
* @package
|
||||
*/
|
||||
Blockly.Mutator.prototype.getWorkspace = function() {
|
||||
Mutator.prototype.getWorkspace = function() {
|
||||
return this.workspace_;
|
||||
};
|
||||
|
||||
@@ -94,11 +101,10 @@ Blockly.Mutator.prototype.getWorkspace = function() {
|
||||
* @param {!Element} group The icon group.
|
||||
* @protected
|
||||
*/
|
||||
Blockly.Mutator.prototype.drawIcon_ = function(group) {
|
||||
Mutator.prototype.drawIcon_ = function(group) {
|
||||
// Square with rounded corners.
|
||||
Blockly.utils.dom.createSvgElement(
|
||||
Blockly.utils.Svg.RECT,
|
||||
{
|
||||
dom.createSvgElement(
|
||||
Svg.RECT, {
|
||||
'class': 'blocklyIconShape',
|
||||
'rx': '4',
|
||||
'ry': '4',
|
||||
@@ -107,29 +113,22 @@ Blockly.Mutator.prototype.drawIcon_ = function(group) {
|
||||
},
|
||||
group);
|
||||
// Gear teeth.
|
||||
Blockly.utils.dom.createSvgElement(
|
||||
Blockly.utils.Svg.PATH,
|
||||
{
|
||||
dom.createSvgElement(
|
||||
Svg.PATH, {
|
||||
'class': 'blocklyIconSymbol',
|
||||
'd': 'm4.203,7.296 0,1.368 -0.92,0.677 -0.11,0.41 0.9,1.559 0.41,' +
|
||||
'0.11 1.043,-0.457 1.187,0.683 0.127,1.134 0.3,0.3 1.8,0 0.3,' +
|
||||
'-0.299 0.127,-1.138 1.185,-0.682 1.046,0.458 0.409,-0.11 0.9,' +
|
||||
'-1.559 -0.11,-0.41 -0.92,-0.677 0,-1.366 0.92,-0.677 0.11,' +
|
||||
'-0.41 -0.9,-1.559 -0.409,-0.109 -1.046,0.458 -1.185,-0.682 ' +
|
||||
'-0.127,-1.138 -0.3,-0.299 -1.8,0 -0.3,0.3 -0.126,1.135 -1.187,' +
|
||||
'0.682 -1.043,-0.457 -0.41,0.11 -0.899,1.559 0.108,0.409z'
|
||||
'0.11 1.043,-0.457 1.187,0.683 0.127,1.134 0.3,0.3 1.8,0 0.3,' +
|
||||
'-0.299 0.127,-1.138 1.185,-0.682 1.046,0.458 0.409,-0.11 0.9,' +
|
||||
'-1.559 -0.11,-0.41 -0.92,-0.677 0,-1.366 0.92,-0.677 0.11,' +
|
||||
'-0.41 -0.9,-1.559 -0.409,-0.109 -1.046,0.458 -1.185,-0.682 ' +
|
||||
'-0.127,-1.138 -0.3,-0.299 -1.8,0 -0.3,0.3 -0.126,1.135 -1.187,' +
|
||||
'0.682 -1.043,-0.457 -0.41,0.11 -0.899,1.559 0.108,0.409z'
|
||||
},
|
||||
group);
|
||||
// Axle hole.
|
||||
Blockly.utils.dom.createSvgElement(
|
||||
Blockly.utils.Svg.CIRCLE,
|
||||
{
|
||||
'class': 'blocklyIconShape',
|
||||
'r': '2.7',
|
||||
'cx': '8',
|
||||
'cy': '8'
|
||||
},
|
||||
group);
|
||||
dom.createSvgElement(
|
||||
Svg.CIRCLE,
|
||||
{'class': 'blocklyIconShape', 'r': '2.7', 'cx': '8', 'cy': '8'}, group);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -139,9 +138,9 @@ Blockly.Mutator.prototype.drawIcon_ = function(group) {
|
||||
* @protected
|
||||
* @override
|
||||
*/
|
||||
Blockly.Mutator.prototype.iconClick_ = function(e) {
|
||||
Mutator.prototype.iconClick_ = function(e) {
|
||||
if (this.block_.isEditable()) {
|
||||
Blockly.Icon.prototype.iconClick_.call(this, e);
|
||||
Icon.prototype.iconClick_.call(this, e);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -150,28 +149,27 @@ Blockly.Mutator.prototype.iconClick_ = function(e) {
|
||||
* @return {!SVGElement} The top-level node of the editor.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.createEditor_ = function() {
|
||||
Mutator.prototype.createEditor_ = function() {
|
||||
/* Create the editor. Here's the markup that will be generated:
|
||||
<svg>
|
||||
[Workspace]
|
||||
</svg>
|
||||
*/
|
||||
this.svgDialog_ = Blockly.utils.dom.createSvgElement(
|
||||
Blockly.utils.Svg.SVG,
|
||||
{'x': Blockly.Bubble.BORDER_WIDTH, 'y': Blockly.Bubble.BORDER_WIDTH},
|
||||
null);
|
||||
this.svgDialog_ = dom.createSvgElement(
|
||||
Svg.SVG, {'x': Bubble.BORDER_WIDTH, 'y': Bubble.BORDER_WIDTH}, null);
|
||||
// Convert the list of names into a list of XML objects for the flyout.
|
||||
let quarkXml;
|
||||
if (this.quarkNames_.length) {
|
||||
var quarkXml = Blockly.utils.xml.createElement('xml');
|
||||
for (var i = 0, quarkName; (quarkName = this.quarkNames_[i]); i++) {
|
||||
var element = Blockly.utils.xml.createElement('block');
|
||||
quarkXml = xml.createElement('xml');
|
||||
for (let i = 0, quarkName; (quarkName = this.quarkNames_[i]); i++) {
|
||||
const element = xml.createElement('block');
|
||||
element.setAttribute('type', quarkName);
|
||||
quarkXml.appendChild(element);
|
||||
}
|
||||
} else {
|
||||
var quarkXml = null;
|
||||
quarkXml = null;
|
||||
}
|
||||
var workspaceOptions = new Blockly.Options(
|
||||
const workspaceOptions = new Options(
|
||||
/** @type {!Blockly.BlocklyOptions} */
|
||||
({
|
||||
// If you want to enable disabling, also remove the
|
||||
@@ -184,25 +182,22 @@ Blockly.Mutator.prototype.createEditor_ = function() {
|
||||
'renderer': this.block_.workspace.options.renderer,
|
||||
'rendererOverrides': this.block_.workspace.options.rendererOverrides
|
||||
}));
|
||||
workspaceOptions.toolboxPosition = this.block_.RTL ?
|
||||
Blockly.utils.toolbox.Position.RIGHT :
|
||||
Blockly.utils.toolbox.Position.LEFT;
|
||||
var hasFlyout = !!quarkXml;
|
||||
workspaceOptions.toolboxPosition =
|
||||
this.block_.RTL ? toolbox.Position.RIGHT : toolbox.Position.LEFT;
|
||||
const hasFlyout = !!quarkXml;
|
||||
if (hasFlyout) {
|
||||
workspaceOptions.languageTree =
|
||||
Blockly.utils.toolbox.convertToolboxDefToJson(quarkXml);
|
||||
workspaceOptions.languageTree = toolbox.convertToolboxDefToJson(quarkXml);
|
||||
}
|
||||
this.workspace_ = new Blockly.WorkspaceSvg(workspaceOptions);
|
||||
this.workspace_ = new WorkspaceSvg(workspaceOptions);
|
||||
this.workspace_.isMutator = true;
|
||||
this.workspace_.addChangeListener(Blockly.Events.disableOrphans);
|
||||
this.workspace_.addChangeListener(Events.disableOrphans);
|
||||
|
||||
// Mutator flyouts go inside the mutator workspace's <g> rather than in
|
||||
// a top level SVG. Instead of handling scale themselves, mutators
|
||||
// inherit scale from the parent workspace.
|
||||
// To fix this, scale needs to be applied at a different level in the DOM.
|
||||
var flyoutSvg = hasFlyout ?
|
||||
this.workspace_.addFlyout(Blockly.utils.Svg.G) : null;
|
||||
var background = this.workspace_.createDom('blocklyMutatorBackground');
|
||||
const flyoutSvg = hasFlyout ? this.workspace_.addFlyout(Svg.G) : null;
|
||||
const background = this.workspace_.createDom('blocklyMutatorBackground');
|
||||
|
||||
if (flyoutSvg) {
|
||||
// Insert the flyout after the <rect> but before the block canvas so that
|
||||
@@ -218,12 +213,12 @@ Blockly.Mutator.prototype.createEditor_ = function() {
|
||||
/**
|
||||
* Add or remove the UI indicating if this icon may be clicked or not.
|
||||
*/
|
||||
Blockly.Mutator.prototype.updateEditable = function() {
|
||||
Blockly.Mutator.superClass_.updateEditable.call(this);
|
||||
Mutator.prototype.updateEditable = function() {
|
||||
Mutator.superClass_.updateEditable.call(this);
|
||||
if (!this.block_.isInFlyout) {
|
||||
if (this.block_.isEditable()) {
|
||||
if (this.iconGroup_) {
|
||||
Blockly.utils.dom.removeClass(
|
||||
dom.removeClass(
|
||||
/** @type {!Element} */ (this.iconGroup_),
|
||||
'blocklyIconGroupReadonly');
|
||||
}
|
||||
@@ -231,7 +226,7 @@ Blockly.Mutator.prototype.updateEditable = function() {
|
||||
// Close any mutator bubble. Icon is not clickable.
|
||||
this.setVisible(false);
|
||||
if (this.iconGroup_) {
|
||||
Blockly.utils.dom.addClass(
|
||||
dom.addClass(
|
||||
/** @type {!Element} */ (this.iconGroup_),
|
||||
'blocklyIconGroupReadonly');
|
||||
}
|
||||
@@ -243,15 +238,15 @@ Blockly.Mutator.prototype.updateEditable = function() {
|
||||
* Resize the bubble to match the size of the workspace.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.resizeBubble_ = function() {
|
||||
var doubleBorderWidth = 2 * Blockly.Bubble.BORDER_WIDTH;
|
||||
var workspaceSize = this.workspace_.getCanvas().getBBox();
|
||||
var width = workspaceSize.width + workspaceSize.x;
|
||||
var height = workspaceSize.height + doubleBorderWidth * 3;
|
||||
var flyout = this.workspace_.getFlyout();
|
||||
Mutator.prototype.resizeBubble_ = function() {
|
||||
const doubleBorderWidth = 2 * Bubble.BORDER_WIDTH;
|
||||
const workspaceSize = this.workspace_.getCanvas().getBBox();
|
||||
let width = workspaceSize.width + workspaceSize.x;
|
||||
let height = workspaceSize.height + doubleBorderWidth * 3;
|
||||
const flyout = this.workspace_.getFlyout();
|
||||
if (flyout) {
|
||||
var flyoutScrollMetrics = flyout.getWorkspace().getMetricsManager()
|
||||
.getScrollMetrics();
|
||||
const flyoutScrollMetrics =
|
||||
flyout.getWorkspace().getMetricsManager().getScrollMetrics();
|
||||
height = Math.max(height, flyoutScrollMetrics.height + 20);
|
||||
width += flyout.getWidth();
|
||||
}
|
||||
@@ -276,7 +271,7 @@ Blockly.Mutator.prototype.resizeBubble_ = function() {
|
||||
|
||||
if (this.block_.RTL) {
|
||||
// Scroll the workspace to always left-align.
|
||||
var translation = 'translate(' + this.workspaceWidth_ + ',0)';
|
||||
const translation = 'translate(' + this.workspaceWidth_ + ',0)';
|
||||
this.workspace_.getCanvas().setAttribute('transform', translation);
|
||||
}
|
||||
this.workspace_.resize();
|
||||
@@ -286,7 +281,7 @@ Blockly.Mutator.prototype.resizeBubble_ = function() {
|
||||
* A method handler for when the bubble is moved.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.onBubbleMove_ = function() {
|
||||
Mutator.prototype.onBubbleMove_ = function() {
|
||||
if (this.workspace_) {
|
||||
this.workspace_.recordDragTargets();
|
||||
}
|
||||
@@ -296,43 +291,44 @@ Blockly.Mutator.prototype.onBubbleMove_ = function() {
|
||||
* Show or hide the mutator bubble.
|
||||
* @param {boolean} visible True if the bubble should be visible.
|
||||
*/
|
||||
Blockly.Mutator.prototype.setVisible = function(visible) {
|
||||
Mutator.prototype.setVisible = function(visible) {
|
||||
if (visible == this.isVisible()) {
|
||||
// No change.
|
||||
return;
|
||||
}
|
||||
Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BUBBLE_OPEN))(
|
||||
this.block_, visible, 'mutator'));
|
||||
Events.fire(
|
||||
new (Events.get(Events.BUBBLE_OPEN))(this.block_, visible, 'mutator'));
|
||||
if (visible) {
|
||||
// Create the bubble.
|
||||
this.bubble_ = new Blockly.Bubble(
|
||||
/** @type {!Blockly.WorkspaceSvg} */ (this.block_.workspace),
|
||||
this.bubble_ = new Bubble(
|
||||
/** @type {!WorkspaceSvg} */ (this.block_.workspace),
|
||||
this.createEditor_(), this.block_.pathObject.svgPath,
|
||||
/** @type {!Blockly.utils.Coordinate} */ (this.iconXY_), null, null);
|
||||
/** @type {!Coordinate} */ (this.iconXY_), null, null);
|
||||
// Expose this mutator's block's ID on its top-level SVG group.
|
||||
this.bubble_.setSvgId(this.block_.id);
|
||||
this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this));
|
||||
var tree = this.workspace_.options.languageTree;
|
||||
var flyout = this.workspace_.getFlyout();
|
||||
const tree = this.workspace_.options.languageTree;
|
||||
const flyout = this.workspace_.getFlyout();
|
||||
if (tree) {
|
||||
flyout.init(this.workspace_);
|
||||
flyout.show(tree);
|
||||
}
|
||||
|
||||
this.rootBlock_ = this.block_.decompose(this.workspace_);
|
||||
var blocks = this.rootBlock_.getDescendants(false);
|
||||
for (var i = 0, child; (child = blocks[i]); i++) {
|
||||
const blocks = this.rootBlock_.getDescendants(false);
|
||||
for (let i = 0, child; (child = blocks[i]); i++) {
|
||||
child.render();
|
||||
}
|
||||
// The root block should not be draggable or deletable.
|
||||
this.rootBlock_.setMovable(false);
|
||||
this.rootBlock_.setDeletable(false);
|
||||
let margin, x;
|
||||
if (flyout) {
|
||||
var margin = flyout.CORNER_RADIUS * 2;
|
||||
var x = this.rootBlock_.RTL ? flyout.getWidth() + margin : margin;
|
||||
margin = flyout.CORNER_RADIUS * 2;
|
||||
x = this.rootBlock_.RTL ? flyout.getWidth() + margin : margin;
|
||||
} else {
|
||||
var margin = 16;
|
||||
var x = margin;
|
||||
margin = 16;
|
||||
x = margin;
|
||||
}
|
||||
if (this.block_.RTL) {
|
||||
x = -x;
|
||||
@@ -340,10 +336,9 @@ Blockly.Mutator.prototype.setVisible = function(visible) {
|
||||
this.rootBlock_.moveBy(x, margin);
|
||||
// Save the initial connections, then listen for further changes.
|
||||
if (this.block_.saveConnections) {
|
||||
var thisMutator = this;
|
||||
var mutatorBlock =
|
||||
/** @type {{saveConnections: function(!Blockly.Block)}} */ (
|
||||
this.block_);
|
||||
const thisMutator = this;
|
||||
const mutatorBlock =
|
||||
/** @type {{saveConnections: function(!Block)}} */ (this.block_);
|
||||
mutatorBlock.saveConnections(this.rootBlock_);
|
||||
this.sourceListener_ = function() {
|
||||
mutatorBlock.saveConnections(thisMutator.rootBlock_);
|
||||
@@ -375,21 +370,20 @@ Blockly.Mutator.prototype.setVisible = function(visible) {
|
||||
* Update the source block when the mutator's blocks are changed.
|
||||
* Bump down any block that's too high.
|
||||
* Fired whenever a change is made to the mutator's workspace.
|
||||
* @param {!Blockly.Events.Abstract} e Custom data for event.
|
||||
* @param {!Abstract} e Custom data for event.
|
||||
* @private
|
||||
*/
|
||||
Blockly.Mutator.prototype.workspaceChanged_ = function(e) {
|
||||
if (e.isUiEvent ||
|
||||
(e.type == Blockly.Events.CHANGE && e.element == 'disabled')) {
|
||||
Mutator.prototype.workspaceChanged_ = function(e) {
|
||||
if (e.isUiEvent || (e.type == Events.CHANGE && e.element == 'disabled')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.workspace_.isDragging()) {
|
||||
var blocks = this.workspace_.getTopBlocks(false);
|
||||
var MARGIN = 20;
|
||||
const blocks = this.workspace_.getTopBlocks(false);
|
||||
const MARGIN = 20;
|
||||
|
||||
for (var b = 0, block; (block = blocks[b]); b++) {
|
||||
var blockXY = block.getRelativeToSurfaceXY();
|
||||
for (let b = 0, block; (block = blocks[b]); b++) {
|
||||
const blockXY = block.getRelativeToSurfaceXY();
|
||||
|
||||
// Bump any block that's above the top back inside.
|
||||
if (blockXY.y < MARGIN) {
|
||||
@@ -397,8 +391,8 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) {
|
||||
}
|
||||
// Bump any block overlapping the flyout back inside.
|
||||
if (block.RTL) {
|
||||
var right = -MARGIN;
|
||||
var flyout = this.workspace_.getFlyout();
|
||||
let right = -MARGIN;
|
||||
const flyout = this.workspace_.getFlyout();
|
||||
if (flyout) {
|
||||
right -= flyout.getWidth();
|
||||
}
|
||||
@@ -413,13 +407,13 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) {
|
||||
|
||||
// When the mutator's workspace changes, update the source block.
|
||||
if (this.rootBlock_.workspace == this.workspace_) {
|
||||
Blockly.Events.setGroup(true);
|
||||
var block = this.block_;
|
||||
var oldMutationDom = block.mutationToDom();
|
||||
var oldMutation = oldMutationDom && Blockly.Xml.domToText(oldMutationDom);
|
||||
Events.setGroup(true);
|
||||
const block = this.block_;
|
||||
const oldMutationDom = block.mutationToDom();
|
||||
const oldMutation = oldMutationDom && Xml.domToText(oldMutationDom);
|
||||
|
||||
// Switch off rendering while the source block is rebuilt.
|
||||
var savedRendered = block.rendered;
|
||||
const savedRendered = block.rendered;
|
||||
// TODO(#4288): We should not be setting the rendered property to false.
|
||||
block.rendered = false;
|
||||
|
||||
@@ -434,18 +428,18 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) {
|
||||
block.render();
|
||||
}
|
||||
|
||||
var newMutationDom = block.mutationToDom();
|
||||
var newMutation = newMutationDom && Blockly.Xml.domToText(newMutationDom);
|
||||
const newMutationDom = block.mutationToDom();
|
||||
const newMutation = newMutationDom && Xml.domToText(newMutationDom);
|
||||
if (oldMutation != newMutation) {
|
||||
Blockly.Events.fire(new (Blockly.Events.get(Blockly.Events.BLOCK_CHANGE))(
|
||||
Events.fire(new (Events.get(Events.BLOCK_CHANGE))(
|
||||
block, 'mutation', null, oldMutation, newMutation));
|
||||
// Ensure that any bump is part of this mutation's event group.
|
||||
var group = Blockly.Events.getGroup();
|
||||
const group = Events.getGroup();
|
||||
setTimeout(function() {
|
||||
Blockly.Events.setGroup(group);
|
||||
Events.setGroup(group);
|
||||
block.bumpNeighbours();
|
||||
Blockly.Events.setGroup(false);
|
||||
}, Blockly.internalConstants.BUMP_DELAY);
|
||||
Events.setGroup(false);
|
||||
}, internalConstants.BUMP_DELAY);
|
||||
}
|
||||
|
||||
// Don't update the bubble until the drag has ended, to avoid moving blocks
|
||||
@@ -453,35 +447,35 @@ Blockly.Mutator.prototype.workspaceChanged_ = function(e) {
|
||||
if (!this.workspace_.isDragging()) {
|
||||
this.resizeBubble_();
|
||||
}
|
||||
Blockly.Events.setGroup(false);
|
||||
Events.setGroup(false);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Dispose of this mutator.
|
||||
*/
|
||||
Blockly.Mutator.prototype.dispose = function() {
|
||||
Mutator.prototype.dispose = function() {
|
||||
this.block_.mutator = null;
|
||||
Blockly.Icon.prototype.dispose.call(this);
|
||||
Icon.prototype.dispose.call(this);
|
||||
};
|
||||
|
||||
/**
|
||||
* Update the styles on all blocks in the mutator.
|
||||
* @public
|
||||
*/
|
||||
Blockly.Mutator.prototype.updateBlockStyle = function() {
|
||||
var ws = this.workspace_;
|
||||
Mutator.prototype.updateBlockStyle = function() {
|
||||
const ws = this.workspace_;
|
||||
|
||||
if (ws && ws.getAllBlocks(false)) {
|
||||
var workspaceBlocks = ws.getAllBlocks(false);
|
||||
for (var i = 0, block; (block = workspaceBlocks[i]); i++) {
|
||||
const workspaceBlocks = ws.getAllBlocks(false);
|
||||
for (let i = 0, block; (block = workspaceBlocks[i]); i++) {
|
||||
block.setStyle(block.getStyleName());
|
||||
}
|
||||
|
||||
var flyout = ws.getFlyout();
|
||||
const flyout = ws.getFlyout();
|
||||
if (flyout) {
|
||||
var flyoutBlocks = flyout.workspace_.getAllBlocks(false);
|
||||
for (var i = 0, block; (block = flyoutBlocks[i]); i++) {
|
||||
const flyoutBlocks = flyout.workspace_.getAllBlocks(false);
|
||||
for (let i = 0, block; (block = flyoutBlocks[i]); i++) {
|
||||
block.setStyle(block.getStyleName());
|
||||
}
|
||||
}
|
||||
@@ -490,17 +484,17 @@ Blockly.Mutator.prototype.updateBlockStyle = function() {
|
||||
|
||||
/**
|
||||
* Reconnect an block to a mutated input.
|
||||
* @param {Blockly.Connection} connectionChild Connection on child block.
|
||||
* @param {!Blockly.Block} block Parent block.
|
||||
* @param {Connection} connectionChild Connection on child block.
|
||||
* @param {!Block} block Parent block.
|
||||
* @param {string} inputName Name of input on parent block.
|
||||
* @return {boolean} True iff a reconnection was made, false otherwise.
|
||||
*/
|
||||
Blockly.Mutator.reconnect = function(connectionChild, block, inputName) {
|
||||
Mutator.reconnect = function(connectionChild, block, inputName) {
|
||||
if (!connectionChild || !connectionChild.getSourceBlock().workspace) {
|
||||
return false; // No connection or block has been deleted.
|
||||
}
|
||||
var connectionParent = block.getInput(inputName).connection;
|
||||
var currentParent = connectionChild.targetBlock();
|
||||
const connectionParent = block.getInput(inputName).connection;
|
||||
const currentParent = connectionChild.targetBlock();
|
||||
if ((!currentParent || currentParent == block) &&
|
||||
connectionParent.targetConnection != connectionChild) {
|
||||
if (connectionParent.isConnected()) {
|
||||
@@ -516,14 +510,14 @@ Blockly.Mutator.reconnect = function(connectionChild, block, inputName) {
|
||||
/**
|
||||
* Get the parent workspace of a workspace that is inside a mutator, taking into
|
||||
* account whether it is a flyout.
|
||||
* @param {Blockly.Workspace} workspace The workspace that is inside a mutator.
|
||||
* @return {?Blockly.Workspace} The mutator's parent workspace or null.
|
||||
* @param {Workspace} workspace The workspace that is inside a mutator.
|
||||
* @return {?Workspace} The mutator's parent workspace or null.
|
||||
* @public
|
||||
*/
|
||||
Blockly.Mutator.findParentWs = function(workspace) {
|
||||
var outerWs = null;
|
||||
Mutator.findParentWs = function(workspace) {
|
||||
let outerWs = null;
|
||||
if (workspace && workspace.options) {
|
||||
var parent = workspace.options.parentWorkspace;
|
||||
const parent = workspace.options.parentWorkspace;
|
||||
// If we were in a flyout in a mutator, need to go up two levels to find
|
||||
// the actual parent.
|
||||
if (workspace.isFlyout) {
|
||||
@@ -536,3 +530,5 @@ Blockly.Mutator.findParentWs = function(workspace) {
|
||||
}
|
||||
return outerWs;
|
||||
};
|
||||
|
||||
exports = Mutator;
|
||||
|
||||
@@ -112,7 +112,7 @@ goog.addDependency('../../core/menu.js', ['Blockly.Menu'], ['Blockly.browserEven
|
||||
goog.addDependency('../../core/menuitem.js', ['Blockly.MenuItem'], ['Blockly.utils.IdGenerator', 'Blockly.utils.aria', 'Blockly.utils.dom']);
|
||||
goog.addDependency('../../core/metrics_manager.js', ['Blockly.FlyoutMetricsManager', 'Blockly.MetricsManager'], ['Blockly.IMetricsManager', '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', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.toolbox', 'Blockly.utils.xml']);
|
||||
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.internalConstants']);
|
||||
goog.addDependency('../../core/options.js', ['Blockly.Options'], ['Blockly.Theme', 'Blockly.Themes.Classic', 'Blockly.registry', 'Blockly.utils.IdGenerator', 'Blockly.utils.Metrics', 'Blockly.utils.toolbox']);
|
||||
goog.addDependency('../../core/positionable_helpers.js', ['Blockly.uiPosition'], ['Blockly.Scrollbar', 'Blockly.utils.Rect', 'Blockly.utils.toolbox']);
|
||||
|
||||
Reference in New Issue
Block a user