diff --git a/src/frontend/mame/ui/filesel.cpp b/src/frontend/mame/ui/filesel.cpp index 256834c5de1..3477fa416b1 100644 --- a/src/frontend/mame/ui/filesel.cpp +++ b/src/frontend/mame/ui/filesel.cpp @@ -47,14 +47,14 @@ namespace ui { 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_image(image) , m_current_directory(current_directory) , m_current_file(current_file) + , m_has_empty(has_empty) + , m_has_softlist(has_softlist) + , m_has_create(has_create) , m_result(result) { - m_image = image; - m_has_empty = has_empty; - m_has_softlist = has_softlist; - m_has_create = has_create; } @@ -176,7 +176,9 @@ int menu_file_selector::compare_entries(const file_selector_entry *e1, const fil //------------------------------------------------- menu_file_selector::file_selector_entry &menu_file_selector::append_entry( - file_selector_entry_type entry_type, const std::string &entry_basename, const std::string &entry_fullpath) + file_selector_entry_type entry_type, + const std::string &entry_basename, + const std::string &entry_fullpath) { return append_entry(entry_type, std::string(entry_basename), std::string(entry_fullpath)); } @@ -188,7 +190,9 @@ menu_file_selector::file_selector_entry &menu_file_selector::append_entry( //------------------------------------------------- menu_file_selector::file_selector_entry &menu_file_selector::append_entry( - file_selector_entry_type entry_type, std::string &&entry_basename, std::string &&entry_fullpath) + file_selector_entry_type entry_type, + std::string &&entry_basename, + std::string &&entry_fullpath) { // allocate a new entry file_selector_entry entry; @@ -197,47 +201,41 @@ menu_file_selector::file_selector_entry &menu_file_selector::append_entry( entry.fullpath = std::move(entry_fullpath); // find the end of the list - m_entrylist.emplace_back(std::move(entry)); - return m_entrylist[m_entrylist.size() - 1]; + return *m_entrylist.emplace(m_entrylist.end(), std::move(entry)); } //------------------------------------------------- -// append_entry_menu_item - appends +// append_dirent_entry - appends // a menu item for a file selector entry //------------------------------------------------- menu_file_selector::file_selector_entry *menu_file_selector::append_dirent_entry(const osd::directory::entry *dirent) { - std::string buffer; file_selector_entry_type entry_type; - file_selector_entry *entry; - - switch(dirent->type) + switch (dirent->type) { - case osd::directory::entry::entry_type::FILE: - entry_type = SELECTOR_ENTRY_TYPE_FILE; - break; + case osd::directory::entry::entry_type::FILE: + entry_type = SELECTOR_ENTRY_TYPE_FILE; + break; - case osd::directory::entry::entry_type::DIR: - entry_type = SELECTOR_ENTRY_TYPE_DIRECTORY; - break; + case osd::directory::entry::entry_type::DIR: + entry_type = SELECTOR_ENTRY_TYPE_DIRECTORY; + break; - default: - // exceptional case; do not add a menu item - return nullptr; + default: + // exceptional case; do not add a menu item + return nullptr; } // determine the full path - buffer = util::zippath_combine(m_current_directory, dirent->name); + std::string buffer = util::zippath_combine(m_current_directory, dirent->name); // create the file selector entry - entry = &append_entry( - entry_type, - dirent->name, - std::move(buffer)); - - return entry; + return &append_entry( + entry_type, + dirent->name, + std::move(buffer)); } @@ -290,64 +288,51 @@ void menu_file_selector::append_entry_menu_item(const file_selector_entry *entry void menu_file_selector::populate(float &customtop, float &custombottom) { - util::zippath_directory *directory = nullptr; - osd_file::error err; - const osd::directory::entry *dirent; - const file_selector_entry *entry; const file_selector_entry *selected_entry = nullptr; - int i; - const char *volume_name; - uint8_t first; - // open the directory - err = util::zippath_opendir(m_current_directory, &directory); // clear out the menu entries m_entrylist.clear(); + // open the directory + util::zippath_directory *directory = nullptr; + osd_file::error const err = util::zippath_opendir(m_current_directory, &directory); + + // add the "[empty slot]" entry if available if (m_has_empty) - { - // add the "[empty slot]" entry append_entry(SELECTOR_ENTRY_TYPE_EMPTY, "", ""); - } + // add the "[create]" entry if (m_has_create && !util::zippath_is_zip(directory)) - { - // add the "[create]" entry append_entry(SELECTOR_ENTRY_TYPE_CREATE, "", ""); - } + // add and select the "[software list]" entry if available if (m_has_softlist) - { - // add the "[software list]" entry - entry = &append_entry(SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, "", ""); - selected_entry = entry; - } + selected_entry = &append_entry(SELECTOR_ENTRY_TYPE_SOFTWARE_LIST, "", ""); // add the drives - i = 0; - while((volume_name = osd_get_volume_name(i))!=nullptr) - { - append_entry(SELECTOR_ENTRY_TYPE_DRIVE, - volume_name, volume_name); - i++; - } + int i = 0; + for (char const *volume_name = osd_get_volume_name(i); volume_name; volume_name = osd_get_volume_name(++i)) + append_entry(SELECTOR_ENTRY_TYPE_DRIVE, volume_name, volume_name); // mark first filename entry - first = m_entrylist.size() + 1; + std::size_t const first = m_entrylist.size() + 1; // build the menu for each item - if (err == osd_file::error::NONE) + if (osd_file::error::NONE != err) { - while((dirent = util::zippath_readdir(directory)) != nullptr) + osd_printf_verbose("menu_file_selector::populate: error opening directory '%s' (%d)\n", m_current_directory.c_str(), int(err)); + } + else + { + for (osd::directory::entry const *dirent = util::zippath_readdir(directory); dirent; dirent = util::zippath_readdir(directory)) { // append a dirent entry - entry = append_dirent_entry(dirent); - - if (entry != nullptr) + file_selector_entry const *entry = append_dirent_entry(dirent); + if (entry) { // set the selected item to be the first non-parent directory or file - if ((selected_entry == nullptr) && strcmp(dirent->name, "..")) + if (!selected_entry && strcmp(dirent->name, "..")) selected_entry = entry; // do we have to select this file? @@ -356,29 +341,31 @@ void menu_file_selector::populate(float &customtop, float &custombottom) } } } + if (directory) + util::zippath_closedir(directory); // sort the menu entries - const std::collate& coll = std::use_facet>(std::locale()); - std::sort(m_entrylist.begin()+first, m_entrylist.end(), [&coll](file_selector_entry const &x, file_selector_entry const &y) - { - std::wstring xstr = wstring_from_utf8(x.basename); - std::wstring ystr = wstring_from_utf8(y.basename); - return coll.compare(xstr.data(), xstr.data()+xstr.size(), ystr.data(), ystr.data()+ystr.size()) < 0; - } ); + const std::collate &coll = std::use_facet>(std::locale()); + std::sort( + m_entrylist.begin() + first, + m_entrylist.end(), + [&coll] (file_selector_entry const &x, file_selector_entry const &y) + { + std::wstring const xstr = wstring_from_utf8(x.basename); + std::wstring const ystr = wstring_from_utf8(y.basename); + return coll.compare(xstr.data(), xstr.data()+xstr.size(), ystr.data(), ystr.data()+ystr.size()) < 0; + }); // append all of the menu entries - for (auto &entry : m_entrylist) + for (file_selector_entry const &entry : m_entrylist) append_entry_menu_item(&entry); // set the selection (if we have one) - if (selected_entry != nullptr) - set_selection((void *) selected_entry); + if (selected_entry) + set_selection((void *)selected_entry); // set up custom render proc customtop = ui().get_line_height() + 3.0f * UI_BOX_TB_BORDER; - - if (directory != nullptr) - util::zippath_closedir(directory); } @@ -426,7 +413,7 @@ void menu_file_selector::handle() if (err != osd_file::error::NONE) { // this path is problematic; present the user with an error and bail - ui().popup_time(1, "Error accessing %s", entry->fullpath); + ui().popup_time(1, _("Error accessing %s"), entry->fullpath); break; } m_current_directory.assign(entry->fullpath); diff --git a/src/frontend/mame/ui/filesel.h b/src/frontend/mame/ui/filesel.h index 6e1759588dd..2aec3a77da1 100644 --- a/src/frontend/mame/ui/filesel.h +++ b/src/frontend/mame/ui/filesel.h @@ -16,6 +16,7 @@ #include "ui/menu.h" namespace ui { + // ======================> menu_file_selector class menu_file_selector : public menu @@ -30,7 +31,16 @@ public: 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); + 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; protected: @@ -50,7 +60,7 @@ private: struct file_selector_entry { - file_selector_entry() {} + file_selector_entry() { } file_selector_entry(file_selector_entry &&) = default; file_selector_entry &operator=(file_selector_entry &&) = default; file_selector_entry_type type; @@ -59,16 +69,16 @@ private: }; // internal state - device_image_interface * m_image; - std::string & m_current_directory; - std::string & m_current_file; - bool m_has_empty; - bool m_has_softlist; - bool m_has_create; - result & m_result; + device_image_interface *const m_image; + std::string & m_current_directory; + std::string & m_current_file; + bool const m_has_empty; + bool const m_has_softlist; + bool const m_has_create; + result & m_result; std::vector m_entrylist; - std::string m_hover_directory; - std::string m_filename; + std::string m_hover_directory; + std::string m_filename; virtual void populate(float &customtop, float &custombottom) override; virtual void handle() override; @@ -95,16 +105,20 @@ public: WRITE_OTHER, WRITE_DIFF }; - menu_select_rw(mame_ui_manager &mui, render_container &container, - bool can_in_place, result &result); + menu_select_rw( + mame_ui_manager &mui, + render_container &container, + bool can_in_place, + result &result); virtual ~menu_select_rw() override; - virtual void populate(float &customtop, float &custombottom) override; - virtual void handle() override; static void *itemref_from_result(result result); static result result_from_itemref(void *itemref); private: + virtual void populate(float &customtop, float &custombottom) override; + virtual void handle() override; + // internal state bool m_can_in_place; result & m_result; diff --git a/src/osd/modules/file/posixdir.cpp b/src/osd/modules/file/posixdir.cpp index 113c5068963..be18239ebf5 100644 --- a/src/osd/modules/file/posixdir.cpp +++ b/src/osd/modules/file/posixdir.cpp @@ -158,6 +158,7 @@ const osd::directory::entry *posix_directory::read() case DT_REG: m_entry.type = entry::entry_type::FILE; break; + case DT_UNKNOWN: case DT_LNK: if (stat_err) m_entry.type = entry::entry_type::OTHER; diff --git a/src/osd/modules/file/posixfile.cpp b/src/osd/modules/file/posixfile.cpp index 3cc122342dd..967202eb61c 100644 --- a/src/osd/modules/file/posixfile.cpp +++ b/src/osd/modules/file/posixfile.cpp @@ -446,7 +446,7 @@ bool osd_is_absolute_path(std::string const &path) if (!path.empty() && is_path_separator(path[0])) return true; #if !defined(WIN32) - else if (!path.empty() && (path[0] == '.')) + else if (!path.empty() && (path[0] == '.') && (!path[1] || is_path_separator(path[1]))) // FIXME: why is this even here? foo/./bar is a valid way to refer to foo/bar return true; #elif !defined(UNDER_CE) else if ((path.length() > 1) && (path[1] == ':'))