From 0dcdfd24286294f89cbc1ccfba3b2910e1947959 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 20 Jan 2026 15:09:44 -0800 Subject: [PATCH 1/6] fix: Don't suppress and re-fire events when dragging blocks from the flyout --- packages/blockly/core/flyout_base.ts | 41 ++++------------------------ 1 file changed, 6 insertions(+), 35 deletions(-) diff --git a/packages/blockly/core/flyout_base.ts b/packages/blockly/core/flyout_base.ts index 1d16f05f1f1..271ab54a6f2 100644 --- a/packages/blockly/core/flyout_base.ts +++ b/packages/blockly/core/flyout_base.ts @@ -38,7 +38,6 @@ import * as dom from './utils/dom.js'; import * as idGenerator from './utils/idgenerator.js'; import {Svg} from './utils/svg.js'; import * as toolbox from './utils/toolbox.js'; -import * as Variables from './variables.js'; import {WorkspaceSvg} from './workspace_svg.js'; /** @@ -813,44 +812,16 @@ export abstract class Flyout * @internal */ createBlock(originalBlock: BlockSvg): BlockSvg { - let newBlock = null; - eventUtils.disable(); - const variablesBeforeCreation = this.targetWorkspace - .getVariableMap() - .getAllVariables(); - this.targetWorkspace.setResizesEnabled(false); try { - newBlock = this.placeNewBlock(originalBlock); + return this.placeNewBlock(originalBlock); } finally { - eventUtils.enable(); - } - - // Close the flyout. - this.targetWorkspace.hideChaff(); - - const newVariables = Variables.getAddedVariables( - this.targetWorkspace, - variablesBeforeCreation, - ); + this.targetWorkspace.hideChaff(); - if (eventUtils.isEnabled()) { - eventUtils.setGroup(true); - // Fire a VarCreate event for each (if any) new variable created. - for (let i = 0; i < newVariables.length; i++) { - const thisVariable = newVariables[i]; - eventUtils.fire( - new (eventUtils.get(EventType.VAR_CREATE))(thisVariable), - ); + // Close the flyout. + if (this.autoClose) { + this.hide(); } - - // Block events come after var events, in case they refer to newly created - // variables. - eventUtils.fire(new (eventUtils.get(EventType.BLOCK_CREATE))(newBlock)); - } - if (this.autoClose) { - this.hide(); } - return newBlock; } /** @@ -890,7 +861,7 @@ export abstract class Flyout const json = this.serializeBlock(oldBlock); // Normally this resizes leading to weird jumps. Save it for terminateDrag. targetWorkspace.setResizesEnabled(false); - const block = blocks.append(json, targetWorkspace) as BlockSvg; + const block = blocks.append(json, targetWorkspace, {recordUndo: true}) as BlockSvg; this.positionNewBlock(oldBlock, block); From f0a247889c431866a1a94b375cab61cf16f784d8 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 20 Jan 2026 15:10:16 -0800 Subject: [PATCH 2/6] fix: Fix bug that could cause blocks to get bumped when dragging from the flyout --- packages/blockly/core/flyout_base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/blockly/core/flyout_base.ts b/packages/blockly/core/flyout_base.ts index 271ab54a6f2..abe952eaaaf 100644 --- a/packages/blockly/core/flyout_base.ts +++ b/packages/blockly/core/flyout_base.ts @@ -861,7 +861,7 @@ export abstract class Flyout const json = this.serializeBlock(oldBlock); // Normally this resizes leading to weird jumps. Save it for terminateDrag. targetWorkspace.setResizesEnabled(false); - const block = blocks.append(json, targetWorkspace, {recordUndo: true}) as BlockSvg; + const block = blocks.appendInternal(json, targetWorkspace, {recordUndo: true}) as BlockSvg; this.positionNewBlock(oldBlock, block); From 79cb632ebd8d5f283e5f70970fa3b255fd7f8b44 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 20 Jan 2026 15:10:35 -0800 Subject: [PATCH 3/6] fix: Fix bug that made it more difficult to drag blocks from scrollable flyouts --- packages/blockly/core/gesture.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/blockly/core/gesture.ts b/packages/blockly/core/gesture.ts index f3498bfad75..5102d42b20c 100644 --- a/packages/blockly/core/gesture.ts +++ b/packages/blockly/core/gesture.ts @@ -273,10 +273,7 @@ export class Gesture { throw new Error(`Cannot update dragging from the flyout because the ' + 'flyout's target workspace is undefined`); } - if ( - !this.flyout.isScrollable() || - this.flyout.isDragTowardWorkspace(this.currentDragDeltaXY) - ) { + this.startWorkspace_ = this.flyout.targetWorkspace; this.startWorkspace_.updateScreenCalculationsIfScrolled(); // Start the event group now, so that the same event group is used for @@ -289,8 +286,7 @@ export class Gesture { this.targetBlock = this.flyout.createBlock(this.targetBlock); getFocusManager().focusNode(this.targetBlock); return true; - } - return false; + } /** From c57b87e9be3bfdd55be32d3003daa99629b2af2e Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 20 Jan 2026 15:25:01 -0800 Subject: [PATCH 4/6] chore: Run formatter --- packages/blockly/core/flyout_base.ts | 4 +++- packages/blockly/core/gesture.ts | 25 ++++++++++++------------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/blockly/core/flyout_base.ts b/packages/blockly/core/flyout_base.ts index abe952eaaaf..093daa61009 100644 --- a/packages/blockly/core/flyout_base.ts +++ b/packages/blockly/core/flyout_base.ts @@ -861,7 +861,9 @@ export abstract class Flyout const json = this.serializeBlock(oldBlock); // Normally this resizes leading to weird jumps. Save it for terminateDrag. targetWorkspace.setResizesEnabled(false); - const block = blocks.appendInternal(json, targetWorkspace, {recordUndo: true}) as BlockSvg; + const block = blocks.appendInternal(json, targetWorkspace, { + recordUndo: true, + }) as BlockSvg; this.positionNewBlock(oldBlock, block); diff --git a/packages/blockly/core/gesture.ts b/packages/blockly/core/gesture.ts index 5102d42b20c..3b469addb9e 100644 --- a/packages/blockly/core/gesture.ts +++ b/packages/blockly/core/gesture.ts @@ -274,19 +274,18 @@ export class Gesture { 'flyout's target workspace is undefined`); } - this.startWorkspace_ = this.flyout.targetWorkspace; - this.startWorkspace_.updateScreenCalculationsIfScrolled(); - // Start the event group now, so that the same event group is used for - // block creation and block dragging. - if (!eventUtils.getGroup()) { - eventUtils.setGroup(true); - } - // The start block is no longer relevant, because this is a drag. - this.startBlock = null; - this.targetBlock = this.flyout.createBlock(this.targetBlock); - getFocusManager().focusNode(this.targetBlock); - return true; - + this.startWorkspace_ = this.flyout.targetWorkspace; + this.startWorkspace_.updateScreenCalculationsIfScrolled(); + // Start the event group now, so that the same event group is used for + // block creation and block dragging. + if (!eventUtils.getGroup()) { + eventUtils.setGroup(true); + } + // The start block is no longer relevant, because this is a drag. + this.startBlock = null; + this.targetBlock = this.flyout.createBlock(this.targetBlock); + getFocusManager().focusNode(this.targetBlock); + return true; } /** From c78f5b4d2ee4a21fe703ab6a1a553825c9d5fd2e Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 6 Feb 2026 08:10:19 -0800 Subject: [PATCH 5/6] refactor: Clean up `createBlock` --- packages/blockly/core/flyout_base.ts | 52 +++++++++------------------- 1 file changed, 17 insertions(+), 35 deletions(-) diff --git a/packages/blockly/core/flyout_base.ts b/packages/blockly/core/flyout_base.ts index 093daa61009..ca26937b360 100644 --- a/packages/blockly/core/flyout_base.ts +++ b/packages/blockly/core/flyout_base.ts @@ -812,16 +812,24 @@ export abstract class Flyout * @internal */ createBlock(originalBlock: BlockSvg): BlockSvg { - try { - return this.placeNewBlock(originalBlock); - } finally { - this.targetWorkspace.hideChaff(); - - // Close the flyout. - if (this.autoClose) { - this.hide(); - } + const targetWorkspace = this.targetWorkspace; + targetWorkspace.hideChaff(); + const svgRootOld = originalBlock.getSvgRoot(); + if (!svgRootOld) { + throw Error('oldBlock is not rendered'); } + + // Clone the block. + const json = this.serializeBlock(originalBlock); + // Normally this resizes leading to weird jumps. Save it for terminateDrag. + targetWorkspace.setResizesEnabled(false); + const block = blocks.appendInternal(json, targetWorkspace, { + recordUndo: true, + }) as BlockSvg; + + this.positionNewBlock(originalBlock, block); + + return block; } /** @@ -844,32 +852,6 @@ export abstract class Flyout : false; } - /** - * Copy a block from the flyout to the workspace and position it correctly. - * - * @param oldBlock The flyout block to copy. - * @returns The new block in the main workspace. - */ - private placeNewBlock(oldBlock: BlockSvg): BlockSvg { - const targetWorkspace = this.targetWorkspace; - const svgRootOld = oldBlock.getSvgRoot(); - if (!svgRootOld) { - throw Error('oldBlock is not rendered'); - } - - // Clone the block. - const json = this.serializeBlock(oldBlock); - // Normally this resizes leading to weird jumps. Save it for terminateDrag. - targetWorkspace.setResizesEnabled(false); - const block = blocks.appendInternal(json, targetWorkspace, { - recordUndo: true, - }) as BlockSvg; - - this.positionNewBlock(oldBlock, block); - - return block; - } - /** * Serialize a block to JSON. * From d4c861c8d097d62dcd6a211a36fc71e5c4497fd1 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Fri, 6 Feb 2026 08:21:33 -0800 Subject: [PATCH 6/6] fix: Hide chaff at the end of block creation --- packages/blockly/core/flyout_base.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/blockly/core/flyout_base.ts b/packages/blockly/core/flyout_base.ts index ca26937b360..fb774bd61cd 100644 --- a/packages/blockly/core/flyout_base.ts +++ b/packages/blockly/core/flyout_base.ts @@ -813,7 +813,6 @@ export abstract class Flyout */ createBlock(originalBlock: BlockSvg): BlockSvg { const targetWorkspace = this.targetWorkspace; - targetWorkspace.hideChaff(); const svgRootOld = originalBlock.getSvgRoot(); if (!svgRootOld) { throw Error('oldBlock is not rendered'); @@ -828,7 +827,7 @@ export abstract class Flyout }) as BlockSvg; this.positionNewBlock(originalBlock, block); - + targetWorkspace.hideChaff(); return block; }