summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/ui/dirmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/ui/dirmenu.cpp')
-rw-r--r--src/frontend/mame/ui/dirmenu.cpp142
1 files changed, 83 insertions, 59 deletions
diff --git a/src/frontend/mame/ui/dirmenu.cpp b/src/frontend/mame/ui/dirmenu.cpp
index ab55b742054..1e28c88cc37 100644
--- a/src/frontend/mame/ui/dirmenu.cpp
+++ b/src/frontend/mame/ui/dirmenu.cpp
@@ -29,50 +29,46 @@ namespace ui {
namespace {
-constexpr int ADDING = 1;
-constexpr int CHANGE = 2;
-
struct folders_entry
{
const char *name;
const char *option;
- const int action;
};
const folders_entry f_folders[] =
{
- { N_p("path-option", "ROMs"), OPTION_MEDIAPATH, ADDING },
- { N_p("path-option", "Software Media"), OPTION_SWPATH, CHANGE },
- { N_p("path-option", "Sound Samples"), OPTION_SAMPLEPATH, ADDING },
- { N_p("path-option", "Artwork"), OPTION_ARTPATH, ADDING },
- { N_p("path-option", "Crosshairs"), OPTION_CROSSHAIRPATH, ADDING },
- { N_p("path-option", "Cheat Files"), OPTION_CHEATPATH, ADDING },
- { N_p("path-option", "Plugins"), OPTION_PLUGINSPATH, ADDING },
- { N_p("path-option", "UI Translations"), OPTION_LANGUAGEPATH, CHANGE },
- { N_p("path-option", "Software Lists"), OPTION_HASHPATH, ADDING },
- { N_p("path-option", "INIs"), OPTION_INIPATH, ADDING },
- { N_p("path-option", "UI Settings"), OPTION_UI_PATH, CHANGE },
- { N_p("path-option", "Plugin Data"), OPTION_PLUGINDATAPATH, CHANGE },
- { N_p("path-option", "DATs"), OPTION_HISTORY_PATH, ADDING },
- { N_p("path-option", "Category INIs"), OPTION_CATEGORYINI_PATH, CHANGE },
- { N_p("path-option", "Snapshots"), OPTION_SNAPSHOT_DIRECTORY, ADDING },
- { N_p("path-option", "Icons"), OPTION_ICONS_PATH, ADDING },
- { N_p("path-option", "Control Panels"), OPTION_CPANELS_PATH, ADDING },
- { N_p("path-option", "Cabinets"), OPTION_CABINETS_PATH, ADDING },
- { N_p("path-option", "Marquees"), OPTION_MARQUEES_PATH, ADDING },
- { N_p("path-option", "PCBs"), OPTION_PCBS_PATH, ADDING },
- { N_p("path-option", "Flyers"), OPTION_FLYERS_PATH, ADDING },
- { N_p("path-option", "Title Screens"), OPTION_TITLES_PATH, ADDING },
- { N_p("path-option", "Game Endings"), OPTION_ENDS_PATH, ADDING },
- { N_p("path-option", "Bosses"), OPTION_BOSSES_PATH, ADDING },
- { N_p("path-option", "Artwork Previews"), OPTION_ARTPREV_PATH, ADDING },
- { N_p("path-option", "Select"), OPTION_SELECT_PATH, ADDING },
- { N_p("path-option", "Game Over Screens"), OPTION_GAMEOVER_PATH, ADDING },
- { N_p("path-option", "HowTo"), OPTION_HOWTO_PATH, ADDING },
- { N_p("path-option", "Logos"), OPTION_LOGOS_PATH, ADDING },
- { N_p("path-option", "Scores"), OPTION_SCORES_PATH, ADDING },
- { N_p("path-option", "Versus"), OPTION_VERSUS_PATH, ADDING },
- { N_p("path-option", "Covers"), OPTION_COVER_PATH, ADDING }
+ { N_p("path-option", "ROMs"), OPTION_MEDIAPATH },
+ { N_p("path-option", "Software Media"), OPTION_SWPATH },
+ { N_p("path-option", "Sound Samples"), OPTION_SAMPLEPATH },
+ { N_p("path-option", "Artwork"), OPTION_ARTPATH },
+ { N_p("path-option", "Crosshairs"), OPTION_CROSSHAIRPATH },
+ { N_p("path-option", "Cheat Files"), OPTION_CHEATPATH },
+ { N_p("path-option", "Plugins"), OPTION_PLUGINSPATH },
+ { N_p("path-option", "UI Translations"), OPTION_LANGUAGEPATH },
+ { N_p("path-option", "Software Lists"), OPTION_HASHPATH },
+ { N_p("path-option", "INIs"), OPTION_INIPATH },
+ { N_p("path-option", "UI Settings"), OPTION_UI_PATH },
+ { N_p("path-option", "Plugin Data"), OPTION_PLUGINDATAPATH },
+ { N_p("path-option", "DATs"), OPTION_HISTORY_PATH },
+ { N_p("path-option", "Category INIs"), OPTION_CATEGORYINI_PATH },
+ { N_p("path-option", "Snapshots"), OPTION_SNAPSHOT_DIRECTORY },
+ { N_p("path-option", "Icons"), OPTION_ICONS_PATH },
+ { N_p("path-option", "Control Panels"), OPTION_CPANELS_PATH },
+ { N_p("path-option", "Cabinets"), OPTION_CABINETS_PATH },
+ { N_p("path-option", "Marquees"), OPTION_MARQUEES_PATH },
+ { N_p("path-option", "PCBs"), OPTION_PCBS_PATH },
+ { N_p("path-option", "Flyers"), OPTION_FLYERS_PATH },
+ { N_p("path-option", "Title Screens"), OPTION_TITLES_PATH },
+ { N_p("path-option", "Game Endings"), OPTION_ENDS_PATH },
+ { N_p("path-option", "Bosses"), OPTION_BOSSES_PATH },
+ { N_p("path-option", "Artwork Previews"), OPTION_ARTPREV_PATH },
+ { N_p("path-option", "Select"), OPTION_SELECT_PATH },
+ { N_p("path-option", "Game Over Screens"), OPTION_GAMEOVER_PATH },
+ { N_p("path-option", "HowTo"), OPTION_HOWTO_PATH },
+ { N_p("path-option", "Logos"), OPTION_LOGOS_PATH },
+ { N_p("path-option", "Scores"), OPTION_SCORES_PATH },
+ { N_p("path-option", "Versus"), OPTION_VERSUS_PATH },
+ { N_p("path-option", "Covers"), OPTION_COVER_PATH }
};
@@ -166,7 +162,7 @@ void menu_remove_folder::populate(float &customtop, float &custombottom)
class menu_add_change_folder : public menu
{
public:
- menu_add_change_folder(mame_ui_manager &mui, render_container &container, int ref);
+ menu_add_change_folder(mame_ui_manager &mui, render_container &container, int ref, bool multipath);
protected:
virtual void custom_render(void *selectedref, float top, float bottom, float x, float y, float x2, float y2) override;
@@ -180,9 +176,9 @@ private:
void update_search();
int const m_ref;
+ bool const m_multipath;
std::string m_current_path;
std::string m_search;
- bool const m_change;
std::vector<std::string> m_folders;
};
@@ -190,10 +186,10 @@ private:
// ctor
//-------------------------------------------------
-menu_add_change_folder::menu_add_change_folder(mame_ui_manager &mui, render_container &container, int ref)
+menu_add_change_folder::menu_add_change_folder(mame_ui_manager &mui, render_container &container, int ref, bool multipath)
: menu(mui, container)
, m_ref(ref)
- , m_change(f_folders[ref].action == CHANGE)
+ , m_multipath(multipath)
{
// configure the starting path
osd_get_full_path(m_current_path, ".");
@@ -255,7 +251,7 @@ void menu_add_change_folder::handle(event const *ev)
{
// Tab key, save current path
std::string error_string;
- if (m_change)
+ if (!m_multipath)
{
if (ui().options().exists(f_folders[m_ref].option))
ui().options().set_value(f_folders[m_ref].option, m_current_path, OPTION_PRIORITY_CMDLINE);
@@ -349,7 +345,7 @@ void menu_add_change_folder::custom_render(void *selectedref, float top, float b
{
std::string const toptext[] = {
util::string_format(
- m_change ? _("Change %1$s Folder - Search: %2$s_") : _("Add %1$s Folder - Search: %2$s_"),
+ m_multipath ? _("Add %1$s Folder - Search: %2$s_") : _("Change %1$s Folder - Search: %2$s_"),
_("path-option", f_folders[m_ref].name),
m_search),
m_current_path };
@@ -428,8 +424,9 @@ class menu_display_actual : public menu
public:
menu_display_actual(mame_ui_manager &mui, render_container &container, int selectedref)
: menu(mui, container)
- , m_heading{ util::string_format((f_folders[selectedref].action == ADDING) ? _("%1$s Folders") : _("%1$s Folder"), _("path-option", f_folders[selectedref].name)) }
, m_ref(selectedref)
+ , m_multipath(is_multipath(f_folders[selectedref].option))
+ , m_heading{ util::string_format(m_multipath ? _("%1$s Folders") : _("%1$s Folder"), _("path-option", f_folders[selectedref].name)) }
{
}
@@ -446,13 +443,30 @@ private:
virtual void populate(float &customtop, float &custombottom) override;
virtual void handle(event const *ev) override;
+ bool is_multipath(std::string_view folder) const;
+
+ int const m_ref;
+ bool const m_multipath;
std::string const m_heading[1];
std::string m_searchpath;
std::vector<std::string> m_folders;
- int const m_ref;
};
//-------------------------------------------------
+// is_multipath
+//-------------------------------------------------
+
+bool menu_display_actual::is_multipath(std::string_view folder) const
+{
+ auto option = ui().options().get_entry(folder);
+ if (!option)
+ option = machine().options().get_entry(folder);
+ assert(option);
+
+ return option->type() == core_options::option_type::MULTIPATH;
+}
+
+//-------------------------------------------------
// handle
//-------------------------------------------------
@@ -468,7 +482,7 @@ void menu_display_actual::handle(event const *ev)
break;
case ADD_CHANGE:
- menu::stack_push<menu_add_change_folder>(ui(), container(), m_ref);
+ menu::stack_push<menu_add_change_folder>(ui(), container(), m_ref, m_multipath);
break;
}
}
@@ -480,21 +494,31 @@ void menu_display_actual::handle(event const *ev)
void menu_display_actual::populate(float &customtop, float &custombottom)
{
- if (ui().options().exists(f_folders[m_ref].option))
- m_searchpath.assign(ui().options().value(f_folders[m_ref].option));
- else
- m_searchpath.assign(machine().options().value(f_folders[m_ref].option));
+ auto const &folder = f_folders[m_ref];
+ auto option = ui().options().get_entry(folder.option);
+ if (!option)
+ option = machine().options().get_entry(folder.option);
+ assert(option);
- path_iterator path(m_searchpath);
- std::string curpath;
- m_folders.clear();
- while (path.next(curpath))
- m_folders.push_back(curpath);
-
- item_append((f_folders[m_ref].action == CHANGE) ? _("Change Folder") : _("Add Folder"), 0, (void *)ADD_CHANGE);
+ m_searchpath.assign(option->value());
- if (m_folders.size() > 1)
- item_append(_("Remove Folder"), 0, (void *)REMOVE);
+ m_folders.clear();
+ if (m_multipath)
+ {
+ path_iterator path(m_searchpath);
+ std::string curpath;
+ while (path.next(curpath))
+ m_folders.push_back(curpath);
+
+ item_append(_("Add Folder"), 0, (void *)ADD_CHANGE);
+ if (m_folders.size() > 1)
+ item_append(_("Remove Folder"), 0, (void *)REMOVE);
+ }
+ else
+ {
+ m_folders.push_back(m_searchpath);
+ item_append(_("Change Folder"), 0, (void *)ADD_CHANGE);
+ }
item_append(menu_item_type::SEPARATOR);
@@ -559,7 +583,7 @@ void menu_directory::handle(event const *ev)
void menu_directory::populate(float &customtop, float &custombottom)
{
for (auto & elem : f_folders)
- item_append(_("path-option", elem.name), 0, (void *)(uintptr_t)elem.action);
+ item_append(_("path-option", elem.name), 0, this); // need a non-null reference pointer - value is immaterial
item_append(menu_item_type::SEPARATOR);
}