Files
AronaSlate/Source/Arona/UI/Widget/PatternThumbnail/SMidiPatternThumbnail.cpp
2024-01-25 11:21:15 +08:00

72 lines
1.7 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "SMidiPatternThumbnail.h"
#include "SInvalidationPanel.h"
#include "SlateOptMacros.h"
#include "Render/UpdatableTexture.h"
#include "Pattern/MidiPattern.h"
#include "PluginHost/PluginHost.h"
#include "UI/Widget/SUpdatableImage.h"
#include "UI/Widget/Thumbnail.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
SMidiPatternThumbnail::~SMidiPatternThumbnail()
{
if (FMidiPattern* Pattern = (FMidiPattern*)GetPattern())
Pattern->OnChanged.RemoveAll(this);
}
void SMidiPatternThumbnail::Construct(const FArguments& InArgs)
{
ChildSlot
[
SNew(SInvalidationPanel)
[
SAssignNew(UpdatableImage, SUpdatableImage)
.OnPostResize(this, &SMidiPatternThumbnail::UpdateMidiThumbnail)
]
];
}
void SMidiPatternThumbnail::Redraw()
{
OnChanged(nullptr, nullptr);
}
void SMidiPatternThumbnail::OnPatternChanged(FPattern* OldPattern, FPattern* NewPattern)
{
FMidiPattern* OldMidiPattern = (FMidiPattern*)OldPattern;
FMidiPattern* NewMidiPattern = (FMidiPattern*)NewPattern;
check(NewPattern->Type == EPatternType::Midi)
if (OldMidiPattern)
OldMidiPattern->OnChanged.RemoveAll(this);
if (!NewMidiPattern)
return;
NewMidiPattern->OnChanged_MainThread.AddRaw(this, &SMidiPatternThumbnail::OnChanged);
}
void SMidiPatternThumbnail::OnChanged(FPluginHost* Host, FMidiMessageSequence* Changed)
{
if (!GetPattern())
return;
UpdatableImage->NeedRedraw();
}
void SMidiPatternThumbnail::UpdateMidiThumbnail(FImageData& ImageData)
{
if (!GetPattern())
return;
ImageData.ClearColor(FColor::Black);
FMidiPattern* Pattern = (FMidiPattern*)GetPattern();
Thumbnail::GenerateMidiPatternThumbnail(Pattern, ImageData, FColor::White);
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION