AronaSlate/Source/Arona/UI/Widget/Pattern/SPatternInstance.h

77 lines
2.0 KiB
C++

// 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<AudioFrame>, 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<SWidget> GetViewWidget() = 0;
virtual void RequestUpdate() = 0;
FPatternInstance* GetPatternInstance() const { return PatternInstance; }
TRange<AudioFrame> GetTimeRange() const { return PatternInstance->TimeRange; }
TRange<AudioFrame> GetFrameViewRange() const { return FrameViewRange.Get(); }
float ResizeHandleSize = 5.f;
protected:
virtual FReply OpenPatternMenu() { return FReply::Unhandled(); }
ResizeDir ResizeDirection = ResizeDir::None;
FPatternInstance* PatternInstance = nullptr;
TAttribute<float> FrameToPixel;
TAttribute<AudioFrame> SnapFrame;
TAttribute<TRange<AudioFrame>> FrameViewRange;
FVector2f MouseDownPos; // 屏幕坐标
AudioFrame BeginPatternEnd;
AudioFrame BeginPatternStart;
AudioFrame BeginPatternPos;
mutable FVector2f LastSize;
};