Widget Studio
WSModernButton.h
1/*
2* Copyright (c) 2021 THEIA INTERACTIVE. All rights reserved.
3*
4* Website: https://widgetstudio.design
5* Documentation: https://docs.widgetstudio.design
6* Support: marketplace@theia.io
7* Marketplace FAQ: https://marketplacehelp.epicgames.com
8*/
9
10#pragma once
11
12#include "CoreMinimal.h"
13
14#include "Widgets/WSButtonBase.h"
15#include "Widgets/Modern/WSModernCard.h"
16#include "Widgets/Basic/WSIcon.h"
17#include "Widgets/Basic/WSText.h"
18#include "Components/HorizontalBox.h"
19#include "Components/Image.h"
20#include "Components/InvalidationBox.h"
21#include "Components/Overlay.h"
22#include "Components/ScaleBox.h"
23#include "Components/Spacer.h"
24#include "Components/VerticalBox.h"
25#include "WSModernButton.generated.h"
26
27UENUM(BlueprintType, META=(
28 Tooltip = "The location of the icon in conjunction to the widget.",
29 DeprecatedNode,
30 DeprecationMessage = "Use EWSPlacement instead.")
31)
32enum class EPlacement : uint8
33{
34 Left UMETA(DisplayName="Left"),
35 Right UMETA(DisplayName="Right"),
36 Top UMETA(DisplayName="Top"),
37 Bottom UMETA(DisplayName="Bottom"),
38
39 IconPlacement_Max UMETA(Hidden),
40};
41
42UENUM(BlueprintType, META=(
43 Tooltip = "The overall style of the button.",
44 ScriptName="ButtonStyling")
45)
46enum class EButtonStyle : uint8
47{
48 Solid UMETA(DisplayName="Solid"),
49 Line UMETA(DisplayName="Outline"),
50 Content UMETA(DisplayName="Content"),
51
52 ButtonStyle_Max UMETA(Hidden),
53};
54
55UENUM(BlueprintType, META=(
56 Tooltip = "The style of the buttons content.")
57)
58enum class EButtonContentStyle : uint8
59{
60 IconWithLabel UMETA(DisplayName="Text + Icon"),
61 Label UMETA(DisplayName="Text"),
62 Icon UMETA(DisplayName="Icon"),
63
64 ButtonStyle_Max UMETA(Hidden),
65};
66
71USTRUCT(BlueprintType)
73{
74 GENERATED_BODY()
75
76 // TODO: Re-add EditConditionHides meta properties back in 5.0 when the crash has been fixed. https://issues.unrealengine.com/issue/UE-117661
77 // TODO: Change FButtonOptions to FWSButtonOptions to avoid naming conflicts with other plugins in the future.
78
79
80 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widget Studio")
81 EButtonContentStyle ContentStyle;
82
84 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widget Studio", Meta = (EditCondition = "ContentStyle != EButtonContentStyle::Icon"))
85 FText Text;
86
88 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widget Studio", Meta = (EditCondition = "ContentStyle != EButtonContentStyle::Label"))
89 EIconItem Icon;
90
95 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widget Studio", Meta = (EditCondition = "ContentStyle != EButtonContentStyle::Label"))
96 UTexture2D* CustomIcon;
97
99 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Widget Studio", Meta = (MultiLine = true))
100 FText ToolTip;
101
107 UPROPERTY(EditAnywhere, Category = "Widget Studio")
108 bool bIsCheckedStateLocked;
109
110 explicit FButtonOptions(
111 const EButtonContentStyle InContentStyle = EButtonContentStyle::Label,
112 const bool bInIsCheckedStateLocked = false,
113 const FText InText = FText().FromString("New Option"),
114 const EIconItem InIcon = EIconItem::Heart,
115 UTexture2D* InCustomIcon = nullptr
116 )
117 {
118 bIsCheckedStateLocked = bInIsCheckedStateLocked;
119 ContentStyle = InContentStyle;
120 Text = InText;
121 Icon = InIcon;
122 CustomIcon = InCustomIcon;
123 }
124};
125
129UCLASS()
130class WIDGETSTUDIORUNTIME_API UWidgetStudioModernButton : public UWidgetStudioButtonBase
131{
132 GENERATED_BODY()
133
134protected:
135
136 virtual TSharedRef<SWidget> RebuildWidget() override;
137 virtual int32 NativePaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override;
138 virtual void SynchronizeProperties() override;
139 virtual void InitializeStyling() override;
140 virtual void UpdateStyling() override;
141
142 // Internal Functions
143 void UpdateContentPositionsAndStyling() const;
144
145 // Internal Properties
146 const float BaseDropShadowOpacity = .15;
147
148 UPROPERTY()
149 float ShadowLength;
150
151 // Widget Components
152
153 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
154 UInvalidationBox* Retainer = nullptr;
155
156 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
157 USizeBox* SizeBox = nullptr;
158
159 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
160 UOverlay* Overlay = nullptr;
161
162 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
163 UOverlay* BackgroundOverlay = nullptr;
164
165 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
166 UOverlay* ContentOverlay = nullptr;
167
168 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
169 UScaleBox* BackgroundScaleBox = nullptr;
170
171 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
172 UImage* DropShadow = nullptr;
173
174 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
175 UImage* Background = nullptr;
176
177 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
178 UHorizontalBox* HorizontalContent = nullptr;
179
180 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
181 UVerticalBox* VerticalContent = nullptr;
182
183 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
184 UWidgetStudioIcon* IconItem = nullptr;
185
186 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
187 USpacer* SpacerItem = nullptr;
188
189 UPROPERTY(BlueprintReadOnly, Category = "Widgets")
190 UWidgetStudioText* TextItem = nullptr;
191
192private:
193
194 // General
195
197 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (InLineCategoryProperty))
198 EButtonContentStyle ContentStyle = EButtonContentStyle::Label;
199
201 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle != EButtonContentStyle::Icon", EditConditionHides))
202 FText Text = FText().FromString("Button");
203
205 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle != EButtonContentStyle::Icon", EditConditionHides))
206 FWSTextStyle TextStyle = FWSTextStyle(
207 EWSFontType::Button,
208 FFontStyle(),
209 EFontCase::Sentence,
210 ETextJustify::Center,
211 false,
212 0,
213 ETextWrappingPolicy::DefaultWrapping);
214
216 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle != EButtonContentStyle::Label", EditConditionHides))
217 EIconItem Icon = EIconItem::Heart;
218
223 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle != EButtonContentStyle::Label", EditConditionHides))
224 UTexture2D* CustomIcon;
225
230 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle == EButtonContentStyle::IconWithLabel", EditConditionHides))
231 EWSPlacement IconPlacement = EWSPlacement::Left;
232
234 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle != EButtonContentStyle::Label", EditConditionHides))
235 FWSIconStyle IconStyle;
236
238 UPROPERTY(EditAnywhere, Category = "Widget Studio", Meta = (EditCondition="ContentStyle != EButtonContentStyle::Icon", EditConditionHides))
239 TEnumAsByte<EHorizontalAlignment> ContentAlignment = HAlign_Center;
240
241 // Colors
242
244 UPROPERTY(EditAnywhere, Category = "Widget Studio|Color")
245 EPalette StandardBackgroundColor = EPalette::TertiaryBackground;
246
248 UPROPERTY(EditAnywhere, Category = "Widget Studio|Color")
249 EPalette CheckedBackgroundColor = EPalette::PrimaryAccent;
250
252 UPROPERTY(EditAnywhere, Category = "Widget Studio|Color")
253 EPalette StandardContentColor = EPalette::PrimaryContent;
254
256 UPROPERTY(EditAnywhere, Category = "Widget Studio|Color")
257 EPalette CheckedContentColor = EPalette::TertiaryBackground;
258
259 // Styling
260
262 UPROPERTY(EditAnywhere, Category = "Widget Studio|Style")
263 EButtonStyle ButtonStyle = EButtonStyle::Solid;
264
266 UPROPERTY(EditAnywhere, Category = "Widget Studio|Style")
267 float ContentPadding = 10;
268
270 UPROPERTY(EditAnywhere, Category = "Widget Studio|Style", Meta = (EditCondition="ButtonStyle != EButtonStyle::Content", EditConditionHides))
271 ECornerStyle CornerStyle = ECornerStyle::Rounded;
272
274 UPROPERTY(EditAnywhere, Category = "Widget Studio|Style", Meta = (EditCondition="ButtonStyle != EButtonStyle::Content", EditConditionHides))
275 EShadowStyle ShadowStyle = EShadowStyle::Small;
276
277public:
278
279 // Helpers
280
282 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Text")
283 bool IsTextValid() const;
284
286 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Text")
287 FText GetText() const;
288
290 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Text")
291 FWSTextStyle GetTextOptions() const;
292
293
295 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Icon")
296 bool IsIconValid() const;
297
299 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Icon")
300 EIconItem GetIcon() const;
301
303 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Icon")
304 FWSIconStyle GetIconOptions() const;
305
307 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Icon")
308 bool IsIconColoredByPalette() const;
309
311 UFUNCTION(BlueprintGetter, Category="Widget Studio|Helper")
312 bool IsUsingCustomIcon() const;
313
315 UFUNCTION(BlueprintGetter, Category="Widget Studio|Helper")
316 UTexture2D* GetCustomIcon() const;
317
318
320 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Color")
321 EPalette GetStandardBackgroundColor() const;
322
324 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Color")
325 EPalette GetCheckedBackgroundColor() const;
326
328 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Color")
329 EPalette GetStandardContentColor() const;
330
332 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Color")
333 EPalette GetCheckedContentColor() const;
334
336 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Style")
337 EWSPlacement GetIconPlacement() const;
338
340 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Style")
341 ECornerStyle GetCornerStyle() const;
342
344 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Style")
345 EButtonStyle GetButtonStyle() const;
346
348 UFUNCTION(BlueprintGetter, Category = "Widget Studio|Helper|Style")
349 EButtonContentStyle GetContentStyle() const;
350
351
352 // Modifiers
353
358 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Text")
359 void SetText(FText NewText);
360
365 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Text")
366 void SetTextOptions(FWSTextStyle NewTextOptions);
367
372 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier")
373 void SetAlignment(TEnumAsByte<EHorizontalAlignment> NewAlignment);
374
375
380 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Icon")
381 void SetIcon(EIconItem NewIcon);
382
387 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Icon")
388 void SetIconOptions(FWSIconStyle NewIconOptions);
389
394 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Icon")
395 void SetIconPlacement(EWSPlacement NewIconPlacement);
396
401 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Icon")
402 void SetColorIconByPalette(bool NewState);
403
408 UFUNCTION(BlueprintSetter, Category="Widget Studio|Modifier")
409 void SetCustomIcon(UTexture2D* NewCustomIcon);
410
412 UFUNCTION(BlueprintSetter, Category="Widget Studio|Modifier")
413 void ClearCustomIcon();
414
415
420 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Color")
421 void SetStandardBackgroundColor(EPalette NewColor);
422
427 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Color")
428 void SetCheckedBackgroundColor(EPalette NewColor);
429
434 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Color")
435 void SetStandardContentColor(EPalette NewColor);
436
441 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Color")
442 void SetCheckedContentColor(EPalette NewColor);
443
444
449 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Style")
450 void SetCornerStyle(ECornerStyle NewCornerStyle);
451
456 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Style")
457 void SetButtonStyle(EButtonStyle NewButtonStyle);
458
463 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier|Style")
464 void SetContentStyle(EButtonContentStyle NewContentStyle);
465
470 UFUNCTION(BlueprintSetter, Category = "Widget Studio|Modifier")
471 void SetOptions(FButtonOptions NewOptions);
472};
Contain the fundamental logic for a Widget Studio button.
Definition: WSButtonBase.h:27
A pre-setup widget that works with power of two icons.
Definition: WSIcon.h:53
A fully styled functional button from the Widget Studio.
Definition: WSModernButton.h:131
A custom text widget setup to work with the Typography Styling.
Definition: WSText.h:92
Contains the data for a Widget Studio Modern Button.
Definition: WSModernButton.h:73
Struct with font weight, size, and letter spacing.
Definition: WSTypography.h:23
The settings for the Widget Studio Icon Widget.
Definition: WSIcon.h:27
The settings for the Widget Studio Text.
Definition: WSText.h:23