google / blockly

The web-based visual programming editor.
https://developers.google.com/blockly/
Apache License 2.0
12.51k stars 3.72k forks source link

Shadow blocks custom context menu #8615

Open FranciscoCaetano88 opened 1 month ago

FranciscoCaetano88 commented 1 month ago

Check for duplicates

Problem

I'm working on creating a function block using the new version of Blockly, where users can dynamically add or remove multiple arguments that themselves are shadow blocks. Most blocks shouldn't be able to connect to this inputs but there are a few exceptions. I've also implemented a custom dragging strategy that allows new argument blocks to be created by dragging this shadow argument blocks.

Now, I wanted to enhance the shadow blocks by adding a context menu that allows users to edit or remove the selected block. However this is not possible due to a rule in the gesture class that makes the target of every shadow block its parent. I experimented with making the argument blocks non-movable instead of using shadow blocks, but this approach didn’t work with the dragging strategy.

Request

I would like to be able to add a custom context menu to shadow blocks.

Alternatives considered

No response

Additional context

No response

cpcallen commented 1 month ago

Hi @FranciscoCaetano88. As I noted in our discussion in the forum, a better approach for your particular situation is probably to make the blocks non-shadow and modify the dragging strategy to work accordingly. That said, however:

The request that it be possible to access a block's context menu even when that block is a shadow seems reasonable and I think we should consider making this change. At the moment it is not possible to access a shadow block's context menu, because when a gesture begins on a a shadow block, unless that gesture is a click, the gesture is instead treated as targeting the parent block; to make it possible to access the context menu this gesture would also have to be excepted from the target-parent rule too, and as this would be a breaking change it will require some careful consideration to ensure that it does not create unexpected difficulties.

Would you be able to provide some screenshots of your current use-case, to provide a clear explanation of how this feature would be useful to you?

FranciscoCaetano88 commented 2 days ago

Hi @cpcallen! My goal is to recreate this function block in the new Blockly version. I want to be able to add or remove arguments using the +/- buttons and also edit or delete specific arguments from any position within the list. When I tried using non-shadow blocks as suggested, actions like copy/paste or undo/redo would result in an extra block being created. My theory is that this happens because a block is being created during the display update. Then, the block's state includes another block, connected to the input, that replaces the created one, which disconnects the initially created block, leading to the extra block. I'm unsure how to work around this issue.

Image

cpcallen commented 1 day ago

Thanks for the information, @FranciscoCaetano88. As it happens, we will probably have to address this issue as part of the planned changes to keyboard navigation, which involve using the context menu to allow keyboard access to a variety of editing functions—see google/blockly-keyboard-experimentation#130 and google/blockly-keyboard-experimentation#130 and google/blockly-keyboard-experimentation#132.