3

一度に開くフォルダ選択ダイアログを1つだけにしたい。ユーザーがフォルダを選択すると、イベントが発生し、選択したフォルダをjavaScriptに通知します。

ダイアログを開くために、FireBreathのプロジェクト DialogManager抽象化に次の要点のコードを含めました

pluginAPI cpp

プラグインへのグローバルポインタを維持しているので、その関数は任意のコンテキストから呼び出すことができます

Q:これが最善の方法ですか?

#include "DialogManagerWin.h"
pluginAPI * g_thePlugin;

pluginAPICTORで設定しました

g_thePlugin = this;

pluginAPI.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 に答える