diff options
Diffstat (limited to 'src/frontend/mame/ui/inifile.h')
-rw-r--r-- | src/frontend/mame/ui/inifile.h | 90 |
1 files changed, 54 insertions, 36 deletions
diff --git a/src/frontend/mame/ui/inifile.h b/src/frontend/mame/ui/inifile.h index 49344fd01eb..68adca3c917 100644 --- a/src/frontend/mame/ui/inifile.h +++ b/src/frontend/mame/ui/inifile.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Maurizio Petrarota +// copyright-holders:Maurizio Petrarota, Vas Crabb /*************************************************************************** ui/inifile.h @@ -7,7 +7,6 @@ UI INIs file manager. ***************************************************************************/ - #ifndef MAME_FRONTEND_UI_INIFILE_H #define MAME_FRONTEND_UI_INIFILE_H @@ -15,6 +14,10 @@ #include "ui/utils.h" +#include <functional> +#include <set> +#include <tuple> +#include <type_traits> #include <unordered_set> @@ -28,7 +31,7 @@ class inifile_manager { public: // construction/destruction - inifile_manager(running_machine &machine, ui_options &moptions); + inifile_manager(ui_options &options); // load systems from category void load_ini_category(size_t file, size_t category, std::unordered_set<game_driver const *> &result) const; @@ -59,52 +62,67 @@ class favorite_manager { public: // construction/destruction - favorite_manager(running_machine &machine, ui_options &moptions); - - // favorites comparator - struct ci_less - { - bool operator() (const std::string &s1, const std::string &s2) const - { - return (core_stricmp(s1.c_str(), s2.c_str()) < 0); - } - }; - - // favorite indices - std::multimap<std::string, ui_software_info, ci_less> m_list; - - // getters - running_machine &machine() const { return m_machine; } + favorite_manager(ui_options &options); // add - void add_favorite_game(); - void add_favorite_game(const game_driver *driver); - void add_favorite_game(ui_software_info &swinfo); + void add_favorite_system(game_driver const &driver); + void add_favorite_software(ui_software_info const &swinfo); + void add_favorite(running_machine &machine); // check - bool isgame_favorite(); - bool isgame_favorite(const game_driver *driver); - bool isgame_favorite(ui_software_info const &swinfo); - - // save - void save_favorite_games(); + bool is_favorite_system(game_driver const &driver) const; + bool is_favorite_software(ui_software_info const &swinfo) const; + bool is_favorite_system_software(ui_software_info const &swinfo) const; + bool is_favorite(running_machine &machine) const; // remove - void remove_favorite_game(); - void remove_favorite_game(ui_software_info const &swinfo); + void remove_favorite_system(game_driver const &driver); + void remove_favorite_software(ui_software_info const &swinfo); + void remove_favorite(running_machine &machine); + + // walk + template <typename T> void apply(T &&action) + { + for (auto const &item : m_favorites) + action(item); + } + template <typename T> void apply_sorted(T &&action) + { + update_sorted(); + for (auto const &item : m_sorted) + action(item.get()); + } private: - const char *favorite_filename = "favorites.ini"; + using running_software_key = std::tuple<game_driver const &, char const *, std::string const &>; + + struct favorite_compare + { + using is_transparent = std::true_type; + + bool operator()(ui_software_info const &lhs, ui_software_info const &rhs) const; + bool operator()(ui_software_info const &lhs, game_driver const &rhs) const; + bool operator()(game_driver const &lhs, ui_software_info const &rhs) const; + bool operator()(ui_software_info const &lhs, running_software_key const &rhs) const; + bool operator()(running_software_key const &lhs, ui_software_info const &rhs) const; + }; - // current - std::multimap<std::string, ui_software_info>::iterator m_current; + using favorites_set = std::set<ui_software_info, favorite_compare>; + using sorted_favorites = std::vector<std::reference_wrapper<ui_software_info const> >; - // parse file ui_favorite - void parse_favorite(); + // implementation + template <typename T> static void apply_running_machine(running_machine &machine, T &&action); + template <typename T> void add_impl(T &&key); + template <typename T> bool check_impl(T const &key) const; + template <typename T> bool remove_impl(T const &key); + void update_sorted(); + void save_favorites(); // internal state - running_machine &m_machine; // reference to our machine ui_options &m_options; + favorites_set m_favorites; + sorted_favorites m_sorted; + bool m_need_sort; }; #endif // MAME_FRONTEND_UI_INIFILE_H |