Skip to content

Commit

Permalink
fix: dragging blocks by shadows to delete (#8138)
Browse files Browse the repository at this point in the history
* Revert "fix: dragging shadow blocks (#7992)"

This reverts commit c0e6e67.

* fix: dragging by shadow not being deletable

* fix: unselecting shadows

* fix: revert changes to select and unselect
  • Loading branch information
BeksOmega authored May 17, 2024
1 parent 5a8969f commit 3fd7492
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 48 deletions.
11 changes: 11 additions & 0 deletions core/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,17 @@ export class Block implements IASTNodeLocation {
return block;
}

/**
* Returns this block if it is a shadow block, or the first non-shadow parent.
*
* @internal
*/
getFirstNonShadowBlock(): this {
if (!this.isShadow()) return this;
// We can assert the parent is non-null because shadows must have parents.
return this.getParent()!.getFirstNonShadowBlock();
}

/**
* Find all the blocks that are directly nested inside this one.
* Includes value and statement inputs, as well as any following statement.
Expand Down
49 changes: 2 additions & 47 deletions core/dragging/block_drag_strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,24 +55,15 @@ export class BlockDragStrategy implements IDragStrategy {

private dragging = false;

/**
* If this is a shadow block, the offset between this block and the parent
* block, to add to the drag location. In workspace units.
*/
private dragOffset = new Coordinate(0, 0);

constructor(private block: BlockSvg) {
this.workspace = block.workspace;
}

/** Returns true if the block is currently movable. False otherwise. */
isMovable(): boolean {
if (this.block.isShadow()) {
return this.block.getParent()?.isMovable() ?? false;
}

return (
this.block.isOwnMovable() &&
!this.block.isShadow() &&
!this.block.isDeadOrDying() &&
!this.workspace.options.readOnly &&
// We never drag blocks in the flyout, only create new blocks that are
Expand All @@ -86,11 +77,6 @@ export class BlockDragStrategy implements IDragStrategy {
* from any parent blocks.
*/
startDrag(e?: PointerEvent): void {
if (this.block.isShadow()) {
this.startDraggingShadow(e);
return;
}

this.dragging = true;
if (!eventUtils.getGroup()) {
eventUtils.setGroup(true);
Expand Down Expand Up @@ -120,22 +106,6 @@ export class BlockDragStrategy implements IDragStrategy {
this.workspace.getLayerManager()?.moveToDragLayer(this.block);
}

/** Starts a drag on a shadow, recording the drag offset. */
private startDraggingShadow(e?: PointerEvent) {
const parent = this.block.getParent();
if (!parent) {
throw new Error(
'Tried to drag a shadow block with no parent. ' +
'Shadow blocks should always have parents.',
);
}
this.dragOffset = Coordinate.difference(
parent.getRelativeToSurfaceXY(),
this.block.getRelativeToSurfaceXY(),
);
parent.startDrag(e);
}

/**
* Whether or not we should disconnect the block when a drag is started.
*
Expand Down Expand Up @@ -204,11 +174,6 @@ export class BlockDragStrategy implements IDragStrategy {

/** Moves the block and updates any connection previews. */
drag(newLoc: Coordinate): void {
if (this.block.isShadow()) {
this.block.getParent()?.drag(Coordinate.sum(newLoc, this.dragOffset));
return;
}

this.block.moveDuringDrag(newLoc);
this.updateConnectionPreview(
this.block,
Expand Down Expand Up @@ -352,12 +317,7 @@ export class BlockDragStrategy implements IDragStrategy {
* Cleans up any state at the end of the drag. Applies any pending
* connections.
*/
endDrag(e?: PointerEvent): void {
if (this.block.isShadow()) {
this.block.getParent()?.endDrag(e);
return;
}

endDrag(): void {
this.fireDragEndEvent();
this.fireMoveEvent();

Expand Down Expand Up @@ -413,11 +373,6 @@ export class BlockDragStrategy implements IDragStrategy {
* including reconnecting connections.
*/
revertDrag(): void {
if (this.block.isShadow()) {
this.block.getParent()?.revertDrag();
return;
}

this.startChildConn?.connect(this.block.nextConnection);
if (this.startParentConn) {
switch (this.startParentConn.type) {
Expand Down
2 changes: 1 addition & 1 deletion core/gesture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1015,7 +1015,7 @@ export class Gesture {
// If the gesture already went through a bubble, don't set the start block.
if (!this.startBlock && !this.startBubble) {
this.startBlock = block;
common.setSelected(this.startBlock);
common.setSelected(this.startBlock.getFirstNonShadowBlock());
if (block.isInFlyout && block !== block.getRootBlock()) {
this.setTargetBlock(block.getRootBlock());
} else {
Expand Down

0 comments on commit 3fd7492

Please sign in to comment.