#include "UI/NeuGallery.h" #include "UI/NeuIcons.h" #include "UI/NeuWidgets.h" #include "Styling/CoreStyle.h" #include "Widgets/Images/SImage.h" #include "Widgets/Layout/SBox.h" #include "Widgets/SBoxPanel.h" #include "Widgets/SOverlay.h" namespace { TSharedRef GalleryTitle(const TCHAR* Text) { return SNew(SBox).HeightOverride(22.f) [ SNew(SNeuText).Text(FString(Text)).Weight(ENeuFont::Bold).Px(13.f).Color(Neu::Dim()) ]; } TSharedRef GallerySection(const TCHAR* Title, const TSharedRef& Body) { return SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(4.f, 0.f, 0.f, 6.f)[ GalleryTitle(Title) ] + SVerticalBox::Slot().AutoHeight()[ Body ]; } TSharedRef GalleryButton(const TCHAR* Text, bool bHover, bool bPress, bool bOn, bool bEnabled, FName Icon = NAME_None) { TSharedRef B = SNew(SNeuButton).Text(FString(Text)).On(bOn).IconItem(Icon).MinWidth(112.f).Px(15.f).Height(36.f); B->ForceState(bHover, bPress); B->SetEnabled(bEnabled); return B; } } TSharedRef Neu::MakeGallery() { const FLinearColor Cyan = Neu::Cyan(); const FLinearColor Amber = Neu::Amber(); const FLinearColor Red = Neu::Red(); const FLinearColor Green = Neu::Green(); // ---- column A ---- TSharedRef Panels = SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 22.f, 0.f) [ SNew(SBox).WidthOverride(150.f).HeightOverride(64.f) [ SNew(SNeuPanel).Padding(FMargin(12.f))[ SNew(SNeuText).Text(TEXT("EXTRUDED")).Weight(ENeuFont::Bold).Px(14.f).Color(Neu::Txt()) ] ] ] + SHorizontalBox::Slot().AutoWidth() [ SNew(SBox).WidthOverride(150.f).HeightOverride(64.f) [ SNew(SNeuPanel).Inset(true).Padding(FMargin(12.f))[ SNew(SNeuText).Text(TEXT("INSET WELL")).Weight(ENeuFont::Bold).Px(14.f).Color(Neu::Dim()) ] ] ]; TSharedRef Buttons = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 14.f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 16.f, 0.f)[ GalleryButton(TEXT("NORMAL"), false, false, false, true) ] + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 16.f, 0.f)[ GalleryButton(TEXT("HOVER"), true, false, false, true) ] + SHorizontalBox::Slot().AutoWidth()[ GalleryButton(TEXT("PRESSED"), true, true, false, true) ] ] + SVerticalBox::Slot().AutoHeight() [ SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 16.f, 0.f)[ GalleryButton(TEXT("ON"), false, false, true, true) ] + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 16.f, 0.f)[ GalleryButton(TEXT("DISABLED"), false, false, false, false) ] + SHorizontalBox::Slot().AutoWidth()[ GalleryButton(TEXT("WITH ICON"), false, false, false, true, TEXT("ingot")) ] ]; TSharedRef SliderOff = SNew(SNeuSlider).Value(0.6f).Width(300.f).ValueText(TEXT("60%")); SliderOff->SetEnabled(false); TSharedRef Sliders = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight()[ SNew(SNeuSlider).Value(0.0f).Width(300.f).ValueText(TEXT("0%")) ] + SVerticalBox::Slot().AutoHeight()[ SNew(SNeuSlider).Value(0.5f).Width(300.f).ValueText(TEXT("50%")) ] + SVerticalBox::Slot().AutoHeight()[ SNew(SNeuSlider).Value(1.0f).Width(300.f).ValueText(TEXT("100%")) ] + SVerticalBox::Slot().AutoHeight()[ SliderOff ]; TSharedRef Bars = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 8.f)[ SNew(SBox).WidthOverride(300.f)[ SNew(SNeuProgress).Value(0.0f).Height(16.f) ] ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 8.f)[ SNew(SBox).WidthOverride(300.f)[ SNew(SNeuProgress).Value(0.45f).Height(16.f).Text(TEXT("45%")) ] ] + SVerticalBox::Slot().AutoHeight()[ SNew(SBox).WidthOverride(300.f)[ SNew(SNeuProgress).Value(1.0f).Height(16.f).Color(Red).Text(TEXT("FULL")) ] ]; TSharedRef ColA = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 18.f)[ GallerySection(TEXT("PANELS"), Panels) ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 18.f)[ GallerySection(TEXT("BUTTONS"), Buttons) ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 14.f)[ GallerySection(TEXT("SLIDERS (0, 50, 100, DISABLED)"), Sliders) ] + SVerticalBox::Slot().AutoHeight()[ GallerySection(TEXT("PROGRESS"), Bars) ]; // ---- column B ---- auto Gauge = [](float V, const TCHAR* Text, const TCHAR* Label, FLinearColor C, float D = 72.f, bool bGlow = false) -> TSharedRef { return SNew(SBox).Padding(FMargin(0.f, 0.f, 14.f, 0.f)) [ SNew(SNeuGauge).Value(V).ValueText(FString(Text)).Label(FString(Label)).Color(C).Diameter(D).Glow(bGlow) ]; }; TSharedRef Gauges = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight() [ SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth()[ Gauge(0.97f, TEXT("97"), TEXT("HEALTH"), Cyan) ] + SHorizontalBox::Slot().AutoWidth()[ Gauge(0.55f, TEXT("38s"), TEXT("O2"), Amber) ] + SHorizontalBox::Slot().AutoWidth()[ Gauge(0.12f, TEXT("12"), TEXT("HULL"), Red) ] + SHorizontalBox::Slot().AutoWidth()[ Gauge(1.0f, TEXT("100"), TEXT("FOOD"), Green) ] + SHorizontalBox::Slot().AutoWidth()[ Gauge(0.0f, TEXT("0"), TEXT("EMPTY"), Cyan, 56.f) ] ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 8.f, 0.f, 0.f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth()[ Gauge(0.72f, TEXT("72%"), TEXT("POWER GLOW"), Amber, 120.f, true) ] + SHorizontalBox::Slot().AutoWidth()[ Gauge(0.33f, TEXT("33"), TEXT("NARROW 56"), Green, 56.f) ] ]; auto Slot = [](const TCHAR* Item, int32 Count, bool bSel, const TCHAR* Key) -> TSharedRef { return SNew(SBox).Padding(FMargin(0.f, 0.f, 12.f, 0.f)) [ SNew(SNeuSlot).ItemId(FName(Item)).Count(Count).Selected(bSel).KeyLabel(FString(Key)) ]; }; TSharedRef Slots = SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth()[ Slot(TEXT(""), 0, false, TEXT("1")) ] + SHorizontalBox::Slot().AutoWidth()[ Slot(TEXT("flashlight"), 1, false, TEXT("2")) ] + SHorizontalBox::Slot().AutoWidth()[ Slot(TEXT("flare"), 3, true, TEXT("3")) ] + SHorizontalBox::Slot().AutoWidth()[ Slot(TEXT("scanner"), 1, false, TEXT("4")) ] + SHorizontalBox::Slot().AutoWidth()[ Slot(TEXT("ferrite"), 7, false, TEXT("5")) ]; auto Cell = [](const TCHAR* Item, int32 Count, bool bSel, const TCHAR* Cap, bool bGrey) -> TSharedRef { return SNew(SBox).Padding(FMargin(0.f, 0.f, 14.f, 0.f)) [ SNew(SNeuCell).ItemId(FName(Item)).Count(Count).Selected(bSel).Caption(FString(Cap)).Greyed(bGrey) ]; }; TSharedRef Cells = SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth()[ Cell(TEXT(""), 0, false, TEXT(""), false) ] + SHorizontalBox::Slot().AutoWidth()[ Cell(TEXT("cobalt"), 4, false, TEXT("Cobalt"), false) ] + SHorizontalBox::Slot().AutoWidth()[ Cell(TEXT("tank1"), 1, true, TEXT("O2 tank"), false) ] + SHorizontalBox::Slot().AutoWidth()[ Cell(TEXT("weapon"), 0, false, TEXT("WEAPON"), true) ]; TSharedRef ColB = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 18.f)[ GallerySection(TEXT("GAUGES (270 DEG ARC, NO NEEDLE)"), Gauges) ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 18.f)[ GallerySection(TEXT("HOTBAR SLOTS (EMPTY, ITEM, SELECTED)"), Slots) ] + SVerticalBox::Slot().AutoHeight()[ GallerySection(TEXT("INVENTORY CELLS (EMPTY, ITEM, SELECTED, LOCKED)"), Cells) ]; // ---- column C ---- TArray Costs; Costs.Add({ TEXT("3 Ingot"), Neu::Green() }); Costs.Add({ TEXT("1 Wafer"), Neu::Red() }); TSharedRef Rows = SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 24.f, 0.f) [ SNew(SBox).WidthOverride(560.f)[ SNew(SNeuRow).ItemId(TEXT("tank2")).Name(TEXT("Ultra O2 Tank")).Desc(TEXT("150 s of air")).Chips(Costs).ButtonText(TEXT("BUILD")) ] ] + SHorizontalBox::Slot().AutoWidth() [ SNew(SBox).WidthOverride(560.f)[ SNew(SNeuRow).ItemId(TEXT("kit_refinery")).Name(TEXT("Refinery")).Desc(TEXT("Locked: needs a Wafer")).Chips(Costs).ButtonText(TEXT("BUILD")).Locked(true) ] ]; TSharedRef IconsA = SNew(SHorizontalBox); TSharedRef IconsB = SNew(SHorizontalBox); TSharedRef IconsC = SNew(SHorizontalBox); const TCHAR* Items[] = { TEXT("ferrite"), TEXT("cobalt"), TEXT("pearl"), TEXT("ingot"), TEXT("wafer"), TEXT("lattice"), TEXT("flashlight"), TEXT("scanner"), TEXT("propulsor"), TEXT("flare"), TEXT("beacon"), TEXT("tank1"), TEXT("silverfin"), TEXT("jelly"), TEXT("polyp"), TEXT("weapon"), TEXT("orebox"), TEXT("kit_locker"), TEXT("kit_fabricator"), TEXT("mystery") }; for (int32 I = 0; I < UE_ARRAY_COUNT(Items); ++I) { (I < 7 ? IconsA : (I < 14 ? IconsB : IconsC))->AddSlot().AutoWidth().Padding(0.f, 0.f, 6.f, 0.f) [ SNew(SNeuIcon).ItemId(FName(Items[I])).Size(36.f) ]; } TSharedRef Icons = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 6.f)[ IconsA ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 6.f)[ IconsB ] + SVerticalBox::Slot().AutoHeight()[ IconsC ]; TArray Tabs = { { TEXT("one"), TEXT("ONE") }, { TEXT("two"), TEXT("TWO") } }; TSharedRef Window = SNew(SBox).WidthOverride(340.f).HeightOverride(150.f) [ SNew(SNeuWindow).Title(TEXT("PDA")).Tabs(Tabs).ActiveTab(FName(TEXT("one"))).DesiredWidth(340.f).DesiredHeight(150.f).TabMinWidth(70.f) [ SNew(SNeuPanel).Inset(true).Padding(FMargin(12.f)) [ SNew(SNeuText).Text(TEXT("Window body, an inset well.")).Px(14.f).Color(Neu::Dim()) ] ] ]; TSharedRef ColC = SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight().Padding(0.f, 0.f, 0.f, 18.f)[ GallerySection(TEXT("ITEM ICONS, DRAWN IN CODE"), Icons) ] + SVerticalBox::Slot().AutoHeight()[ GallerySection(TEXT("WINDOW FRAME"), Window) ]; return SNew(SOverlay) + SOverlay::Slot() [ SNew(SImage).Image(FCoreStyle::Get().GetBrush("WhiteBrush")).ColorAndOpacity(Neu::Bg()) ] + SOverlay::Slot() [ SNew(SBox).Padding(FMargin(26.f, 18.f)) [ SNew(SVerticalBox) + SVerticalBox::Slot().AutoHeight() [ SNew(SHorizontalBox) + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 36.f, 0.f)[ ColA ] + SHorizontalBox::Slot().AutoWidth().Padding(0.f, 0.f, 36.f, 0.f)[ ColB ] + SHorizontalBox::Slot().AutoWidth()[ ColC ] ] + SVerticalBox::Slot().AutoHeight().Padding(0.f, 16.f, 0.f, 0.f)[ GallerySection(TEXT("ROWS (NORMAL, LOCKED)"), Rows) ] ] ]; }