annotate foosdk/sdk/foobar2000/SDK/mainmenu.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 "menu_helpers.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 bool mainmenu_commands::g_execute_dynamic(const GUID & p_guid, const GUID & p_subGuid,service_ptr_t<service_base> p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 mainmenu_commands::ptr ptr; t_uint32 index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 if (!menu_item_resolver::g_resolve_main_command(p_guid, ptr, index)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 mainmenu_commands_v2::ptr v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 if (!ptr->service_query_t(v2)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 if (!v2->is_command_dynamic(index)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 bool rv = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 fb2k::crashOnException([&] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 rv = v2->dynamic_execute(index, p_subGuid, p_callback);;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }, "mainmenu_commands::dynamic_execute");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 bool mainmenu_commands::g_execute(const GUID & p_guid,service_ptr_t<service_base> p_callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 mainmenu_commands::ptr ptr; t_uint32 index;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (!menu_item_resolver::g_resolve_main_command(p_guid, ptr, index)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 fb2k::crashOnException( [&] {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 ptr->execute(index, p_callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }, "mainmenu_commands::execute");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 bool mainmenu_commands::g_find_by_name(const char * p_name,GUID & p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 for( auto ptr : enumerate() ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 const t_uint32 count = ptr->get_command_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 for(t_uint32 n=0;n<count;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 ptr->get_name(n,temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 if (stricmp_utf8(temp,p_name) == 0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 p_guid = ptr->get_command(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
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 static bool dynamic_execute_recur(mainmenu_node::ptr node, const GUID & subID, service_ptr_t<service_base> callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 switch(node->get_type()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 case mainmenu_node::type_command:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 if (subID == node->get_guid()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 node->execute(callback); return true;
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 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 case mainmenu_node::type_group:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 const t_size total = node->get_children_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for(t_size walk = 0; walk < total; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (dynamic_execute_recur(node->get_child(walk), subID, callback)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 bool mainmenu_commands_v2::is_command_dynamic(t_uint32 index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 (void)index; return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 mainmenu_node::ptr mainmenu_commands_v2::dynamic_instantiate(t_uint32 index) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 (void)index; uBugCheck();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 bool mainmenu_commands_v2::dynamic_execute(t_uint32 index, const GUID & subID, service_ptr_t<service_base> callback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 return dynamic_execute_recur(dynamic_instantiate(index), subID, callback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 }