27 UFUNCTION(BlueprintCallable, Category =
"Stream Chat")
28 void Setup(
const FMessage& InMessage, EMessageSide InSide, EMessagePosition InPosition);
31 UPROPERTY(meta = (BindWidgetOptional))
32 UTextBubbleWidget* TextBubble;
35 UPROPERTY(meta = (BindWidgetOptional))
36 UVerticalBox* AlignPanel;
39 UPROPERTY(meta = (BindWidgetOptional))
40 UContentWidget* HoverMenuTargetPanel;
43 UPROPERTY(meta = (BindWidgetOptional))
44 UContentWidget* ReactionsTargetPanel;
47 UPROPERTY(meta = (BindWidgetOptional))
48 UContentWidget* TimestampTargetPanel;
51 UPROPERTY(meta = (BindWidgetOptional))
52 UContentWidget* AvatarTargetPanel;
54 UPROPERTY(EditDefaultsOnly, NoClear, Category = Defaults)
55 TSubclassOf<UMessageHoverMenuWidget> MouseHoverMenuWidgetClass = UMessageHoverMenuWidget::StaticClass();
57 UPROPERTY(EditDefaultsOnly, NoClear, Category = Defaults)
58 TSubclassOf<UMessageReactionsWidget> ReactionsWidgetClass = UMessageReactionsWidget::StaticClass();
60 UPROPERTY(EditDefaultsOnly, NoClear, Category = Defaults)
61 TSubclassOf<UAvatarWidget> AvatarWidgetClass = UAvatarWidget::StaticClass();
63 UPROPERTY(EditDefaultsOnly, NoClear, Category = Defaults)
64 TSubclassOf<UTimestampWidget> TimestampWidgetClass = UTimestampWidget::StaticClass();
66 UPROPERTY(EditDefaultsOnly, NoClear, Category = Defaults)
67 TSubclassOf<UAttachmentWidget> AttachmentWidgetClass = UAttachmentWidget::StaticClass();
69 UPROPERTY(EditDefaultsOnly, Category = Defaults)
70 int32 AvatarSize = 36;
73 UPROPERTY(EditDefaultsOnly, Category = Defaults)
74 FMargin AttachmentPadding = FMargin{0.f, 0.f, 0.f, 2.f};
77 UPROPERTY(EditDefaultsOnly, Category = Thread)
78 FMargin ThreadFooterPadding = FMargin{2.f, 2.f, 2.f, 0.f};
80 UPROPERTY(EditDefaultsOnly, Category = Thread)
81 int32 ThreadFooterFontSize = 12;
89 UPROPERTY(EditDefaultsOnly, Category =
"Message Actions")
90 float LongPressSeconds = 0.4f;
99 UPROPERTY(EditDefaultsOnly, Category = "Message Actions")
100 float LongPressMoveTolerance = 4.f;
103 UPROPERTY(EditDefaultsOnly, Category = Moderation)
104 FMargin ModerationWarningPadding = FMargin{2.f, 2.f, 2.f, 0.f};
106 UPROPERTY(EditDefaultsOnly, Category = Moderation)
107 int32 ModerationWarningFontSize = 12;
110 UPROPERTY(EditDefaultsOnly, Category = Moderation)
111 FText BouncedMessageText = NSLOCTEXT("StreamChat", "BouncedMessage", "Not sent. Hold to edit, send anyway or delete.");
114 UPROPERTY(EditDefaultsOnly, Category = Thread)
115 FText OneReplyText = NSLOCTEXT("StreamChat", "OneReply", "1 reply");
118 UPROPERTY(EditDefaultsOnly, Category = Thread)
119 FText ManyRepliesFormat = NSLOCTEXT("StreamChat", "ManyReplies", "{0} replies
");
121 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Setup)
123 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Setup)
124 EMessagePosition Position;
125 UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Setup)
129 virtual void OnSetup() override;
130 virtual void NativeConstruct() override;
131 virtual void NativeDestruct() override;
133 virtual void NativeOnMouseEnter(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
134 virtual void NativeOnMouseLeave(const FPointerEvent& InMouseEvent) override;
135 virtual FReply NativeOnMouseButtonDown(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
136 virtual FReply NativeOnMouseButtonUp(const FGeometry& InGeometry, const FPointerEvent& InMouseEvent) override;
138 bool ShouldDisplayHoverMenu() const;
144 void BeginLongPress();
145 void CancelLongPress();
146 void OnLongPressElapsed();
147 bool ShouldDisplayActionsMenu() const;
148 void CreateActionsMenuAnchor();
151 UUserWidget* CreateActionsMenu();
154 void CreateAttachmentWidgets();
162 void CreateThreadFooter();
163 bool ShouldDisplayThreadFooter() const;
164 FText GetThreadFooterText() const;
173 void CreateModerationWarning();
174 bool ShouldDisplayModerationWarning() const;
177 void OnThreadFooterClicked();
179 // Only valid while hovered
181 UMessageHoverMenuWidget* MouseHoverMenu;
183 // Only valid if message has reactions
185 UMessageReactionsWidget* Reactions;
187 // Live in AlignPanel rather than a panel of their own, so tracked here to be replaced on re-setup
189 TArray<UAttachmentWidget*> Attachments;
191 // Also lives in AlignPanel, for the same reason: WBP_Message has no slot for it
193 UButton* ThreadFooterButton;
196 UTextBlock* ThreadFooterText;
200 UTextBlock* ModerationWarningText;
205 UMenuAnchor* ActionsMenuAnchor;
207 FTimerHandle LongPressTimer;
209 FVector2D PressPosition = FVector2D::ZeroVector;