AronaSlate/Source/Arona/UI/Widget/ChannelRack/ChannelRackItem.cpp
2024-01-25 11:21:15 +08:00

144 lines
3.7 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "ChannelRackItem.h"
#include "ChannelRackMidiThumbnail.h"
#include "MultiBoxBuilder.h"
#include "SBox.h"
#include "SButton.h"
#include "SImage.h"
#include "SlateApplication.h"
#include "SlateOptMacros.h"
#include "SSplitter.h"
#include "PluginHost/PluginHost.h"
#include "Singleton/PluginHostList.h"
#include "UI/Widget/WindowManager.h"
#include "UI/Widget/ChannelInterface/SPluginHostChannelInterface.h"
#include "Widgets/SBoxPanel.h"
BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
#define LOCTEXT_NAMESPACE "FChannelRack"
void SChannelRackItem::Construct(const FArguments& InArgs, FPluginHost* InPluginHost)
{
PluginHost = InPluginHost;
ChildSlot
[
SAssignNew(Splitter, SSplitter)
.ResizeMode(ESplitterResizeMode::FixedSize)
+SSplitter::Slot()
.OnSlotResized(InArgs._OnSplliterAPositionChanged)
.MinSize(32)
[
SNew(SHorizontalBox)
+SHorizontalBox::Slot()
.AutoWidth()
[
SNew(SCheckBox)
.IsChecked(PluginHost->IsEnabled() ? ECheckBoxState::Checked : ECheckBoxState::Unchecked)
.OnCheckStateChanged(this, &SChannelRackItem::SetPluginHostEnabled)
]
+SHorizontalBox::Slot()
.FillWidth(1.f)
.VAlign(VAlign_Top)
[
SNew(SButton)
.Text(FText::FromString(PluginHost->Name))
.OnClicked(this, &SChannelRackItem::TogglePluginHostEditor)
]
]
+SSplitter::Slot()
.OnSlotResized(InArgs._OnSplliterBPositionChanged)
[
SNew(SBox)
.HeightOverride(64)
[
SAssignNew(MidiThumbnail, SChannelRackMidiThumbnail, PluginHost)
.Pattern(nullptr)
]
]
];
}
FReply SChannelRackItem::OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
if (MouseEvent.GetEffectingButton() == EKeys::RightMouseButton)
{
ShowPluginHostMenu();
return FReply::Handled();
}
return FReply::Unhandled();
}
void SChannelRackItem::SetPattern(FMidiPattern* InPattern)
{
MidiThumbnail->SetPattern(InPattern);
}
void SChannelRackItem::SetSplliterASize(float X)
{
Splitter->SlotAt(0).SetSizeValue(X);
}
void SChannelRackItem::SetSplliterBSize(float X)
{
Splitter->SlotAt(1).SetSizeValue(X);
}
void SChannelRackItem::ShowPluginHostMenu()
{
FMenuBuilder MenuBuilder(true, nullptr);
// MenuBuilder.BeginSection("ChannelRackItem", FText::FromString("ChannelRackItem"));
MenuBuilder.AddMenuEntry(
LOCTEXT("OpenChannelInterface", "打开通道面板"),
LOCTEXT("OpenChannelInterface_ToolTip", "打开一个通道面板窗口"),
FSlateIcon(),
FUIAction(FExecuteAction::CreateRaw(this, &SChannelRackItem::ShowPluginHostChannelInterface))
);
MenuBuilder.AddMenuEntry(
LOCTEXT("DeletePluginHost", "删除插件"),
FText(),
FSlateIcon(),
FUIAction(FExecuteAction::CreateRaw(this, &SChannelRackItem::DeletePluginHost))
);
// MenuBuilder.EndSection();
FSlateApplication::Get().PushMenu(SharedThis(this), FWidgetPath(), MenuBuilder.MakeWidget(), FSlateApplication::Get().GetCursorPos(), FPopupTransitionEffect::ContextMenu);
}
void SChannelRackItem::SetPluginHostEnabled(ECheckBoxState CheckBoxState)
{
PluginHost->SetEnabled(CheckBoxState == ECheckBoxState::Checked);
}
FReply SChannelRackItem::TogglePluginHostEditor()
{
FWindowManager::Get().TogglePluginEditor(PluginHost);
return FReply::Handled();
}
void SChannelRackItem::ShowPluginHostChannelInterface()
{
FMenuBuilder MenuBuilder(true, nullptr);
MenuBuilder.AddWidget(
SNew(SPluginHostChannelInterface, PluginHost),
FText()
);
FSlateApplication::Get().PushMenu(SharedThis(this), FWidgetPath(), MenuBuilder.MakeWidget(), FSlateApplication::Get().GetCursorPos(), FPopupTransitionEffect::ComboButton);
}
void SChannelRackItem::DeletePluginHost()
{
FPluginHostList::Get().RemoveInstrument(PluginHost);
}
END_SLATE_FUNCTION_BUILD_OPTIMIZATION
#undef LOCTEXT_NAMESPACE