UNPKG

@blockly/block-plus-minus

Version:

A group of blocks that replace the built-in mutator UI with a +/- based UI.

71 lines (62 loc) 2 kB
/** * @license * Copyright 2020 Google LLC * SPDX-License-Identifier: Apache-2.0 */ /** * @fileoverview A field for a plus button used for mutation. */ 'use strict'; import * as Blockly from 'blockly/core'; import {getExtraBlockState} from './serialization_helper'; /** * Creates a plus image field used for mutation. * @param {Object=} args Untyped args passed to block.minus when the field * is clicked. * @returns {Blockly.FieldImage} The Plus field. */ export function createPlusField(args = undefined) { const plus = new Blockly.FieldImage(plusImage, 15, 15, undefined, onClick_); /** * Untyped args passed to block.plus when the field is clicked. * @type {?(Object|undefined)} * @private */ plus.args_ = args; return plus; } /** * Calls block.plus(args) when the plus field is clicked. * @param {!Blockly.FieldImage} plusField The field being clicked. * @private */ function onClick_(plusField) { // TODO: This is a dupe of the mutator code, anyway to unify? const block = plusField.getSourceBlock(); if (block.isInFlyout) { return; } Blockly.Events.setGroup(true); const oldExtraState = getExtraBlockState(block); block.plus(plusField.args_); const newExtraState = getExtraBlockState(block); if (oldExtraState != newExtraState) { Blockly.Events.fire( new Blockly.Events.BlockChange( block, 'mutation', null, oldExtraState, newExtraState, ), ); } Blockly.Events.setGroup(false); } const plusImage = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC' + '9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBkPSJNMT' + 'ggMTBoLTR2LTRjMC0xLjEwNC0uODk2LTItMi0ycy0yIC44OTYtMiAybC4wNzEgNGgtNC4wNz' + 'FjLTEuMTA0IDAtMiAuODk2LTIgMnMuODk2IDIgMiAybDQuMDcxLS4wNzEtLjA3MSA0LjA3MW' + 'MwIDEuMTA0Ljg5NiAyIDIgMnMyLS44OTYgMi0ydi00LjA3MWw0IC4wNzFjMS4xMDQgMCAyLS' + '44OTYgMi0ycy0uODk2LTItMi0yeiIgZmlsbD0id2hpdGUiIC8+PC9zdmc+Cg==';