From 0dcdfd24286294f89cbc1ccfba3b2910e1947959 Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Tue, 20 Jan 2026 15:09:44 -0800 Subject: [PATCH 1/4] 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/4] 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/4] 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/4] 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; } /**