javascript — использование плагина firebreath для открытия диалогового окна папок и асинхронного возврата выбора папки, чтобы сценарий java не блокировался

Я хочу, чтобы в любой момент открывался только один диалог выбора папки.
Как только пользователь выберет папку, будет запущено событие, сообщающее javaScript о выбранной папке.

Чтобы открыть диалоговое окно, я включил код из следующего гист в моем проекте
DialogManager абстракция для FireBreath

Я поддерживаю глобальный указатель на плагин, чтобы его функции можно было вызывать из любого контекста

Q: это лучший способ?

#include "DialogManagerWin.h"pluginAPI * g_thePlugin;

Я установил его в плагине API CTOR

g_thePlugin = this;

Это идет к плагину API

это событие, которое я хочу дать javascript выбранной папке

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

API для вызова из javaScript:

вызывает код из сущности, чтобы открыть выбор папки в другом потоке, чтобы избежать блокировки и вызвать зависание браузера.

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

3

Решение

Прежде всего, существует разница между плагином и корневым объектом 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));
}

Точно не проверял этот код, но это должно быть близко.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]