diff options
Diffstat (limited to 'src/frontend/mame/ui/selsoft.cpp')
-rw-r--r-- | src/frontend/mame/ui/selsoft.cpp | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/src/frontend/mame/ui/selsoft.cpp b/src/frontend/mame/ui/selsoft.cpp index 95c02a9d853..e00a1618016 100644 --- a/src/frontend/mame/ui/selsoft.cpp +++ b/src/frontend/mame/ui/selsoft.cpp @@ -29,53 +29,11 @@ #include <algorithm> #include <iterator> #include <functional> +#include <locale> namespace ui { -namespace { - -//------------------------------------------------- -// compares two items in the software list and -// sort them by parent-clone -//------------------------------------------------- - -bool compare_software(ui_software_info const &a, ui_software_info const &b) -{ - bool const clonex = !a.parentname.empty() && !a.parentlongname.empty(); - bool const cloney = !b.parentname.empty() && !b.parentlongname.empty(); - - if (!clonex && !cloney) - { - return 0 > core_stricmp(a.longname.c_str(), b.longname.c_str()); - } - else if (!clonex && cloney) - { - if ((a.shortname == b.parentname) && (a.instance == b.instance)) - return true; - else - return 0 > core_stricmp(a.longname.c_str(), b.parentlongname.c_str()); - } - else if (clonex && !cloney) - { - if ((a.parentname == b.shortname) && (a.instance == b.instance)) - return false; - else - return 0 > core_stricmp(a.parentlongname.c_str(), b.longname.c_str()); - } - else if ((a.parentname == b.parentname) && (a.instance == b.instance)) - { - return 0 > core_stricmp(a.longname.c_str(), b.longname.c_str()); - } - else - { - return 0 > core_stricmp(a.parentlongname.c_str(), b.parentlongname.c_str()); - } -} - -} // anonymous namespace - - menu_select_software::search_item::search_item(ui_software_info const &s) : software(s) , ucs_shortname(ustr_from_utf8(normalize_unicode(s.shortname, unicode_normalization_form::D, true))) @@ -455,7 +413,51 @@ void menu_select_software::build_software_list() } // sort array - std::stable_sort(m_swinfo.begin() + 1, m_swinfo.end(), compare_software); + std::collate<wchar_t> const &coll = std::use_facet<std::collate<wchar_t>>(std::locale()); + auto const compare_names = + [&coll] (std::string const &x, std::string const &y) -> bool + { + std::wstring const wx = wstring_from_utf8(x); + std::wstring const wy = wstring_from_utf8(y); + return 0 > coll.compare(wx.data(), wx.data() + wx.size(), wy.data(), wy.data() + wy.size()); + }; + std::stable_sort( + m_swinfo.begin() + 1, + m_swinfo.end(), + [&compare_names] (ui_software_info const &a, ui_software_info const &b) -> bool + { + bool const clonex = !a.parentname.empty() && !a.parentlongname.empty(); + bool const cloney = !b.parentname.empty() && !b.parentlongname.empty(); + + if (!clonex && !cloney) + { + return compare_names(a.longname, b.longname); + } + else if (!clonex && cloney) + { + if ((a.shortname == b.parentname) && (a.instance == b.instance)) + return true; + else + return compare_names(a.longname, b.longname); + } + else if (clonex && !cloney) + { + if ((a.parentname == b.shortname) && (a.instance == b.instance)) + return false; + else + return compare_names(a.longname, b.longname); + } + else if ((a.parentname == b.parentname) && (a.instance == b.instance)) + { + return compare_names(a.longname, b.longname); + } + else + { + return compare_names(a.parentlongname, b.parentlongname); + } + }); + + m_filter_data.finalise(); } |