上下文菜单

上下文菜单中包含与工作区中的某个元素相关的一系列操作。点击右键和长按时,系统会显示上下文菜单。

块的默认上下文菜单

如果您想添加用户可以执行的新型操作,可能需要创建自定义上下文菜单选项。例如,整理工作区中的所有代码块,或下载代码块的映像。如果您认为操作不会频繁使用,则上下文菜单是放置该操作的理想位置。否则,您可能需要创建一种更容易发现的方法来访问操作。

实现新选项

如需实现新的上下文菜单选项,您需要实现 RegistryItem 接口。

ID

id 属性应是一个唯一字符串,指示上下文菜单选项的作用。

const deleteOption = {
  id: 'deleteElement',
};

范围

scopeType 属性会告知 Blockly 菜单选项可能显示在什么上下文中,以及要向其 displayTextpreconditionFncallback 传递哪些信息。上下文菜单的范围可以限定为块、工作区评论和工作区。

const deleteOption = {
  scopeType: Blockly.ContextMenuRegistry.ScopeType.BLOCK,
};

如果您想让上下文菜单在多个范围内使用,则应复制上下文菜单选项,并为每个范围重新定义范围参数。

const otherDeleteOption = {...deleteOption};
otherDeleteOption.scopeType = Blockly.ContextMenuRegistry.ScopeType.COMMENT;

显示文本

displayText 是应作为菜单选项的一部分向用户显示的内容。显示文本可以是字符串或 HTML,也可以是返回字符串或 HTML 的函数。

const deleteOption = {
  displayText: 'Delete block',
};

如果要显示 Blockly.Msg 的译文,您需要使用函数。如果您尝试直接分配值,系统可能不会加载消息,而是会获得值 undefined

const deleteOption = {
  displayText: () => Blockly.Msg['MY_DELETE_OPTION_TEXT'],
};

如果您使用了函数,系统还会向其传递 Scope 值,您可以通过该值访问与上下文菜单相关联的元素(例如块或工作区)。您可以使用它向显示文本添加有关该元素的信息。

const deleteOption = {
  displayText: (scope) => `Delete ${scope.block.type} block`,
}

重量

weight 用于确定上下文菜单项的显示顺序。正值越多,显示在列表中的位置就越靠下,正值越小。 (您可以想象一下,权重较高的选项会“更重”,因此它们会陷入底部。)

const deleteOption = {
  weight: 10;
}

内置上下文菜单选项的权重以从 1 开始递增、在 1 递增的顺序递增。

前提条件

除了 scopeType 之外,您还可以使用 preconditionFn 限制应显示上下文菜单选项的时机和方式。

它应该返回一组字符串之一:'enabled''disabled''hidden'

说明 映像
已启用 表示相应选项处于有效状态。 启用的选项
已停用 表示该选项处于非活跃状态。 已停用的选项
已隐藏 隐藏选项。

系统还会向 preconditionFn 传递一个 Scope,您可以使用它来确定选项的状态。

const deleteOption = {
  preconditionFn: (scope) => {
    if (scope.block.isDeletable()) {
      return 'enabled';
    }
    return 'disabled';
  }
}

回拨电话

callback 属性用于执行上下文菜单项的操作。系统会向其传递 ScopePointerEventPointerEvent 是触发打开上下文菜单的原始事件,而不是选择某个选项的事件。您可以使用该事件找出点击发生的位置。例如,这让您可以在点击位置创建新块。

const deleteOption = {
  callback: (scope, e) => {
    scope.block.dispose();
  }
}

注册

如需使用上下文菜单选项,您需要注册该选项。您应该在网页加载时执行此操作一次。这可能会在注入工作区之前或之后发生。

const deleteOption = { /* implementations from above */ };
Blockly.ContextMenuRegistry.registry.register(deleteOption);

按块类型修改选项

块还有一种额外的方法来修改上下文菜单,即使用覆盖其 customContextMenu 属性。此方法接受 ContextMenuOption 对象数组(从已注册的菜单项中整理而来),然后就地修改该数组以确定最终显示的选项集。

如需了解详情,请参阅定义块、自定义上下文菜单

工作区还有一个类似 configureContextMenu 的方法。

移除选项

您可以按 ID 取消注册,从而从上下文菜单中移除某个选项。

Blockly.ContextMenuRegistry.registry.unregister('someID');

默认选项的 ID 位于 contextmenu_items.ts 中。

修改选项

如需修改现有选项,您可以从注册表中获取该项,然后就地进行修改。

const option = Blockly.ContextMenuRegistry.registry.getItem('someID');
option?.displayText = 'some other display text';