summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/ui/dirmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/ui/dirmenu.cpp')
-rw-r--r--src/emu/ui/dirmenu.cpp691
1 files changed, 691 insertions, 0 deletions
diff --git a/src/emu/ui/dirmenu.cpp b/src/emu/ui/dirmenu.cpp
new file mode 100644
index 00000000000..69c360920dd
--- /dev/null
+++ b/src/emu/ui/dirmenu.cpp
@@ -0,0 +1,691 @@
+// license:BSD-3-Clause
+// copyright-holders:Dankan1890
+/*********************************************************************
+
+ ui/dirmenu.cpp
+
+ Internal UI user interface.
+
+*********************************************************************/
+
+#include "emu.h"
+#include "ui/ui.h"
+#include "ui/menu.h"
+#include "ui/dirmenu.h"
+#include "ui/datfile.h"
+#include "ui/utils.h"
+#include "ui/optsmenu.h"
+
+struct folders_entry
+{
+ const char *name;
+ const char *option;
+};
+
+static const folders_entry s_folders_entry[] =
+{
+ { "ROMs", OPTION_MEDIAPATH },
+ { "UI", OPTION_UI_PATH },
+ { "Samples", OPTION_SAMPLEPATH },
+ { "DATs", OPTION_HISTORY_PATH },
+ { "INIs", OPTION_INIPATH },
+ { "Extra INIs", OPTION_EXTRAINI_PATH },
+ { "Icons", OPTION_ICONS_PATH },
+ { "Cheats", OPTION_CHEATPATH },
+ { "Snapshots", OPTION_SNAPSHOT_DIRECTORY },
+ { "Cabinets", OPTION_CABINETS_PATH },
+ { "Flyers", OPTION_FLYERS_PATH },
+ { "Titles", OPTION_TITLES_PATH },
+ { "Ends", OPTION_ENDS_PATH },
+ { "PCBs", OPTION_PCBS_PATH },
+ { "Marquees", OPTION_MARQUEES_PATH },
+ { "Controls Panels", OPTION_CPANELS_PATH },
+ { "Crosshairs", OPTION_CROSSHAIRPATH },
+ { "Artworks", OPTION_ARTPATH },
+ { "Bosses", OPTION_BOSSES_PATH },
+ { "Artworks Preview", OPTION_ARTPREV_PATH },
+ { "Select", OPTION_SELECT_PATH },
+ { "GameOver", OPTION_GAMEOVER_PATH },
+ { "HowTo", OPTION_HOWTO_PATH },
+ { "Logos", OPTION_LOGOS_PATH },
+ { "Scores", OPTION_SCORES_PATH },
+ { "Versus", OPTION_VERSUS_PATH },
+ { nullptr }
+};
+
+/**************************************************
+ MENU ADD FOLDER
+**************************************************/
+//-------------------------------------------------
+// ctor / dtor
+//-------------------------------------------------
+
+ui_menu_add_change_folder::ui_menu_add_change_folder(running_machine &machine, render_container *container, int ref, bool _change) : ui_menu(machine, container)
+{
+ m_ref = ref - 1;
+ m_change = _change;
+ m_search[0] = '\0';
+
+ // configure the starting path
+ char *dst = nullptr;
+ osd_get_full_path(&dst, ".");
+ m_current_path = dst;
+ osd_free(dst);
+}
+
+ui_menu_add_change_folder::~ui_menu_add_change_folder()
+{
+}
+
+//-------------------------------------------------
+// handle
+//-------------------------------------------------
+
+void ui_menu_add_change_folder::handle()
+{
+ // 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_SELECT)
+ {
+ int index = (FPTR)m_event->itemref - 1;
+ const ui_menu_item &pitem = item[index];
+
+ // go up to the parent path
+ if (!strcmp(pitem.text, ".."))
+ {
+ size_t first_sep = m_current_path.find_first_of(PATH_SEPARATOR[0]);
+ size_t last_sep = m_current_path.find_last_of(PATH_SEPARATOR[0]);
+ if (first_sep != last_sep)
+ m_current_path.erase(++last_sep);
+ }
+ else
+ {
+ // if isn't a drive, appends the directory
+ if (strcmp(pitem.subtext, "[DRIVE]") != 0)
+ {
+ if (m_current_path[m_current_path.length() - 1] == PATH_SEPARATOR[0])
+ m_current_path.append(pitem.text);
+ else
+ m_current_path.append(PATH_SEPARATOR).append(pitem.text);
+ }
+ else
+ m_current_path = pitem.text;
+ }
+
+ // reset the char buffer also in this case
+ if (m_search[0] != 0)
+ m_search[0] = '\0';
+ reset(UI_MENU_RESET_SELECT_FIRST);
+ }
+ else if (m_event->iptkey == IPT_SPECIAL)
+ {
+ int buflen = strlen(m_search);
+ bool update_selected = FALSE;
+
+ // if it's a backspace and we can handle it, do so
+ if ((m_event->unichar == 8 || m_event->unichar == 0x7f) && buflen > 0)
+ {
+ *(char *)utf8_previous_char(&m_search[buflen]) = 0;
+ update_selected = TRUE;
+ }
+ // if it's any other key and we're not maxed out, update
+ else if (m_event->unichar >= ' ' && m_event->unichar < 0x7f)
+ {
+ buflen += utf8_from_uchar(&m_search[buflen], ARRAY_LENGTH(m_search) - buflen, m_event->unichar);
+ m_search[buflen] = 0;
+ update_selected = TRUE;
+ }
+ // Tab key, save current path
+ else if (m_event->unichar == 0x09)
+ {
+ std::string error_string;
+ if (m_change)
+ {
+ if (machine().ui().options().exists(s_folders_entry[m_ref].option))
+ {
+ machine().ui().options().set_value(s_folders_entry[m_ref].option, m_current_path.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ }
+ else {
+ if (strcmp(machine().options().value(s_folders_entry[m_ref].option), m_current_path.c_str()) != 0)
+ {
+ machine().options().set_value(s_folders_entry[m_ref].option, m_current_path.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ machine().options().mark_changed(s_folders_entry[m_ref].option);
+ }
+ }
+ machine().datfile().reset_run();
+ }
+ else
+ {
+ std::string tmppath;
+ if (machine().ui().options().exists(s_folders_entry[m_ref].option)) {
+ tmppath.assign(machine().ui().options().value(s_folders_entry[m_ref].option)).append(";").append(m_current_path.c_str());
+ }
+ else {
+ tmppath.assign(machine().options().value(s_folders_entry[m_ref].option)).append(";").append(m_current_path.c_str());
+ }
+
+ if (machine().ui().options().exists(s_folders_entry[m_ref].option))
+ {
+ machine().ui().options().set_value(s_folders_entry[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ }
+ else {
+ if (strcmp(machine().options().value(s_folders_entry[m_ref].option), tmppath.c_str()) != 0)
+ {
+ machine().options().set_value(s_folders_entry[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ machine().options().mark_changed(s_folders_entry[m_ref].option);
+ }
+ }
+ }
+
+ ui_menu::menu_stack->parent->reset(UI_MENU_RESET_SELECT_FIRST);
+ ui_menu::stack_pop(machine());
+ }
+
+ // check for entries which matches our search buffer
+ if (update_selected)
+ {
+ const int cur_selected = selected;
+ int entry, bestmatch = 0;
+
+ // from current item to the end
+ for (entry = cur_selected; entry < item.size(); entry++)
+ if (item[entry].ref != nullptr && m_search[0] != 0)
+ {
+ int match = 0;
+ for (int i = 0; i < ARRAY_LENGTH(m_search); i++)
+ {
+ if (core_strnicmp(item[entry].text, m_search, i) == 0)
+ match = i;
+ }
+
+ if (match > bestmatch)
+ {
+ bestmatch = match;
+ selected = entry;
+ }
+ }
+
+ // and from the first item to current one
+ for (entry = 0; entry < cur_selected; entry++)
+ {
+ if (item[entry].ref != nullptr && m_search[0] != 0)
+ {
+ int match = 0;
+ for (int i = 0; i < ARRAY_LENGTH(m_search); i++)
+ {
+ if (core_strnicmp(item[entry].text, m_search, i) == 0)
+ match = i;
+ }
+
+ if (match > bestmatch)
+ {
+ bestmatch = match;
+ selected = entry;
+ }
+ }
+ }
+ top_line = selected - (visible_lines / 2);
+ }
+ }
+ else if (m_event->iptkey == IPT_UI_CANCEL)
+ {
+ // reset the char buffer also in this case
+ if (m_search[0] != 0)
+ m_search[0] = '\0';
+ }
+ }
+}
+
+//-------------------------------------------------
+// populate
+//-------------------------------------------------
+
+void ui_menu_add_change_folder::populate()
+{
+ // open a path
+ const char *volume_name;
+ file_enumerator path(m_current_path.c_str());
+ const osd_directory_entry *dirent;
+ int folders_count = 0;
+
+ // add the drives
+ for (int i = 0; (volume_name = osd_get_volume_name(i)) != nullptr; i++)
+ item_append(volume_name, "[DRIVE]", 0, (void *)(FPTR)++folders_count);
+
+ // add the directories
+ while ((dirent = path.next()) != nullptr)
+ {
+ if (dirent->type == ENTTYPE_DIR && strcmp(dirent->name, ".") != 0)
+ item_append(dirent->name, "[DIR]", 0, (void *)(FPTR)++folders_count);
+ }
+
+ item_append(MENU_SEPARATOR_ITEM, nullptr, 0, nullptr);
+
+ // configure the custom rendering
+ customtop = 2.0f * machine().ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER;
+ custombottom = 1.0f * machine().ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER;
+}
+
+//-------------------------------------------------
+// perform our special rendering
+//-------------------------------------------------
+
+void ui_menu_add_change_folder::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();
+ std::string tempbuf[2];
+ tempbuf[0] = (m_change) ? "Change" : "Add";
+ tempbuf[0].append(" ").append(s_folders_entry[m_ref].name).append(" Folder - Search: ").append(m_search).append("_");
+ tempbuf[1] = m_current_path;
+
+ // get the size of the text
+ for (auto & elem: tempbuf)
+ {
+ mui.draw_text_full(container, elem.c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_NEVER,
+ DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr);
+ width += (2.0f * UI_BOX_LR_BORDER) + 0.01f;
+ maxwidth = MAX(width, maxwidth);
+ }
+
+ // 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
+ for (auto & elem : tempbuf)
+ {
+ mui.draw_text_full(container, elem.c_str(), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_NEVER,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+ y1 = y1 + mui.get_line_height();
+ }
+
+ // bottom text
+ tempbuf[0] = "Press TAB to set";
+
+ mui.draw_text_full(container, tempbuf[0].c_str(), 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
+ x1 = 0.5f - 0.5f * maxwidth;
+ x2 = x1 + maxwidth;
+ y1 = origy2 + UI_BOX_TB_BORDER;
+ y2 = origy2 + bottom;
+
+ // draw a box
+ mui.draw_outlined_box(container, x1, y1, x2, y2, UI_RED_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, tempbuf[0].c_str(), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+
+}
+
+/**************************************************
+ MENU DIRECTORY
+**************************************************/
+//-------------------------------------------------
+// ctor / dtor
+//-------------------------------------------------
+
+ui_menu_directory::ui_menu_directory(running_machine &machine, render_container *container) : ui_menu(machine, container)
+{
+}
+
+ui_menu_directory::~ui_menu_directory()
+{
+ save_ui_options(machine());
+ ui_globals::reset = true;
+}
+
+//-------------------------------------------------
+// handle
+//-------------------------------------------------
+
+void ui_menu_directory::handle()
+{
+ // process the menu
+ const ui_menu_event *m_event = process(0);
+
+ if (m_event != nullptr && m_event->itemref != nullptr && m_event->iptkey == IPT_UI_SELECT)
+ {
+ int ref = (FPTR)m_event->itemref;
+ bool change = (ref == HISTORY_FOLDERS || ref == EXTRAINI_FOLDERS || ref == UI_FOLDERS);
+ ui_menu::stack_push(global_alloc_clear<ui_menu_display_actual>(machine(), container, ref, change));
+ }
+}
+
+//-------------------------------------------------
+// populate
+//-------------------------------------------------
+
+void ui_menu_directory::populate()
+{
+ item_append("Roms", nullptr, 0, (void *)(FPTR)ROM_FOLDERS);
+ item_append("UI", nullptr, 0, (void *)(FPTR)UI_FOLDERS);
+ item_append("Samples", nullptr, 0, (void *)(FPTR)SAMPLE_FOLDERS);
+ item_append("INIs", nullptr, 0, (void *)(FPTR)INI_FOLDERS);
+ item_append("Artwork", nullptr, 0, (void *)(FPTR)ARTWORK_FOLDERS);
+ item_append("DATs (History, Mameinfo, etc...)", nullptr, 0, (void *)(FPTR)HISTORY_FOLDERS);
+ item_append("Extra INI (Category, etc...)", nullptr, 0, (void *)(FPTR)EXTRAINI_FOLDERS);
+ item_append("Icons", nullptr, 0, (void *)(FPTR)ICON_FOLDERS);
+ item_append("Cheats", nullptr, 0, (void *)(FPTR)CHEAT_FOLDERS);
+ item_append("Snapshots", nullptr, 0, (void *)(FPTR)SNAPSHOT_FOLDERS);
+ item_append("Cabinets", nullptr, 0, (void *)(FPTR)CABINET_FOLDERS);
+ item_append("Flyers", nullptr, 0, (void *)(FPTR)FLYER_FOLDERS);
+ item_append("Titles", nullptr, 0, (void *)(FPTR)TITLE_FOLDERS);
+ item_append("Ends", nullptr, 0, (void *)(FPTR)ENDS_FOLDERS);
+ item_append("PCBs", nullptr, 0, (void *)(FPTR)PCB_FOLDERS);
+ item_append("Marquees", nullptr, 0, (void *)(FPTR)MARQUEES_FOLDERS);
+ item_append("Control Panels", nullptr, 0, (void *)(FPTR)CPANEL_FOLDERS);
+ item_append("Bosses", nullptr, 0, (void *)(FPTR)BOSSES_FOLDERS);
+ item_append("Versus", nullptr, 0, (void *)(FPTR)VERSUS_FOLDERS);
+ item_append("Game Over", nullptr, 0, (void *)(FPTR)GAMEOVER_FOLDERS);
+ item_append("How To", nullptr, 0, (void *)(FPTR)HOWTO_FOLDERS);
+ item_append("Select", nullptr, 0, (void *)(FPTR)SELECT_FOLDERS);
+ item_append("Artwork Preview", nullptr, 0, (void *)(FPTR)ARTPREV_FOLDERS);
+ item_append("Scores", nullptr, 0, (void *)(FPTR)SCORES_FOLDERS);
+ item_append("Logos", nullptr, 0, (void *)(FPTR)LOGO_FOLDERS);
+ item_append("Crosshairs", nullptr, 0, (void *)(FPTR)CROSSHAIR_FOLDERS);
+
+ 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_directory::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
+{
+ float width;
+ ui_manager &mui = machine().ui();
+
+ // get the size of the text
+ mui.draw_text_full(container, "Folder Setup", 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr);
+ width += (2.0f * UI_BOX_LR_BORDER) + 0.01f;
+ float maxwidth = MAX(width, origx2 - origx1);
+
+ // 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, "Folder Setup", x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+}
+
+/**************************************************
+ MENU DISPLAY PATH
+**************************************************/
+//-------------------------------------------------
+// ctor / dtor
+//-------------------------------------------------
+
+ui_menu_display_actual::ui_menu_display_actual(running_machine &machine, render_container *container, int ref, bool _change) : ui_menu(machine, container)
+{
+ m_ref = ref;
+ m_change = _change;
+}
+
+ui_menu_display_actual::~ui_menu_display_actual()
+{
+}
+
+//-------------------------------------------------
+// handle
+//-------------------------------------------------
+
+void ui_menu_display_actual::handle()
+{
+ // process the menu
+ const ui_menu_event *m_event = process(0);
+ if (m_event != nullptr && m_event->itemref != nullptr && m_event->iptkey == IPT_UI_SELECT)
+ switch ((FPTR)m_event->itemref)
+ {
+ case REMOVE_FOLDER:
+ ui_menu::stack_push(global_alloc_clear<ui_menu_remove_folder>(machine(), container, m_ref));
+ break;
+
+ case ADD_FOLDER:
+ case CHANGE_FOLDER:
+ ui_menu::stack_push(global_alloc_clear<ui_menu_add_change_folder>(machine(), container, m_ref, m_change));
+ break;
+ }
+}
+
+//-------------------------------------------------
+// populate
+//-------------------------------------------------
+
+void ui_menu_display_actual::populate()
+{
+ m_tempbuf.assign("Current ").append(s_folders_entry[m_ref - 1].name).append(" Folders");
+ if (machine().ui().options().exists(s_folders_entry[m_ref - 1].option)) {
+ m_searchpath.assign(machine().ui().options().value(s_folders_entry[m_ref - 1].option));
+ }
+ else {
+ m_searchpath.assign(machine().options().value(s_folders_entry[m_ref - 1].option));
+ }
+ path_iterator path(m_searchpath.c_str());
+ std::string curpath;
+ m_folders.clear();
+ while (path.next(curpath, nullptr))
+ m_folders.push_back(curpath);
+
+ if (m_change)
+ item_append("Change Folder", nullptr, 0, (void *)CHANGE_FOLDER);
+ else
+ item_append("Add Folder", nullptr, 0, (void *)ADD_FOLDER);
+
+ if (m_folders.size() > 1)
+ item_append("Remove Folder", nullptr, 0, (void *)REMOVE_FOLDER);
+
+ item_append(MENU_SEPARATOR_ITEM, nullptr, 0, nullptr);
+ customtop = (m_folders.size() + 1) * machine().ui().get_line_height() + 6.0f * UI_BOX_TB_BORDER;
+}
+
+//-------------------------------------------------
+// perform our special rendering
+//-------------------------------------------------
+
+void ui_menu_display_actual::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();
+ float lineh = mui.get_line_height();
+
+ for (auto & elem : m_folders)
+ {
+ mui.draw_text_full(container, elem.c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_LEFT, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr);
+ width += (2.0f * UI_BOX_LR_BORDER) + 0.01f;
+ maxwidth = MAX(maxwidth, width);
+ }
+
+ // get the size of the text
+ mui.draw_text_full(container, m_tempbuf.c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_TRUNCATE, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr);
+ width += (2.0f * UI_BOX_LR_BORDER) + 0.01f;
+ maxwidth = MAX(width, maxwidth);
+
+ // compute our bounds
+ float x1 = 0.5f - 0.5f * maxwidth;
+ float x2 = x1 + maxwidth;
+ float y1 = origy1 - top;
+ float y2 = y1 + lineh + 2.0f * 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, m_tempbuf.c_str(), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+
+ // compute our bounds
+ x1 = 0.5f - 0.5f * maxwidth;
+ x2 = x1 + maxwidth;
+ y1 = y2 + 2.0f * UI_BOX_TB_BORDER;
+ y2 = origy1 - UI_BOX_TB_BORDER;
+
+ // draw a box
+ mui.draw_outlined_box(container, x1, y1, x2, y2, UI_BACKGROUND_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
+ for (auto & elem : m_folders)
+ {
+ mui.draw_text_full(container, elem.c_str(), x1, y1, x2 - x1, JUSTIFY_LEFT, WRAP_TRUNCATE,
+ DRAW_NORMAL, UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+ y1 += lineh;
+ }
+
+}
+
+/**************************************************
+ MENU REMOVE FOLDER
+**************************************************/
+//-------------------------------------------------
+// ctor / dtor
+//-------------------------------------------------
+
+ui_menu_remove_folder::ui_menu_remove_folder(running_machine &machine, render_container *container, int ref) : ui_menu(machine, container)
+{
+ m_ref = ref - 1;
+ if (machine.ui().options().exists(s_folders_entry[m_ref].option)) {
+ m_searchpath.assign(machine.ui().options().value(s_folders_entry[m_ref].option));
+ }
+ else {
+ m_searchpath.assign(machine.options().value(s_folders_entry[m_ref].option));
+ }
+
+}
+
+ui_menu_remove_folder::~ui_menu_remove_folder()
+{
+}
+
+//-------------------------------------------------
+// handle
+//-------------------------------------------------
+
+void ui_menu_remove_folder::handle()
+{
+ // process the menu
+ const ui_menu_event *m_event = process(0);
+ if (m_event != nullptr && m_event->itemref != nullptr && m_event->iptkey == IPT_UI_SELECT)
+ {
+ int index = (FPTR)m_event->itemref - 1;
+ std::string tmppath;
+ for (size_t i = 0; i < item.size() - 2; i++)
+ if (i != index)
+ tmppath.append(item[i].text).append(";");
+
+ tmppath.substr(0, tmppath.size() - 1);
+ std::string error_string;
+ if (machine().ui().options().exists(s_folders_entry[m_ref].option))
+ {
+ machine().ui().options().set_value(s_folders_entry[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ }
+ else {
+ if (strcmp(machine().options().value(s_folders_entry[m_ref].option),tmppath.c_str())!=0)
+ {
+ machine().options().set_value(s_folders_entry[m_ref].option, tmppath.c_str(), OPTION_PRIORITY_CMDLINE, error_string);
+ machine().options().mark_changed(s_folders_entry[m_ref].option);
+ }
+ }
+
+ ui_menu::menu_stack->parent->reset(UI_MENU_RESET_REMEMBER_REF);
+ ui_menu::stack_pop(machine());
+ }
+}
+
+//-------------------------------------------------
+// populate menu
+//-------------------------------------------------
+
+void ui_menu_remove_folder::populate()
+{
+ path_iterator path(m_searchpath.c_str());
+ std::string curpath;
+ int folders_count = 0;
+
+ while (path.next(curpath, nullptr))
+ item_append(curpath.c_str(), nullptr, 0, (void *)(FPTR)++folders_count);
+
+ 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_remove_folder::custom_render(void *selectedref, float top, float bottom, float origx1, float origy1, float origx2, float origy2)
+{
+ float width;
+ ui_manager &mui = machine().ui();
+ std::string tempbuf = std::string("Remove ").append(s_folders_entry[m_ref].name).append(" Folder");
+
+ // get the size of the text
+ mui.draw_text_full(container, tempbuf.c_str(), 0.0f, 0.0f, 1.0f, JUSTIFY_CENTER, WRAP_NEVER, DRAW_NONE, ARGB_WHITE, ARGB_BLACK, &width, nullptr);
+ width += (2.0f * UI_BOX_LR_BORDER) + 0.01f;
+ float maxwidth = MAX(width, origx2 - origx1);
+
+ // 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, tempbuf.c_str(), x1, y1, x2 - x1, JUSTIFY_CENTER, WRAP_NEVER, DRAW_NORMAL,
+ UI_TEXT_COLOR, UI_TEXT_BG_COLOR, nullptr, nullptr);
+}