From aa81c1d82f93dc4d18d62b1742b9821d15ba409d Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Wed, 8 Jun 2016 06:56:25 +0200 Subject: [PATCH] Start implementing ui_cocoa_msg_window.m --- ui/drivers/cocoa/ui_cocoa_msg_window.m | 94 +++++++++++++++++++++++++- ui/drivers/ui_cocoa.m | 2 +- ui/ui_companion_driver.h | 11 ++- 3 files changed, 102 insertions(+), 5 deletions(-) diff --git a/ui/drivers/cocoa/ui_cocoa_msg_window.m b/ui/drivers/cocoa/ui_cocoa_msg_window.m index 38a92df741..06d5e19cfb 100644 --- a/ui/drivers/cocoa/ui_cocoa_msg_window.m +++ b/ui/drivers/cocoa/ui_cocoa_msg_window.m @@ -19,21 +19,109 @@ #include #include +#include + +#include "cocoa_common.h" + #include "../../ui_companion_driver.h" +extern id apple_platform; + +static enum ui_msg_window_response ui_msg_window_cocoa_dialog(ui_msg_window_state *state, enum ui_msg_window_type type) +{ + NSInteger response; + NSAlert* alert = [[NSAlert new] autorelease]; + + if (!string_is_empty(state->title)) + [alert setMessageText:BOXSTRING(state->title)]; + [alert setInformativeText:BOXSTRING(state->text)]; + + switch (state->buttons) + { + case UI_MSG_WINDOW_OK: + [alert addButtonWithTitle:BOXSTRING("OK")]; + break; + case UI_MSG_WINDOW_YESNO: + [alert addButtonWithTitle:BOXSTRING("Yes")]; + [alert addButtonWithTitle:BOXSTRING("No")]; + break; + case UI_MSG_WINDOW_OKCANCEL: + [alert addButtonWithTitle:BOXSTRING("OK")]; + [alert addButtonWithTitle:BOXSTRING("Cancel")]; + break; + case UI_MSG_WINDOW_YESNOCANCEL: + [alert addButtonWithTitle:BOXSTRING("Yes")]; + [alert addButtonWithTitle:BOXSTRING("No")]; + [alert addButtonWithTitle:BOXSTRING("Cancel")]; + break; + } + + switch (type) + { + case UI_MSG_WINDOW_TYPE_ERROR: + [alert setAlertStyle:NSCriticalAlertStyle]; + break; + case UI_MSG_WINDOW_TYPE_WARNING: + [alert setAlertStyle:NSWarningAlertStyle]; + break; + case UI_MSG_WINDOW_TYPE_QUESTION: + [alert setAlertStyle:NSInformationalAlertStyle]; + break; + case UI_MSG_WINDOW_TYPE_INFORMATION: + [alert setAlertStyle:NSInformationalAlertStyle]; + break; + } + + [alert beginSheetModalForWindow:((RetroArch_OSX*)[[NSApplication sharedApplication] delegate]).window + modalDelegate:apple_platform + didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) + contextInfo:nil]; + response = [[NSApplication sharedApplication] runModalForWindow:[alert window]]; + + switch (state->buttons) + { + case UI_MSG_WINDOW_OK: + if (response == NSAlertFirstButtonReturn) + return UI_MSG_RESPONSE_OK; + break; + case UI_MSG_WINDOW_OKCANCEL: + if (response == NSAlertFirstButtonReturn) + return UI_MSG_RESPONSE_OK; + if (response == NSAlertSecondButtonReturn) + return UI_MSG_RESPONSE_CANCEL; + break; + case UI_MSG_WINDOW_YESNO: + if (response == NSAlertFirstButtonReturn) + return UI_MSG_RESPONSE_YES; + if (response == NSAlertSecondButtonReturn) + return UI_MSG_RESPONSE_NO; + break; + case UI_MSG_WINDOW_YESNOCANCEL: + if (response == NSAlertFirstButtonReturn) + return UI_MSG_RESPONSE_YES; + if (response == NSAlertSecondButtonReturn) + return UI_MSG_RESPONSE_NO; + if (response == NSAlertThirdButtonReturn) + return UI_MSG_RESPONSE_CANCEL; + break; + } + + return UI_MSG_RESPONSE_NA; +} + static enum ui_msg_window_response ui_msg_window_cocoa_error(ui_msg_window_state *state) { - return UI_MSG_RESPONSE_CANCEL; + return ui_msg_window_cocoa_dialog(state, UI_MSG_WINDOW_TYPE_ERROR); } static enum ui_msg_window_response ui_msg_window_cocoa_information(ui_msg_window_state *state) { - return UI_MSG_RESPONSE_CANCEL; + return ui_msg_window_cocoa_dialog(state, UI_MSG_WINDOW_TYPE_INFORMATION); } static enum ui_msg_window_response ui_msg_window_cocoa_question(ui_msg_window_state *state) { - return UI_MSG_RESPONSE_CANCEL; + return ui_msg_window_cocoa_dialog(state, UI_MSG_WINDOW_TYPE_QUESTION); } const ui_msg_window_t ui_msg_window_cocoa = { diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index ccd0e8f548..c5eb7facb3 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -35,7 +35,7 @@ #include "../../system.h" #include "../../tasks/tasks_internal.h" -static id apple_platform; +id apple_platform; static void app_terminate(void) { diff --git a/ui/ui_companion_driver.h b/ui/ui_companion_driver.h index dc6cfafe59..66ab650f2e 100644 --- a/ui/ui_companion_driver.h +++ b/ui/ui_companion_driver.h @@ -41,12 +41,21 @@ enum ui_msg_window_buttons enum ui_msg_window_response { - UI_MSG_RESPONSE_OK = 0, + UI_MSG_RESPONSE_NA = 0, + UI_MSG_RESPONSE_OK, UI_MSG_RESPONSE_CANCEL, UI_MSG_RESPONSE_YES, UI_MSG_RESPONSE_NO }; +enum ui_msg_window_type +{ + UI_MSG_WINDOW_TYPE_ERROR = 0, + UI_MSG_WINDOW_TYPE_INFORMATION, + UI_MSG_WINDOW_TYPE_QUESTION, + UI_MSG_WINDOW_TYPE_WARNING +}; + typedef struct ui_msg_window_state { enum ui_msg_window_buttons buttons;