summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/ui/slotopt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/ui/slotopt.cpp')
-rw-r--r--src/frontend/mame/ui/slotopt.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/frontend/mame/ui/slotopt.cpp b/src/frontend/mame/ui/slotopt.cpp
new file mode 100644
index 00000000000..9b6afa92132
--- /dev/null
+++ b/src/frontend/mame/ui/slotopt.cpp
@@ -0,0 +1,210 @@
+// license:BSD-3-Clause
+// copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods
+/*********************************************************************
+
+ ui/slotopt.cpp
+
+ Internal menu for the slot options.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "emuopts.h"
+#include "mameopts.h"
+#include "ui/ui.h"
+#include "ui/menu.h"
+#include "ui/slotopt.h"
+#include "ui/devopt.h"
+
+
+/*-------------------------------------------------
+ ui_slot_get_current_option - returns
+-------------------------------------------------*/
+device_slot_option *ui_menu_slot_devices::slot_get_current_option(device_slot_interface &slot)
+{
+ std::string current;
+ if (slot.fixed())
+ {
+ if (slot.default_option() == nullptr) return nullptr;
+ current.assign(slot.default_option());
+ }
+ else
+ {
+ current = machine().options().main_value(slot.device().tag() + 1);
+ }
+
+ return slot.option(current.c_str());
+}
+
+/*-------------------------------------------------
+ ui_slot_get_current_index - returns
+-------------------------------------------------*/
+int ui_menu_slot_devices::slot_get_current_index(device_slot_interface &slot)
+{
+ const device_slot_option *current = slot_get_current_option(slot);
+
+ if (current != nullptr)
+ {
+ int val = 0;
+ for (const device_slot_option &option : slot.option_list())
+ {
+ if (&option == current)
+ return val;
+
+ if (option.selectable())
+ val++;
+ }
+ }
+
+ return -1;
+}
+
+/*-------------------------------------------------
+ ui_slot_get_length - returns
+-------------------------------------------------*/
+int ui_menu_slot_devices::slot_get_length(device_slot_interface &slot)
+{
+ int val = 0;
+ for (const device_slot_option &option : slot.option_list())
+ if (option.selectable())
+ val++;
+
+ return val;
+}
+
+/*-------------------------------------------------
+ ui_slot_get_next - returns
+-------------------------------------------------*/
+const char *ui_menu_slot_devices::slot_get_next(device_slot_interface &slot)
+{
+ int idx = slot_get_current_index(slot);
+ if (idx < 0)
+ idx = 0;
+ else
+ idx++;
+
+ if (idx >= slot_get_length(slot))
+ return "";
+
+ return slot_get_option(slot, idx);
+}
+
+/*-------------------------------------------------
+ ui_slot_get_prev - returns
+-------------------------------------------------*/
+const char *ui_menu_slot_devices::slot_get_prev(device_slot_interface &slot)
+{
+ int idx = slot_get_current_index(slot);
+ if (idx < 0)
+ idx = slot_get_length(slot) - 1;
+ else
+ idx--;
+
+ if (idx < 0)
+ return "";
+
+ return slot_get_option(slot, idx);
+}
+
+/*-------------------------------------------------
+ ui_slot_get_option - returns
+-------------------------------------------------*/
+const char *ui_menu_slot_devices::slot_get_option(device_slot_interface &slot, int index)
+{
+ if (index >= 0)
+ {
+ int val = 0;
+ for (const device_slot_option &option : slot.option_list())
+ {
+ if (val == index)
+ return option.name();
+
+ if (option.selectable())
+ val++;
+ }
+ }
+
+ return "";
+}
+
+
+/*-------------------------------------------------
+ ui_set_use_natural_keyboard - specifies
+ whether the natural keyboard is active
+-------------------------------------------------*/
+
+void ui_menu_slot_devices::set_slot_device(device_slot_interface &slot, const char *val)
+{
+ std::string error;
+ machine().options().set_value(slot.device().tag()+1, val, OPTION_PRIORITY_CMDLINE, error);
+ assert(error.empty());
+}
+
+/*-------------------------------------------------
+ menu_slot_devices_populate - populates the main
+ slot device menu
+-------------------------------------------------*/
+
+ui_menu_slot_devices::ui_menu_slot_devices(running_machine &machine, render_container *container) : ui_menu(machine, container)
+{
+}
+
+void ui_menu_slot_devices::populate()
+{
+ /* cycle through all devices for this system */
+ for (device_slot_interface &slot : slot_interface_iterator(machine().root_device()))
+ {
+ /* record the menu item */
+ const device_slot_option *option = slot_get_current_option(slot);
+ std::string opt_name;
+ if (option == nullptr)
+ opt_name.assign("------");
+ else
+ {
+ opt_name.assign(option->name());
+ if (slot.fixed() || slot_get_length(slot) == 0)
+ opt_name.append(_(" [internal]"));
+ }
+
+ item_append(slot.device().tag() + 1, opt_name.c_str(), (slot.fixed() || slot_get_length(slot) == 0) ? 0 : (MENU_FLAG_LEFT_ARROW | MENU_FLAG_RIGHT_ARROW), (void *)&slot);
+ }
+ item_append(ui_menu_item_type::SEPARATOR);
+ item_append(_("Reset"), nullptr, 0, (void *)1);
+}
+
+ui_menu_slot_devices::~ui_menu_slot_devices()
+{
+}
+
+/*-------------------------------------------------
+ ui_menu_slot_devices - menu that
+-------------------------------------------------*/
+
+void ui_menu_slot_devices::handle()
+{
+ /* process the menu */
+ const ui_menu_event *menu_event = process(0);
+
+ if (menu_event != nullptr && menu_event->itemref != nullptr)
+ {
+ if ((FPTR)menu_event->itemref == 1 && menu_event->iptkey == IPT_UI_SELECT)
+ {
+ mame_options::add_slot_options(machine().options());
+ machine().schedule_hard_reset();
+ }
+ else if (menu_event->iptkey == IPT_UI_LEFT || menu_event->iptkey == IPT_UI_RIGHT)
+ {
+ device_slot_interface *slot = (device_slot_interface *)menu_event->itemref;
+ const char *val = (menu_event->iptkey == IPT_UI_LEFT) ? slot_get_prev(*slot) : slot_get_next(*slot);
+ set_slot_device(*slot, val);
+ reset(UI_MENU_RESET_REMEMBER_REF);
+ }
+ else if (menu_event->iptkey == IPT_UI_SELECT)
+ {
+ device_slot_interface *slot = (device_slot_interface *)menu_event->itemref;
+ device_slot_option *option = slot_get_current_option(*slot);
+ if (option)
+ ui_menu::stack_push(global_alloc_clear<ui_menu_device_config>(machine(), container, slot, option));
+ }
+ }
+}