annotate foosdk/sdk/foobar2000/SDK/popup_message.cpp @ 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "popup_message.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "messageBox.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 void popup_message::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)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 get()->show_ex(p_msg, p_msg_length, p_title, p_title_length, p_icon);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 void popup_message::g_complain(const char * what) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 g_show(what, "Information", icon_error);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void popup_message::g_complain(const char * p_whatFailed, const std::exception & p_exception) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 g_complain(p_whatFailed,p_exception.what());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 void popup_message::g_complain(const char * p_whatFailed, const char * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 g_complain( pfc::format(p_whatFailed, ": ", msg));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 void popup_message_v3::show_query( const char * title, const char * msg, unsigned buttons, completion_notify::ptr reply) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 query_t q;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 q.title = title; q.msg = msg; q.buttons = buttons; q.reply = reply;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 this->show_query( q );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 void popup_message_v3::query_t::show() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 popup_message_v3::get()->show_query(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 void popup_message_v2::g_show(fb2k::hwnd_t parent, const char * msg, const char * title) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 service_enum_t< popup_message_v2 > e;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 service_ptr_t< popup_message_v2 > m;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if (e.first( m )) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m->show(parent, msg, title);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 popup_message::g_show( msg, title );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void popup_message_v2::g_complain(fb2k::hwnd_t parent, const char * whatFailed, const char * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 g_show(parent, pfc::format(whatFailed, ": ", msg));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void popup_message_v2::g_complain(fb2k::hwnd_t parent, const char * whatFailed, const std::exception & e) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 g_complain(parent, whatFailed, e.what());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void fb2k::showToast( const char * msg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 fb2k::popup_toast::arg_t arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 fb2k::popup_toast::get()->show_toast(msg, arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void fb2k::showToastLongDuration( const char * msg ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 fb2k::popup_toast::arg_t arg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 arg.longDuration = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 fb2k::popup_toast::get()->show_toast(msg, arg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void popup_message::g_showToast(const char * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 fb2k::showToast( msg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void popup_message::g_showToastLongDuration(const char * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 fb2k::showToastLongDuration( msg );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 int fb2k::messageBox(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 return popup_message_v3::get()->messageBox(parent, msg, title, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 void fb2k::messageBoxAsync(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags, std::function<void(int)> reply) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return popup_message_v3::get()->messageBoxAsync(parent, msg, title, flags, reply);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 popup_message_v3::query_t popup_message_v3::setupMessageBox(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 query_t q = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 q.title = title;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 q.msg = msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 q.wndParent = parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 switch (flags & 0xF) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 default:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 case MB_OK:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 q.buttons = buttonOK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 q.defButton = buttonOK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 case MB_OKCANCEL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 q.buttons = buttonOK | buttonCancel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 q.defButton = (flags & MB_DEFBUTTON2) ? buttonCancel : buttonOK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 case MB_ABORTRETRYIGNORE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 q.buttons = buttonAbort | buttonRetry | buttonIgnore;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 if (flags & MB_DEFBUTTON3) q.defButton = buttonIgnore;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 else if (flags & MB_DEFBUTTON2) q.defButton = buttonRetry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 else q.defButton = buttonAbort;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 case MB_YESNOCANCEL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 q.buttons = buttonYes | buttonNo | buttonCancel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 if (flags & MB_DEFBUTTON3) q.defButton = buttonCancel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 else if (flags & MB_DEFBUTTON2) q.defButton = buttonNo;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 else q.defButton = buttonYes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 case MB_YESNO:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 q.buttons = buttonYes | buttonNo;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 q.defButton = (flags & MB_DEFBUTTON2) ? buttonNo : buttonYes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 case MB_RETRYCANCEL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 q.buttons = buttonRetry | buttonCancel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 q.defButton = (flags & MB_DEFBUTTON2) ? buttonCancel : buttonRetry;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 switch (flags & 0xF0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 case MB_ICONHAND:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 q.icon = iconError;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 case MB_ICONQUESTION:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 q.icon = iconQuestion;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 case MB_ICONEXCLAMATION:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 q.icon = iconWarning;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 case MB_ICONASTERISK:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 q.icon = iconInformation;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 return q;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 int popup_message_v3::messageBoxReply(uint32_t status) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 if (status & buttonOK) return IDOK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 if (status & buttonCancel) return IDCANCEL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 if (status & buttonYes) return IDYES;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 if (status & buttonNo) return IDNO;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 if (status & buttonRetry) return IDRETRY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 if (status & buttonAbort) return IDABORT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 if (status & buttonIgnore) return IDIGNORE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 return -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 void popup_message_v3::messageBoxAsync(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags, std::function<void (int)> reply) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 PFC_ASSERT( core_api::is_main_thread() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 auto q = setupMessageBox(parent, msg, title, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 if (reply) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 q.reply = fb2k::makeCompletionNotify([reply](unsigned code) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 reply(messageBoxReply(code));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 });
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 this->show_query(q);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 int popup_message_v3::messageBox(fb2k::hwnd_t parent, const char* msg, const char* title, unsigned flags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 PFC_ASSERT( core_api::is_main_thread() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 auto q = setupMessageBox(parent, msg, title, flags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 uint32_t status = this->show_query_modal(q);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 return messageBoxReply(status);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }