JavaScript is required

节点&线条&画布 右键菜单

节点上下文菜单

演示上下文菜单实现,根据目标类型(节点、连线或画布)提供动态操作,使用 eventPositionOnView 准确定位。

节点上下文菜单

功能概述

本示例演示如何为节点实现上下文菜单,根据目标类型(节点、连线或画布)提供不同的操作。菜单通过 RGSlotOnView 渲染,并使用上下文菜单事件处理器中的 eventPositionOnView 进行定位。

核心特性实现

带视图位置的上下文菜单处理器

const onContextmenu = (
    e: RGUserEvent,
    objectType: RGEventTargetType,
    object: RGNode | RGLine | undefined,
    eventPositionOnCanvas: RGCoordinate,
    eventPositionOnView: RGCoordinate
) => {
    setMenuTarget({ type: objectType, data: object });
    // 直接使用 eventPositionOnView 设置菜单位置
    setMenuPosition({ x: eventPositionOnView.x, y: eventPositionOnView.y });
    setIsShowMenu(true);
};

基于目标类型的动态菜单操作

<RGSlotOnView>
    {isShowMenu && (
        <div
            className="pointer-events-auto context-menu-panel"
            style={{ left: menuPosition.x, top: menuPosition.y }}
            onClick={(e) => e.stopPropagation()}
        >
            <div className="menu-header">
                {menuTarget?.type === 'node' && 'Node Menu'}
                {menuTarget?.type === 'line' && 'Line Menu'}
                {menuTarget?.type === 'canvas' && 'Canvas Menu'}
            </div>

            {/* 选项 1:查看详情 */}
            <div className="menu-item" onClick={() => doMenuAction('View Details')}>
                <Info size={16} /> View Details
            </div>

            {/* 选项 2:特定类型的操作 */}
            {menuTarget?.type === 'node' && (
                <div className="menu-item" onClick={() => doMenuAction('Edit Node')}>
                    <Edit size={16} /> Edit Node
                </div>
            )}
            {menuTarget?.type === 'line' && (
                <div className="menu-item" onClick={() => doMenuAction('Change Color')}>
                    <Edit size={16} /> Change Color
                </div>
            )}
            {menuTarget?.type === 'canvas' && (
                <div className="menu-item" onClick={() => doMenuAction('Add New Node')}>
                    <Plus size={16} /> Add New Node
                </div>
            )}

            {/* 选项 3:通用操作 */}
            {menuTarget?.type === 'canvas' ? (
                <div className="menu-item" onClick={() => doMenuAction('Reset Zoom')}>
                    <ZoomIn size={16} /> Reset Zoom
                </div>
            ) : (
                <div className="menu-item" onClick={() => doMenuAction('Delete')}>
                    <Trash2 size={16} /> Delete
                </div>
            )}
        </div>
    )}
</RGSlotOnView>

操作处理器

const doMenuAction = (action: string) => {
    const targetName = menuTarget?.type === 'canvas' ? 'Canvas' : (menuTarget?.data as any)?.text || menuTarget?.type;
    SimpleGlobalMessage.showMessage({
        message: `Performed [${action}] on ${targetName}`,
        type: 'success'
    });
    setIsShowMenu(false);
};

创意使用场景

工作流编辑器:节点上的上下文菜单提供编辑属性、删除、复制或添加连接等操作。画布菜单提供缩放适应或自动布局等全局操作。

项目管理工具:节点菜单允许任务状态更改、资源分配或依赖关系管理。画布菜单创建新任务或应用过滤器。

数据库架构设计器:右键单击表可进行列编辑、索引管理或关系创建。画布菜单添加新表或生成架构文档。

思维导图应用:节点菜单提供格式选项、图标选择或笔记附件。画布菜单创建新中心主题或导出地图。

网络拓扑设计器:设备菜单提供配置访问、状态监控或连接管理。画布菜单添加设备或运行网络模拟。

游戏关卡编辑器:实体菜单编辑属性、触发器或行为。画布菜单放置新实体、图层或测试运行关卡。

知识图谱编辑器:概念菜单编辑属性、添加相关概念或查看连接。画布菜单创建新概念或导入数据。