// Fill out your copyright notice in the Description page of Project Settings. #include "SPatternSelector.h" #include "SPatternThumbnail.h" #include "SInvalidationPanel.h" #include "SlateOptMacros.h" #include "SMenuAnchor.h" #include "SScrollBox.h" #include "Singleton/MidiSequencer.h" #include "UI/Widget/ChannelRack/ChannelRackMidiThumbnail.h" BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SPatternSelector::Construct(const FArguments& InArgs) { FPatternSelector::Get().OnPatternSelected.AddRaw(this, &SPatternSelector::OnPatternSelected); FPatternSelector::Get().OnPatternDeselected.AddRaw(this, &SPatternSelector::OnPatternDeselected); PatternList = SNew(SScrollBox); ChildSlot [ SAssignNew(MenuAnchor, SMenuAnchor) .OnGetMenuContent(this, &SPatternSelector::CreatePatternList) .Placement(EMenuPlacement::MenuPlacement_ComboBox) [ SAssignNew(SelectPatternName, STextBlock) ] ]; FMidiSequencer::Get().OnNewPattern.AddRaw(this, &SPatternSelector::OnNewPattern); FMidiSequencer::Get().OnDeletePattern.AddRaw(this, &SPatternSelector::OnDeletePattern); for (FPattern* MidiPattern : FMidiSequencer::Get().GetPattern(EPatternType::Midi)) { OnNewPattern(MidiPattern); } } FReply SPatternSelector::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) { if (MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton) { MenuAnchor->SetIsOpen(true); } return SCompoundWidget::OnMouseButtonDown(MyGeometry, MouseEvent); } void SPatternSelector::OnPatternSelected(FPattern* Pattern) { SelectPatternName->SetText(FText::FromString(Pattern->Name)); MenuAnchor->SetIsOpen(false); FPatternSelector::Get().SelectPattern(Pattern); } void SPatternSelector::OnPatternDeselected(FPattern* Pattern) { SelectPatternName->SetText(FText::FromString("无")); } void SPatternSelector::OnNewPattern(FPattern* Pattern) { const TSharedRef PatternThumbnail = SNew(SAutoPatternThumbnail, Pattern); PatternThumbnail->OnPatternClicked.AddRaw(this, &SPatternSelector::OnPatternSelected); PatternList->AddSlot() .HAlign(HAlign_Fill) [ PatternThumbnail ]; } void SPatternSelector::OnDeletePattern(FPattern* Pattern) { const TSharedPtr& ScrollPanel = PatternList->GetScrollPanel(); FChildren* Children = ScrollPanel->GetChildren(); for (int32 i = 0; i < Children->Num(); ++i) { TSharedRef Child = Children->GetChildAt(i); TSharedRef ThumbnailWidget = StaticCastSharedRef(Child); if (ThumbnailWidget->GetPattern() == Pattern) { PatternList->RemoveSlot(Child); break; } } } TSharedRef SPatternSelector::CreatePatternList() { return PatternList.ToSharedRef(); } END_SLATE_FUNCTION_BUILD_OPTIMIZATION