electron 自定义拖放类型

nhjlsmyf  于 6个月前  发布在  Electron
关注(0)|答案(3)|浏览(55)

问题

当前,要开始拖放文件,你需要调用 WebContents.startDrag({ file:<path>, icon:<path> }) 。这将生成以下 DataTransfer 对象:

DataTransfer {
  dropEffect: 'none',
  effectAllowed: 'copyLink', 
  files: FileList, 
  items: DataTransferItemList, 
  types:['Files',..]
}

其中 FileList 包含正确的文件(s)。
问题在于 effectAllowed ,当设置为 'copyLink' 时,它将不允许从 Electron BrowserWindow 拖放到 Discord 等应用程序中,因为它们只允许具有“移动”效果的拖放项。

解决方案

我建议允许更改默认值从 'copyLink' 更改为 'copyMove' ,或者允许用户将拖放效果作为参数传递给 WebContents.startDrag

文件更改

drag_utils_views.cc (第 20 行) - 为 DragFileItems 添加一个参数以接受拖放类型(应该是一个整数,Chromium 的 DragOperation 在此处定义)。
drag_utils_views.cc (第 45 行) - 将 ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_LINK 更改为传递给函数的变量。
drag_utils.h (第 18 行) - 为 DragFileItems 添加一个参数以接受拖放类型。
drag_util_mac.mm (第 28 行) - 可能需要为 DragFileItems 添加一个参数以接受拖放类型,以便与 MACOSX 兼容。(我没有看到如何在 osx 上更改拖放类型,如果他们像 windows 那样使用拖放类型的话。)
atom_api_web_contents.cc (第 1736 行)- 从 item 获取拖放类型,如下所示:

int item;
if (!item.Get("dropType", &item)) {
  item = <some default drop type value, like ui::DragDropTypes.DRAG_COPY | ui::DragDropTypes.DRAG_LINK as it was previously>
}

atom_api_web_contents.cc (第 1754 行)- 为拖放类型传递参数。

结果

现在可以使用 WebContents.startDrag 的示例用法如下:

contents.startDrag({
  file: 'C:/example/file.png',
  icon: 'myico.png',
  dropType: 3, // 3 for copyMove
})
jhkqcmku

jhkqcmku1#

你好!感谢在这里发布第一个问题!如果你在报告一个🐞 bug,请确保你包括重现它的步骤。我们在这个仓库里收到了很多问题,所以请耐心等待,我们会尽快回复你。
为了帮助我们更容易地调查你的问题,请按照 contributing guidelines 进行操作。

xvw2m8pv

xvw2m8pv2#

@mattetti两年前(来自#4622)首次实现了WebContents.startDrag函数。
@zcbenz似乎也参与了其中。
你们知道是否可以将拖放类型从复制链接更改吗?

h6my8fg2

h6my8fg23#

无法按住修饰键(Alt,Cmd等)来控制拖动的类型(复制、移动、链接等)吗?

相关问题