ctrls手动保存

独立特效卡永久保存,拖拽进组和特效卡会复制特效卡,复制卡片与原本卡片共享,只有删除原本卡片复制卡片才会消失
This commit is contained in:
Sch 2023-08-24 04:17:20 +08:00
parent d0a7fac4dc
commit fa8ecab21f
9 changed files with 161 additions and 59 deletions

View File

@ -40,6 +40,7 @@ public:
virtual void AddNewCard(FEffectCardProperty& CardProperty, FString GroupName) {}; virtual void AddNewCard(FEffectCardProperty& CardProperty, FString GroupName) {};
virtual void OpenTimeline(const FString& TimelineName, bool NeedSaveBefore = false, bool ForceOpen = false) {}; virtual void OpenTimeline(const FString& TimelineName, bool NeedSaveBefore = false, bool ForceOpen = false) {};
virtual void CloseTimeline() {};
virtual void OpenProject(const FString& Project) {}; virtual void OpenProject(const FString& Project) {};
virtual bool PreNewProject() { return false; }; virtual bool PreNewProject() { return false; };
virtual void ExportProject(const FString& ExportPath) {}; virtual void ExportProject(const FString& ExportPath) {};

View File

@ -646,6 +646,8 @@ struct CUT5_API FEffectCardProperty
int32 ID = 0; int32 ID = 0;
TArray<FStringWithGUID> UsedCurtains; TArray<FStringWithGUID> UsedCurtains;
FStringWithGUID JumpStepCurtains; FStringWithGUID JumpStepCurtains;
bool IsClone = false;
friend FArchive& operator<<(FArchive& Ar, FEffectCardProperty& EffectCardProperty) friend FArchive& operator<<(FArchive& Ar, FEffectCardProperty& EffectCardProperty)
{ {
Ar << EffectCardProperty.Guid; Ar << EffectCardProperty.Guid;
@ -654,8 +656,14 @@ struct CUT5_API FEffectCardProperty
Ar << EffectCardProperty.ID; Ar << EffectCardProperty.ID;
Ar << EffectCardProperty.UsedCurtains; Ar << EffectCardProperty.UsedCurtains;
Ar << EffectCardProperty.JumpStepCurtains; Ar << EffectCardProperty.JumpStepCurtains;
Ar << EffectCardProperty.IsClone;
return Ar; return Ar;
}; };
bool operator == (const FEffectCardProperty& Other) const
{
return Guid == Other.Guid;
}
}; };
struct CUT5_API FEffectCardGroup struct CUT5_API FEffectCardGroup

View File

@ -19,7 +19,17 @@ BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION
void SEffectCard::OnNameEdited(FString New, FString Old) void SEffectCard::OnNameEdited(FString New, FString Old)
{ {
CardProperty->Name = New; CardProperty->Name = New;
CardGroupPtr->CallRender(); for (int32 i = 0; i < CardGroupPtr->EffectCardPanel->EffectCardGroups.Num(); i++)
{
for (int32 j = 0; j < CardGroupPtr->EffectCardPanel->EffectCardGroups[i].Cards.Num(); j++)
{
if (CardGroupPtr->EffectCardPanel->EffectCardGroups[i].Cards[j].Guid == CardProperty->Guid)
{
CardGroupPtr->EffectCardPanel->EffectCardGroups[i].Cards[j].Name = New;
}
}
}
CardGroupPtr->EffectCardPanel->CallRender();
} }
void SEffectCard::Construct(const FArguments& InArgs) void SEffectCard::Construct(const FArguments& InArgs)
@ -57,8 +67,15 @@ void SEffectCard::Construct(const FArguments& InArgs)
.ClickMethod(EButtonClickMethod::MouseDown) .ClickMethod(EButtonClickMethod::MouseDown)
.OnClicked_Lambda([this]() .OnClicked_Lambda([this]()
{ {
if (CardProperty->bIsActive)
MainInterface->OpenTimeline(FUtils::SingleCardFullPath(CardProperty->Guid.ToString()), true); {
MainInterface->CloseTimeline();
}
else
{
MainInterface->OpenTimeline(FUtils::SingleCardFullPath(CardProperty->Guid.ToString()), true);
}
PropertiesInterfaceGUID = CardProperty->Guid; PropertiesInterfaceGUID = CardProperty->Guid;
MainInterface->CurrentSelectedPropertiesInterfaceGuid = CardProperty->Guid; MainInterface->CurrentSelectedPropertiesInterfaceGuid = CardProperty->Guid;
MainInterface->UpdateProperties(this); MainInterface->UpdateProperties(this);
@ -165,7 +182,15 @@ void SEffectCard::ShowClosedButton(bool bShow)
{ {
MainInterface->OnSelectCard(CardProperty->Guid); MainInterface->OnSelectCard(CardProperty->Guid);
} }
CardGroupPtr->EffectCardPanel->RemoveCard(CardProperty->Guid); if (CardProperty->IsClone)
{
CardGroupPtr->EffectCardPanel->RemoveCardInGroup(CardProperty->Guid, GroupProperty->Guid);
}
else
{
CardGroupPtr->EffectCardPanel->RemoveCard(CardProperty->Guid);
}
}), 1 }), 1
); );

View File

@ -277,11 +277,8 @@ void SEffectCardGroup::Construct(const FArguments& InArgs)
EffectCardGroup->UsedCurtains.Remove(*InItem.Get()); EffectCardGroup->UsedCurtains.Remove(*InItem.Get());
MainInterface->UpdateProperties(this); MainInterface->UpdateProperties(this);
} }
}) })
]; ];
}) })
[ [
SNew(STextBlock).Text_Lambda([this]() SNew(STextBlock).Text_Lambda([this]()
@ -300,9 +297,7 @@ void SEffectCardGroup::Construct(const FArguments& InArgs)
} }
}) })
] ]
] ]
] ]
] ]
] ]
@ -391,7 +386,7 @@ void SEffectCardGroup::OnSelect()
{ {
if (EffectCardGroup->bIsDedicated == false) if (EffectCardGroup->bIsDedicated == false)
{ {
const FString Name = FPaths::Combine(FGlobalData::BasePath, FGlobalData::CurrentProjectName, TEXT("FX"), EffectCardGroup->GroupName + TEXT(".bin")); const FString Name = FPaths::Combine(FGlobalData::BasePath, FGlobalData::CurrentProjectName, TEXT("FX"), EffectCardGroup->Guid.ToString() + TEXT(".bin"));
MainInterface->OpenTimeline(Name, true); MainInterface->OpenTimeline(Name, true);
MainInterface->CurrentSelectedPropertiesInterfaceGuid = EffectCardGroup->Guid; MainInterface->CurrentSelectedPropertiesInterfaceGuid = EffectCardGroup->Guid;
MainInterface->UpdateProperties(this); MainInterface->UpdateProperties(this);
@ -426,17 +421,26 @@ void SEffectCardGroup::CallRender()
FEffectCardProperty NewCard; FEffectCardProperty NewCard;
NewCard.Name = TEXT("未命名") + NewCard.Guid.ToString(); NewCard.Name = TEXT("未命名") + NewCard.Guid.ToString();
int32 ID = 0; int32 ID = 0;
for (int32 i = 0; i < EffectCardPanel->EffectCardGroups.Num(); i++) for (int32 i = 0; i < EffectCardPanel->EffectCardGroups.Num(); i++)
{ {
for (int32 j = 0; j < EffectCardPanel->EffectCardGroups[i].Cards.Num(); j++) if (EffectCardPanel->EffectCardGroups[i].bIsDedicated)
{ {
ID++; for (int32 j = 0; j < EffectCardPanel->EffectCardGroups[i].Cards.Num(); j++)
{
ID++;
}
} }
ID++; ID++;
} }
NewCard.ID = ID; NewCard.ID = ID;
FUtils::CreateDefaultTimelineSave(FUtils::SingleCardFullPath(NewCard.Guid.ToString()), FTimelineInfo::ETimelineType::FX); FUtils::CreateDefaultTimelineSave(FUtils::SingleCardFullPath(NewCard.Guid.ToString()), FTimelineInfo::ETimelineType::FX);
{ {
FSaveModifier SaveModifier(FUtils::SingleCardFullPath(NewCard.Guid.ToString())); FSaveModifier SaveModifier(FUtils::SingleCardFullPath(NewCard.Guid.ToString()));
@ -444,7 +448,16 @@ void SEffectCardGroup::CallRender()
SaveModifier.TimelineInfo.CurrentOpenType = FTimelineInfo::ETimelineType::FX; SaveModifier.TimelineInfo.CurrentOpenType = FTimelineInfo::ETimelineType::FX;
NewCard.TimelineInfo = SaveModifier.TimelineInfo; NewCard.TimelineInfo = SaveModifier.TimelineInfo;
} }
MainInterface->AddNewCard(NewCard, EffectCardGroup->GroupName); MainInterface->AddNewCard(NewCard, TEXT("独立特效卡"));
if (!EffectCardGroup->bIsDedicated)
{
FEffectCardProperty NewCardForClone = NewCard;
NewCardForClone.IsClone = true;
MainInterface->AddNewCard(NewCardForClone, EffectCardGroup->GroupName);
}
return FReply::Handled(); return FReply::Handled();
}) })
] ]
@ -554,7 +567,7 @@ FReply SEffectCardGroup::OnDrop(const FGeometry& MyGeometry, const FDragDropEven
{ {
return FReply::Handled(); return FReply::Handled();
} }
EffectCardPanel->MoveCard(EffectCardDragDrop->CardGuid, EffectCardGroup->GroupName); EffectCardPanel->DuplicateCard(EffectCardDragDrop->CardGuid, EffectCardGroup->Guid);
} }
return SCompoundWidget::OnDrop(MyGeometry, DragDropEvent); return SCompoundWidget::OnDrop(MyGeometry, DragDropEvent);
} }

View File

@ -6,6 +6,7 @@
#include "SEffectCardGroup.h" #include "SEffectCardGroup.h"
#include "SlateOptMacros.h" #include "SlateOptMacros.h"
#include "Cut5/Utils/Utils.h" #include "Cut5/Utils/Utils.h"
#include "Cut5/Widgets/SCutTimeline.h"
#include "Widgets/Layout/SExpandableArea.h" #include "Widgets/Layout/SExpandableArea.h"
#include "Widgets/Layout/SScrollBox.h" #include "Widgets/Layout/SScrollBox.h"
@ -103,7 +104,9 @@ void SEffectCardsPanel::CallRender()
.Text(FText::FromString("+")) .Text(FText::FromString("+"))
.OnClicked_Lambda([this]() .OnClicked_Lambda([this]()
{ {
FEffectCardGroup* Group = AddNewGroup(TEXT("新建组") + FGuid::NewGuid().ToString()); const FGuid NewGuid = FGuid::NewGuid();
FEffectCardGroup* Group = AddNewGroup(TEXT("新建组") + NewGuid.ToString());
Group->Guid = NewGuid;
int32 ID = 0; int32 ID = 0;
for (int32 i = 0; i < EffectCardGroups.Num(); i++) for (int32 i = 0; i < EffectCardGroups.Num(); i++)
{ {
@ -114,7 +117,8 @@ void SEffectCardsPanel::CallRender()
ID++; ID++;
} }
Group->ID = ID; Group->ID = ID;
const FString NewPath = FPaths::Combine(FGlobalData::BasePath, FGlobalData::CurrentProjectName, TEXT("FX"), FGuid::NewGuid().ToString() + TEXT(".bin"));
const FString NewPath = FPaths::Combine(FGlobalData::BasePath, FGlobalData::CurrentProjectName, TEXT("FX"), NewGuid.ToString() + TEXT(".bin"));
FUtils::CreateDefaultTimelineSave(NewPath, FTimelineInfo::ETimelineType::FX); FUtils::CreateDefaultTimelineSave(NewPath, FTimelineInfo::ETimelineType::FX);
{ {
FSaveModifier SaveModifier(NewPath); FSaveModifier SaveModifier(NewPath);
@ -152,39 +156,64 @@ void SEffectCardsPanel::AddNewCard(FEffectCardProperty CardProperty, const FStri
void SEffectCardsPanel::RemoveCard(const FGuid& GUID) void SEffectCardsPanel::RemoveCard(const FGuid& GUID)
{ {
const FGuid CopyGuid = GUID;
// Search in all group to find GUID equal to the GUID. // Search in all group to find GUID equal to the GUID.
int32 j = 0; int32 j = 0;
for (FEffectCardGroup& Group : EffectCardGroups) for (FEffectCardGroup& Group : EffectCardGroups)
{ {
if (!Group.bIsDedicated && Group.Guid == GUID) if (!Group.bIsDedicated && Group.Guid == CopyGuid)
{ {
if (Group.bIsActive == true) if (Group.bIsActive == true)
{ {
MainInterface->OpenTimeline(FUtils::MainSaveFullPath()); MainInterface->OpenTimeline(FUtils::MainSaveFullPath(), true);
} }
EffectCardGroups.RemoveAt(j); EffectCardGroups.RemoveAt(j);
break; break;
} }
int32 i = 0;
for (FEffectCardProperty& Property : Group.Cards) for (int32 i = Group.Cards.Num() - 1; i >= 0; i--)
{ {
if (Property.Guid == GUID) if (Group.Cards[i].Guid == CopyGuid)
{ {
if (Property.bIsActive == true) if (Group.Cards[i].bIsActive == true)
{ {
MainInterface->OpenTimeline(FUtils::MainSaveFullPath()); MainInterface->OpenTimeline(FUtils::MainSaveFullPath(), true);
} }
Group.Cards.RemoveAt(i); Group.Cards.RemoveAt(i);
break;
} }
i++;
} }
j++; j++;
} }
CallRender(); CallRender();
} }
void SEffectCardsPanel::RemoveCardInGroup(const FGuid& Guid, const FGuid& GroupGuid)
{
for (FEffectCardGroup& Group : EffectCardGroups)
{
if (Group.Guid == GroupGuid)
{
int32 i = 0;
for (FEffectCardProperty& Property : Group.Cards)
{
if (Property.Guid == Guid)
{
if (Property.bIsActive == true)
{
MainInterface->OpenTimeline(FUtils::MainSaveFullPath());
}
Group.Cards.RemoveAt(i);
break;
}
i++;
}
break;
}
}
CallRender();
}
void SEffectCardsPanel::MoveCard(const FGuid& GUID, const FString& GroupName) void SEffectCardsPanel::MoveCard(const FGuid& GUID, const FString& GroupName)
{ {
FEffectCardProperty CardProperty; FEffectCardProperty CardProperty;
@ -211,6 +240,42 @@ void SEffectCardsPanel::MoveCard(const FGuid& GUID, const FString& GroupName)
CallRender(); CallRender();
} }
void SEffectCardsPanel::DuplicateCard(const FGuid& Guid, const FGuid& ToGroupGuid)
{
for (int32 i = 0; i < EffectCardGroups.Num(); i++)
{
if (EffectCardGroups[i].bIsDedicated)
{
for (int32 j = 0; j < EffectCardGroups[i].Cards.Num(); j++)
{
if (Guid == EffectCardGroups[i].Cards[j].Guid)
{
FEffectCardProperty NewEffectCardProperty = EffectCardGroups[i].Cards[j];
NewEffectCardProperty.IsClone = true;
for (int32 k = 0; k < EffectCardGroups.Num(); k++)
{
if (EffectCardGroups[k].Guid == ToGroupGuid)
{
if (EffectCardGroups[k].Cards.Contains(NewEffectCardProperty))
{
return;
}
EffectCardGroups[k].Cards.Add(NewEffectCardProperty);
break;
}
}
break;
}
}
}
}
CallRender();
}
FEffectCardGroup* SEffectCardsPanel::AddNewGroup(const FString& GroupName) FEffectCardGroup* SEffectCardsPanel::AddNewGroup(const FString& GroupName)
{ {
FEffectCardGroup NewGroup; FEffectCardGroup NewGroup;
@ -253,7 +318,7 @@ void SEffectCardsPanel::SelectCard(const FGuid& Guid)
{ {
if (Guid == CurrentSelectedCardGuid) if (Guid == CurrentSelectedCardGuid)
{ {
MainInterface->OpenTimeline(FUtils::MainSaveFullPath()); MainInterface->CloseTimeline();
CurrentSelectedCardGuid.Invalidate(); CurrentSelectedCardGuid.Invalidate();
DeselectedAll(); DeselectedAll();
MainInterface->UpdateProperties(nullptr); MainInterface->UpdateProperties(nullptr);

View File

@ -57,6 +57,9 @@ public:
*/ */
void RemoveCard(const FGuid& GUID); void RemoveCard(const FGuid& GUID);
void RemoveCardInGroup(const FGuid& Guid, const FGuid& GroupGuid);
/** /**
* @brief Move card from one group to another. * @brief Move card from one group to another.
* @param GUID Card GUID. * @param GUID Card GUID.
@ -64,6 +67,7 @@ public:
*/ */
void MoveCard(const FGuid& GUID, const FString& GroupName); void MoveCard(const FGuid& GUID, const FString& GroupName);
void DuplicateCard(const FGuid& Guid, const FGuid& ToGroupGuid);
/** /**
* @brief Add an group to the panel. * @brief Add an group to the panel.

View File

@ -770,38 +770,18 @@ void SCutMainWindow::AddNewCard(FEffectCardProperty& CardProperty, FString Group
void SCutMainWindow::OpenTimeline(const FString& TimelineName, bool NeedSaveBefore, bool ForceOpen) void SCutMainWindow::OpenTimeline(const FString& TimelineName, bool NeedSaveBefore, bool ForceOpen)
{ {
CutTimeline->bNeedShowPanel = true;
if (NeedSaveBefore) if (NeedSaveBefore)
{ {
if (TimelineName != "") CutTimeline->SaveTimeline(CutTimeline->TimelineInfo.CurrentOpenFullPath, CutTimeline->TimelineInfo);
{ CutTimeline->TimelineInfo.CurrentOpenFullPath = TimelineName;
if (CutTimeline->TimelineInfo.CurrentOpenFullPath.IsEmpty())
{
CutTimeline->SaveTimeline(FUtils::MainSaveFullPath(), CutTimeline->TimelineInfo);
CutTimeline->TimelineInfo.CurrentOpenFullPath = FUtils::MainSaveFullPath();
CutTimeline->bNeedShowPanel = false;
}
else
{
if (CutTimeline->TimelineInfo.CurrentOpenFullPath != FUtils::MainSaveFullPath())
{
CutTimeline->SaveTimeline(CutTimeline->TimelineInfo.CurrentOpenFullPath, CutTimeline->TimelineInfo);
CutTimeline->bNeedShowPanel = true;
}
else
{
if (!ForceOpen)
{
CutTimeline->SaveTimeline(FUtils::MainSaveFullPath(), CutTimeline->TimelineInfo);
CutTimeline->TimelineInfo.CurrentOpenFullPath = FUtils::MainSaveFullPath();
CutTimeline->bNeedShowPanel = false;
}
}
}
}
} }
//
// if (TimelineName == CutTimeline->TimelineInfo.CurrentOpenFullPath && !ForceOpen)
// {
// CloseTimeline();
// return;
// }
FTimelineInfo TimelineInfo; FTimelineInfo TimelineInfo;
// 拿到TimelineName路径中的名字也就是倒数第四位开始去掉后缀 // 拿到TimelineName路径中的名字也就是倒数第四位开始去掉后缀
@ -813,6 +793,14 @@ void SCutMainWindow::OpenTimeline(const FString& TimelineName, bool NeedSaveBefo
} }
OnAddNewTrack(ETrackType::PlayerTrack); OnAddNewTrack(ETrackType::PlayerTrack);
}
void SCutMainWindow::CloseTimeline()
{
CutTimeline->bNeedShowPanel = false;
CutTimeline->SaveTimeline(CutTimeline->TimelineInfo.CurrentOpenFullPath, CutTimeline->TimelineInfo);
CutTimeline->RenderGroup();
} }
void SCutMainWindow::OpenProject(const FString& Project) void SCutMainWindow::OpenProject(const FString& Project)

View File

@ -70,6 +70,7 @@ public:
// 不好 到时候改成 Group Widget 内部操作 // 不好 到时候改成 Group Widget 内部操作
virtual void AddNewCard(FEffectCardProperty& CardProperty, FString GroupName) override; virtual void AddNewCard(FEffectCardProperty& CardProperty, FString GroupName) override;
virtual void OpenTimeline(const FString& TimelineName, bool NeedSaveBefore, bool ForceOpen = false) override; virtual void OpenTimeline(const FString& TimelineName, bool NeedSaveBefore, bool ForceOpen = false) override;
virtual void CloseTimeline() override;
virtual void OpenProject(const FString& Project) override; virtual void OpenProject(const FString& Project) override;
virtual void ExportProject(const FString& ExportPath) override; virtual void ExportProject(const FString& ExportPath) override;
virtual void ImportProject(const FString& ImportPath) override; virtual void ImportProject(const FString& ImportPath) override;

View File

@ -6,10 +6,7 @@
#include "DefineGlobal.h" #include "DefineGlobal.h"
#include "Cut5/Interface/CutMainWidgetInterface.h" #include "Cut5/Interface/CutMainWidgetInterface.h"
#include "Widgets/SCompoundWidget.h" #include "Widgets/SCompoundWidget.h"
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/core/mat.hpp>
#include "Cut5/Interface/SoundInterface.h" #include "Cut5/Interface/SoundInterface.h"