// 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