diff --git a/src/api/sorting/plugin_sort.cpp b/src/api/sorting/plugin_sort.cpp index e300ee73..4a9bacd5 100644 --- a/src/api/sorting/plugin_sort.cpp +++ b/src/api/sorting/plugin_sort.cpp @@ -38,6 +38,13 @@ std::vector GetPluginsSortingData( std::vector pluginsSortingData; pluginsSortingData.reserve(loadedPluginInterfaces.size()); +#ifdef _WIN32 + std::vector wideLoadOrder; + for (const auto& pluginName : loadOrder) { + wideLoadOrder.push_back(ToWinWide(pluginName)); + } +#endif + for (const auto& pluginInterface : loadedPluginInterfaces) { if (!pluginInterface) { continue; @@ -56,8 +63,13 @@ std::vector GetPluginsSortingData( const auto userMetadata = db.GetPluginUserMetadata(plugin->GetName(), true) .value_or(PluginMetadata(plugin->GetName())); +#ifdef _WIN32 + const auto pluginSortingData = PluginSortingData( + plugin, masterlistMetadata, userMetadata, wideLoadOrder); +#else const auto pluginSortingData = PluginSortingData(plugin, masterlistMetadata, userMetadata, loadOrder); +#endif pluginsSortingData.push_back(pluginSortingData); } diff --git a/src/api/sorting/plugin_sorting_data.cpp b/src/api/sorting/plugin_sorting_data.cpp index 0475ba16..b0d53393 100644 --- a/src/api/sorting/plugin_sorting_data.cpp +++ b/src/api/sorting/plugin_sorting_data.cpp @@ -53,7 +53,11 @@ PluginSortingData::PluginSortingData( const PluginSortingInterface* plugin, const PluginMetadata& masterlistMetadata, const PluginMetadata& userMetadata, +#ifdef _WIN32 + const std::vector& loadOrder) : +#else const std::vector& loadOrder) : +#endif plugin_(plugin), group_(userMetadata.GetGroup().value_or( masterlistMetadata.GetGroup().value_or(Group::DEFAULT_NAME))), @@ -66,8 +70,17 @@ PluginSortingData::PluginSortingData( return; } +#ifdef _WIN32 + auto wideName = ToWinWide(GetName()); +#endif + for (size_t i = 0; i < loadOrder.size(); i++) { - if (CompareFilenames(plugin->GetName(), loadOrder.at(i)) == 0) { +#ifdef _WIN32 + int comparison = CompareFilenames(wideName, loadOrder.at(i)); +#else + int comparison = CompareFilenames(GetName(), loadOrder.at(i)); +#endif + if (comparison == 0) { loadOrderIndex_ = i; break; } diff --git a/src/api/sorting/plugin_sorting_data.h b/src/api/sorting/plugin_sorting_data.h index db4ac1f6..2a8d06fe 100644 --- a/src/api/sorting/plugin_sorting_data.h +++ b/src/api/sorting/plugin_sorting_data.h @@ -43,7 +43,11 @@ public: explicit PluginSortingData(const PluginSortingInterface* plugin, const PluginMetadata& masterlistMetadata, const PluginMetadata& userMetadata, +#ifdef _WIN32 + const std::vector& loadOrder); +#else const std::vector& loadOrder); +#endif std::string GetName() const; bool IsMaster() const; diff --git a/src/tests/api/internals/sorting/plugin_sort_test.h b/src/tests/api/internals/sorting/plugin_sort_test.h index aaadd432..955263f4 100644 --- a/src/tests/api/internals/sorting/plugin_sort_test.h +++ b/src/tests/api/internals/sorting/plugin_sort_test.h @@ -83,8 +83,18 @@ protected: const std::vector& loadOrder = {}) { const auto plugin = GetPlugin(name); +#ifdef _WIN32 + std::vector wideLoadOrder; + for (const auto& pluginName : loadOrder) { + wideLoadOrder.push_back(ToWinWide(pluginName)); + } + + return PluginSortingData( + plugin, PluginMetadata(), PluginMetadata(), wideLoadOrder); +#else return PluginSortingData( plugin, PluginMetadata(), PluginMetadata(), loadOrder); +#endif } plugingraph::TestPlugin* GetPlugin(const std::string& name) { diff --git a/src/tests/api/internals/sorting/plugin_sorting_data_test.h b/src/tests/api/internals/sorting/plugin_sorting_data_test.h index cc580561..c86c46e8 100644 --- a/src/tests/api/internals/sorting/plugin_sorting_data_test.h +++ b/src/tests/api/internals/sorting/plugin_sorting_data_test.h @@ -63,6 +63,19 @@ protected: return loadedPluginInterfaces; } +#ifdef _WIN32 + std::vector getNativeLoadOrder() { + std::vector wideLoadOrder; + for (const auto &pluginName : getLoadOrder()) { + wideLoadOrder.push_back(ToWinWide(pluginName)); + } + + return wideLoadOrder; + } +#else + std::vector getNativeLoadOrder() { return getLoadOrder(); } +#endif + Game game_; const std::string blankEslEsp; }; @@ -89,14 +102,14 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) { dynamic_cast(game_.GetPlugin(blankEsp)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); EXPECT_FALSE(esp.IsMaster()); auto master = PluginSortingData( dynamic_cast(game_.GetPlugin(blankEsm)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); EXPECT_TRUE(master.IsMaster()); if (GetParam() == GameType::fo4 || GetParam() == GameType::tes5se) { @@ -104,7 +117,7 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) { dynamic_cast(game_.GetPlugin(blankEsl)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); EXPECT_TRUE(lightMaster.IsMaster()); auto lightPlugin = @@ -112,7 +125,7 @@ TEST_P(PluginSortingDataTest, lightFlaggedEspFilesShouldNotBeTreatedAsMasters) { game_.GetPlugin(blankEslEsp)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); EXPECT_FALSE(lightPlugin.IsMaster()); } } @@ -125,7 +138,7 @@ TEST_P(PluginSortingDataTest, dynamic_cast(game_.GetPlugin(blankMasterDependentEsm)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); if (GetParam() == GameType::starfield) { EXPECT_EQ(1, plugin.GetOverrideRecordCount()); } else { @@ -140,11 +153,11 @@ TEST_P(PluginSortingDataTest, ASSERT_NO_THROW(loadInstalledPlugins(game_, false)); - auto plugin = PluginSortingData( - dynamic_cast(game_.GetPlugin(blankEsm)), - PluginMetadata(), - PluginMetadata(), - getLoadOrder()); + auto plugin = + PluginSortingData(dynamic_cast(game_.GetPlugin(blankEsm)), + PluginMetadata(), + PluginMetadata(), + getNativeLoadOrder()); if (GetParam() == GameType::starfield) { EXPECT_TRUE(plugin.IsBlueprintMaster()); } else { @@ -155,20 +168,21 @@ TEST_P(PluginSortingDataTest, dynamic_cast(game_.GetPlugin(blankDifferentEsm)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); EXPECT_FALSE(plugin.IsBlueprintMaster()); - plugin = PluginSortingData(dynamic_cast(game_.GetPlugin(blankEsp)), - PluginMetadata(), - PluginMetadata(), - getLoadOrder()); + plugin = + PluginSortingData(dynamic_cast(game_.GetPlugin(blankEsp)), + PluginMetadata(), + PluginMetadata(), + getNativeLoadOrder()); EXPECT_FALSE(plugin.IsBlueprintMaster()); plugin = PluginSortingData( dynamic_cast(game_.GetPlugin(blankDifferentEsp)), PluginMetadata(), PluginMetadata(), - getLoadOrder()); + getNativeLoadOrder()); EXPECT_FALSE(plugin.IsBlueprintMaster()); } }