diff --git a/apps/openmw/mwstate/character.cpp b/apps/openmw/mwstate/character.cpp index 3c02311458..22d7e7ba1e 100644 --- a/apps/openmw/mwstate/character.cpp +++ b/apps/openmw/mwstate/character.cpp @@ -18,14 +18,25 @@ bool MWState::operator<(const Slot& left, const Slot& right) return left.mTimeStamp < right.mTimeStamp; } -std::string MWState::getFirstGameFile(const std::vector& contentFiles) +bool MWState::operator<(const Character& left, const Character& right) +{ + if (left.mSlots.empty() && right.mSlots.empty()) + return left.mPath < right.mPath; + else if (left.mSlots.empty()) + return false; + else if (right.mSlots.empty()) + return true; + return right.mSlots.back() < left.mSlots.back(); +} + +std::string_view MWState::getFirstGameFile(const std::vector& contentFiles) { for (const std::string& c : contentFiles) { if (Misc::StringUtils::ciEndsWith(c, ".esm") || Misc::StringUtils::ciEndsWith(c, ".omwgame")) return c; } - return ""; + return {}; } void MWState::Character::addSlot(const std::filesystem::path& path, const std::string& game) diff --git a/apps/openmw/mwstate/character.hpp b/apps/openmw/mwstate/character.hpp index 3c68d9f490..3858bdba10 100644 --- a/apps/openmw/mwstate/character.hpp +++ b/apps/openmw/mwstate/character.hpp @@ -2,6 +2,7 @@ #define GAME_STATE_CHARACTER_H #include +#include #include @@ -16,7 +17,7 @@ namespace MWState bool operator<(const Slot& left, const Slot& right); - std::string getFirstGameFile(const std::vector& contentFiles); + std::string_view getFirstGameFile(const std::vector& contentFiles); class Character { @@ -63,6 +64,8 @@ namespace MWState ///< Return signature information for this character. /// /// \attention This function must not be called if there are no slots. + + friend bool operator<(const Character& left, const Character& right); }; } diff --git a/apps/openmw/mwstate/charactermanager.cpp b/apps/openmw/mwstate/charactermanager.cpp index 32f0fe0aef..6d2583776b 100644 --- a/apps/openmw/mwstate/charactermanager.cpp +++ b/apps/openmw/mwstate/charactermanager.cpp @@ -18,10 +18,8 @@ MWState::CharacterManager::CharacterManager(std::filesystem::path saves, const s } else { - for (std::filesystem::directory_iterator iter(mPath); iter != std::filesystem::directory_iterator(); ++iter) + for (const std::filesystem::path& characterDir : std::filesystem::directory_iterator(mPath)) { - std::filesystem::path characterDir = *iter; - if (std::filesystem::is_directory(characterDir)) { Character character(characterDir, mGame); @@ -30,6 +28,7 @@ MWState::CharacterManager::CharacterManager(std::filesystem::path saves, const s mCharacters.push_back(character); } } + mCharacters.sort(); } }