144 lines
3.7 KiB
C++
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
|