// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "SCompoundWidget.h" #include "Singleton/MidiSequencer.h" class SUpdatableTexture; class FPatternInstance; class FUpdatableTexture; struct FPatternInstanceClickData { FPatternInstance* PatternInstance; double MidiTimestampOffset; }; DECLARE_DELEGATE_RetVal_OneParam(FReply, FPatternInstanceClickDelegate, FPatternInstanceClickData) /** * */ class ARONA_API SPatternInstance : public SCompoundWidget { public: enum class ResizeDir { None, Left, Right, }; SLATE_BEGIN_ARGS(SPatternInstance) {} SLATE_ARGUMENT(FPatternInstance*, PatternInstance) SLATE_ATTRIBUTE(float, FrameToPixel) SLATE_ATTRIBUTE(AudioFrame, SnapFrame) SLATE_ATTRIBUTE(TRange, FrameViewRange) SLATE_END_ARGS() /** Constructs this widget with InArgs */ virtual void Construct(const FArguments& InArgs); virtual FReply OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; virtual FReply OnMouseButtonUp(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; virtual FReply OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) override; virtual TSharedRef GetViewWidget() = 0; virtual void RequestUpdate() = 0; FPatternInstance* GetPatternInstance() const { return PatternInstance; } TRange GetTimeRange() const { return PatternInstance->TimeRange; } TRange GetFrameViewRange() const { return FrameViewRange.Get(); } float ResizeHandleSize = 5.f; protected: virtual FReply OpenPatternMenu() { return FReply::Unhandled(); } ResizeDir ResizeDirection = ResizeDir::None; FPatternInstance* PatternInstance = nullptr; TAttribute FrameToPixel; TAttribute SnapFrame; TAttribute> FrameViewRange; FVector2f MouseDownPos; // 屏幕坐标 AudioFrame BeginPatternEnd; AudioFrame BeginPatternStart; AudioFrame BeginPatternPos; mutable FVector2f LastSize; };