Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/SDK/popup_message.h @ 1:20d02a178406 default tip
*: check in everything else
yay
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 05 Jan 2026 02:15:46 -0500 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/SDK/popup_message.h Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,144 @@ +#pragma once + +#include <climits> // UINT_MAX +#include <functional> +#include "completion_notify.h" + +//! This interface allows you to show generic nonmodal noninteractive dialog with a text message. This should be used instead of MessageBox where possible.\n +//! Usage: use popup_message::g_show / popup_message::g_show_ex static helpers, or popup_message::get() to obtain an instance.\n +//! Thread safety: OK to call from worker threads (will delegate UI ops to main thread automatically). \n +//! Note that all strings are UTF-8. +class NOVTABLE popup_message : public service_base { +public: + enum t_icon {icon_information, icon_error, icon_query}; + //! Activates the popup dialog; returns immediately (the dialog remains visible). + //! @param p_msg Message to show (UTF-8 encoded string). + //! @param p_msg_length Length limit of message string to show, in bytes (actual string may be shorter if null terminator is encountered before). Set this to infinite to use plain null-terminated strings. + //! @param p_title Title of dialog to show (UTF-8 encoded string). + //! @param p_title_length Length limit of the title string, in bytes (actual string may be shorter if null terminator is encountered before). Set this to infinite to use plain null-terminated strings. + //! @param p_icon Icon of the dialog - can be set to icon_information, icon_error or icon_query. + virtual void show_ex(const char * p_msg,size_t p_msg_length,const char * p_title,size_t p_title_length,t_icon p_icon = icon_information) = 0; + + //! Activates the popup dialog; returns immediately (the dialog remains visible); helper function built around show_ex(), takes null terminated strings with no length limit parameters. + //! @param p_msg Message to show (UTF-8 encoded string). + //! @param p_title Title of dialog to show (UTF-8 encoded string). + //! @param p_icon Icon of the dialog - can be set to icon_information, icon_error or icon_query. + inline void show(const char * p_msg,const char * p_title,t_icon p_icon = icon_information) {show_ex(p_msg,UINT_MAX,p_title,UINT_MAX,p_icon);} + + //! Static helper function instantiating the service and activating the message dialog. See show_ex() for description of parameters. + static void g_show_ex(const char * p_msg,size_t p_msg_length,const char * p_title,size_t p_title_length,t_icon p_icon = icon_information); + //! Static helper function instantiating the service and activating the message dialog. See show() for description of parameters. + static inline void g_show(const char * p_msg,const char * p_title,t_icon p_icon = icon_information) {g_show_ex(p_msg,UINT_MAX,p_title,UINT_MAX,p_icon);} + + //! Shows generic box with a failure message + static void g_complain(const char * what); + //! <whatfailed>: <exception message> + static void g_complain(const char * p_whatFailed, const std::exception & p_exception); + //! <whatfailed>: <msg> + static void g_complain(const char * p_whatFailed, const char * msg); + + static void g_showToast(const char * msg); + static void g_showToastLongDuration(const char * msg); + + FB2K_MAKE_SERVICE_COREAPI(popup_message); +}; + +#define EXCEPTION_TO_POPUP_MESSAGE(CODE,LABEL) try { CODE; } catch(std::exception const & e) {popup_message::g_complain(LABEL,e);} + +//! \since 1.1 +//! Extendsion to popup_message API. \n +//! Thread safety: OK to call from worker threads (will delegate UI ops to main thread automatically). \n +//! Note that all strings are UTF-8. +class NOVTABLE popup_message_v2 : public service_base { + FB2K_MAKE_SERVICE_COREAPI(popup_message_v2); +public: + virtual void show(fb2k::hwnd_t parent, const char * msg, t_size msg_length, const char * title, t_size title_length) = 0; + void show(fb2k::hwnd_t parent, const char * msg, const char * title) {show(parent, msg, SIZE_MAX, title, SIZE_MAX);} + + static void g_show(fb2k::hwnd_t parent, const char * msg, const char * title = "Information"); + static void g_complain(fb2k::hwnd_t parent, const char * whatFailed, const char * msg); + static void g_complain(fb2k::hwnd_t parent, const char * whatFailed, const std::exception & e); +}; + +namespace fb2k { + //! \since 2.0 + //! Not really implemented for Windows yet. + class popup_toast : public service_base { + FB2K_MAKE_SERVICE_COREAPI( popup_toast ); + public: + struct arg_t { + bool longDuration = false; + }; + virtual void show_toast(const char * msg, arg_t const & arg) = 0; + }; + void showToast( const char * msg ); + void showToastLongDuration( const char * msg ); + + class toastFormatter : public pfc::string_formatter { + public: + ~toastFormatter() noexcept { + try { + if ( this->length() > 0 ) showToast( c_str() ); + } catch(...) {} + } + }; +} + +#define FB2K_Toast() ::fb2k::toastFormatter()._formatter() + + +//! \since 1.5 +//! MessageBox-like dialog, only non-blocking and with dark mode support under foobar2000 v2.0. \n +//! Call from main thread only (contrary to popup_message / popup_message_v2) !!! +class NOVTABLE popup_message_v3 : public service_base { + FB2K_MAKE_SERVICE_COREAPI(popup_message_v3); +public: + + //! show_query button codes. \n + //! Combine one or more of these to create a button mask to pass to show_query(). + enum { + buttonOK = 1 << 0, + buttonCancel = 1 << 1, + buttonYes = 1 << 2, + buttonNo = 1 << 3, + buttonRetry = 1 << 4, + buttonAbort = 1 << 5, + buttonIgnore = 1 << 6, + + flagDoNotAskAgain = 1 << 16, + + iconNone = 0, + iconInformation, + iconQuestion, + iconWarning, + iconError, + }; + + struct query_t { + const char * title = nullptr; + const char * msg = nullptr; + uint32_t buttons = 0; + uint32_t defButton = 0; + uint32_t icon = iconNone; + completion_notify::ptr reply; // optional + fb2k::hwnd_t wndParent = NULL; + const char * msgDoNotAskAgain = nullptr; + + void show(); + }; + + //! Shows an interactive query presenting the user with multiple actions to choose from. + virtual void show_query(query_t const &) = 0; + + //! Modal version of show_query. Reply part of the argument can be empty; the status code will be returned. + virtual uint32_t show_query_modal(query_t const &) = 0; + + // Minimalist MessageBox() reimplementation wrapper + int messageBox(fb2k::hwnd_t, const char*, const char*, unsigned); + void messageBoxAsync(fb2k::hwnd_t, const char*, const char*, unsigned, std::function<void (int)> reply = nullptr); + static query_t setupMessageBox(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags); + static int messageBoxReply(uint32_t); + + //! Old method wrapper + void show_query( const char * title, const char * msg, unsigned buttons, completion_notify::ptr reply); +};
