Bootstrap Chameleon Logo

Drag and Drop Area

多一种操作方式,多一种可能

SDropTarget

SDropTarget用于实现各种拖放操作,例如将文件拖放到其中以读取文件,或将Actor等拖放到工具中以获取实例。

拖拽操作方面用户以更加直观的方式与工具进行交互,会有更好的体验。

例如,在Object Detail View中,我们可以直接将需要查看的对象拖拽到窗口。

Shelf工具我们可以将文本,Actor,Chameleon Tool工具等拖拽到窗口。

G002_shelf_s

这个视频中,我们可以将图片拖拽到编辑窗口,获取其路径和内容之后再进行后续操作

OnDrop

例如,下面的代码中,我们将一个SMultiLineEditableTextBox放在SDropTarget中,当拖放文件或文本到SDropTarget中时,将会触发on_drop_func函数。从而获得用户拖放的文件或文本。

"SDropTarget": {
    "Text": "SDropTarget",
    "HAlign": "Center",
    "OnDrop": "chameleon_instance.on_drop_func(%**kwargs)",
    "Content":
    {
        "SMultiLineEditableTextBox":
        {
            "Aka": "file_path_input",
            "Text": "Drag and Drop, File or Text"
        }

    }
}

支持的类型

  • Assets. Unreal 中的UAssets
  • Folder. Content Browser中的文件夹
  • Actors. Actor实例
  • External file. For instance, drag and drop a file from windows explorer.
  • External text. Select some text in Text Editor(Pycharm, sublime, notepad++), and drag and drop it.

变量占位符

%**kwargs

在上面的JSON文件中,"chameleon_instance.on_drop_func(%**kwargs)"。 我们使用了%**kwargs 这个变量占位符。在运行时,它会被实际的值替换。 例如: 当我们拖拽一个文件到SDropTarget中时,%kwargs会被替换为:files = [file_path_a, file_path_b_if_exists, ...], 当拖拽一段文本时,%kwargs会被替换为:text = text_conent`

这样,我们就可以在on_drop_func中,可以通过**kwargs捕获所有的参数及其对应的值。

具体现在用到的参数名有:

  • "assets"
  • "assets_folders"
  • "folders"
  • "text"
  • "files"

分别对应上面支持的5种对象类型

TIP
可以在通过kwargs.keys()获取当前可用的参数名

    def on_drop_func(self, *args, **kwargs):
        file_names = kwargs.get("files", None)
        text = kwargs.get("text", "")

        if file_names:
            file_path = file_names[0]
            print(f"file_path: {file_path}")
            if os.path.exists(file_path):
                self.data.set_text(self.ui_file_path_input, file_path)
        else:
            if text:
                print(f"text: {text}")
                self.data.set_text(self.ui_input, text)

其他

下面三个是遗留的变量占位符,由于功能与%**kwargs重复,所以不再推荐继续使用。

  • %assets_folders
  • %folders
  • "%actors

小结

SDropTarget是一个非常有用的控件,可以让用户以更加直观的方式与工具进行交互,会有更好的体验。通过%**kwargs,我们可以获取到用户拖放的对象,从而在Python中进行后续操作。

参考