From f67f1d934ece16ebaf1a624e8c06b0c0b2cc85e7 Mon Sep 17 00:00:00 2001 From: Stephen Whittle Date: Wed, 16 Aug 2023 16:57:17 +1000 Subject: [PATCH] 2023.7.2 Updates * NativeSDK updated * SubmitModChangesAsync now allows the alteration of a mod's tags * DisplayNamePortal field added to User objects to provide the portal-specific display name for that user Bugfixes * Email validation regex had some edge cases not handled properly * Mod Tags no longer have incorrect caching logic --- .../ModioRefineSearchDrawer.uasset | Bin 32683 -> 36289 bytes Doc/documentation.html | 7 ++- .../Private/Internal/Convert/EditModParams.h | 2 +- Source/Modio/Private/Internal/Convert/User.h | 1 + .../Private/Libraries/ModioEditModLibrary.cpp | 5 ++ Source/Modio/Private/ModioSubsystem.cpp | 5 -- .../Public/Libraries/ModioEditModLibrary.h | 3 ++ .../Modio/Public/Types/ModioEditModParams.h | 5 ++ Source/Modio/Public/Types/ModioUser.h | 6 +++ Source/ModioUI/Private/ModioUISubsystem.cpp | 11 ++--- .../Private/UI/CommonComponents/ModioMenu.cpp | 2 +- .../RefineSearch/ModioRefineSearchDrawer.cpp | 44 ++++++++++-------- .../ModioModDetailsPropertyInspector.cpp | 6 +++ Source/ModioUI/Public/ModioUISubsystem.h | 2 + .../RefineSearch/ModioRefineSearchDrawer.h | 5 ++ .../UI/Interfaces/IModioUITextValidator.h | 2 +- Source/ThirdParty/NativeSDK | 2 +- 17 files changed, 73 insertions(+), 35 deletions(-) diff --git a/Content/UI/Browser/Drawers/RefineSearch/ModioRefineSearchDrawer.uasset b/Content/UI/Browser/Drawers/RefineSearch/ModioRefineSearchDrawer.uasset index e6b80df13a202b5cc86314dabe4a15bf8fe3504b..aa6601ed0b9b83612f0b0db1f1e5c5169b44825e 100644 GIT binary patch literal 36289 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 literal 32683 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 ClgG^f diff --git a/Doc/documentation.html b/Doc/documentation.html index d3dd2c5f..7f5d0388 100644 --- a/Doc/documentation.html +++ b/Doc/documentation.html @@ -9004,6 +9004,11 @@

Variables

ProfileUrl

+ +

FString

+

DisplayNamePortal

+ +
@@ -15244,7 +15249,7 @@

Values

diff --git a/Source/Modio/Private/Internal/Convert/EditModParams.h b/Source/Modio/Private/Internal/Convert/EditModParams.h index 459f7396..23779bf1 100644 --- a/Source/Modio/Private/Internal/Convert/EditModParams.h +++ b/Source/Modio/Private/Internal/Convert/EditModParams.h @@ -35,6 +35,6 @@ FORCEINLINE Modio::EditModParams ToModio(const FModioEditModParams& In) : Modio::Optional {}; Out.MetadataBlob = ToModioOptional(In.MetadataBlob); Out.LogoPath = ToModioOptional(In.LogoPath); - + Out.Tags = ToModioOptional>(In.Tags); return Out; } \ No newline at end of file diff --git a/Source/Modio/Private/Internal/Convert/User.h b/Source/Modio/Private/Internal/Convert/User.h index 32724913..15c0a214 100644 --- a/Source/Modio/Private/Internal/Convert/User.h +++ b/Source/Modio/Private/Internal/Convert/User.h @@ -21,5 +21,6 @@ FORCEINLINE FModioUser ToUnreal(const Modio::User& In) { Out.Username = ToUnreal(In.Username); Out.DateOnline = ToUnreal(In.DateOnline); Out.ProfileUrl = ToUnreal(In.ProfileUrl); + Out.DisplayNamePortal = ToUnreal(In.DisplayNamePortal); return Out; } \ No newline at end of file diff --git a/Source/Modio/Private/Libraries/ModioEditModLibrary.cpp b/Source/Modio/Private/Libraries/ModioEditModLibrary.cpp index 917797ed..11bc90f0 100644 --- a/Source/Modio/Private/Libraries/ModioEditModLibrary.cpp +++ b/Source/Modio/Private/Libraries/ModioEditModLibrary.cpp @@ -59,3 +59,8 @@ void UModioEditModLibrary::SetLogoPath(FModioEditModParams& In, FString LogoPath { In.LogoPath = LogoPath; } + +void UModioEditModLibrary::SetTags(FModioEditModParams& In, TArray& Tags) +{ + In.Tags = Tags; +} diff --git a/Source/Modio/Private/ModioSubsystem.cpp b/Source/Modio/Private/ModioSubsystem.cpp index 966e3d5e..f2a723d1 100644 --- a/Source/Modio/Private/ModioSubsystem.cpp +++ b/Source/Modio/Private/ModioSubsystem.cpp @@ -443,11 +443,6 @@ void UModioSubsystem::K2_GetModMediaLogoAsync(FModioModID ModId, EModioLogoSize void UModioSubsystem::GetModTagOptionsAsync(FOnGetModTagOptionsDelegateFast Callback) { - if (CachedModTags) - { - Callback.ExecuteIfBound({}, CachedModTags); - return; - } // TODO: @modio-UE4 capturing `this` is bad and we shouldn't do it. Better to store the cached tags as a TSharedPtr // and capture that by value, so we are guaranteed lifetime Modio::GetModTagOptionsAsync( diff --git a/Source/Modio/Public/Libraries/ModioEditModLibrary.h b/Source/Modio/Public/Libraries/ModioEditModLibrary.h index 0dc553e1..482c66fa 100644 --- a/Source/Modio/Public/Libraries/ModioEditModLibrary.h +++ b/Source/Modio/Public/Libraries/ModioEditModLibrary.h @@ -57,4 +57,7 @@ class MODIO_API UModioEditModLibrary : public UBlueprintFunctionLibrary UFUNCTION(BlueprintCallable, Category = "mod.io|Edit Mod Params") static void SetLogoPath(UPARAM(ref) FModioEditModParams& In, FString LogoPath); + + UFUNCTION(BlueprintCallable, Category = "mod.io|Edit Mod Params") + static void SetTags(UPARAM(ref) FModioEditModParams& In, UPARAM(ref) TArray& Tags); }; diff --git a/Source/Modio/Public/Types/ModioEditModParams.h b/Source/Modio/Public/Types/ModioEditModParams.h index c7dfa0c1..2e2343e6 100644 --- a/Source/Modio/Public/Types/ModioEditModParams.h +++ b/Source/Modio/Public/Types/ModioEditModParams.h @@ -75,4 +75,9 @@ struct FModioEditModParams * Optional path to a new logo image for this mod **/ TOptional LogoPath; + + /** + * List of metadata tags that reference the mod to create. They help to search and filter content + **/ + TOptional> Tags; }; \ No newline at end of file diff --git a/Source/Modio/Public/Types/ModioUser.h b/Source/Modio/Public/Types/ModioUser.h index dd15cbb2..17d9998d 100644 --- a/Source/Modio/Public/Types/ModioUser.h +++ b/Source/Modio/Public/Types/ModioUser.h @@ -54,6 +54,12 @@ struct MODIO_API FModioUser **/ UPROPERTY(BlueprintReadOnly, Category = "User") FString ProfileUrl; + + /** + * Display name of this User for the given Portal, if their account is linked + **/ + UPROPERTY(BlueprintReadOnly, Category = "User") + FString DisplayNamePortal; }; /** diff --git a/Source/ModioUI/Private/ModioUISubsystem.cpp b/Source/ModioUI/Private/ModioUISubsystem.cpp index 8fadd24c..634a2b29 100644 --- a/Source/ModioUI/Private/ModioUISubsystem.cpp +++ b/Source/ModioUI/Private/ModioUISubsystem.cpp @@ -844,17 +844,16 @@ void UModioUISubsystem::ShowUninstallConfirmationDialog(UObject* DialogDataSourc TOptional UModioUISubsystem::GetTagOptionsList() { - if (CachedModTags.IsSet()) - { - return CachedModTags; - } + return CachedModTags; +} + +void UModioUISubsystem::GetTagOptionsListAsync() +{ if (UModioSubsystem* Subsystem = GEngine->GetEngineSubsystem()) { Subsystem->GetModTagOptionsAsync( FOnGetModTagOptionsDelegateFast::CreateUObject(this, &UModioUISubsystem::OnGetModTagOptionsComplete)); } - - return TOptional(); } void UModioUISubsystem::OnGetModTagOptionsComplete(FModioErrorCode ec, TOptional ModTags) diff --git a/Source/ModioUI/Private/UI/CommonComponents/ModioMenu.cpp b/Source/ModioUI/Private/UI/CommonComponents/ModioMenu.cpp index 362eecc5..7202dfb6 100644 --- a/Source/ModioUI/Private/UI/CommonComponents/ModioMenu.cpp +++ b/Source/ModioUI/Private/UI/CommonComponents/ModioMenu.cpp @@ -338,7 +338,7 @@ void UModioMenu::NativeOnInitialized() { Subsystem->EnableModManagement(); // Cache tags for this game - Subsystem->GetTagOptionsList(); + Subsystem->GetTagOptionsListAsync(); } // Find the refine search drawer, bind to its confirmed event so we know to display the search results if (DrawerController) diff --git a/Source/ModioUI/Private/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.cpp b/Source/ModioUI/Private/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.cpp index 36c5acd9..23cc1bcd 100644 --- a/Source/ModioUI/Private/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.cpp +++ b/Source/ModioUI/Private/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.cpp @@ -35,6 +35,10 @@ void UModioRefineSearchDrawer::NativeOnInitialized() { SearchInput->MaxCharacters = MaxCharacterAmount; } + if (CancelButton) + { + CancelButton->OnClicked.AddDynamic(this, &UModioRefineSearchDrawer::OnCancelClicked); + } UISubsystem = GEngine->GetEngineSubsystem(); UISubsystem->OnInputDeviceChanged.AddUObject(this, &UModioRefineSearchDrawer::OnInputDeviceChanged); @@ -94,6 +98,7 @@ void UModioRefineSearchDrawer::ConstructNavigationPath() NavigationPath.Add(ApplyButton); NavigationPath.Add(ClearButton); + NavigationPath.Add(CancelButton); } void UModioRefineSearchDrawer::BindCollapseButtons() @@ -118,6 +123,8 @@ void UModioRefineSearchDrawer::BindCollapseButtons() void UModioRefineSearchDrawer::ValidateAndSetFocus() { + CurrentNavIndex = FMath::Clamp(CurrentNavIndex, 0, NavigationPath.Num() - 1); + UE_LOG(LogTemp, Warning, TEXT("%d"), CurrentNavIndex); if (NavigationPath.IsValidIndex(CurrentNavIndex)) { if (!NavigationPath[CurrentNavIndex]->TakeWidget()->SupportsKeyboardFocus()) @@ -192,6 +199,11 @@ void UModioRefineSearchDrawer::OnClearClicked() } } +void UModioRefineSearchDrawer::OnCancelClicked() +{ + GEngine->GetEngineSubsystem()->CloseSearchDrawer(); +} + void UModioRefineSearchDrawer::OnApplyClicked() { Execute_NotifySettingsChanged( @@ -234,45 +246,39 @@ FReply UModioRefineSearchDrawer::NativeOnPreviewKeyDown(const FGeometry& MyGeome if (InKeyEvent.GetKey() == EKeys::Tab && CurrentNavIndex == 0) { - if (NavigationPath.IsValidIndex(CurrentNavIndex + 1)) - { - CurrentNavIndex += 1; - } + CurrentNavIndex += 1; ValidateAndSetFocus(); return FReply::Handled(); } if (GetCommandKeyForEvent(InKeyEvent) == FModioInputKeys::Down) { - if (NavigationPath.IsValidIndex(CurrentNavIndex + 1)) { - CurrentNavIndex += 1; - } + CurrentNavIndex += 1; ValidateAndSetFocus(); return FReply::Handled(); } else if (GetCommandKeyForEvent(InKeyEvent) == FModioInputKeys::Up) { - if (NavigationPath.IsValidIndex(CurrentNavIndex - 1)) - { - CurrentNavIndex -= 1; - } + CurrentNavIndex -= 1; ValidateAndSetFocus(); return FReply::Handled(); } - else if (GetCommandKeyForEvent(InKeyEvent) == FModioInputKeys::Left) + + if (CurrentNavIndex >= NavigationPath.Num() - 3) { - if (CurrentNavIndex == NavigationPath.Num() - 1) + if (GetCommandKeyForEvent(InKeyEvent) == FModioInputKeys::Left) { - CurrentNavIndex -= 1; + CurrentNavIndex--; + CurrentNavIndex = FMath::Clamp(CurrentNavIndex, NavigationPath.Num() - 3, NavigationPath.Num() - 1); ValidateAndSetFocus(); + return FReply::Handled(); } - } - else if (GetCommandKeyForEvent(InKeyEvent) == FModioInputKeys::Right) - { - if (CurrentNavIndex == NavigationPath.Num() - 2) + else if (GetCommandKeyForEvent(InKeyEvent) == FModioInputKeys::Right) { - CurrentNavIndex += 1; + CurrentNavIndex++; + CurrentNavIndex = FMath::Clamp(CurrentNavIndex, NavigationPath.Num() - 3, NavigationPath.Num() - 1); ValidateAndSetFocus(); + return FReply::Handled(); } } diff --git a/Source/ModioUI/Private/UI/Views/ModDetails/ModioModDetailsPropertyInspector.cpp b/Source/ModioUI/Private/UI/Views/ModDetails/ModioModDetailsPropertyInspector.cpp index 306e6b3c..07c63dd5 100644 --- a/Source/ModioUI/Private/UI/Views/ModDetails/ModioModDetailsPropertyInspector.cpp +++ b/Source/ModioUI/Private/UI/Views/ModDetails/ModioModDetailsPropertyInspector.cpp @@ -21,6 +21,12 @@ FText UModioModDetailsPropertyInspector::GetPropertyText(EModioModInfoPropertyTy switch (PropertyType) { case EModioModInfoPropertyType::CreatorName: + if (ModInfo->Underlying.ProfileSubmittedBy.DisplayNamePortal.Len() > 0) + { + return FText::Format(FText::FromString("{0} ({1})"), FText::FromString(ModInfo->Underlying.ProfileSubmittedBy.Username), + FText::FromString(ModInfo->Underlying.ProfileSubmittedBy.DisplayNamePortal)); + } + return FText::FromString(ModInfo->Underlying.ProfileSubmittedBy.Username); case EModioModInfoPropertyType::LastUpdated: { diff --git a/Source/ModioUI/Public/ModioUISubsystem.h b/Source/ModioUI/Public/ModioUISubsystem.h index 68b0e8c6..341665d6 100644 --- a/Source/ModioUI/Public/ModioUISubsystem.h +++ b/Source/ModioUI/Public/ModioUISubsystem.h @@ -254,6 +254,8 @@ UCLASS() class MODIOUI_API UModioUISubsystem : public UEngineSubsystem TOptional GetTagOptionsList(); + void GetTagOptionsListAsync(); + UFUNCTION(BlueprintCallable, Category = "ModioUISubsystem") float GetCurrentDPIScaleValue(); diff --git a/Source/ModioUI/Public/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.h b/Source/ModioUI/Public/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.h index c70c262d..f5bc9eda 100644 --- a/Source/ModioUI/Public/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.h +++ b/Source/ModioUI/Public/UI/Drawers/RefineSearch/ModioRefineSearchDrawer.h @@ -45,6 +45,9 @@ class MODIOUI_API UModioRefineSearchDrawer : public UModioUserWidgetBase, UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Widgets", meta = (BindWidget)) UModioRichTextButton* ClearButton; + UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Widgets", meta = (BindWidget)) + UModioRichTextButton* CancelButton; + UPROPERTY(BlueprintAssignable) FOnSearchSettingsChanged OnSettingsChanged; @@ -76,6 +79,8 @@ class MODIOUI_API UModioRefineSearchDrawer : public UModioUserWidgetBase, UFUNCTION() void OnApplyClicked(); UFUNCTION() + void OnCancelClicked(); + UFUNCTION() void ConstructNavigationPath(); UFUNCTION() void OnCollapse(); diff --git a/Source/ModioUI/Public/UI/Interfaces/IModioUITextValidator.h b/Source/ModioUI/Public/UI/Interfaces/IModioUITextValidator.h index 372a3e0b..e4947cb4 100644 --- a/Source/ModioUI/Public/UI/Interfaces/IModioUITextValidator.h +++ b/Source/ModioUI/Public/UI/Interfaces/IModioUITextValidator.h @@ -99,7 +99,7 @@ class MODIOUI_API UModioUIInputValidationLibrary : public UBlueprintFunctionLibr { // Regex for validating email adress found here: https://mylittledevblog.com/2018/02/15/ue4-email-validation/ // I would prefer to use https://stackoverflow.com/a/201378/12018052, but that doesn't work - const FRegexPattern Pattern(TEXT("(\\w+)(\\.|_)?(\\w*)@(\\w+)(\\.(\\w+))+")); + const FRegexPattern Pattern(TEXT("^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$")); FRegexMatcher Matcher(Pattern, TextToValidate.ToString()); return Matcher.FindNext(); diff --git a/Source/ThirdParty/NativeSDK b/Source/ThirdParty/NativeSDK index 89f18b3b..2aaf41e1 160000 --- a/Source/ThirdParty/NativeSDK +++ b/Source/ThirdParty/NativeSDK @@ -1 +1 @@ -Subproject commit 89f18b3bb21c697ba0d8bba5d84e291f178e1c88 +Subproject commit 2aaf41e15574cbd7d02f7399f2e383e3ebff84d4