94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
// 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<SAutoPatternThumbnail> PatternThumbnail = SNew(SAutoPatternThumbnail, Pattern);
|
|
PatternThumbnail->OnPatternClicked.AddRaw(this, &SPatternSelector::OnPatternSelected);
|
|
PatternList->AddSlot()
|
|
.HAlign(HAlign_Fill)
|
|
[
|
|
PatternThumbnail
|
|
];
|
|
}
|
|
|
|
void SPatternSelector::OnDeletePattern(FPattern* Pattern)
|
|
{
|
|
const TSharedPtr<SScrollPanel>& ScrollPanel = PatternList->GetScrollPanel();
|
|
FChildren* Children = ScrollPanel->GetChildren();
|
|
for (int32 i = 0; i < Children->Num(); ++i)
|
|
{
|
|
TSharedRef<SWidget> Child = Children->GetChildAt(i);
|
|
TSharedRef<SAutoPatternThumbnail> ThumbnailWidget = StaticCastSharedRef<SAutoPatternThumbnail>(Child);
|
|
if (ThumbnailWidget->GetPattern() == Pattern)
|
|
{
|
|
PatternList->RemoveSlot(Child);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
TSharedRef<SWidget> SPatternSelector::CreatePatternList()
|
|
{
|
|
return PatternList.ToSharedRef();
|
|
}
|
|
|
|
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
|