diff --git a/src/arch/Dialog/Dialog.cpp b/src/arch/Dialog/Dialog.cpp index 9067ce0bb7..62ec752fc6 100644 --- a/src/arch/Dialog/Dialog.cpp +++ b/src/arch/Dialog/Dialog.cpp @@ -234,6 +234,30 @@ Dialog::Result Dialog::AbortRetry( RString sMessage, RString sID ) return ret; } +Dialog::Result Dialog::YesNo( RString sMessage, RString sID ) +{ + Dialog::Init(); + + if( LOG ) + LOG->Trace( "Dialog: \"%s\" [%s]", sMessage.c_str(), sID.c_str() ); + + if( sID != "" && MessageIsIgnored(sID) ) + return g_NullDriver.YesNo( sMessage, sID ); + + RageThread::SetIsShowingDialog( true ); + + // only show Dialog if windowed + Dialog::Result ret; + if( DialogsEnabled() ) + ret = g_pImpl->YesNo( sMessage, sID ); // call derived version + else + ret = g_NullDriver.YesNo( sMessage, sID ); + + RageThread::SetIsShowingDialog( false ); + + return ret; +} + /* * (c) 2003-2004 Glenn Maynard, Chris Danford * All rights reserved. diff --git a/src/arch/Dialog/Dialog.h b/src/arch/Dialog/Dialog.h index e36d2cacda..d115c85b6d 100644 --- a/src/arch/Dialog/Dialog.h +++ b/src/arch/Dialog/Dialog.h @@ -10,12 +10,13 @@ namespace Dialog void SetWindowed( bool bWindowed ); - enum Result { ok, cancel, abort, retry, ignore }; + enum Result { ok, cancel, abort, retry, ignore, yes, no }; void Error( RString sError, RString sID = "" ); void OK( RString sMessage, RString sID = "" ); Result OKCancel( RString sMessage, RString sID = "" ); Result AbortRetryIgnore( RString sMessage, RString sID = "" ); Result AbortRetry( RString sMessage, RString sID = "" ); + Result YesNo( RString sMessage, RString sID = "" ); /* for DialogDrivers */ void IgnoreMessage( RString sID ); diff --git a/src/arch/Dialog/DialogDriver.h b/src/arch/Dialog/DialogDriver.h index 3ce0dd3de0..5e377328ba 100644 --- a/src/arch/Dialog/DialogDriver.h +++ b/src/arch/Dialog/DialogDriver.h @@ -12,8 +12,9 @@ public: virtual void Error( RString sMessage, RString sID ) { printf("Error: %s\n", sMessage.c_str()); } virtual void OK( RString sMessage, RString sID ) {} virtual Dialog::Result OKCancel( RString sMessage, RString sID ) { return Dialog::ok; } - virtual Dialog::Result AbortRetryIgnore( RString sMessage, RString sID ) { return Dialog::ignore; } - virtual Dialog::Result AbortRetry( RString sMessage, RString sID ) { return Dialog::abort; } + virtual Dialog::Result AbortRetryIgnore( RString sMessage, RString sID ) { return Dialog::ignore; } + virtual Dialog::Result AbortRetry( RString sMessage, RString sID ) { return Dialog::abort; } + virtual Dialog::Result YesNo( RString sMessage, RString sID ) { return Dialog::no; } virtual RString Init() { return RString(); } virtual ~DialogDriver() { } diff --git a/src/arch/Dialog/DialogDriver_MacOSX.cpp b/src/arch/Dialog/DialogDriver_MacOSX.cpp index 989d4abda2..57340a9c51 100644 --- a/src/arch/Dialog/DialogDriver_MacOSX.cpp +++ b/src/arch/Dialog/DialogDriver_MacOSX.cpp @@ -54,6 +54,27 @@ void DialogDriver_MacOSX::Error( RString sError, RString sID ) ShowAlert( kCFUserNotificationStopAlertLevel, sError, CFSTR("OK") ); } +Dialog::Result DialogDriver_MacOSX::OKCancel( RString sMessage, RString sID ) +{ + CFBundleRef bundle = CFBundleGetMainBundle(); + CFStringRef sOK = LSTRING( bundle, "OK" ); + CFStringRef sCancel = LSTRING( bundle, "Cancel" ); + CFOptionFlags result = ShowAlert( kCFUserNotificationNoteAlertLevel, sMessage, sOK, sCancel ); + + CFRelease( sOK ); + CFRelease( sCancel ); + switch( result ) + { + case kCFUserNotificationDefaultResponse: + case kCFUserNotificationCancelResponse: + return Dialog::cancel; + case kCFUserNotificationAlternateResponse: + return Dialog::ok; + default: + FAIL_M( ssprintf("Invalid response: %d.", int(result)) ); + } +} + Dialog::Result DialogDriver_MacOSX::AbortRetryIgnore( RString sMessage, RString sID ) { CFBundleRef bundle = CFBundleGetMainBundle(); @@ -101,6 +122,27 @@ Dialog::Result DialogDriver_MacOSX::AbortRetry( RString sMessage, RString sID ) } } +Dialog::Result DialogDriver_MacOSX::YesNo( RString sMessage, RString sID ) +{ + CFBundleRef bundle = CFBundleGetMainBundle(); + CFStringRef sYes = LSTRING( bundle, "Yes" ); + CFStringRef sNo = LSTRING( bundle, "No" ); + CFOptionFlags result = ShowAlert( kCFUserNotificationNoteAlertLevel, sMessage, sYes, sNo ); + + CFRelease( sYes ); + CFRelease( sNo ); + switch( result ) + { + case kCFUserNotificationDefaultResponse: + case kCFUserNotificationCancelResponse: + return Dialog::no; + case kCFUserNotificationAlternateResponse: + return Dialog::yes; + default: + FAIL_M( ssprintf("Invalid response: %d.", int(result)) ); + } +} + /* * (c) 2003-2006 Steve Checkoway * All rights reserved. diff --git a/src/arch/Dialog/DialogDriver_MacOSX.h b/src/arch/Dialog/DialogDriver_MacOSX.h index d07e513db7..109d8053da 100644 --- a/src/arch/Dialog/DialogDriver_MacOSX.h +++ b/src/arch/Dialog/DialogDriver_MacOSX.h @@ -8,8 +8,10 @@ class DialogDriver_MacOSX: public DialogDriver public: void Error( RString sError, RString sID ); void OK( RString sMessage, RString sID ); + Dialog::Result OKCancel( RString sMessage, RString sID ); Dialog::Result AbortRetryIgnore( RString sMessage, RString sID ); Dialog::Result AbortRetry( RString sMessage, RString sID ); + Dialog::Result YesNo( RString sMessage, RString sID ); }; #define USE_DIALOG_DRIVER_COCOA diff --git a/src/arch/Dialog/DialogDriver_Win32.cpp b/src/arch/Dialog/DialogDriver_Win32.cpp index 705e29fb9c..1849f70c1c 100644 --- a/src/arch/Dialog/DialogDriver_Win32.cpp +++ b/src/arch/Dialog/DialogDriver_Win32.cpp @@ -263,6 +263,22 @@ Dialog::Result DialogDriver_Win32::AbortRetry( RString sMessage, RString sID ) } } +Dialog::Result DialogDriver_Win32::YesNo( RString sMessage, RString sID ) +{ + int iRet = 0; +#if !defined(SMPACKAGE) + iRet = ::MessageBox(::GetHwnd(), ConvertUTF8ToACP(sMessage).c_str(), ConvertUTF8ToACP(::GetWindowTitle()).c_str(), MB_YESNO); +#else + iRet = ::AfxMessageBox( ConvertUTF8ToACP(sMessage).c_str(), MB_RETRYCANCEL, 0 ); +#endif + switch( iRet ) + { + case IDYES: return Dialog::yes; + default: ASSERT(0); + case IDNO: return Dialog::no; + } +} + /* * (c) 2003-2004 Glenn Maynard, Chris Danford * All rights reserved. diff --git a/src/arch/Dialog/DialogDriver_Win32.h b/src/arch/Dialog/DialogDriver_Win32.h index 14c3be75bb..3edc6e1544 100644 --- a/src/arch/Dialog/DialogDriver_Win32.h +++ b/src/arch/Dialog/DialogDriver_Win32.h @@ -11,6 +11,7 @@ public: Dialog::Result OKCancel( RString sMessage, RString sID ); Dialog::Result AbortRetryIgnore( RString sMessage, RString sID ); Dialog::Result AbortRetry( RString sMessage, RString sID ); + Dialog::Result YesNo( RString sMessage, RString sID ); }; #endif