summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/ui/inputmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/ui/inputmap.cpp')
-rw-r--r--src/frontend/mame/ui/inputmap.cpp83
1 files changed, 51 insertions, 32 deletions
diff --git a/src/frontend/mame/ui/inputmap.cpp b/src/frontend/mame/ui/inputmap.cpp
index 4f6c41bd237..0162bdd319e 100644
--- a/src/frontend/mame/ui/inputmap.cpp
+++ b/src/frontend/mame/ui/inputmap.cpp
@@ -131,7 +131,7 @@ void menu_input_general::populate()
{
for (input_item_data &item : data)
{
- const input_type_entry &entry(*reinterpret_cast<const input_type_entry *>(item.ref));
+ const input_type_entry &entry(*std::get<input_type_entry const *>(item.ref));
item.seq = machine().ioport().type_seq(entry.type(), entry.player(), item.seqtype);
}
}
@@ -141,13 +141,6 @@ void menu_input_general::populate()
item_append(menu_item_type::SEPARATOR);
}
-void menu_input_general::update_input(input_item_data &seqchangeditem)
-{
- const input_type_entry &entry = *reinterpret_cast<const input_type_entry *>(seqchangeditem.ref);
- machine().ioport().set_type_seq(entry.type(), entry.player(), seqchangeditem.seqtype, seqchangeditem.seq);
- seqchangeditem.seq = machine().ioport().type_seq(entry.type(), entry.player(), seqchangeditem.seqtype);
-}
-
/*-------------------------------------------------
menu_input_specific - handle the game-specific
@@ -224,8 +217,8 @@ void menu_input_specific::populate()
return true;
if (i1.group > i2.group)
return false;
- const ioport_field &field1 = *reinterpret_cast<const ioport_field *>(i1.ref);
- const ioport_field &field2 = *reinterpret_cast<const ioport_field *>(i2.ref);
+ const ioport_field &field1 = *std::get<ioport_field *>(i1.ref);
+ const ioport_field &field2 = *std::get<ioport_field *>(i2.ref);
if (field1.type() < field2.type())
return true;
if (field1.type() > field2.type())
@@ -248,7 +241,7 @@ void menu_input_specific::populate()
{
for (input_item_data &item : data)
{
- const ioport_field &field(*reinterpret_cast<const ioport_field *>(item.ref));
+ const ioport_field &field(*std::get<ioport_field *>(item.ref));
item.seq = field.seq(item.seqtype);
}
}
@@ -262,24 +255,6 @@ void menu_input_specific::populate()
item_append(menu_item_type::SEPARATOR);
}
-void menu_input_specific::update_input(input_item_data &seqchangeditem)
-{
- ioport_field::user_settings settings;
-
- // yeah, the const_cast is naughty, but we know we stored a non-const reference in it
- ioport_field const &field(*reinterpret_cast<ioport_field const *>(seqchangeditem.ref));
- field.get_user_settings(settings);
- settings.seq[seqchangeditem.seqtype] = seqchangeditem.seq;
- if (seqchangeditem.seq.is_default())
- settings.cfg[seqchangeditem.seqtype].clear();
- else if (!seqchangeditem.seq.length())
- settings.cfg[seqchangeditem.seqtype] = "NONE";
- else
- settings.cfg[seqchangeditem.seqtype] = machine().input().seq_to_tokens(seqchangeditem.seq);
- const_cast<ioport_field &>(field).set_user_settings(settings);
- seqchangeditem.seq = field.seq(seqchangeditem.seqtype);
-}
-
/*-------------------------------------------------
menu_input - display a menu for inputs
@@ -318,6 +293,50 @@ void menu_input::toggle_none_default(input_seq &selected_seq, input_seq &origina
}
+void menu_input::update_assignment(input_item_data &item, std::nullptr_t)
+{
+ throw std::invalid_argument("Input type or I/O port field not set in input item data.");
+}
+
+void menu_input::update_assignment(input_item_data &item, input_type_entry const *entry)
+{
+ machine().ioport().set_type_seq(entry->type(), entry->player(), item.seqtype, item.seq);
+ item.seq = machine().ioport().type_seq(entry->type(), entry->player(), item.seqtype);
+}
+
+void menu_input::update_assignment(input_item_data &item, ioport_field *field)
+{
+ ioport_field::user_settings settings;
+
+ field->get_user_settings(settings);
+ settings.seq[item.seqtype] = item.seq;
+ if (item.seq.is_default())
+ settings.cfg[item.seqtype].clear();
+ else if (!item.seq.length())
+ settings.cfg[item.seqtype] = "NONE";
+ else
+ settings.cfg[item.seqtype] = machine().input().seq_to_tokens(item.seq);
+ field->set_user_settings(settings);
+ item.seq = field->seq(item.seqtype);
+}
+
+
+bool menu_input::assignment_is_inherited(input_item_data const &item, std::nullptr_t) const
+{
+ throw std::invalid_argument("Input type or I/O port field not set in input item data.");
+}
+
+bool menu_input::assignment_is_inherited(input_item_data const &item, input_type_entry const *entry) const
+{
+ return entry->cfg(item.seqtype).empty();
+}
+
+bool menu_input::assignment_is_inherited(input_item_data const &item, ioport_field *field) const
+{
+ return field->live().cfg[item.seqtype].empty();
+}
+
+
void menu_input::recompute_metrics(uint32_t width, uint32_t height, float aspect)
{
menu::recompute_metrics(width, height, aspect);
@@ -551,7 +570,7 @@ bool menu_input::handle(event const *ev)
// if the sequence changed, update it
if (seqchangeditem)
{
- update_input(*seqchangeditem);
+ std::visit([this, seqchangeditem] (auto &&ref) { update_assignment(*seqchangeditem, ref); }, seqchangeditem->ref);
// invalidate the menu to force an update
invalidate = true;
@@ -609,9 +628,9 @@ void menu_input::populate_sorted()
}
else
{
- // otherwise, generate the sequence name and invert it if different from the default
+ // otherwise, generate the sequence name and de-emphasise it if it isn't set at this level
subtext = machine().input().seq_name(item.seq);
- flags |= (item.seq != *item.defseq) ? FLAG_INVERT : 0;
+ flags |= std::visit([this, &item] (auto &&ref) { return assignment_is_inherited(item, ref); }, item.ref) ? FLAG_DEEMPHASIZE : 0;
}
// add the item