Bootstrap Chameleon Logo

Context Menu for Slate Widget

熟悉的配方,通用的使用方法

除了在编辑器界面上添加菜单项,我们通过TAPython创建的Chameleon Tools中的部分Slate组件也支持右键菜单,用户可以通过右键菜单对当前选中的Item进行操作。

添加的方法是在对应的Slate控件中添加"OnContextMenuOpening" 字段,字段中的内容格式和Pre-defined Menu Entry等菜单设置格式是一致的。

以下这些控件支持右键菜单

支持的控件

支持的控件注意分为以下三类

文本输入控件

  • SEditableTextBox

Context menu of SEditableTextBox

"SEditableTextBox":
{
    "Text": "",
    "SelectAllTextWhenFocused": true,
    "HintText": "Type some thing, and press enter",
    "OnTextChanged": "print(%)",
    "OnTextCommitted": "print('input text: {}'.format(%))",
    "OnContextMenuOpening":
    {
        "items":
        [
            {
                "name": "ContextMenu A1",
                "Command": "print ('ContextMenu A')",
                "icon": {
                    "style": "EditorStyle",
                    "name": "LevelEditor.Tabs.Details"
                }
            },
            {
                "name": "ContextMenu B1",
                "Command": "print ('ContextMenu B')",
                "icon": { "style": "ChameleonStyle", "name": "Flash"}
            }
        ]
    }
}

在Command中可以触发Python工具中的某个函数,通过“Aka”名获取、修改控件中当前的内容。

下面其他的类型的文本控件也是类似的设置方法。事实上它们有着类似的继承关系。

  • SEditableText

  • SEditableTextBox

  • SMultiLineEditableText

  • SMultiLineEditableTextBox

SListView

SListView中的Context Menu是很实用的。例如,下面的Object Manager中就可以通过右键菜单对选中的Item进行操作。

Context menu of SListView created with TAPython

"SListView":
{
    "ItemHeight": 1,
    "Aka": "SubNameList",
    "ListItemsSource": [],
    "SHeaderRow": {
        "Columns":
        [
            {
                "DefaultLabel": "SubName",
                "FillWidth": 1
            }
        ]
    },
    "OnContextMenuOpening": {
        "items": [
            {
                "name": "Spawn this Category",
                "Command": "chameleon_object_manager.SpawnCurrentSubCategoryPrefabs()"
            },
            {
                "name": "Spawn this Category with LODs",
                "Command": "chameleon_object_manager.SpawnCurrentSubCategoryPrefabs(bSpawnAtSelection=True, bSpawnAllLOD=True)"
            },
            {
                "name": "Generate Mesh",
                "Command": "chameleon_object_manager.generate_mesh_for_sub_categorys()"
            }
        ]
    },
    "OnSelectionChanged": "chameleon_object_manager.ui_on_listview_SubNameList_selected_changed(%index)",
    "OnMouseButtonDoubleClick": "chameleon_object_manager.ui_on_listview_SubNameList_double_click(%index)"
}

和文本输出框一样,我们可以通过chameleon_data_instance.get_selected_item_in_view_list获取当前选中的Item,然后对其进行操作。例如下面的代码中的self.data.get_selected_item_in_view_list,将会返回整个SListView中的Item项,和它们是否被选中的状态。

def get_selected_item_in_view_list(self, ui_name):
    items, isSelected = self.data.get_list_view_items(ui_name)
    ...

除了通过get_selected_item_in_view_list这个方法以外,我们也可以在"OnSelectionChanged""OnMouseButtonDoubleClick"中获取用户的选择操作。然后在Python代码中记录下"当前状态"。

TIP
"OnContextMenuOpening"中没有%index这样的变量占位符,可以理解为触发了一个事件,至于是哪个Item触发的,需要在Python中获取。

STreeView

STeeView 和 SListView的使用方法是一样的,只是它是一个树形结构的控件。我们可以用同样的方式为它加上右键菜单。

Context Menu of SListView created with TAPython

相关参考

Menu Entry Tab Context Menu