我只想在任何时候打开一个文件夹选择对话框。用户选择文件夹后,将触发一个事件,通知 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));
}
还没有完全测试过该代码,但这应该很接近。