summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ui/ctrlmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/ui/ctrlmenu.cpp')
-rw-r--r--src/emu/ui/ctrlmenu.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/emu/ui/ctrlmenu.cpp b/src/emu/ui/ctrlmenu.cpp
new file mode 100644
index 00000000000..74b35abd8e3
--- /dev/null
+++ b/src/emu/ui/ctrlmenu.cpp
@@ -0,0 +1,149 @@
+// license:BSD-3-Clause
+// copyright-holders:Dankan1890
+/*********************************************************************
+
+ ui/ctrlmenu.cpp
+
+ Internal UI user interface.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "ui/ui.h"
+#include "ui/menu.h"
+#include "ui/ctrlmenu.h"
+
+const char *ui_menu_controller_mapping::m_device_status[] = { "none", "keyboard", "mouse", "lightgun", "joystick" };
+
+ui_menu_controller_mapping::ctrl_option ui_menu_controller_mapping::m_options[] = {
+ { 0, nullptr, nullptr },
+ { 0, "Lightgun Device Assignment", OPTION_LIGHTGUN_DEVICE },
+ { 0, "Trackball Device Assignment", OPTION_TRACKBALL_DEVICE },
+ { 0, "Pedal Device Assignment", OPTION_PEDAL_DEVICE },
+ { 0, "Adstick Device Assignment", OPTION_ADSTICK_DEVICE },
+ { 0, "Paddle Device Assignment", OPTION_PADDLE_DEVICE },
+ { 0, "Dial Device Assignment", OPTION_DIAL_DEVICE },
+ { 0, "Positional Device Assignment", OPTION_POSITIONAL_DEVICE },
+ { 0, "Mouse Device Assignment", OPTION_MOUSE_DEVICE }
+};
+
+//-------------------------------------------------
+// ctor
+//-------------------------------------------------
+
+ui_menu_controller_mapping::ui_menu_controller_mapping(running_machine &machine, render_container *container) : ui_menu(machine, container)
+{
+ for (int d = 1; d < ARRAY_LENGTH(m_options); ++d)
+ m_options[d].status = check_status(machine.options().value(m_options[d].option), m_options[d].option);
+}
+
+//-------------------------------------------------
+// dtor
+//-------------------------------------------------
+
+ui_menu_controller_mapping::~ui_menu_controller_mapping()
+{
+ std::string error_string;
+ for (int d = 1; d < ARRAY_LENGTH(m_options); ++d)
+ {
+ if (strcmp(machine().options().value(m_options[d].option),m_device_status[m_options[d].status])!=0)
+ {
+ machine().options().set_value(m_options[d].option, m_device_status[m_options[d].status], OPTION_PRIORITY_CMDLINE, error_string);
+ machine().options().mark_changed(m_options[d].option);
+ }
+ }
+}
+
+//-------------------------------------------------
+// handle
+//-------------------------------------------------
+
+void ui_menu_controller_mapping::handle()
+{
+ bool changed = false;
+
+ // process the menu
+ const ui_menu_event *m_event = process(0);
+ if (m_event != nullptr && m_event->itemref != nullptr)
+ {
+ if (m_event->iptkey == IPT_UI_LEFT || m_event->iptkey == IPT_UI_RIGHT)
+ {
+ changed = true;
+ FPTR value = (FPTR)m_event->itemref;
+ (m_event->iptkey == IPT_UI_RIGHT) ? m_options[value].status++ : m_options[value].status--;
+ }
+ }
+
+ if (changed)
+ reset(UI_MENU_RESET_REMEMBER_REF);
+}
+
+//-------------------------------------------------
+// populate
+//-------------------------------------------------
+
+void ui_menu_controller_mapping::populate()
+{
+ // add options
+ for (int d = 1; d < ARRAY_LENGTH(m_options); ++d)
+ {
+ UINT32 arrow_flags = get_arrow_flags(0, ARRAY_LENGTH(m_device_status) - 1, m_options[d].status);
+ item_append(m_options[d].description, m_device_status[m_options[d].status], arrow_flags, (void *)(FPTR)d);
+ }
+ item_append(MENU_SEPARATOR_ITEM, nullptr, 0, nullptr);
+ customtop = machine().ui().get_line_height() + (3.0f * UI_BOX_TB_BORDER);
+}
+
+//-------------------------------------------------
+// perform our special rendering
+//-------------------------------------------------
+
+void ui_menu_controller_mapping::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
+{
+ float width, maxwidth = origx2 - origx1;
+ ui_manager &mui = machine().ui();
+
+ mui.draw_text_full(container, _("Device Mapping"), 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr);
+ width += 2 * UI_BOX_LR_BORDER;
+ maxwidth = MAX(maxwidth, width);
+
+ // compute our bounds
+ float x1 = 0.5f - 0.5f * maxwidth;
+ float x2 = x1 + maxwidth;
+ float y1 = origy1 - top;
+ float y2 = origy1 - UI_BOX_TB_BORDER;
+
+ // draw a box
+ mui.draw_outlined_box(container, x1, y1, x2, y2, UI_GREEN_COLOR);
+
+ // take off the borders
+ x1 += UI_BOX_LR_BORDER;
+ x2 -= UI_BOX_LR_BORDER;
+ y1 += UI_BOX_TB_BORDER;
+
+ // draw the text within it
+ mui.draw_text_full(container, _("Device Mapping"), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+
+}
+
+//-------------------------------------------------
+// return current value
+//-------------------------------------------------
+
+int ui_menu_controller_mapping::check_status(const char *status, const char *option)
+{
+ for (int d = 0; *m_device_status[d]; d++)
+ if (!strcmp(m_device_status[d], status))
+ return d;
+
+ emu_options def_opt;
+ const char *def_val = def_opt.value(option);
+
+ for (int d = 0; *m_device_status[d]; d++)
+ if (!strcmp(m_device_status[d], def_val))
+ return d;
+
+ return 1;
+}