Use the new function converter in dialog api.

This commit is contained in:
Cheng Zhao 2014-04-18 17:19:15 +08:00
parent 499c9bc3b9
commit 1dd57bd3a4
2 changed files with 20 additions and 72 deletions

View file

@ -11,8 +11,8 @@
#include "atom/browser/ui/file_dialog.h" #include "atom/browser/ui/file_dialog.h"
#include "atom/browser/ui/message_box.h" #include "atom/browser/ui/message_box.h"
#include "atom/common/native_mate_converters/file_path_converter.h" #include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/function_converter.h"
#include "native_mate/dictionary.h" #include "native_mate/dictionary.h"
#include "native_mate/scoped_persistent.h"
#include "atom/common/node_includes.h" #include "atom/common/node_includes.h"
@ -37,48 +37,11 @@ struct Converter<atom::NativeWindow*> {
} }
}; };
typedef scoped_refptr<RefCountedPersistent<v8::Function>> RefCountedV8Function;
template<>
struct Converter<mate::RefCountedV8Function> {
static bool FromV8(v8::Isolate* isolate,
v8::Handle<v8::Value> val,
RefCountedV8Function* out) {
if (!val->IsFunction())
return false;
v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(val);
*out = new mate::RefCountedPersistent<v8::Function>(function);
return true;
}
};
} // namespace mate } // namespace mate
namespace { namespace {
template<typename T>
void CallV8Function(const mate::RefCountedV8Function& callback, T arg) {
v8::Locker locker(node_isolate);
v8::HandleScope handle_scope(node_isolate);
v8::Handle<v8::Value> value = mate::Converter<T>::ToV8(node_isolate, arg);
callback->NewHandle(node_isolate)->Call(
v8::Context::GetCurrent()->Global(), 1, &value);
}
template<typename T>
void CallV8Function2(
const mate::RefCountedV8Function& callback, bool result, const T& arg) {
if (result)
return CallV8Function<T>(callback, arg);
else
return CallV8Function<void*>(callback, NULL);
}
void ShowMessageBox(int type, void ShowMessageBox(int type,
const std::vector<std::string>& buttons, const std::vector<std::string>& buttons,
const std::string& title, const std::string& title,
@ -87,18 +50,12 @@ void ShowMessageBox(int type,
atom::NativeWindow* window, atom::NativeWindow* window,
mate::Arguments* args) { mate::Arguments* args) {
v8::Handle<v8::Value> peek = args->PeekNext(); v8::Handle<v8::Value> peek = args->PeekNext();
mate::RefCountedV8Function callback; atom::MessageBoxCallback callback;
if (mate::Converter<mate::RefCountedV8Function>::FromV8(node_isolate, if (mate::Converter<atom::MessageBoxCallback>::FromV8(node_isolate,
peek, peek,
&callback)) { &callback)) {
atom::ShowMessageBox( atom::ShowMessageBox(window, (atom::MessageBoxType)type, buttons, title,
window, message, detail, callback);
(atom::MessageBoxType)type,
buttons,
title,
message,
detail,
base::Bind(&CallV8Function<int>, callback));
} else { } else {
int chosen = atom::ShowMessageBox( int chosen = atom::ShowMessageBox(
window, window,
@ -117,17 +74,12 @@ void ShowOpenDialog(const std::string& title,
atom::NativeWindow* window, atom::NativeWindow* window,
mate::Arguments* args) { mate::Arguments* args) {
v8::Handle<v8::Value> peek = args->PeekNext(); v8::Handle<v8::Value> peek = args->PeekNext();
mate::RefCountedV8Function callback; file_dialog::OpenDialogCallback callback;
if (mate::Converter<mate::RefCountedV8Function>::FromV8(node_isolate, if (mate::Converter<file_dialog::OpenDialogCallback>::FromV8(node_isolate,
peek, peek,
&callback)) { &callback)) {
file_dialog::ShowOpenDialog( file_dialog::ShowOpenDialog(window, title, default_path, properties,
window, callback);
title,
default_path,
properties,
base::Bind(&CallV8Function2<std::vector<base::FilePath>>,
callback));
} else { } else {
std::vector<base::FilePath> paths; std::vector<base::FilePath> paths;
if (file_dialog::ShowOpenDialog(window, if (file_dialog::ShowOpenDialog(window,
@ -144,15 +96,11 @@ void ShowSaveDialog(const std::string& title,
atom::NativeWindow* window, atom::NativeWindow* window,
mate::Arguments* args) { mate::Arguments* args) {
v8::Handle<v8::Value> peek = args->PeekNext(); v8::Handle<v8::Value> peek = args->PeekNext();
mate::RefCountedV8Function callback; file_dialog::SaveDialogCallback callback;
if (mate::Converter<mate::RefCountedV8Function>::FromV8(node_isolate, if (mate::Converter<file_dialog::SaveDialogCallback>::FromV8(node_isolate,
peek, peek,
&callback)) { &callback)) {
file_dialog::ShowSaveDialog( file_dialog::ShowSaveDialog(window, title, default_path, callback);
window,
title,
default_path,
base::Bind(&CallV8Function2<base::FilePath>, callback));
} else { } else {
base::FilePath path; base::FilePath path;
if (file_dialog::ShowSaveDialog(window, if (file_dialog::ShowSaveDialog(window,

View file

@ -30,7 +30,7 @@ module.exports =
String(options.defaultPath), String(options.defaultPath),
properties, properties,
window, window,
callback (success, result) -> callback if success then result
showSaveDialog: (window, options, callback) -> showSaveDialog: (window, options, callback) ->
unless window?.constructor is BrowserWindow unless window?.constructor is BrowserWindow
@ -46,7 +46,7 @@ module.exports =
binding.showSaveDialog String(options.title), binding.showSaveDialog String(options.title),
String(options.defaultPath), String(options.defaultPath),
window, window,
callback (success, result) -> callback if success then result
showMessageBox: (window, options, callback) -> showMessageBox: (window, options, callback) ->
unless window?.constructor is BrowserWindow unless window?.constructor is BrowserWindow