From 263ce7e13992f9024e7aaa0888547a8e9a89a83a Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Wed, 13 Dec 2023 18:32:37 +0000 Subject: [PATCH] fix: uncollapsing --- examples/sample-p5-app/src/index.js | 74 +++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/examples/sample-p5-app/src/index.js b/examples/sample-p5-app/src/index.js index cd6aa41d15..65818bfbd9 100644 --- a/examples/sample-p5-app/src/index.js +++ b/examples/sample-p5-app/src/index.js @@ -148,31 +148,75 @@ const getStringification = { } Blockly.ContextMenuRegistry.registry.register(getStringification); -const fancyCollapse = { +const fancyCollapseOption = { callback: function(scope) { const ws = scope.block.workspace; const stacks = combineBlocks(ws, blockSelectionWeakMap.get(ws)); - for (const stack of stacks) { - const prevParentConn = stack.first.previousConnection?.targetConnection; - const prevDanglerConn = stack.last.nextConnection?.targetConnection; - stack.first.previousConnection?.disconnect(); - stack.last.nextConnection?.disconnect(); - const newBlock = - Blockly.serialization.blocks.append({'type': 'collapse'}, ws); - newBlock.getInput('COLLAPSE').connection.connect( - stack.first.previousConnection); - prevParentConn?.connect(newBlock.previousConnection); - prevDanglerConn?.connect(newBlock.nextConnection); - newBlock.setCollapsed(true); + if (shouldExpand(scope)) { + fancyExpand(stacks); + } else { + fancyCollapse(stacks); } }, scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK, - displayText: "Summarize ✨Fancily✨", + displayText: (scope) => { + return shouldExpand(scope) ? 'Expand ✨Fancily✨' : "Summarize ✨Fancily✨"; + }, preconditionFn: () => {return 'enabled'}, weight: 100, id: 'FancyCollapse' } -Blockly.ContextMenuRegistry.registry.register(fancyCollapse); +Blockly.ContextMenuRegistry.registry.register(fancyCollapseOption); + +function shouldExpand(scope) { + const ws = scope.block.workspace; + const stacks = combineBlocks(ws, blockSelectionWeakMap.get(ws)); + for (const stack of stacks) { + for (const block of stack.blockList) { + if (block.type === 'collapse') { + return true; + } + } + } + return false; +} + +function fancyCollapse(stacks) { + for (const stack of stacks) { + const prevParentConn = stack.first.previousConnection?.targetConnection; + const prevDanglerConn = stack.last.nextConnection?.targetConnection; + stack.first.previousConnection?.disconnect(); + stack.last.nextConnection?.disconnect(); + const newBlock = + Blockly.serialization.blocks.append({'type': 'collapse'}, ws); + newBlock.getInput('COLLAPSE').connection.connect( + stack.first.previousConnection); + prevParentConn?.connect(newBlock.previousConnection); + prevDanglerConn?.connect(newBlock.nextConnection); + newBlock.setCollapsed(true); + } +} + +function fancyExpand(stacks) { + Blockly.Events.disable(); + for (const stack of stacks) { + for (const block of stack.blockList) { + const prevParentConn = block.previousConnection?.targetConnection; + const prevDanglerConn = block.nextConnection?.targetConnection; + const childConn = block.getInput('COLLAPSE').connection.targetConnection; + block.getInput('COLLAPSE').connection.disconnect(); + block.dispose(); + childConn?.connect(prevParentConn); + let lastBlock = childConn.getSourceBlock(); + while (lastBlock.nextConnection?.targetConnection) { + lastBlock = lastBlock.nextConnection.targetConnection.getSourceBlock(); + } + prevDanglerConn.disconnect(); + lastBlock?.nextConnection?.connect(prevDanglerConn); + } + } + Blockly.Events.enable(); +} // Load the initial state from storage and run the code. load(ws);