3

我只想在任何时候打开一个文件夹选择对话框。一旦用户选择了文件夹,就会触发一个事件,通知所选文件夹的 JavaScript。

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

插件API cpp

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

问:这是最好的方法吗?

#include "DialogManagerWin.h"
pluginAPI * g_thePlugin;

我在pluginAPI CTOR中设置它

g_thePlugin = this;

插件API.h

这转到 pluginAPI

这是我想为 javascript 提供所选文件夹的事件

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

从 javaScript 调用的 API:

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

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 ;
}
4

1 回答 1

3

首先,插件和根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));
}

尚未准确测试该代码,但这应该很接近。

于 2012-10-02T22:37:42.913 回答