// 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