mac: Add asynchronous ShowSaveDialog.
authorCheng Zhao <zcbenz@gmail.com>
Mon, 23 Sep 2013 12:08:32 +0000 (20:08 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Mon, 23 Sep 2013 12:08:32 +0000 (20:08 +0800)
browser/ui/file_dialog.h
browser/ui/file_dialog_mac.mm

index 250ba5c..96c0061 100644 (file)
@@ -25,7 +25,10 @@ enum FileDialogProperty {
 };
 
 typedef base::Callback<void(
-    bool result, std::vector<base::FilePath> paths)> OpenDialogCallback;
+    bool result, const std::vector<base::FilePath>& paths)> OpenDialogCallback;
+
+typedef base::Callback<void(
+    bool result, const base::FilePath& path)> SaveDialogCallback;
 
 bool ShowOpenDialog(atom::NativeWindow* parent_window,
                     const std::string& title,
@@ -44,6 +47,11 @@ bool ShowSaveDialog(atom::NativeWindow* parent_window,
                     const base::FilePath& default_path,
                     base::FilePath* path);
 
+void ShowSaveDialog(atom::NativeWindow* parent_window,
+                    const std::string& title,
+                    const base::FilePath& default_path,
+                    const SaveDialogCallback& callback);
+
 }  // namespace file_dialog
 
 #endif  // BROWSER_UI_FILE_DIALOG_H_
index e4902e4..fd28cf5 100644 (file)
@@ -143,4 +143,26 @@ bool ShowSaveDialog(atom::NativeWindow* parent_window,
   return true;
 }
 
+void ShowSaveDialog(atom::NativeWindow* parent_window,
+                    const std::string& title,
+                    const base::FilePath& default_path,
+                    const SaveDialogCallback& c) {
+  NSSavePanel* dialog = [NSSavePanel savePanel];
+
+  SetupDialog(dialog, title, default_path);
+
+  __block SaveDialogCallback callback = c;
+
+  NSWindow* window = parent_window ? parent_window->GetNativeWindow() : NULL;
+  [dialog beginSheetModalForWindow:window
+                 completionHandler:^(NSInteger chosen) {
+    if (chosen == NSFileHandlingPanelCancelButton) {
+      callback.Run(false, base::FilePath());
+    } else {
+      std::string path = base::SysNSStringToUTF8([[dialog URL] path]);
+      callback.Run(true, base::FilePath(path));
+    }
+  }];
+}
+
 }  // namespace file_dialog