Merge pull request #9237 from lioncash/msghandler

Common/MsgHandler: Add fmt-capable variants of the alert macros
This commit is contained in:
LC 2020-11-11 00:34:45 -05:00 committed by GitHub
commit ae83685b0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 104 additions and 25 deletions

View File

@ -9,9 +9,24 @@ cd "$(dirname "$0")/.."
SRCDIR=Source SRCDIR=Source
find $SRCDIR -name '*.cpp' -o -name '*.h' -o -name '*.c' | \ find $SRCDIR -name '*.cpp' -o -name '*.h' -o -name '*.c' | \
xgettext -s -p ./Languages/po -o dolphin-emu.pot --package-name="Dolphin Emulator" \ xgettext -s -p ./Languages/po -o dolphin-emu.pot --package-name="Dolphin Emulator" \
--keyword=_ --keyword=wxTRANSLATE --keyword=SuccessAlertT --keyword=PanicAlertT \ --keyword=_ \
--keyword=PanicYesNoT --keyword=AskYesNoT --keyword=CriticalAlertT --keyword=GetStringT \ --keyword=wxTRANSLATE \
--keyword=_trans --keyword=tr:1,1t --keyword=tr:1,2c --keyword=QT_TR_NOOP --keyword=FmtFormatT \ --keyword=AskYesNoT \
--keyword=AskYesNoFmtT \
--keyword=CriticalAlertT \
--keyword=CriticalAlertFmtT \
--keyword=PanicAlertT \
--keyword=PanicAlertFmtT \
--keyword=PanicYesNoT \
--keyword=PanicYesNoFmtT \
--keyword=SuccessAlertT \
--keyword=SuccessAlertFmtT \
--keyword=GetStringT \
--keyword=_trans \
--keyword=tr:1,1t \
--keyword=tr:1,2c \
--keyword=QT_TR_NOOP \
--keyword=FmtFormatT \
--add-comments=i18n --from-code=utf-8 -f - --add-comments=i18n --from-code=utf-8 -f -
# Copy strings from qt-strings.pot to dolphin-emu.pot # Copy strings from qt-strings.pot to dolphin-emu.pot

View File

@ -52,6 +52,28 @@ std::string DefaultStringTranslator(const char* text)
MsgAlertHandler s_msg_handler = DefaultMsgHandler; MsgAlertHandler s_msg_handler = DefaultMsgHandler;
StringTranslator s_str_translator = DefaultStringTranslator; StringTranslator s_str_translator = DefaultStringTranslator;
bool s_alert_enabled = true; bool s_alert_enabled = true;
const char* GetCaption(MsgType style)
{
static const std::string info_caption = s_str_translator(_trans("Information"));
static const std::string warn_caption = s_str_translator(_trans("Question"));
static const std::string ques_caption = s_str_translator(_trans("Warning"));
static const std::string crit_caption = s_str_translator(_trans("Critical"));
switch (style)
{
case MsgType::Information:
return info_caption.c_str();
case MsgType::Question:
return ques_caption.c_str();
case MsgType::Warning:
return warn_caption.c_str();
case MsgType::Critical:
return crit_caption.c_str();
default:
return "Unhandled caption";
}
}
} // Anonymous namespace } // Anonymous namespace
// Select which of these functions that are used for message boxes. If // Select which of these functions that are used for message boxes. If
@ -83,30 +105,9 @@ std::string GetStringT(const char* string)
bool MsgAlert(bool yes_no, MsgType style, const char* format, ...) bool MsgAlert(bool yes_no, MsgType style, const char* format, ...)
{ {
// Read message and write it to the log // Read message and write it to the log
const char* caption = ""; const char* caption = GetCaption(style);
char buffer[2048]; char buffer[2048];
static const std::string info_caption = s_str_translator(_trans("Information"));
static const std::string warn_caption = s_str_translator(_trans("Question"));
static const std::string ques_caption = s_str_translator(_trans("Warning"));
static const std::string crit_caption = s_str_translator(_trans("Critical"));
switch (style)
{
case MsgType::Information:
caption = info_caption.c_str();
break;
case MsgType::Question:
caption = ques_caption.c_str();
break;
case MsgType::Warning:
caption = warn_caption.c_str();
break;
case MsgType::Critical:
caption = crit_caption.c_str();
break;
}
va_list args; va_list args;
va_start(args, format); va_start(args, format);
CharArrayFromFormatV(buffer, sizeof(buffer) - 1, s_str_translator(format).c_str(), args); CharArrayFromFormatV(buffer, sizeof(buffer) - 1, s_str_translator(format).c_str(), args);
@ -123,4 +124,21 @@ bool MsgAlert(bool yes_no, MsgType style, const char* format, ...)
return true; return true;
} }
bool MsgAlertFmtImpl(bool yes_no, MsgType style, fmt::string_view format,
const fmt::format_args& args)
{
const char* caption = GetCaption(style);
const auto message = fmt::vformat(format, args);
ERROR_LOG_FMT(MASTER_LOG, "{}: {}", caption, message);
// Don't ignore questions, especially AskYesNo, PanicYesNo could be ignored
if (s_msg_handler != nullptr &&
(s_alert_enabled || style == MsgType::Question || style == MsgType::Critical))
{
return s_msg_handler(caption, message.c_str(), yes_no, style);
}
return true;
}
} // namespace Common } // namespace Common

View File

@ -27,11 +27,22 @@ void RegisterMsgAlertHandler(MsgAlertHandler handler);
void RegisterStringTranslator(StringTranslator translator); void RegisterStringTranslator(StringTranslator translator);
std::string GetStringT(const char* string); std::string GetStringT(const char* string);
bool MsgAlert(bool yes_no, MsgType style, const char* format, ...) bool MsgAlert(bool yes_no, MsgType style, const char* format, ...)
#ifdef __GNUC__ #ifdef __GNUC__
__attribute__((format(printf, 3, 4))) __attribute__((format(printf, 3, 4)))
#endif #endif
; ;
bool MsgAlertFmtImpl(bool yes_no, MsgType style, fmt::string_view format,
const fmt::format_args& args);
template <typename... Args>
bool MsgAlertFmt(bool yes_no, MsgType style, fmt::string_view format, const Args&... args)
{
return MsgAlertFmtImpl(yes_no, style, format, fmt::make_args_checked<Args...>(format, args...));
}
void SetEnableAlert(bool enable); void SetEnableAlert(bool enable);
// Like fmt::format, except the string becomes translatable // Like fmt::format, except the string becomes translatable
@ -42,6 +53,8 @@ std::string FmtFormatT(const char* string, Args&&... args)
} }
} // namespace Common } // namespace Common
// Deprecated variants of the alert macros. See the fmt variants down below.
#define SuccessAlert(format, ...) \ #define SuccessAlert(format, ...) \
Common::MsgAlert(false, Common::MsgType::Information, format, ##__VA_ARGS__) Common::MsgAlert(false, Common::MsgType::Information, format, ##__VA_ARGS__)
@ -72,3 +85,36 @@ std::string FmtFormatT(const char* string, Args&&... args)
#define CriticalAlertT(format, ...) \ #define CriticalAlertT(format, ...) \
Common::MsgAlert(false, Common::MsgType::Critical, format, ##__VA_ARGS__) Common::MsgAlert(false, Common::MsgType::Critical, format, ##__VA_ARGS__)
// Fmt-capable variants of the macros
#define SuccessAlertFmt(format, ...) \
Common::MsgAlertFmt(false, Common::MsgType::Information, FMT_STRING(format), ##__VA_ARGS__)
#define PanicAlertFmt(format, ...) \
Common::MsgAlertFmt(false, Common::MsgType::Warning, FMT_STRING(format), ##__VA_ARGS__)
#define PanicYesNoFmt(format, ...) \
Common::MsgAlertFmt(true, Common::MsgType::Warning, FMT_STRING(format), ##__VA_ARGS__)
#define AskYesNoFmt(format, ...) \
Common::MsgAlertFmt(true, Common::MsgType::Question, FMT_STRING(format), ##__VA_ARGS__)
#define CriticalAlertFmt(format, ...) \
Common::MsgAlertFmt(false, Common::MsgType::Critical, FMT_STRING(format), ##__VA_ARGS__)
// Use these macros (that do the same thing) if the message should be translated.
#define SuccessAlertFmtT(format, ...) \
Common::MsgAlertFmt(false, Common::MsgType::Information, FMT_STRING(format), ##__VA_ARGS__)
#define PanicAlertFmtT(format, ...) \
Common::MsgAlertFmt(false, Common::MsgType::Warning, FMT_STRING(format), ##__VA_ARGS__)
#define PanicYesNoFmtT(format, ...) \
Common::MsgAlertFmt(true, Common::MsgType::Warning, FMT_STRING(format), ##__VA_ARGS__)
#define AskYesNoFmtT(format, ...) \
Common::MsgAlertFmt(true, Common::MsgType::Question, FMT_STRING(format), ##__VA_ARGS__)
#define CriticalAlertFmtT(format, ...) \
Common::MsgAlertFmt(false, Common::MsgType::Critical, FMT_STRING(format), ##__VA_ARGS__)