summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame
diff options
context:
space:
mode:
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
commitf459eb6e137252301fefeff443d10ae8b9a69828 (patch)
treee50f3edd884637b30aee2a14af6d76fb4d012070 /src/frontend/mame
parent9c61152a201e9f4757cc20d3571a0714890d3cc4 (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.cpp16
-rw-r--r--src/frontend/mame/luaengine.h4
-rw-r--r--src/frontend/mame/ui/menu.h2
-rw-r--r--src/frontend/mame/ui/pluginopt.cpp103
-rw-r--r--src/frontend/mame/ui/pluginopt.h7
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