分割与删除
This commit is contained in:
parent
ebcd744d23
commit
c3ea0e6f1a
BIN
Resources/EffectPanel.png
Normal file
BIN
Resources/EffectPanel.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
BIN
Resources/TrackBar.png
Normal file
BIN
Resources/TrackBar.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 427 B |
@ -13,7 +13,7 @@ public class Cut5 : ModuleRules
|
|||||||
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||||
|
|
||||||
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "FFMPEGMedia", "FFMPEGMediaFactory"});
|
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "FFMPEGMedia", "FFMPEGMediaFactory"});
|
||||||
PrivateDependencyModuleNames.AddRange(new string[] {"RuntimeAudioImporter", "FFMPEGMedia", "FFMPEGMediaFactory", "Slate", "SlateCore", "UMG", "OpenCV", "DesktopPlatform", "PortAudioPlugin"});
|
PrivateDependencyModuleNames.AddRange(new string[] {"RuntimeAudioImporter", "FFMPEGMedia", "FFMPEGMediaFactory", "Slate", "SlateCore", "UMG", "OpenCV", "DesktopPlatform", "PortAudioPlugin", "EditorStyle"});
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,4 +25,9 @@ public:
|
|||||||
|
|
||||||
virtual void UpdateTimelineLength() {};
|
virtual void UpdateTimelineLength() {};
|
||||||
virtual void Seek(int32 Frame) {};
|
virtual void Seek(int32 Frame) {};
|
||||||
|
virtual void RemoveClip(const FGuid& Guid) {};
|
||||||
|
virtual void BreakClip(const FGuid& Guid) {};
|
||||||
|
|
||||||
|
FGuid SelectedClipGUID;
|
||||||
|
int32 SelectedClipFrame;
|
||||||
};
|
};
|
||||||
|
9
Source/Cut5/Widgets/Commands/TimelineClipCommands.cpp
Normal file
9
Source/Cut5/Widgets/Commands/TimelineClipCommands.cpp
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include "TimelineClipCommands.h"
|
||||||
|
|
||||||
|
#define LOCTEXT_NAMESPACE "FTimelineClipCommands"
|
||||||
|
void FTimelineClipCommands::RegisterCommands()
|
||||||
|
{
|
||||||
|
UI_COMMAND(Remove, "移除", "Executes My TimelineClipCommands", EUserInterfaceActionType::Button, FInputChord());
|
||||||
|
UI_COMMAND(Break, "分割", "Executes My TimelineClipCommands", EUserInterfaceActionType::Button, FInputChord());
|
||||||
|
}
|
||||||
|
#undef LOCTEXT_NAMESPACE
|
22
Source/Cut5/Widgets/Commands/TimelineClipCommands.h
Normal file
22
Source/Cut5/Widgets/Commands/TimelineClipCommands.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "Framework/Commands/Commands.h"
|
||||||
|
|
||||||
|
class FTimelineClipCommands : public TCommands<FTimelineClipCommands>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
FTimelineClipCommands()
|
||||||
|
: TCommands<FTimelineClipCommands>(TEXT("FTimelineClipCommands"), NSLOCTEXT("Contexts", "FTimelineClipCommands", "FTimelineClipCommands"), NAME_None, FAppStyle::GetAppStyleSetName())
|
||||||
|
{
|
||||||
|
// 这里可以设置你的命令的默认键盘快捷键
|
||||||
|
}
|
||||||
|
|
||||||
|
// TCommands<> 接口
|
||||||
|
virtual void RegisterCommands() override;
|
||||||
|
|
||||||
|
TSharedPtr<FUICommandInfo> Remove;
|
||||||
|
TSharedPtr<FUICommandInfo> Break;
|
||||||
|
};
|
@ -99,7 +99,7 @@ struct CUT5_API FClipData
|
|||||||
|
|
||||||
int32 GetClipStartFrame() const { return ClipStartTime / FGlobalData::DefaultTimeTickSpace; };
|
int32 GetClipStartFrame() const { return ClipStartTime / FGlobalData::DefaultTimeTickSpace; };
|
||||||
int32 GetClipEndFrame() const { return ClipEndTime / FGlobalData::DefaultTimeTickSpace; };
|
int32 GetClipEndFrame() const { return ClipEndTime / FGlobalData::DefaultTimeTickSpace; };
|
||||||
|
int32 GetClipRelativeEndFrame() const { return GetClipEndFrame() - GetClipStartFrame(); }
|
||||||
|
|
||||||
|
|
||||||
enum class ECropMethod
|
enum class ECropMethod
|
||||||
@ -112,15 +112,16 @@ struct CUT5_API FClipData
|
|||||||
if (CropMethod == ECropMethod::FromFront)
|
if (CropMethod == ECropMethod::FromFront)
|
||||||
{
|
{
|
||||||
ClipStartTime += CropFrame * FGlobalData::DefaultTimeTickSpace;
|
ClipStartTime += CropFrame * FGlobalData::DefaultTimeTickSpace;
|
||||||
if (ClipType == ETrackType::VideoTrack)
|
if (ClipType == ETrackType::VideoTrack || ClipType == ETrackType::AudioTrack)
|
||||||
{
|
{
|
||||||
VideoStartFrame += CropFrame;
|
VideoStartFrame += CropFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ClipEndTime -= CropFrame * FGlobalData::DefaultTimeTickSpace;
|
ClipEndTime -= CropFrame * FGlobalData::DefaultTimeTickSpace;
|
||||||
if (ClipType == ETrackType::VideoTrack)
|
if (ClipType == ETrackType::VideoTrack || ClipType == ETrackType::AudioTrack)
|
||||||
{
|
{
|
||||||
VideoEndFrame -= CropFrame;
|
VideoEndFrame -= CropFrame;
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,25 @@ void SEffectCardsPanel::Construct(const FArguments& InArgs)
|
|||||||
{
|
{
|
||||||
MainInterface = InArgs._MainInterface;
|
MainInterface = InArgs._MainInterface;
|
||||||
ChildSlot
|
ChildSlot
|
||||||
|
[
|
||||||
|
SNew(SOverlay)
|
||||||
|
+ SOverlay::Slot()
|
||||||
|
.HAlign(HAlign_Fill)
|
||||||
|
.VAlign(VAlign_Fill)
|
||||||
|
[
|
||||||
|
SNew(SImage)
|
||||||
|
.Image(FUtils::GetBrushFromImage(FUtils::GetResourcesPath(TEXT("EffectPanel.png")), FVector2D(0.0, 0.0)))
|
||||||
|
]
|
||||||
|
+ SOverlay::Slot()
|
||||||
|
.HAlign(HAlign_Fill)
|
||||||
|
.VAlign(VAlign_Fill)
|
||||||
[
|
[
|
||||||
SNew(SBox)
|
SNew(SBox)
|
||||||
[
|
[
|
||||||
SAssignNew(ScrollBox, SScrollBox)
|
SAssignNew(ScrollBox, SScrollBox)
|
||||||
]
|
]
|
||||||
|
]
|
||||||
|
|
||||||
];
|
];
|
||||||
FEffectCardGroup DedicatedGroup;
|
FEffectCardGroup DedicatedGroup;
|
||||||
DedicatedGroup.bIsDedicated = true;
|
DedicatedGroup.bIsDedicated = true;
|
||||||
|
@ -5,10 +5,13 @@
|
|||||||
#include "AudioDevice.h"
|
#include "AudioDevice.h"
|
||||||
#include "RuntimeAudioImporterLibrary.h"
|
#include "RuntimeAudioImporterLibrary.h"
|
||||||
#include "SlateOptMacros.h"
|
#include "SlateOptMacros.h"
|
||||||
|
#include "Commands/TimelineClipCommands.h"
|
||||||
#include "Cut5/WidgetInterface.h"
|
#include "Cut5/WidgetInterface.h"
|
||||||
#include "Cut5/Utils/Utils.h"
|
#include "Cut5/Utils/Utils.h"
|
||||||
#include "Engine/Engine.h"
|
#include "Engine/Engine.h"
|
||||||
#include "Engine/Texture2D.h"
|
#include "Engine/Texture2D.h"
|
||||||
|
#include "Slate/Private/Framework/Application/Menu.h"
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#include "libavformat/avformat.h"
|
#include "libavformat/avformat.h"
|
||||||
@ -20,6 +23,21 @@ BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
|||||||
|
|
||||||
FReply STimelineClip::OnBorderMouseButtonDown(const FGeometry& Geometry, const FPointerEvent& PointerEvent)
|
FReply STimelineClip::OnBorderMouseButtonDown(const FGeometry& Geometry, const FPointerEvent& PointerEvent)
|
||||||
{
|
{
|
||||||
|
TSharedPtr<SWidget> MenuContent;
|
||||||
|
if (PointerEvent.IsMouseButtonDown(EKeys::RightMouseButton))
|
||||||
|
{
|
||||||
|
Body->SelectedClipGUID = ClipData->ClipGuid;
|
||||||
|
Body->SelectedClipFrame = (Geometry.AbsoluteToLocal(PointerEvent.GetScreenSpacePosition()).X) / FGlobalData::DefaultTimeTickSpace;
|
||||||
|
FMenuBuilder MenuBuilder(true, CommandList);
|
||||||
|
MenuBuilder.AddMenuEntry(FTimelineClipCommands::Get().Remove);
|
||||||
|
MenuBuilder.AddMenuEntry(FTimelineClipCommands::Get().Break);
|
||||||
|
MenuContent = MenuBuilder.MakeWidget();
|
||||||
|
FSlateApplication::Get().PushMenu(AsShared(), FWidgetPath(), MenuContent.ToSharedRef(), FSlateApplication::Get().GetCursorPos(), FPopupTransitionEffect::ContextMenu);
|
||||||
|
return FReply::Handled();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const FVector2D LocalPos = Geometry.AbsoluteToLocal(PointerEvent.GetScreenSpacePosition());
|
const FVector2D LocalPos = Geometry.AbsoluteToLocal(PointerEvent.GetScreenSpacePosition());
|
||||||
// GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Blue, LocalPos.ToString());
|
// GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Blue, LocalPos.ToString());
|
||||||
if (LocalPos.X <= 10)
|
if (LocalPos.X <= 10)
|
||||||
@ -43,6 +61,7 @@ FReply STimelineClip::OnBorderMouseButtonDown(const FGeometry& Geometry, const F
|
|||||||
|
|
||||||
void STimelineClip::Construct(const FArguments& InArgs)
|
void STimelineClip::Construct(const FArguments& InArgs)
|
||||||
{
|
{
|
||||||
|
CommandList = InArgs._CommandList;
|
||||||
ClipData = InArgs._InClipData;
|
ClipData = InArgs._InClipData;
|
||||||
MainWidgetInterface = InArgs._MainWidgetInterface;
|
MainWidgetInterface = InArgs._MainWidgetInterface;
|
||||||
Body = InArgs._Body;
|
Body = InArgs._Body;
|
||||||
|
@ -32,6 +32,7 @@ public:
|
|||||||
SLATE_ARGUMENT(FClipData*, InClipData)
|
SLATE_ARGUMENT(FClipData*, InClipData)
|
||||||
SLATE_ARGUMENT(ICutMainWidgetInterface*, MainWidgetInterface)
|
SLATE_ARGUMENT(ICutMainWidgetInterface*, MainWidgetInterface)
|
||||||
SLATE_ARGUMENT(TSharedPtr<IWidgetInterface>, Body)
|
SLATE_ARGUMENT(TSharedPtr<IWidgetInterface>, Body)
|
||||||
|
SLATE_ARGUMENT(TSharedPtr<FUICommandList>, CommandList)
|
||||||
SLATE_END_ARGS()
|
SLATE_END_ARGS()
|
||||||
|
|
||||||
FReply OnBorderMouseButtonDown(const FGeometry& Geometry, const FPointerEvent& PointerEvent);
|
FReply OnBorderMouseButtonDown(const FGeometry& Geometry, const FPointerEvent& PointerEvent);
|
||||||
@ -50,5 +51,9 @@ public:
|
|||||||
|
|
||||||
FDecodedAudioStruct DecodedAudioStruct;
|
FDecodedAudioStruct DecodedAudioStruct;
|
||||||
PaStream* Stream = nullptr;
|
PaStream* Stream = nullptr;
|
||||||
|
|
||||||
|
|
||||||
|
TSharedPtr<FUICommandList> CommandList;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
#include "STrackBody.h"
|
#include "STrackBody.h"
|
||||||
|
|
||||||
#include "SlateOptMacros.h"
|
#include "SlateOptMacros.h"
|
||||||
|
#include "Commands/TimelineClipCommands.h"
|
||||||
#include "Cut5/Utils/OpencvUtils.h"
|
#include "Cut5/Utils/OpencvUtils.h"
|
||||||
|
#include "Cut5/Utils/Utils.h"
|
||||||
#include "Engine/Engine.h"
|
#include "Engine/Engine.h"
|
||||||
#include "Widgets/Layout/SConstraintCanvas.h"
|
#include "Widgets/Layout/SConstraintCanvas.h"
|
||||||
|
|
||||||
@ -12,6 +14,17 @@ BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
|
|||||||
|
|
||||||
void STrackBody::Construct(const FArguments& InArgs)
|
void STrackBody::Construct(const FArguments& InArgs)
|
||||||
{
|
{
|
||||||
|
FTimelineClipCommands::Register();
|
||||||
|
CommandList = MakeShared<FUICommandList>();
|
||||||
|
CommandList->MapAction(FTimelineClipCommands::Get().Remove, FExecuteAction::CreateLambda([this]()
|
||||||
|
{
|
||||||
|
RemoveClip(SelectedClipGUID);
|
||||||
|
}), FCanExecuteAction());
|
||||||
|
CommandList->MapAction(FTimelineClipCommands::Get().Break, FExecuteAction::CreateLambda([this]()
|
||||||
|
{
|
||||||
|
BreakClip(SelectedClipGUID);
|
||||||
|
}), FCanExecuteAction());
|
||||||
|
|
||||||
MainWidgetInterface = InArgs._MainWidgetInterface;
|
MainWidgetInterface = InArgs._MainWidgetInterface;
|
||||||
TrackHead = InArgs._TrackHead;
|
TrackHead = InArgs._TrackHead;
|
||||||
ChildSlot
|
ChildSlot
|
||||||
@ -25,15 +38,23 @@ void STrackBody::Construct(const FArguments& InArgs)
|
|||||||
.AutoSize(true)
|
.AutoSize(true)
|
||||||
.Offset(FMargin(0, 0, 0, 0))
|
.Offset(FMargin(0, 0, 0, 0))
|
||||||
.Anchors(FAnchors(0, 0, 1, 1))
|
.Anchors(FAnchors(0, 0, 1, 1))
|
||||||
|
[
|
||||||
|
SNew(SOverlay)
|
||||||
|
+ SOverlay::Slot()
|
||||||
|
.HAlign(HAlign_Fill)
|
||||||
|
.VAlign(VAlign_Fill)
|
||||||
[
|
[
|
||||||
SNew(SBorder)
|
SNew(SBorder)
|
||||||
.HAlign(HAlign_Fill)
|
.HAlign(HAlign_Fill)
|
||||||
.VAlign(VAlign_Fill)
|
.VAlign(VAlign_Fill)
|
||||||
.BorderBackgroundColor(FLinearColor(0.1f, 0.15f, 0.2f, 1.0f))
|
.BorderBackgroundColor(FLinearColor(0.1f, 0.15f, 0.2f, 1.0f))
|
||||||
|
.BorderImage(FUtils::GetBrushFromImage(*FUtils::GetResourcesPath(TEXT("TrackBar.png")), FVector2D(0.0, 0.0)))
|
||||||
[
|
[
|
||||||
SAssignNew(Overlay, SOverlay)
|
SAssignNew(Overlay, SOverlay)
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
]
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -51,7 +72,7 @@ void STrackBody::CallRender()
|
|||||||
TrackHead->CutTimeline->UpdateTimelineLength();
|
TrackHead->CutTimeline->UpdateTimelineLength();
|
||||||
}
|
}
|
||||||
TSharedPtr<STimelineClip> TimelineClip;
|
TSharedPtr<STimelineClip> TimelineClip;
|
||||||
TimelineClip = SNew(STimelineClip).InClipData(&TempClipData).MainWidgetInterface(MainWidgetInterface).Body(SharedThis(this));
|
TimelineClip = SNew(STimelineClip).InClipData(&TempClipData).MainWidgetInterface(MainWidgetInterface).Body(SharedThis(this)).CommandList(CommandList);
|
||||||
|
|
||||||
Overlay->AddSlot()
|
Overlay->AddSlot()
|
||||||
.HAlign(HAlign_Left)
|
.HAlign(HAlign_Left)
|
||||||
@ -266,6 +287,40 @@ void STrackBody::OnDragLeave(const FDragDropEvent& DragDropEvent)
|
|||||||
SCompoundWidget::OnDragLeave(DragDropEvent);
|
SCompoundWidget::OnDragLeave(DragDropEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void STrackBody::RemoveClip(const FGuid& Guid)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < SlateClips.Num(); i++)
|
||||||
|
{
|
||||||
|
if (TrackHead->TrackData.ClipData[i].ClipGuid == Guid)
|
||||||
|
{
|
||||||
|
TrackHead->TrackData.ClipData.RemoveAt(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CallRender();
|
||||||
|
}
|
||||||
|
|
||||||
|
void STrackBody::BreakClip(const FGuid& Guid)
|
||||||
|
{
|
||||||
|
for (int32 i = 0; i < SlateClips.Num(); i++)
|
||||||
|
{
|
||||||
|
if (TrackHead->TrackData.ClipData[i].ClipGuid == Guid)
|
||||||
|
{
|
||||||
|
FClipData NewClipData = TrackHead->TrackData.ClipData[i];
|
||||||
|
NewClipData.ClipGuid = FGuid::NewGuid();
|
||||||
|
|
||||||
|
const int32 CropFrameRight = TrackHead->TrackData.ClipData[i].GetClipRelativeEndFrame() - SelectedClipFrame;
|
||||||
|
TrackHead->TrackData.ClipData[i].CropClip(FClipData::ECropMethod::FromBack, CropFrameRight);
|
||||||
|
|
||||||
|
NewClipData.CropClip(FClipData::ECropMethod::FromFront, SelectedClipFrame + 1);
|
||||||
|
TrackHead->TrackData.ClipData.Add(NewClipData);
|
||||||
|
|
||||||
|
GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Emerald, FString::Printf(TEXT("CropFrameLeft %d CropFrameRight %d"), SelectedClipFrame, CropFrameRight));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CallRender();
|
||||||
|
}
|
||||||
|
|
||||||
void STrackBody::Seek(int32 Frame)
|
void STrackBody::Seek(int32 Frame)
|
||||||
{
|
{
|
||||||
for (int32 i = 0; i < SlateClips.Num(); i++)
|
for (int32 i = 0; i < SlateClips.Num(); i++)
|
||||||
|
@ -28,6 +28,10 @@ public:
|
|||||||
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
|
virtual FReply OnDragOver(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
|
||||||
virtual void OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
|
virtual void OnDragEnter(const FGeometry& MyGeometry, const FDragDropEvent& DragDropEvent) override;
|
||||||
virtual void OnDragLeave(const FDragDropEvent& DragDropEvent) override;
|
virtual void OnDragLeave(const FDragDropEvent& DragDropEvent) override;
|
||||||
|
|
||||||
|
virtual void RemoveClip(const FGuid& Guid) override;
|
||||||
|
virtual void BreakClip(const FGuid& Guid) override;
|
||||||
|
|
||||||
TSharedPtr<STrackHead> TrackHead;
|
TSharedPtr<STrackHead> TrackHead;
|
||||||
ICutMainWidgetInterface* MainWidgetInterface;
|
ICutMainWidgetInterface* MainWidgetInterface;
|
||||||
TSharedPtr<SOverlay> Overlay;
|
TSharedPtr<SOverlay> Overlay;
|
||||||
@ -40,4 +44,5 @@ public:
|
|||||||
};
|
};
|
||||||
virtual void Seek(int32 Frame) override;
|
virtual void Seek(int32 Frame) override;
|
||||||
|
|
||||||
|
TSharedPtr<FUICommandList> CommandList;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user