104 lines
2.3 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "SPatternThumbnail.h"
#include "Async.h"
#include "SInvalidationPanel.h"
#include "SlateOptMacros.h"
#include "SMidiPatternThumbnail.h"
#include "SSamplePatternThumbnail.h"
#include "STextBlock.h"
#include "Pattern/Pattern.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SNullPatternThumbnail::Construct(const FArguments& InArgs, FText InText)
{
ChildSlot
[
SNew(STextBlock)
.Justification(ETextJustify::Center)
.Text(InText)
];
}
TSharedRef<SPatternThumbnail> SNullPatternThumbnail::Create(FText InText)
{
return SNew(SNullPatternThumbnail, InText);
}
void SAutoPatternThumbnail::Construct(const FArguments& InArgs, FPattern* InPattern)
{
SetPattern(InPattern);
}
void SAutoPatternThumbnail::SetPattern(FPattern* InPattern)
{
Pattern = InPattern;
ChildSlot.DetachWidget();
Thumbnail = CreateThumbnail(InPattern);
ChildSlot
[
SNew(SInvalidationPanel)
[
Thumbnail.ToSharedRef()
]
];
}
FReply SAutoPatternThumbnail::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
if (MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton && Thumbnail.IsValid())
{
if (Thumbnail->GetPattern())
{
OnPatternClicked.Broadcast(Thumbnail->GetPattern());
}
}
return FReply::Unhandled();
}
FVector2D SAutoPatternThumbnail::ComputeDesiredSize(float LayoutScaleMultiplier) const
{
return FVector2D(0, 36) * LayoutScaleMultiplier;
}
void SAutoPatternThumbnail::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
{
SCompoundWidget::Tick(AllottedGeometry, InCurrentTime, InDeltaTime);
if (bNeedRedraw)
{
Thumbnail->Redraw();
bNeedRedraw = false;
}
}
TSharedPtr<SPatternThumbnail> SAutoPatternThumbnail::CreateThumbnail(FPattern* InPattern)
{
TSharedPtr<SPatternThumbnail> Out;
if (!InPattern)
{
Out = SNullPatternThumbnail::Create(FText::FromString(TEXT("Null Pattern")));
}
else
{
switch (Pattern->Type)
{
case EPatternType::Midi:
SAssignNew(Out, SMidiPatternThumbnail);
break;
case EPatternType::Automation:
break;
case EPatternType::Sample:
SAssignNew(Out, SSamplePatternThumbnail, static_cast<FSamplePattern*>(InPattern)->GetSampler());
break;
default: ;
}
}
Out->SetPattern(InPattern);
return Out;
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION