我希望一次只能打开一个文件夹选择对话框。 用户选择文件夹后,将触发事件,通知所选文件夹的javaScript。
要打开对话框,我在项目中包含了以下要点中的代码 DialogManager abstraction for FireBreath
我维护一个指向插件的全局指针,因此可以从任何上下文调用它的函数
问:这是最好的方法吗?#include "DialogManagerWin.h"
pluginAPI * g_thePlugin;
g_thePlugin = this;
这是我想给javascript选择文件夹的事件
FB_JSAPI_EVENT(folderselected, 1, (const std::string&));
调用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 ;
}
答案 0 :(得分:3)
首先,插件和根JSAPI对象之间存在差异;你正在维护一个指向根JSAPI对象的全局指针。
不,这不是一个好主意,你永远不应该这样做。
其次,你可能想要做的不是激活JSAPI事件,而是实际上只是调用异步回调。在FBTestPlugin和blog post on the subject中有一些例子。
你需要做的就是接受一个const JSObjectPtr& js函数的回调参数,然后将其传递给对话框抽象的回调。
如果你正在使用抽象,就像它在gist中一样,它看起来像这样:
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));
}
尚未完全测试该代码,但应该接近。