E Story 故事编辑器开发笔记 #15 优化上下文菜单

本地化翻译&快捷键提示&顺序调整

上图是默认的上下文菜单样式,功能上的使用没有什么问题,但是缺少了本地化翻译和快捷键提示,也不太符合我的操作习惯,所以我按照自己的习惯进行了修改。

打开StoryGraphView.cs,修改BuildContextualMenu方法:

C#
public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
{
    // 添加元素
    if (evt.target is GraphView || evt.target is Edge)
    {
        evt.menu.AppendAction("添加节点        Space", action =>
        {
            // 获取光标当前屏幕位置
            Vector2 screenMousePosition = action.eventInfo.mousePosition + storyEditorWindow.position.position + new Vector2(50, 35);
            // 触发请求事件
            nodeCreationRequest(new NodeCreationContext
            {
                screenMousePosition = screenMousePosition,
                index = -1
            });
        });
    }
    if (evt.target is GraphView || evt.target is Node)
    {
        evt.menu.AppendAction("添加分组", action =>
        {
            CreateGroup("分组", GetLocalMousePosition(action.eventInfo.localMousePosition));
        });
    }

    evt.menu.AppendSeparator();    // 分割线

    // 编辑元素
    if (evt.target is GraphView || evt.target is Node || evt.target is Group)
    {
        evt.menu.AppendAction("剪切        Ctrl+X", delegate
        {
            CutSelectionCallback();
        }, canCutSelection ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled);
    }
    if (evt.target is GraphView || evt.target is Node || evt.target is Group)
    {
        evt.menu.AppendAction("复制        Ctrl+C", delegate
        {
            CopySelectionCallback();
        }, canCopySelection ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled);
    }
    if (evt.target is GraphView)
    {
        evt.menu.AppendAction("粘贴        Ctrl+V", delegate
        {
            PasteCallback();
        }, canPaste ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled);
    }
    if (evt.target is GraphView || evt.target is Node || evt.target is Group)
    {
        evt.menu.AppendAction("拷贝        Ctrl+D", delegate
        {
            DuplicateSelectionCallback();
        }, canDuplicateSelection ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled);
    }
    evt.menu.AppendSeparator();
    if (evt.target is GraphView || evt.target is Node || evt.target is Group || evt.target is Edge)
    {
        evt.menu.AppendAction("删除        Delete", delegate
        {
            DeleteSelectionCallback(AskUser.DontAskUser);
        }, canDeleteSelection ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled);
    }
}

增加操作视图按钮

GraphView类自带一些视图操作功能,并且绑定了快捷键,但是没有呈现出来,我打算把这些功能呈现在上下文菜单里。

继续修改BuildContextualMenu方法,在方法末尾添加若干语句:

C#
public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
{
    /* ... 此处代码已省略 ... */

    evt.menu.AppendSeparator();

    // 操作视图
    evt.menu.AppendAction("聚焦上一个        [", delegate
    {
        FramePrev();
    }, DropdownMenuAction.Status.Normal);
    evt.menu.AppendAction("聚焦下一个        ]", delegate
    {
        FrameNext();
    }, DropdownMenuAction.Status.Normal);
    evt.menu.AppendAction("聚焦选中        F", delegate
    {
        FrameSelection();
    }, DropdownMenuAction.Status.Normal);
    evt.menu.AppendAction("聚焦全部        A", delegate
    {
        FrameAll();
    }, DropdownMenuAction.Status.Normal);
    evt.menu.AppendAction("还原视图        O", delegate
    {
        FrameOrigin();
    }, DropdownMenuAction.Status.Normal);
}

测试效果

最终窗口效果如下:

相关链接

留下评论