From bafa2569932117c1f8057f70f99cb220c025e44f Mon Sep 17 00:00:00 2001 From: ckcz123 Date: Thu, 15 Jul 2021 17:07:21 +0800 Subject: [PATCH] blockly context menu --- _server/editor_blockly.js | 67 +++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/_server/editor_blockly.js b/_server/editor_blockly.js index 01c04fb4..0b6b23d4 100644 --- a/_server/editor_blockly.js +++ b/_server/editor_blockly.js @@ -870,6 +870,15 @@ editor_blockly = function () { } } + editor_blockly.isBlockCollapsedSupported = function (block) { + var supportedDisabledBlocks = [ + 'text_0_s', 'text_1_s', 'text_2_s', 'if_s', 'if_1_s', 'confirm_s', 'switch_s', 'choices_s', + 'for_s', 'forEach_s', 'while_s', 'dowhile_s', 'wait_s', 'previewUI_s', + 'waitContext_1', 'waitContext_2', 'waitContext_3', 'switchCase', 'choicesContext' + ]; + return supportedDisabledBlocks.indexOf(block.type || "") >= 0; + } + return editor_blockly; } @@ -1019,12 +1028,7 @@ Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { if (!block) { return ''; } - var supportedDisabledBlocks = [ - 'text_0_s', 'text_1_s', 'text_2_s', 'if_s', 'if_1_s', 'confirm_s', 'switch_s', 'choices_s', - 'for_s', 'forEach_s', 'while_s', 'dowhile_s', 'wait_s', 'previewUI_s', - 'waitContext_1', 'waitContext_2', 'waitContext_3', 'switchCase', 'choicesContext' - ]; - if (!block.isEnabled() && supportedDisabledBlocks.indexOf(block.type) < 0) { + if (!block.isEnabled() && !editor_blockly.isBlockCollapsedSupported(block)) { // Skip past this block if it is disabled. return opt_thisOnly ? '' : this.blockToCode(block.getNextBlock()); } @@ -1046,15 +1050,15 @@ Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { if (Array.isArray(code)) { // Value blocks return tuples of code and operator order. if (!block.outputConnection) { - throw TypeError('Expecting string from statement block: ' + block.type); + throw TypeError('Expecting string from statement block: ' + block.type); } return [this.scrub_(block, code[0], opt_thisOnly), code[1]]; } else if (typeof code == 'string') { if (this.STATEMENT_PREFIX && !block.suppressPrefixSuffix) { - code = this.injectId(this.STATEMENT_PREFIX, block) + code; + code = this.injectId(this.STATEMENT_PREFIX, block) + code; } if (this.STATEMENT_SUFFIX && !block.suppressPrefixSuffix) { - code = code + this.injectId(this.STATEMENT_SUFFIX, block); + code = code + this.injectId(this.STATEMENT_SUFFIX, block); } return this.scrub_(block, code, opt_thisOnly); } else if (code === null) { @@ -1063,3 +1067,48 @@ Blockly.Generator.prototype.blockToCode = function(block, opt_thisOnly) { } throw SyntaxError('Invalid code generated: ' + code); }; + +Blockly.BlockSvg.prototype.generateContextMenu = function() { + if (this.workspace.options.readOnly || !this.contextMenu) { + return null; + } + // Save the current block in a variable for use in closures. + var block = this; + var menuOptions = []; + + if (!this.isInFlyout) { + // 删除 + if (this.isDeletable() && this.isMovable()) { + menuOptions.push(Blockly.ContextMenu.blockDuplicateOption(block)); + } + + if (editor_blockly.isBlockCollapsedSupported(this)) { + menuOptions.push({ + text: this.isCollapsed() ? Blockly.Msg['EXPAND_BLOCK'] : Blockly.Msg['COLLAPSE_BLOCK'], + enabled: true, + callback: function () { block.setCollapsed(!block.collapsed_); } + }); + + menuOptions.push({ + text: this.isEnabled() ? Blockly.Msg['DISABLE_BLOCK'] : Blockly.Msg['ENABLE_BLOCK'], + enabled: !this.getInheritedDisabled(), + callback: function() { + var group = Blockly.Events.getGroup(); + if (!group) { + Blockly.Events.setGroup(true); + } + block.setEnabled(!block.isEnabled()); + if (!group) { + Blockly.Events.setGroup(false); + } + } + }); + } + if (this.isDeletable()) { + menuOptions.push(Blockly.ContextMenu.blockDeleteOption(block)); + } + } + + menuOptions.push(Blockly.ContextMenu.blockHelpOption(block)); + return menuOptions; +};