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

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