diff --git a/core/flyout_vertical.js b/core/flyout_vertical.js index 6f9c744a..8b6a4516 100644 --- a/core/flyout_vertical.js +++ b/core/flyout_vertical.js @@ -59,13 +59,13 @@ Blockly.VerticalFlyout = function(workspaceOptions) { this.horizontalLayout_ = false; /** - * List of checkboxes next to variable blocks. + * Map of checkboxes that correspond to monitored blocks. * Each element is an object containing the SVG for the checkbox, a boolean * for its checked state, and the block the checkbox is associated with. - * @type {!Array.<!Object>} + * @type {!Object.<string, !Object>} * @private */ - this.checkboxes_ = []; + this.checkboxes_ = {}; }; goog.inherits(Blockly.VerticalFlyout, Blockly.Flyout); @@ -458,11 +458,15 @@ Blockly.VerticalFlyout.prototype.clearOldBlocks_ = function() { Blockly.VerticalFlyout.superClass_.clearOldBlocks_.call(this); // Do the same for checkboxes. - for (var i = 0, elem; elem = this.checkboxes_[i]; i++) { - elem.block.flyoutCheckbox = null; - goog.dom.removeNode(elem.svgRoot); + for (var checkboxId in this.checkboxes_) { + if (!Object.prototype.hasOwnProperty.call(this.checkboxes_, checkboxId)) { + continue; + } + var checkbox = this.checkboxes_[checkboxId]; + checkbox.block.flyoutCheckbox = null; + goog.dom.removeNode(checkbox.svgRoot); } - this.checkboxes_ = []; + this.checkboxes_ = {}; }; /** @@ -638,7 +642,7 @@ Blockly.VerticalFlyout.prototype.createCheckbox_ = function(block, cursorX, block.flyoutCheckbox = checkboxObj; this.workspace_.getCanvas().insertBefore(checkboxGroup, svgRoot); - this.checkboxes_.push(checkboxObj); + this.checkboxes_[block.id] = checkboxObj; }; /** @@ -665,26 +669,22 @@ Blockly.VerticalFlyout.prototype.checkboxClicked_ = function(checkboxObj) { * @public */ Blockly.VerticalFlyout.prototype.setCheckboxState = function(blockId, value) { - for (var i = 0; i < this.checkboxes_.length; i++) { - var checkboxObj = this.checkboxes_[i]; - if (checkboxObj.block.id === blockId) { - if (checkboxObj.clicked === value) return; - - var oldValue = checkboxObj.clicked; - checkboxObj.clicked = value; - - if (checkboxObj.clicked) { - Blockly.utils.addClass((checkboxObj.svgRoot), 'checked'); - } else { - Blockly.utils.removeClass((checkboxObj.svgRoot), 'checked'); - } - - Blockly.Events.fire(new Blockly.Events.Change( - checkboxObj.block, 'checkbox', null, oldValue, value)); - - return; - } + var checkboxObj = this.checkboxes_[blockId]; + if (!checkboxObj || checkboxObj.clicked === value) { + return; } + + var oldValue = checkboxObj.clicked; + checkboxObj.clicked = value; + + if (checkboxObj.clicked) { + Blockly.utils.addClass(checkboxObj.svgRoot, 'checked'); + } else { + Blockly.utils.removeClass(checkboxObj.svgRoot, 'checked'); + } + + Blockly.Events.fire(new Blockly.Events.Change( + checkboxObj.block, 'checkbox', null, oldValue, value)); }; /**