// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "InputCoreTypes.h" #include "Logging/TokenizedMessage.h" #include "Layout/Visibility.h" #include "Widgets/DeclarativeSyntaxSupport.h" #include "Input/Reply.h" #include "Widgets/SWidget.h" #include "Widgets/Views/STableViewBase.h" #include "Widgets/SBoxPanel.h" #include "Widgets/Views/SListView.h" #include "Widgets/Views/STableRow.h" #if WITH_EDITOR #include "IDocumentation.h" #include "Interfaces/IMainFrameModule.h" #endif #define LOCTEXT_NAMESPACE "SMessageLogMessageListRow" class SMessageLogMessageListRow : public STableRow> { public: DECLARE_DELEGATE_TwoParams( FOnTokenClicked, TSharedPtr, const TSharedRef& ); DECLARE_DELEGATE_OneParam( FOnMessageClicked, TSharedPtr ); public: SLATE_BEGIN_ARGS(SMessageLogMessageListRow) : _Message() , _OnTokenClicked() , _OnMessageDoubleClicked() { } SLATE_ATTRIBUTE(TSharedPtr, Message) SLATE_EVENT(FOnTokenClicked, OnTokenClicked) SLATE_EVENT(FOnMessageClicked, OnMessageDoubleClicked) SLATE_END_ARGS() /** * Construct child widgets that comprise this widget. * * @param InArgs Declaration from which to construct this widget */ void Construct( const FArguments& InArgs, const TSharedRef< STableViewBase >& InOwnerTableView ); public: /** @return Widget for this log listing item*/ virtual TSharedRef GenerateWidget(); virtual FReply OnMouseButtonDoubleClick(const FGeometry& InMyGeometry, const FPointerEvent& InMouseEvent) override { FReply HandledReply = STableRow>::OnMouseButtonDoubleClick(InMyGeometry, InMouseEvent); if (InMouseEvent.GetEffectingButton() == EKeys::LeftMouseButton) { OnMessageDoubleClicked.ExecuteIfBound(Message); HandledReply = FReply::Handled(); } return HandledReply; } protected: TSharedRef CreateHyperlink( const TSharedRef& InMessageToken, const FText& InToolTip = FText() ); void CreateMessage( const TSharedRef& InHorzBox, const TSharedRef& InMessageToken, float Padding ); private: EVisibility GetActionLinkVisibility(TSharedRef ActionToken) const { return ActionToken->IsValidAction() ? EVisibility::Visible : EVisibility::Collapsed; } bool GetActionLinkEnable(TSharedRef ActionToken) const { return ActionToken->CanExecuteAction(); } void HandleActionHyperlinkNavigate( TSharedRef ActionToken ) { ActionToken->ExecuteAction(); } void HandleHyperlinkNavigate( TSharedRef InMessageToken ) { InMessageToken->GetOnMessageTokenActivated().ExecuteIfBound(InMessageToken); OnTokenClicked.ExecuteIfBound(Message, InMessageToken); } FReply HandleTokenButtonClicked( TSharedRef InMessageToken ) { InMessageToken->GetOnMessageTokenActivated().ExecuteIfBound(InMessageToken); OnTokenClicked.ExecuteIfBound(Message, InMessageToken); return FReply::Handled(); } #if WITH_EDITOR void HandleDocsHyperlinkNavigate( FString DocumentationLink ) { IDocumentation::Get()->Open(DocumentationLink, FDocumentationSourceInfo(TEXT("msg_log"))); } void HandleTutorialHyperlinkNavigate( FString TutorialAssetName ) { IMainFrameModule& MainFrameModule = FModuleManager::GetModuleChecked(TEXT("MainFrame")); MainFrameModule.BroadcastMainFrameRequestResource("Tutorial", TutorialAssetName); } #endif protected: /** The message used to create this widget. */ TSharedPtr Message; /** Delegate to execute when the token is clicked. */ FOnTokenClicked OnTokenClicked; /** Delegate to execute when the message is double-clicked. */ FOnMessageClicked OnMessageDoubleClicked; }; #undef LOCTEXT_NAMESPACE