summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/ui/confswitch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/ui/confswitch.cpp')
-rw-r--r--src/frontend/mame/ui/confswitch.cpp155
1 files changed, 79 insertions, 76 deletions
diff --git a/src/frontend/mame/ui/confswitch.cpp b/src/frontend/mame/ui/confswitch.cpp
index 7d6030ce669..946062b9a1d 100644
--- a/src/frontend/mame/ui/confswitch.cpp
+++ b/src/frontend/mame/ui/confswitch.cpp
@@ -171,103 +171,106 @@ void menu_confswitch::populate()
}
-void menu_confswitch::handle(event const *ev)
+bool menu_confswitch::handle(event const *ev)
{
- // handle events
- if (ev && ev->itemref)
+ if (!ev || !ev->itemref)
+ return false;
+
+ if (uintptr_t(ev->itemref) == 1U)
{
- if (uintptr_t(ev->itemref) == 1U)
- {
- // reset
- if (ev->iptkey == IPT_UI_SELECT)
- machine().schedule_hard_reset();
- }
- else
- {
- // actual settings
- ioport_field &field(*reinterpret_cast<ioport_field *>(ev->itemref));
- bool changed(false);
+ // reset
+ if (ev->iptkey == IPT_UI_SELECT)
+ machine().schedule_hard_reset();
+ }
+ else
+ {
+ // actual settings
+ ioport_field &field(*reinterpret_cast<ioport_field *>(ev->itemref));
+ bool changed(false);
- switch (ev->iptkey)
+ switch (ev->iptkey)
+ {
+ // left goes to previous setting
+ case IPT_UI_LEFT:
+ field.select_previous_setting();
+ changed = true;
+ break;
+
+ // right goes to next setting
+ case IPT_UI_SELECT:
+ case IPT_UI_RIGHT:
+ field.select_next_setting();
+ changed = true;
+ break;
+
+ // if cleared, reset to default value
+ case IPT_UI_CLEAR:
{
- // left goes to previous setting
- case IPT_UI_LEFT:
- field.select_previous_setting();
- changed = true;
- break;
-
- // right goes to next setting
- case IPT_UI_SELECT:
- case IPT_UI_RIGHT:
- field.select_next_setting();
- changed = true;
- break;
-
- // if cleared, reset to default value
- case IPT_UI_CLEAR:
+ ioport_field::user_settings settings;
+ field.get_user_settings(settings);
+ if (field.defvalue() != settings.value)
{
- ioport_field::user_settings settings;
- field.get_user_settings(settings);
- if (field.defvalue() != settings.value)
- {
- settings.value = field.defvalue();
- field.set_user_settings(settings);
- changed = true;
- }
+ settings.value = field.defvalue();
+ field.set_user_settings(settings);
+ changed = true;
}
- break;
+ }
+ break;
- // trick to get previous group - depend on headings having null reference
- case IPT_UI_PREV_GROUP:
+ // trick to get previous group - depend on headings having null reference
+ case IPT_UI_PREV_GROUP:
+ {
+ auto current = selected_index();
+ bool found_break = false;
+ while (0 < current)
{
- auto current = selected_index();
- bool found_break = false;
- while (0 < current)
+ if (!found_break)
{
- if (!found_break)
- {
- if (!item(--current).ref())
- found_break = true;
- }
- else if (!item(current - 1).ref())
- {
- set_selected_index(current);
- set_top_line(current - 1);
- break;
- }
- else
- {
- --current;
- }
+ if (!item(--current).ref())
+ found_break = true;
+ }
+ else if (!item(current - 1).ref())
+ {
+ set_selected_index(current);
+ set_top_line(current - 1);
+ return true;
+ }
+ else
+ {
+ --current;
}
}
- break;
+ }
+ break;
- // trick to get next group - depend on special item references
- case IPT_UI_NEXT_GROUP:
+ // trick to get next group - depend on special item references
+ case IPT_UI_NEXT_GROUP:
+ {
+ auto current = selected_index();
+ while (item_count() > ++current)
{
- auto current = selected_index();
- while (item_count() > ++current)
+ if (!item(current).ref())
{
- if (!item(current).ref())
+ if ((item_count() > (current + 1)) && (uintptr_t(item(current + 1).ref()) != 1))
{
- if ((item_count() > (current + 1)) && (uintptr_t(item(current + 1).ref()) != 1))
- {
- set_selected_index(current + 1);
- set_top_line(current);
- }
- break;
+ set_selected_index(current + 1);
+ set_top_line(current);
+ return true;
}
+ break;
}
}
- break;
}
-
- // if anything changed, rebuild the menu, trying to stay on the same field
- if (changed)
- reset(reset_options::REMEMBER_REF);
+ break;
}
+
+ // if anything changed, rebuild the menu, trying to stay on the same field
+ if (changed)
+ reset(reset_options::REMEMBER_REF);
}
+
+ // changing settings triggers an item rebuild because it can affect whether things are enabled
+ return false;
}