// license:BSD-3-Clause // copyright-holders:Nicola Salmoria, Aaron Giles, Nathan Woods /********************************************************************* ui/mainmenu.cpp Internal MAME menus for the user interface. *********************************************************************/ #include "emu.h" #include "ui/mainmenu.h" #include "ui/about.h" #include "ui/barcode.h" #include "ui/cheatopt.h" #include "ui/confswitch.h" #include "ui/datmenu.h" #include "ui/filemngr.h" #include "ui/info.h" #include "ui/info_pty.h" #include "ui/inifile.h" #include "ui/inputopts.h" #include "ui/miscmenu.h" #include "ui/pluginopt.h" #include "ui/selgame.h" #include "ui/simpleselgame.h" #include "ui/sliders.h" #include "ui/slotopt.h" #include "ui/tapectrl.h" #include "ui/videoopt.h" #include "mame.h" #include "luaengine.h" #include "imagedev/cassette.h" #include "machine/bcreader.h" #include "crsshair.h" #include "dinetwork.h" #include "dipty.h" #include "emuopts.h" namespace ui { enum : unsigned { INPUT_OPTIONS, SETTINGS_DIP_SWITCHES, SETTINGS_DRIVER_CONFIG, BOOKKEEPING, GAME_INFO, WARN_INFO, IMAGE_MENU_IMAGE_INFO, IMAGE_MENU_FILE_MANAGER, TAPE_CONTROL, SLOT_DEVICES, NETWORK_DEVICES, SLIDERS, VIDEO_TARGETS, CROSSHAIR, CHEAT, PLUGINS, BIOS_SELECTION, BARCODE_READ, PTY_INFO, EXTERNAL_DATS, FAVORITE, ABOUT, QUIT_GAME, DISMISS, SELECT_GAME }; /*************************************************************************** MENU HANDLERS ***************************************************************************/ /*------------------------------------------------- menu_main constructor/destructor -------------------------------------------------*/ menu_main::menu_main(mame_ui_manager &mui, render_container &container) : menu(mui, container) , m_phase(machine_phase::PREINIT) { set_needs_prev_menu_item(false); } menu_main::~menu_main() { } /*------------------------------------------------- menu_activated - handle coming to foreground -------------------------------------------------*/ void menu_main::menu_activated() { if (machine().phase() != m_phase) reset(reset_options::REMEMBER_REF); } /*------------------------------------------------- populate - populate main menu items -------------------------------------------------*/ void menu_main::populate() { m_phase = machine().phase(); item_append(_("menu-main", "Input Settings"), 0, (void *)INPUT_OPTIONS); if (ui().machine_info().has_dips()) item_append(_("menu-main", "DIP Switches"), 0, (void *)SETTINGS_DIP_SWITCHES); if (ui().machine_info().has_configs()) item_append(_("menu-main", "Machine Configuration"), 0, (void *)SETTINGS_DRIVER_CONFIG); item_append(_("menu-main", "Bookkeeping Info"), 0, (void *)BOOKKEEPING); item_append(_("menu-main", "System Information"), 0, (void *)GAME_INFO); if (ui().found_machine_warnings()) item_append(_("menu-main", "Warning Information"), 0, (void *)WARN_INFO); for (device_image_interface &image : image_interface_enumerator(machine().root_device())) if (image.user_loadable()) { item_append(_("menu-main", "Media Image Information"), 0, (void *)IMAGE_MENU_IMAGE_INFO); break; } for (device_image_interface &image : image_interface_enumerator(machine().root_device())) if (image.user_loadable() || image.has_preset_images_selection()) { item_append(_("menu-main", "File Manager"), 0, (void *)IMAGE_MENU_FILE_MANAGER); break; } if (cassette_device_enumerator(machine().root_device()).first() != nullptr) item_append(_("menu-main", "Tape Control"), 0, (void *)TAPE_CONTROL); if (pty_interface_enumerator(machine().root_device()).first() != nullptr) item_append(_("menu-main", "Pseudo Terminals"), 0, (void *)PTY_INFO); if (ui().machine_info().has_bioses()) item_append(_("menu-main", "BIOS Selection"), 0, (void *)BIOS_SELECTION); if (slot_interface_enumerator(machine().root_device()).first() != nullptr) item_append(_("menu-main", "Slot Devices"), 0, (void *)SLOT_DEVICES); if (barcode_reader_device_enumerator(machine().root_device()).first() != nullptr) item_append(_("menu-main", "Barcode Reader"), 0, (void *)BARCODE_READ); if (network_interface_enumerator(machine().root_device()).first() != nullptr) item_append(_("menu-main", "Network Devices"), 0, (void*)NETWORK_DEVICES); item_append(_("menu-main", "Slider Controls"), 0, (void *)SLIDERS); item_append(_("menu-main", "Video Options"), 0, (void *)VIDEO_TARGETS); if (machine().crosshair().get_usage()) item_append(_("menu-main", "Crosshair Options"), 0, (void *)CROSSHAIR); if (machine().options().cheat()) item_append(_("menu-main", "Cheat Options"), 0, (void *)CHEAT); if (machine_phase::RESET <= m_phase) { if (machine().options().plugins() && !mame_machine_manager::instance()->lua()->get_menu().empty()) item_append(_("menu-main", "Plugin Options"), 0, (void *)PLUGINS); if (mame_machine_manager::instance()->lua()->call_plugin_check("data_list", "", true)) item_append(_("menu-main", "External DAT View"), 0, (void *)EXTERNAL_DATS); } item_append(menu_item_type::SEPARATOR); if (!mame_machine_manager::instance()->favorite().is_favorite(machine())) item_append(_("menu-main", "Add To Favorites"), 0, (void *)FAVORITE); else item_append(_("menu-main", "Remove From Favorites"), 0, (void *)FAVORITE); item_append(menu_item_type::SEPARATOR); item_append(string_format(_("menu-main", "About %1$s"), emulator_info::get_appname()), 0, (void *)ABOUT); item_append(menu_item_type::SEPARATOR); // item_append(_("menu-main", "Quit from System"), 0, (void *)QUIT_GAME); if (machine_phase::INIT == m_phase) { item_append(_("menu-main", "Start System"), 0, (void *)DISMISS); } else { item_append(_("menu-main", "Select New System"), 0, (void *)SELECT_GAME); item_append(_("menu-main", "Close Menu"), 0, (void *)DISMISS); } } /*------------------------------------------------- handle - handle main menu events -------------------------------------------------*/ bool menu_main::handle(event const *ev) { // process the menu if (ev && (ev->iptkey == IPT_UI_SELECT)) { switch (uintptr_t(ev->itemref)) { case INPUT_OPTIONS: menu::stack_push(ui(), container()); break; case SETTINGS_DIP_SWITCHES: menu::stack_push(ui(), container()); break; case SETTINGS_DRIVER_CONFIG: menu::stack_push(ui(), container()); break; case BOOKKEEPING: menu::stack_push(ui(), container()); break; case GAME_INFO: menu::stack_push(ui(), container()); break; case WARN_INFO: menu::stack_push(ui(), container()); break; case IMAGE_MENU_IMAGE_INFO: menu::stack_push(ui(), container()); break; case IMAGE_MENU_FILE_MANAGER: menu::stack_push(ui(), container(), nullptr); break; case TAPE_CONTROL: menu::stack_push(ui(), container(), nullptr); break; case PTY_INFO: menu::stack_push(ui(), container()); break; case SLOT_DEVICES: menu::stack_push(ui(), container()); break; case NETWORK_DEVICES: menu::stack_push(ui(), container()); break; case SLIDERS: menu::stack_push(ui(), container(), false); break; case VIDEO_TARGETS: menu::stack_push(ui(), container()); break; case CROSSHAIR: menu::stack_push(ui(), container()); break; case CHEAT: menu::stack_push(ui(), container()); break; case PLUGINS: menu::stack_push(ui(), container()); break; case SELECT_GAME: if (machine().options().ui() == emu_options::UI_SIMPLE) menu::stack_push(ui(), container(), nullptr); else menu::stack_push(ui(), container(), nullptr); break; case ABOUT: menu::stack_push(ui(), container()); break; case BIOS_SELECTION: menu::stack_push(ui(), container()); break; case BARCODE_READ: menu::stack_push(ui(), container(), nullptr); break; case EXTERNAL_DATS: menu::stack_push(ui(), container()); break; case FAVORITE: { favorite_manager &mfav = mame_machine_manager::instance()->favorite(); if (mfav.is_favorite(machine())) mfav.remove_favorite(machine()); else mfav.add_favorite(machine()); reset(reset_options::REMEMBER_REF); break; } case QUIT_GAME: stack_pop(); ui().request_quit(); break; case DISMISS: stack_pop(); break; default: fatalerror("ui::menu_main::handle - unknown reference\n"); } } return false; } } // namespace ui