Я хочу, чтобы в любой момент открывался только один диалог выбора папки.
Как только пользователь выберет папку, будет запущено событие, сообщающее javaScript о выбранной папке.
Чтобы открыть диалоговое окно, я включил код из следующего гист в моем проекте
DialogManager абстракция для FireBreath
Я поддерживаю глобальный указатель на плагин, чтобы его функции можно было вызывать из любого контекста
Q: это лучший способ?
#include "DialogManagerWin.h"pluginAPI * g_thePlugin;
g_thePlugin = this;
это событие, которое я хочу дать javascript выбранной папке
FB_JSAPI_EVENT(folderselected, 1, (const std::string&));
вызывает код из сущности, чтобы открыть выбор папки в другом потоке, чтобы избежать блокировки и вызвать зависание браузера.
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 и сообщение в блоге на эту тему.
Все, что вам нужно сделать, это принять const JSObjectPtr& Аргумент обратного вызова функции js, а затем передать его в обратный вызов из абстракции диалога.
Если вы используете абстракцию, как в сущности, она будет выглядеть примерно так:
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));
}
Точно не проверял этот код, но это должно быть близко.
Других решений пока нет …