diff --git a/src/frontend/mame/ui/filesel.cpp b/src/frontend/mame/ui/filesel.cpp index 4d415f19f37..4f4e1b98c57 100644 --- a/src/frontend/mame/ui/filesel.cpp +++ b/src/frontend/mame/ui/filesel.cpp @@ -44,7 +44,7 @@ namespace ui { // ctor //------------------------------------------------- -menu_file_selector::menu_file_selector(mame_ui_manager &mui, render_container *container, device_image_interface *image, std::string ¤t_directory, std::string ¤t_file, bool has_empty, bool has_softlist, bool has_create, int *result) +menu_file_selector::menu_file_selector(mame_ui_manager &mui, render_container *container, device_image_interface *image, std::string ¤t_directory, std::string ¤t_file, bool has_empty, bool has_softlist, bool has_create, menu_file_selector::result *result) : menu(mui, container) , m_current_directory(current_directory) , m_current_file(current_file) @@ -391,18 +391,18 @@ void menu_file_selector::handle() { case SELECTOR_ENTRY_TYPE_EMPTY: // empty slot - unload - *m_result = R_EMPTY; + *m_result = result::EMPTY; menu::stack_pop(machine()); break; case SELECTOR_ENTRY_TYPE_CREATE: // create - *m_result = R_CREATE; + *m_result = result::CREATE; menu::stack_pop(machine()); break; case SELECTOR_ENTRY_TYPE_SOFTWARE_LIST: - *m_result = R_SOFTLIST; + *m_result = result::SOFTLIST; menu::stack_pop(machine()); break; @@ -423,7 +423,7 @@ void menu_file_selector::handle() case SELECTOR_ENTRY_TYPE_FILE: // file m_current_file.assign(entry->fullpath); - *m_result = R_FILE; + *m_result = result::FILE; menu::stack_pop(machine()); break; } @@ -508,7 +508,7 @@ void menu_file_selector::handle() //------------------------------------------------- menu_select_rw::menu_select_rw(mame_ui_manager &mui, render_container *container, - bool can_in_place, int *result) + bool can_in_place, result *result) : menu(mui, container) { m_can_in_place = can_in_place; @@ -532,11 +532,11 @@ menu_select_rw::~menu_select_rw() void menu_select_rw::populate() { item_append(_("Select access mode"), "", FLAG_DISABLE, nullptr); - item_append(_("Read-only"), "", 0, (void *)READONLY); + item_append(_("Read-only"), "", 0, (void *) result::READONLY); if (m_can_in_place) - item_append(_("Read-write"), "", 0, (void *)READWRITE); - item_append(_("Read this image, write to another image"), "", 0, (void *)WRITE_OTHER); - item_append(_("Read this image, write to diff"), "", 0, (void *)WRITE_DIFF); + item_append(_("Read-write"), "", 0, (void *)result::READWRITE); + item_append(_("Read this image, write to another image"), "", 0, (void *)result::WRITE_OTHER); + item_append(_("Read this image, write to diff"), "", 0, (void *)result::WRITE_DIFF); } @@ -550,7 +550,7 @@ void menu_select_rw::handle() const event *event = process(0); if (event != nullptr && event->iptkey == IPT_UI_SELECT) { - *m_result = int(FPTR(event->itemref)); + *m_result = result(FPTR(event->itemref)); menu::stack_pop(machine()); } } diff --git a/src/frontend/mame/ui/filesel.h b/src/frontend/mame/ui/filesel.h index d6991fbbb22..6cef6aa0ade 100644 --- a/src/frontend/mame/ui/filesel.h +++ b/src/frontend/mame/ui/filesel.h @@ -21,8 +21,16 @@ namespace ui { class menu_file_selector : public menu { public: - enum { R_EMPTY, R_SOFTLIST, R_CREATE, R_FILE }; - menu_file_selector(mame_ui_manager &mui, render_container *container, device_image_interface *image, std::string ¤t_directory, std::string ¤t_file, bool has_empty, bool has_softlist, bool has_create, int *result); + enum class result + { + INVALID = -1, + EMPTY = 0x1000, + SOFTLIST, + CREATE, + FILE + }; + + menu_file_selector(mame_ui_manager &mui, render_container *container, device_image_interface *image, std::string ¤t_directory, std::string ¤t_file, bool has_empty, bool has_softlist, bool has_create, result *result); virtual ~menu_file_selector() override; virtual void populate() override; virtual void handle() override; @@ -56,7 +64,7 @@ private: bool m_has_empty; bool m_has_softlist; bool m_has_create; - int * m_result; + result * m_result; std::vector m_entrylist; std::string m_hover_directory; std::string m_filename; @@ -75,9 +83,16 @@ private: class menu_select_rw : public menu { public: - enum { READONLY, READWRITE, WRITE_OTHER, WRITE_DIFF }; + enum class result + { + INVALID = -1, + READONLY = 0x3000, + READWRITE, + WRITE_OTHER, + WRITE_DIFF + }; menu_select_rw(mame_ui_manager &mui, render_container *container, - bool can_in_place, int *result); + bool can_in_place, result *result); virtual ~menu_select_rw() override; virtual void populate() override; virtual void handle() override; @@ -85,7 +100,7 @@ public: private: // internal state bool m_can_in_place; - int * m_result; + result * m_result; }; } // namespace ui diff --git a/src/frontend/mame/ui/floppycntrl.cpp b/src/frontend/mame/ui/floppycntrl.cpp index 19efb25aa5b..c36e3eac4d4 100644 --- a/src/frontend/mame/ui/floppycntrl.cpp +++ b/src/frontend/mame/ui/floppycntrl.cpp @@ -93,8 +93,8 @@ void menu_control_floppy_image::hook_load(std::string filename, bool softlist) else can_in_place = false; } - submenu_result = -1; - menu::stack_push(ui(), container, can_in_place, &submenu_result); + submenu_result.rw = menu_select_rw::result::INVALID; + menu::stack_push(ui(), container, can_in_place, &submenu_result.rw); state = SELECT_RW; } @@ -119,49 +119,49 @@ void menu_control_floppy_image::handle() if (!i->extension_matches(m_current_file.c_str())) format_array[total_usable++] = i; } - submenu_result = -1; - menu::stack_push(ui(), container, format_array, ext_match, total_usable, &submenu_result); + submenu_result.i = -1; + menu::stack_push(ui(), container, format_array, ext_match, total_usable, &submenu_result.i); state = SELECT_FORMAT; break; } case SELECT_FORMAT: - if(submenu_result == -1) { + if(submenu_result.i == -1) { state = START_FILE; handle(); } else { output_filename = util::zippath_combine(m_current_directory.c_str(), m_current_file.c_str()); - output_format = format_array[submenu_result]; + output_format = format_array[submenu_result.i]; do_load_create(); menu::stack_pop(machine()); } break; case SELECT_RW: - switch(submenu_result) { - case menu_select_rw::READONLY: + switch(submenu_result.rw) { + case menu_select_rw::result::READONLY: do_load_create(); menu::stack_pop(machine()); break; - case menu_select_rw::READWRITE: + case menu_select_rw::result::READWRITE: output_format = input_format; do_load_create(); menu::stack_pop(machine()); break; - case menu_select_rw::WRITE_DIFF: + case menu_select_rw::result::WRITE_DIFF: machine().popmessage("Sorry, diffs are not supported yet\n"); menu::stack_pop(machine()); break; - case menu_select_rw::WRITE_OTHER: + case menu_select_rw::result::WRITE_OTHER: menu::stack_push(ui(), container, image, m_current_directory, m_current_file, &create_ok); state = CHECK_CREATE; break; - case -1: + case menu_select_rw::result::INVALID: state = START_FILE; break; } diff --git a/src/frontend/mame/ui/imgcntrl.cpp b/src/frontend/mame/ui/imgcntrl.cpp index 9b1c4c6398d..c2e72495614 100644 --- a/src/frontend/mame/ui/imgcntrl.cpp +++ b/src/frontend/mame/ui/imgcntrl.cpp @@ -35,11 +35,11 @@ namespace ui { menu_control_device_image::menu_control_device_image(mame_ui_manager &mui, render_container *container, device_image_interface *_image) : menu(mui, container), - submenu_result(0), create_ok(false), create_confirmed(false) { image = _image; + submenu_result.i = -1; if (image->software_list_name()) sld = software_list_device::find_by_name(mui.machine().config(), image->software_list_name()); @@ -177,8 +177,8 @@ void menu_control_device_image::handle() { switch(state) { case START_FILE: { - submenu_result = -1; - menu::stack_push(ui(), container, image, m_current_directory, m_current_file, true, image->image_interface()!=nullptr, image->is_creatable(), &submenu_result); + submenu_result.filesel = menu_file_selector::result::INVALID; + menu::stack_push(ui(), container, image, m_current_directory, m_current_file, true, image->image_interface()!=nullptr, image->is_creatable(), &submenu_result.filesel); state = SELECT_FILE; break; } @@ -190,8 +190,8 @@ void menu_control_device_image::handle() break; case START_OTHER_PART: { - submenu_result = -1; - menu::stack_push(ui(), container, swi, swp->interface(), &swp, true, &submenu_result); + submenu_result.swparts = menu_software_parts::result::INVALID; + menu::stack_push(ui(), container, swi, swp->interface(), &swp, true, &submenu_result.swparts); state = SELECT_OTHER_PART; break; } @@ -212,9 +212,9 @@ void menu_control_device_image::handle() state = START_SOFTLIST; else if(swi->has_multiple_parts(image->image_interface())) { - submenu_result = -1; + submenu_result.swparts = menu_software_parts::result::INVALID; swp = nullptr; - menu::stack_push(ui(), container, swi, image->image_interface(), &swp, false, &submenu_result); + menu::stack_push(ui(), container, swi, image->image_interface(), &swp, false, &submenu_result.swparts); state = SELECT_ONE_PART; } else @@ -225,13 +225,13 @@ void menu_control_device_image::handle() break; case SELECT_ONE_PART: - switch(submenu_result) { - case menu_software_parts::T_ENTRY: { + switch(submenu_result.swparts) { + case menu_software_parts::result::ENTRY: { load_software_part(); break; } - case -1: // return to list + default: // return to list state = SELECT_SOFTLIST; break; @@ -239,27 +239,27 @@ void menu_control_device_image::handle() break; case SELECT_OTHER_PART: - switch(submenu_result) { - case menu_software_parts::T_ENTRY: + switch(submenu_result.swparts) { + case menu_software_parts::result::ENTRY: load_software_part(); break; - case menu_software_parts::T_FMGR: + case menu_software_parts::result::FMGR: state = START_FILE; handle(); break; - case menu_software_parts::T_EMPTY: + case menu_software_parts::result::EMPTY: image->unload(); menu::stack_pop(machine()); break; - case menu_software_parts::T_SWLIST: + case menu_software_parts::result::SWLIST: state = START_SOFTLIST; handle(); break; - case -1: // return to system + case menu_software_parts::result::INVALID: // return to system menu::stack_pop(machine()); break; @@ -267,27 +267,27 @@ void menu_control_device_image::handle() break; case SELECT_FILE: - switch(submenu_result) { - case menu_file_selector::R_EMPTY: + switch(submenu_result.filesel) { + case menu_file_selector::result::EMPTY: image->unload(); menu::stack_pop(machine()); break; - case menu_file_selector::R_FILE: + case menu_file_selector::result::FILE: hook_load(m_current_file, false); break; - case menu_file_selector::R_CREATE: + case menu_file_selector::result::CREATE: menu::stack_push(ui(), container, image, m_current_directory, m_current_file, &create_ok); state = CHECK_CREATE; break; - case menu_file_selector::R_SOFTLIST: + case menu_file_selector::result::SOFTLIST: state = START_SOFTLIST; handle(); break; - case -1: // return to system + default: // return to system menu::stack_pop(machine()); break; } diff --git a/src/frontend/mame/ui/imgcntrl.h b/src/frontend/mame/ui/imgcntrl.h index 707530256cd..501a095d6f9 100644 --- a/src/frontend/mame/ui/imgcntrl.h +++ b/src/frontend/mame/ui/imgcntrl.h @@ -14,6 +14,8 @@ #define MAME_FRONTEND_UI_IMAGECNTRL_H #include "ui/menu.h" +#include "ui/filesel.h" +#include "ui/swlist.h" namespace ui { // ======================> menu_control_device_image @@ -37,7 +39,17 @@ protected: // protected instance variables int state; device_image_interface *image; - int submenu_result; + + // this is a single union that contains all of the different types of + // results we could get from child menus + union + { + menu_file_selector::result filesel; + menu_software_parts::result swparts; + menu_select_rw::result rw; + int i; + } submenu_result; + std::string m_current_directory; std::string m_current_file; diff --git a/src/frontend/mame/ui/swlist.cpp b/src/frontend/mame/ui/swlist.cpp index 62c7fd8623e..bf1e34df10f 100644 --- a/src/frontend/mame/ui/swlist.cpp +++ b/src/frontend/mame/ui/swlist.cpp @@ -33,7 +33,7 @@ namespace ui { // ctor //------------------------------------------------- -menu_software_parts::menu_software_parts(mame_ui_manager &mui, render_container *container, const software_info *info, const char *interface, const software_part **part, bool other_opt, int *result) +menu_software_parts::menu_software_parts(mame_ui_manager &mui, render_container *container, const software_info *info, const char *interface, const software_part **part, bool other_opt, result *result) : menu(mui, container) { m_info = info; @@ -62,18 +62,18 @@ void menu_software_parts::populate() if (m_other_opt) { software_part_menu_entry *entry1 = (software_part_menu_entry *) m_pool_alloc(sizeof(*entry1)); - entry1->type = T_EMPTY; + entry1->type = result::EMPTY; entry1->part = nullptr; item_append(_("[empty slot]"), "", 0, entry1); software_part_menu_entry *entry2 = (software_part_menu_entry *) m_pool_alloc(sizeof(*entry2)); - entry2->type = T_FMGR; + entry2->type = result::FMGR; entry2->part = nullptr; item_append(_("[file manager]"), "", 0, entry2); software_part_menu_entry *entry3 = (software_part_menu_entry *) m_pool_alloc(sizeof(*entry3)); - entry3->type = T_SWLIST; + entry3->type = result::SWLIST; entry3->part = nullptr; item_append(_("[software list]"), "", 0, entry3); } @@ -88,7 +88,7 @@ void menu_software_parts::populate() std::string menu_part_name(swpart.name()); if (swpart.feature("part_id") != nullptr) menu_part_name.append(" (").append(swpart.feature("part_id")).append(")"); - entry->type = T_ENTRY; + entry->type = result::ENTRY; entry->part = &swpart; item_append(m_info->shortname(), menu_part_name, 0, entry); } diff --git a/src/frontend/mame/ui/swlist.h b/src/frontend/mame/ui/swlist.h index 58e16bb93bd..3c0317575fa 100644 --- a/src/frontend/mame/ui/swlist.h +++ b/src/frontend/mame/ui/swlist.h @@ -20,15 +20,23 @@ namespace ui { class menu_software_parts : public menu { public: - enum { T_EMPTY, T_FMGR, T_SWLIST, T_ENTRY }; - menu_software_parts(mame_ui_manager &mui, render_container *container, const software_info *info, const char *interface, const software_part **part, bool other_opt, int *result); + enum class result + { + INVALID = -1, + EMPTY = 0x2000, + FMGR, + SWLIST, + ENTRY + }; + + menu_software_parts(mame_ui_manager &mui, render_container *container, const software_info *info, const char *interface, const software_part **part, bool other_opt, result *result); virtual ~menu_software_parts() override; virtual void populate() override; virtual void handle() override; private: struct software_part_menu_entry { - int type; + result type; const software_part *part; }; @@ -37,7 +45,7 @@ private: const char * m_interface; const software_part ** m_selected_part; bool m_other_opt; - int * m_result; + result * m_result; };