diff options
author | Vas Crabb <vas@vastheman.com> | 2021-10-22 01:14:05 +1100 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2021-10-22 01:14:05 +1100 |
commit | f459eb6e137252301fefeff443d10ae8b9a69828 (patch) | |
tree | e50f3edd884637b30aee2a14af6d76fb4d012070 /src/frontend/mame | |
parent | 9c61152a201e9f4757cc20d3571a0714890d3cc4 (diff) |
Plugin usability improvements:
* autofire, inputmacro: Made left/right repeat when held (makes setting
long delays/durations easier).
* autofire, inputmacro: Added headings for devices in input selection
menus (helps when controller buttons have identical names, e.g. AES)
* autofire: Made intial selection when moving between menus intuitive,
log some errors on saving/loading configuration.
* autofire: Fixed two errors in Chinese localisations.
Diffstat (limited to 'src/frontend/mame')
-rw-r--r-- | src/frontend/mame/luaengine.cpp | 16 | ||||
-rw-r--r-- | src/frontend/mame/luaengine.h | 4 | ||||
-rw-r--r-- | src/frontend/mame/ui/menu.h | 2 | ||||
-rw-r--r-- | src/frontend/mame/ui/pluginopt.cpp | 103 | ||||
-rw-r--r-- | src/frontend/mame/ui/pluginopt.h | 7 |
5 files changed, 91 insertions, 41 deletions
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp index 9169bdc9f50..e8e246b5efc 100644 --- a/src/frontend/mame/luaengine.cpp +++ b/src/frontend/mame/luaengine.cpp @@ -432,7 +432,7 @@ sol::object lua_engine::call_plugin(const std::string &name, sol::object in) return sol::lua_nil; } -std::optional<long> lua_engine::menu_populate(const std::string &menu, std::vector<std::tuple<std::string, std::string, std::string>> &menu_list) +std::optional<long> lua_engine::menu_populate(const std::string &menu, std::vector<std::tuple<std::string, std::string, std::string> > &menu_list, std::string &flags) { std::string field = "menu_pop_" + menu; sol::object obj = sol().registry()[field]; @@ -446,7 +446,7 @@ std::optional<long> lua_engine::menu_populate(const std::string &menu, std::vect } else { - std::tuple<sol::table, std::optional<long> > table = res; + std::tuple<sol::table, std::optional<long>, std::string> table = res; for (auto &entry : std::get<0>(table)) { if (entry.second.is<sol::table>()) @@ -455,27 +455,31 @@ std::optional<long> lua_engine::menu_populate(const std::string &menu, std::vect menu_list.emplace_back(enttable.get<std::string, std::string, std::string>(1, 2, 3)); } } + flags = std::get<2>(table); return std::get<1>(table); } } + flags.clear(); return std::nullopt; } -bool lua_engine::menu_callback(const std::string &menu, int index, const std::string &event) +std::pair<bool, std::optional<long> > lua_engine::menu_callback(const std::string &menu, int index, const std::string &event) { std::string field = "menu_cb_" + menu; - bool ret = false; + std::pair<bool, std::optional<long> > ret(false, std::nullopt); sol::object obj = sol().registry()[field]; - if(obj.is<sol::protected_function>()) + if (obj.is<sol::protected_function>()) { auto res = invoke(obj.as<sol::protected_function>(), index, event); - if(!res.valid()) + if (!res.valid()) { sol::error err = res; osd_printf_error("[LUA ERROR] in menu_callback: %s\n", err.what()); } else + { ret = res; + } } return ret; } diff --git a/src/frontend/mame/luaengine.h b/src/frontend/mame/luaengine.h index 5b945e864c9..f61baa8c083 100644 --- a/src/frontend/mame/luaengine.h +++ b/src/frontend/mame/luaengine.h @@ -48,8 +48,8 @@ public: bool frame_hook(); - std::optional<long> menu_populate(const std::string &menu, std::vector<std::tuple<std::string, std::string, std::string>> &menu_list); - bool menu_callback(const std::string &menu, int index, const std::string &event); + std::optional<long> menu_populate(const std::string &menu, std::vector<std::tuple<std::string, std::string, std::string> > &menu_list, std::string &flags); + std::pair<bool, std::optional<long> > menu_callback(const std::string &menu, int index, const std::string &event); void set_machine(running_machine *machine); std::vector<std::string> &get_menu() { return m_menu; } diff --git a/src/frontend/mame/ui/menu.h b/src/frontend/mame/ui/menu.h index d8fcbcd25ea..958c1e86af8 100644 --- a/src/frontend/mame/ui/menu.h +++ b/src/frontend/mame/ui/menu.h @@ -37,7 +37,7 @@ class menu { public: // flags for menu items - enum : unsigned + enum : uint32_t { FLAG_LEFT_ARROW = 1U << 0, FLAG_RIGHT_ARROW = 1U << 1, diff --git a/src/frontend/mame/ui/pluginopt.cpp b/src/frontend/mame/ui/pluginopt.cpp index e065582103b..d706780daae 100644 --- a/src/frontend/mame/ui/pluginopt.cpp +++ b/src/frontend/mame/ui/pluginopt.cpp @@ -62,15 +62,17 @@ menu_plugin::~menu_plugin() { } -menu_plugin_opt::menu_plugin_opt(mame_ui_manager &mui, render_container &container, char *menu) : - ui::menu(mui, container), - m_menu(menu) +menu_plugin_opt::menu_plugin_opt(mame_ui_manager &mui, render_container &container, std::string_view menu) : + ui::menu(mui, container), + m_menu(menu), + m_process_flags(0U), + m_need_idle(false) { } void menu_plugin_opt::handle() { - const event *menu_event = process(0); + const event *menu_event = process(m_process_flags); if (menu_event) { @@ -105,9 +107,13 @@ void menu_plugin_opt::handle() key = std::to_string((u32)menu_event->unichar); break; default: - return; + if (!m_need_idle) + return; } - if (mame_machine_manager::instance()->lua()->menu_callback(m_menu, uintptr_t(menu_event->itemref), key)) + auto const result = mame_machine_manager::instance()->lua()->menu_callback(m_menu, uintptr_t(menu_event->itemref), key); + if (result.second) + set_selection(reinterpret_cast<void *>(uintptr_t(*result.second))); + if (result.first) reset(reset_options::REMEMBER_REF); else if (menu_event->iptkey == IPT_UI_CANCEL) stack_pop(); @@ -117,41 +123,78 @@ void menu_plugin_opt::handle() void menu_plugin_opt::populate(float &customtop, float &custombottom) { std::vector<std::tuple<std::string, std::string, std::string>> menu_list; - auto const sel = mame_machine_manager::instance()->lua()->menu_populate(m_menu, menu_list); + std::string flags; + auto const sel = mame_machine_manager::instance()->lua()->menu_populate(m_menu, menu_list, flags); uintptr_t i = 1; - for(auto &item : menu_list) + for (auto &item : menu_list) { - const std::string &text = std::get<0>(item); - const std::string &subtext = std::get<1>(item); - const std::string &tflags = std::get<2>(item); - - uint32_t flags = 0; - if (tflags == "off") - flags = FLAG_DISABLE; - else if (tflags == "heading") - flags = FLAG_DISABLE | FLAG_UI_HEADING; - else if (tflags == "l") - flags = FLAG_LEFT_ARROW; - else if (tflags == "r") - flags = FLAG_RIGHT_ARROW; - else if (tflags == "lr") - flags = FLAG_RIGHT_ARROW | FLAG_LEFT_ARROW; - - if(text == "---") + std::string &text = std::get<0>(item); + std::string &subtext = std::get<1>(item); + std::string_view tflags = std::get<2>(item); + + uint32_t item_flags_or = uint32_t(0); + uint32_t item_flags_and = ~uint32_t(0); + auto flag_start = tflags.find_first_not_of(' '); + while (std::string_view::npos != flag_start) { - item_append(menu_item_type::SEPARATOR); - i++; + tflags.remove_prefix(flag_start); + auto const flag_end = tflags.find(' '); + auto const flag = tflags.substr(0, flag_end); + tflags.remove_prefix(flag.length()); + flag_start = tflags.find_first_not_of(' '); + + if (flag == "off") + item_flags_or |= FLAG_DISABLE; + else if (flag == "on") + item_flags_and &= ~FLAG_DISABLE; + else if (flag == "l") + item_flags_or |= FLAG_LEFT_ARROW; + else if (flag == "r") + item_flags_or |= FLAG_RIGHT_ARROW; + else if (flag == "lr") + item_flags_or |= FLAG_RIGHT_ARROW | FLAG_LEFT_ARROW; + else if (flag == "invert") + item_flags_or |= FLAG_INVERT; + else if (flag == "heading") + item_flags_or |= FLAG_DISABLE | FLAG_UI_HEADING; } + + if (text == "---") + item_append(menu_item_type::SEPARATOR); else - { - item_append(text, subtext, flags, reinterpret_cast<void *>(i++)); - } + item_append(std::move(text), std::move(subtext), item_flags_or & item_flags_and, reinterpret_cast<void *>(i)); + ++i; } item_append(menu_item_type::SEPARATOR); if (sel) set_selection(reinterpret_cast<void *>(uintptr_t(*sel))); + + m_process_flags = 0U; + m_need_idle = false; + if (!flags.empty()) + { + std::string_view mflags = flags; + auto flag_start = mflags.find_first_not_of(' '); + while (std::string_view::npos != flag_start) + { + mflags.remove_prefix(flag_start); + auto const flag_end = mflags.find(' '); + auto const flag = mflags.substr(0, flag_end); + mflags.remove_prefix(flag.length()); + flag_start = mflags.find_first_not_of(' '); + + if (flag == "lralways") + m_process_flags |= PROCESS_LR_ALWAYS; + else if (flag == "lrrepeat") + m_process_flags |= PROCESS_LR_REPEAT; + else if (flag == "customnav") + m_process_flags |= PROCESS_CUSTOM_NAV; + else if (flag == "idle") + m_need_idle = true; + } + } } menu_plugin_opt::~menu_plugin_opt() diff --git a/src/frontend/mame/ui/pluginopt.h b/src/frontend/mame/ui/pluginopt.h index da2da131792..c639c3caa15 100644 --- a/src/frontend/mame/ui/pluginopt.h +++ b/src/frontend/mame/ui/pluginopt.h @@ -16,6 +16,7 @@ #include "ui/ui.h" #include <string> +#include <string_view> #include <vector> @@ -40,7 +41,7 @@ private: class menu_plugin_opt : public menu { public: - menu_plugin_opt(mame_ui_manager &mui, render_container &container, char *menu); + menu_plugin_opt(mame_ui_manager &mui, render_container &container, std::string_view menu); virtual ~menu_plugin_opt(); protected: @@ -50,7 +51,9 @@ private: virtual void populate(float &customtop, float &custombottom) override; virtual void handle() override; - std::string m_menu; + std::string const m_menu; + uint32_t m_process_flags; + bool m_need_idle; }; } // namespace ui |