:apple: add default button index for osx
authorleethomas <leet944@gmail.com>
Fri, 8 Jan 2016 04:46:45 +0000 (20:46 -0800)
committerleethomas <leet944@gmail.com>
Fri, 8 Jan 2016 16:21:54 +0000 (08:21 -0800)
atom/browser/api/atom_api_dialog.cc
atom/browser/api/lib/dialog.coffee
atom/browser/ui/message_box.h
atom/browser/ui/message_box_mac.mm

index 40ee4d0..e8c1ae3 100644 (file)
@@ -41,6 +41,7 @@ namespace {
 
 void ShowMessageBox(int type,
                     const std::vector<std::string>& buttons,
+                    int default_button_index,
                     int cancel_id,
                     int options,
                     const std::string& title,
@@ -54,11 +55,11 @@ void ShowMessageBox(int type,
   if (mate::Converter<atom::MessageBoxCallback>::FromV8(args->isolate(),
                                                         peek,
                                                         &callback)) {
-    atom::ShowMessageBox(window, (atom::MessageBoxType)type, buttons, cancel_id,
-                         options, title, message, detail, icon, callback);
+    atom::ShowMessageBox(window, (atom::MessageBoxType)type, buttons, default_button_index,
+                         cancel_id, options, title, message, detail, icon, callback);
   } else {
     int chosen = atom::ShowMessageBox(window, (atom::MessageBoxType)type,
-                                      buttons, cancel_id, options, title,
+                                      buttons, default_button_index, cancel_id, options, title,
                                       message, detail, icon);
     args->Return(chosen);
   }
index f10ce58..03deb54 100644 (file)
@@ -91,10 +91,11 @@ module.exports =
 
     throw new TypeError('Buttons need to be array') unless Array.isArray options.buttons
 
-    options.title ?= ''
-    options.message ?= ''
-    options.detail ?= ''
-    options.icon ?= null
+    options.title              ?= ''
+    options.message            ?= ''
+    options.detail             ?= ''
+    options.icon               ?= null
+    options.defaultButtonIndex ?= -1
 
     # Choose a default button to get selected when dialog is cancelled.
     unless options.cancelId?
@@ -108,6 +109,7 @@ module.exports =
 
     binding.showMessageBox messageBoxType,
                            options.buttons,
+                           options.defaultButtonIndex,
                            options.cancelId,
                            flags,
                            options.title,
index 92052d3..cef3c79 100644 (file)
@@ -38,6 +38,7 @@ int ShowMessageBox(NativeWindow* parent_window,
                    MessageBoxType type,
                    const std::vector<std::string>& buttons,
                    int cancel_id,
+                   int default_button_index,
                    int options,
                    const std::string& title,
                    const std::string& message,
@@ -47,6 +48,7 @@ int ShowMessageBox(NativeWindow* parent_window,
 void ShowMessageBox(NativeWindow* parent_window,
                     MessageBoxType type,
                     const std::vector<std::string>& buttons,
+                    int default_button_index,
                     int cancel_id,
                     int options,
                     const std::string& title,
index e518af6..f9a4f9a 100644 (file)
@@ -54,6 +54,7 @@ namespace {
 NSAlert* CreateNSAlert(NativeWindow* parent_window,
                        MessageBoxType type,
                        const std::vector<std::string>& buttons,
+                       int default_button_index,
                        const std::string& title,
                        const std::string& message,
                        const std::string& detail) {
@@ -78,8 +79,17 @@ NSAlert* CreateNSAlert(NativeWindow* parent_window,
     // An empty title causes crash on OS X.
     if (buttons[i].empty())
       title = @"(empty)";
+
     NSButton* button = [alert addButtonWithTitle:title];
     [button setTag:i];
+
+    if (i == (size_t)default_button_index) {
+      // focus the button at default_button_index if the user opted to do so.
+      // The first button added gets set as the default selected.
+      // So remove that default, and make the requested button the default
+      [[[alert buttons] objectAtIndex:0] setKeyEquivalent:@""];
+      [button setKeyEquivalent:@"\r"];
+    }
   }
 
   return alert;
@@ -94,6 +104,7 @@ void SetReturnCode(int* ret_code, int result) {
 int ShowMessageBox(NativeWindow* parent_window,
                    MessageBoxType type,
                    const std::vector<std::string>& buttons,
+                   int default_button_index,
                    int cancel_id,
                    int options,
                    const std::string& title,
@@ -101,7 +112,8 @@ int ShowMessageBox(NativeWindow* parent_window,
                    const std::string& detail,
                    const gfx::ImageSkia& icon) {
   NSAlert* alert = CreateNSAlert(
-      parent_window, type, buttons, title, message, detail);
+      parent_window, type, buttons, default_button_index, title, message,
+      detail);
 
   // Use runModal for synchronous alert without parent, since we don't have a
   // window to wait for.
@@ -127,6 +139,7 @@ int ShowMessageBox(NativeWindow* parent_window,
 void ShowMessageBox(NativeWindow* parent_window,
                     MessageBoxType type,
                     const std::vector<std::string>& buttons,
+                    int default_button_index,
                     int cancel_id,
                     int options,
                     const std::string& title,
@@ -135,7 +148,8 @@ void ShowMessageBox(NativeWindow* parent_window,
                     const gfx::ImageSkia& icon,
                     const MessageBoxCallback& callback) {
   NSAlert* alert = CreateNSAlert(
-      parent_window, type, buttons, title, message, detail);
+      parent_window, type, buttons, default_button_index, title, message,
+      detail);
   ModalDelegate* delegate = [[ModalDelegate alloc] initWithCallback:callback
                                                            andAlert:alert
                                                        callEndModal:false];