使用 firebreath 插件打开文件夹对话框并异步返回文件夹选择,这样 java 脚本就不会被阻止



我只想在任何时候打开一个文件夹选择对话框。用户选择文件夹后,将触发一个事件,通知 javaScript 所选文件夹。

为了打开对话框,我在项目中包含了以下要点中的代码FireBreath 的 DialogManager 抽象

插件接口 cpp

我维护一个指向插件的全局指针,因此可以从任何上下文调用其函数

问:这是最好的方法吗?

#include "DialogManagerWin.h"
pluginAPI * g_thePlugin;

我在插件中设置了它API CTOR

g_thePlugin = this;

插件API.h

这转到插件API

这是我想给 JavaScript 选定的文件夹的事件

FB_JSAPI_EVENT(folderselected, 1, (const std::string&));

要从 javaScript 调用的 API:

从 gist 调用代码以在另一个线程中打开文件夹选择,以避免阻塞并导致浏览器冻结。

void pluginAPI::SelectFolder(std::string initialFolderPath)
{
  FB::PluginWindow* pluginWindow = pluginAPI::getPlugin()->GetWindow();
  DialogManager* dlg_mgr = DialogManager::get();
  dlg_mgr->OpenFolderDialog(m_host, pluginWindow, folderSelectorCallback);
  return;
}

回调

一旦用户选择了文件夹,就会调用此回调

void folderSelectorCallback(const std::string& folderSelected)
{
    g_thePlugin->fire_folderselected(folderSelected);
    return ;
}

首先,插件和根 JSAPI 对象之间存在差异;您正在维护指向根 JSAPI 对象的全局指针。

不,这不是一个好主意,你永远不应该这样做。

其次,您可能希望在此处执行的操作不是触发 JSAPI 事件,而是实际上只是调用异步回调。在FBTestPlugin和一篇关于该主题的博客文章中都有这样的例子。

您需要做的就是接受 js 函数的 const JSObjectPtr& 回调参数,然后将其从对话框抽象传递到回调中。

如果您使用要点中的抽象,它看起来像这样:

void MyPluginAPI::someJavascriptMethod(const FB::JSObjectPtr& callback) {
    PathCallback dlgCallback = boost::bind(MyPluginAPI::doCallback, this, callback, _1);
    DialogManager::get()->OpenFolderDialog(m_host, getPlugin()->GetWindow(), dlgCallback);
}
void MyPluginAPI::doCallback(const FB::JSObjectPtr& callback, const std::string& path) {
    callback->InvokeAsync("", FB::variant_list_of(path));
}

还没有完全测试过该代码,但这应该很接近。

最新更新