From 2d9574952eca5409d4e1e7a4a1132d4884be2fd7 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Mon, 27 Feb 2006 09:07:08 +0000 Subject: [PATCH] Added clone function for better copying of AssEntry and derived classes Originally committed to SVN as r184. --- core/ass_dialogue.cpp | 29 +++++++++++++++++++++++++++++ core/ass_dialogue.h | 2 ++ core/ass_entry.cpp | 17 +++++++++++++++++ core/ass_entry.h | 2 ++ core/ass_file.cpp | 2 +- core/ass_style.cpp | 39 +++++++++++++++++++++++++++++++++++++++ core/ass_style.h | 2 ++ 7 files changed, 92 insertions(+), 1 deletion(-) diff --git a/core/ass_dialogue.cpp b/core/ass_dialogue.cpp index 213e77b07..1fe41da33 100644 --- a/core/ass_dialogue.cpp +++ b/core/ass_dialogue.cpp @@ -727,6 +727,35 @@ bool AssDialogue::CollidesWith(AssDialogue *target) { } +///////// +// Clone +AssEntry *AssDialogue::Clone() { + // Create clone + AssDialogue *final = new AssDialogue(); + + // Copy data + final->group = group; + final->StartMS = StartMS; + final->Valid = Valid; + final->Actor = Actor; + final->Comment = Comment; + final->Effect = Effect; + final->End = End; + final->Layer = Layer; + final->MarginL = MarginL; + final->MarginR = MarginR; + final->MarginV = MarginV; + final->Start = Start; + final->StartMS = final->StartMS; + final->Style = Style; + final->Text = Text; + final->SetEntryData(GetEntryData()); + + // Return + return final; +} + + ////////////////////// AssDialogueBlock ////////////////////// /////////////// // Constructor diff --git a/core/ass_dialogue.h b/core/ass_dialogue.h index 334ec90f9..d4b65fa46 100644 --- a/core/ass_dialogue.h +++ b/core/ass_dialogue.h @@ -200,6 +200,8 @@ public: bool CollidesWith(AssDialogue *target); // Checks if two lines collide void ClearBlocks(); + AssEntry *Clone(); + AssDialogue(); AssDialogue(wxString data,bool IsSSA=false); ~AssDialogue(); diff --git a/core/ass_entry.cpp b/core/ass_entry.cpp index 369051c1e..62a157870 100644 --- a/core/ass_entry.cpp +++ b/core/ass_entry.cpp @@ -100,3 +100,20 @@ wxString AssEntry::GetSSAText() { } return data; } + + +///////// +// Clone +AssEntry *AssEntry::Clone() { + // Create clone + AssEntry *final = new AssEntry(); + + // Copy data + final->data = data; + final->group = group; + final->StartMS = StartMS; + final->Valid = Valid; + + // Return + return final; +} diff --git a/core/ass_entry.h b/core/ass_entry.h index f8ed5b3fc..6f496bdd7 100644 --- a/core/ass_entry.h +++ b/core/ass_entry.h @@ -72,6 +72,8 @@ public: AssEntry(wxString data); virtual ~AssEntry(); + virtual AssEntry *Clone(); + virtual ASS_EntryType GetType() { return ENTRY_BASE; } virtual const wxString GetEntryData() { return data; } virtual void SetEntryData(wxString newData) { if (newData.IsEmpty()) data.Clear(); else data = newData; } diff --git a/core/ass_file.cpp b/core/ass_file.cpp index 477ff5ae1..d2e821156 100644 --- a/core/ass_file.cpp +++ b/core/ass_file.cpp @@ -473,7 +473,7 @@ AssFile::AssFile (AssFile &from) { // Copy lines int lasttime = -1; for (list::iterator cur=from.Line.begin();cur!=from.Line.end();cur++) { - lasttime = AddLine((*cur)->GetEntryData(),(*cur)->group,lasttime,IsSSA); + Line.push_back((*cur)->Clone()); } // Add comments diff --git a/core/ass_style.cpp b/core/ass_style.cpp index 3fbdb0c25..ea9b4fde9 100644 --- a/core/ass_style.cpp +++ b/core/ass_style.cpp @@ -524,3 +524,42 @@ wxString AssStyle::GetSSAText() { return output; } + + +///////// +// Clone +AssEntry *AssStyle::Clone() { + // Create clone + AssStyle *final = new AssStyle(); + + // Copy data + final->group = group; + final->StartMS = StartMS; + final->Valid = Valid; + final->alignment = alignment; + final->angle = angle; + final->bold = bold; + final->borderstyle = borderstyle; + final->encoding = encoding; + final->font = font; + final->fontsize = fontsize; + final->italic = italic; + final->MarginL = MarginL; + final->MarginR = MarginR; + final->MarginV = MarginV; + final->name = name; + final->outline = outline; + final->outline_w = outline_w; + final->primary = primary; + final->scalex = scalex; + final->scaley = scaley; + final->secondary = secondary; + final->shadow = shadow; + final->spacing = spacing; + final->strikeout = strikeout; + final->underline = underline; + final->SetEntryData(GetEntryData()); + + // Return + return final; +} diff --git a/core/ass_style.h b/core/ass_style.h index 60123a75d..143109436 100644 --- a/core/ass_style.h +++ b/core/ass_style.h @@ -102,6 +102,8 @@ public: wxString GetMarginString(int which); // Returns the margin value as a string (1 = left, 2 = right, 3 = vertical) void SetMarginString(const wxString value,int which); // Sets margin value from a string (1 = left, 2 = right, 3 = vertical) + AssEntry *Clone(); + AssStyle(); AssStyle(wxString data,bool IsSSA=false); ~AssStyle();