diff options
author | 2016-04-23 11:25:03 +0200 | |
---|---|---|
committer | 2016-04-23 11:26:47 +0200 | |
commit | 1c726824f2b2cc7c6c03ff975e548b72f9b2c0a9 (patch) | |
tree | 020f20da5a8cd822065c1839bc7a53f826803a3d /src/frontend/mame/ui/filemngr.cpp | |
parent | 01657a63c13c79c5f045ba4ecb4c2fd7f7c5a1f8 (diff) |
Split UI and frontend part from core [Miodrag Milanovic]
Diffstat (limited to 'src/frontend/mame/ui/filemngr.cpp')
-rw-r--r-- | src/frontend/mame/ui/filemngr.cpp | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/src/frontend/mame/ui/filemngr.cpp b/src/frontend/mame/ui/filemngr.cpp new file mode 100644 index 00000000000..a0400e234bb --- /dev/null +++ b/src/frontend/mame/ui/filemngr.cpp @@ -0,0 +1,218 @@ +// license:BSD-3-Clause +// copyright-holders:Nathan Woods +/********************************************************************* + + ui/filemngr.cpp + + MESS's clunky built-in file manager + + TODO + - Restrict directory listing by file extension + +*********************************************************************/ + +#include "emu.h" +#include "ui/ui.h" +#include "ui/menu.h" +#include "ui/filemngr.h" +#include "ui/filesel.h" +#include "ui/miscmenu.h" +#include "ui/imgcntrl.h" +#include "ui/floppycntrl.h" +#include "softlist.h" + + +/*************************************************************************** + FILE MANAGER +***************************************************************************/ + +//------------------------------------------------- +// ctor +//------------------------------------------------- + +ui_menu_file_manager::ui_menu_file_manager(running_machine &machine, render_container *container, const char *warnings) : ui_menu(machine, container), selected_device(nullptr) +{ + // This warning string is used when accessing from the force_file_manager call, i.e. + // when the file manager is loaded top front in the case of mandatory image devices + if (warnings) + m_warnings.assign(warnings); + else + m_warnings.clear(); + + m_curr_selected = FALSE; +} + + +//------------------------------------------------- +// dtor +//------------------------------------------------- + +ui_menu_file_manager::~ui_menu_file_manager() +{ +} + + +//------------------------------------------------- +// custom_render - perform our special rendering +//------------------------------------------------- + +void ui_menu_file_manager::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2) +{ + const char *path; + + // access the path + path = selected_device ? selected_device->filename() : nullptr; + extra_text_render(container, top, bottom, + origx1, origy1, origx2, origy2, nullptr, path); +} + + +void ui_menu_file_manager::fill_image_line(device_image_interface *img, std::string &instance, std::string &filename) +{ + // get the image type/id + instance = string_format("%s (%s)", img->instance_name(), img->brief_instance_name()); + + // get the base name + if (img->basename() != nullptr) + { + filename.assign(img->basename()); + + // if the image has been loaded through softlist, also show the loaded part + if (img->part_entry() != nullptr) + { + const software_part *tmp = img->part_entry(); + if (tmp->name() != nullptr) + { + filename.append(" ("); + filename.append(tmp->name()); + // also check if this part has a specific part_id (e.g. "Map Disc", "Bonus Disc", etc.), and in case display it + if (img->get_feature("part_id") != nullptr) + { + filename.append(": "); + filename.append(img->get_feature("part_id")); + } + filename.append(")"); + } + } + } + else + filename.assign("---"); +} + +//------------------------------------------------- +// populate +//------------------------------------------------- + +void ui_menu_file_manager::populate() +{ + std::string tmp_inst, tmp_name; + bool first_entry = true; + + if (!m_warnings.empty()) + { + item_append(m_warnings.c_str(), nullptr, MENU_FLAG_DISABLE, nullptr); + item_append("", nullptr, MENU_FLAG_DISABLE, nullptr); + } + + // cycle through all devices for this system + std::unordered_set<std::string> devtags; + for (device_t &dev : device_iterator(machine().root_device())) + { + bool tag_appended = false; + if (!devtags.insert(dev.tag()).second) + continue; + + // check whether it owns an image interface + image_interface_iterator subiter(dev); + if (subiter.first() != nullptr) + { + // if so, cycle through all its image interfaces + for (device_image_interface &scan : subiter) + { + if (!scan.user_loadable()) + continue; + + // if it is a children device, and not something further down the device tree, we want it in the menu! + if (strcmp(scan.device().owner()->tag(), dev.tag()) == 0) + if (devtags.insert(scan.device().tag()).second) + { + // check whether we already had some devices with the same owner: if not, output the owner tag! + if (!tag_appended) + { + if (first_entry) + first_entry = false; + else + item_append(ui_menu_item_type::SEPARATOR); + item_append(string_format("[root%s]", dev.tag()).c_str(), nullptr, 0, nullptr); + tag_appended = true; + } + // finally, append the image interface to the menu + fill_image_line(&scan, tmp_inst, tmp_name); + item_append(tmp_inst.c_str(), tmp_name.c_str(), 0, (void *)&scan); + } + } + } + } + item_append(ui_menu_item_type::SEPARATOR); + item_append("Reset", nullptr, 0, (void *)1); + + custombottom = mame_machine_manager::instance()->ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER; +} + + +//------------------------------------------------- +// handle +//------------------------------------------------- + +void ui_menu_file_manager::handle() +{ + // process the menu + const ui_menu_event *event = process(0); + if (event != nullptr && event->itemref != nullptr && event->iptkey == IPT_UI_SELECT) + { + if ((FPTR)event->itemref == 1) + { + if (m_curr_selected) + machine().schedule_hard_reset(); + } + else + { + selected_device = (device_image_interface *) event->itemref; + if (selected_device != nullptr) + { + + m_curr_selected = TRUE; + floppy_image_device *floppy_device = dynamic_cast<floppy_image_device *>(selected_device); + if (floppy_device != nullptr) + { + ui_menu::stack_push(global_alloc_clear<ui_menu_control_floppy_image>(machine(), container, floppy_device)); + } + else + { + ui_menu::stack_push(global_alloc_clear<ui_menu_control_device_image>(machine(), container, selected_device)); + } + // reset the existing menu + reset(UI_MENU_RESET_REMEMBER_POSITION); + } + } + } +} + +// force file manager menu +void ui_menu_file_manager::force_file_manager(running_machine &machine, render_container *container, const char *warnings) +{ + // reset the menu stack + ui_menu::stack_reset(machine); + + // add the quit entry followed by the game select entry + ui_menu *quit = global_alloc_clear<ui_menu_quit_game>(machine, container); + quit->set_special_main_menu(true); + ui_menu::stack_push(quit); + ui_menu::stack_push(global_alloc_clear<ui_menu_file_manager>(machine, container, warnings)); + + // force the menus on + mame_machine_manager::instance()->ui().show_menu(); + + // make sure MAME is paused + machine.pause(); +} |