diff --git a/aegisub/src/visual_feature.cpp b/aegisub/src/visual_feature.cpp index c5e6b41a8..ca3ad1281 100644 --- a/aegisub/src/visual_feature.cpp +++ b/aegisub/src/visual_feature.cpp @@ -44,12 +44,9 @@ VisualDraggableFeature::VisualDraggableFeature() , x(INT_MIN) , y(INT_MIN) , layer(0) -, value(0) -, value2(0) , line(NULL) , lineN(-1) { - for (int i=0;i<4;i++) brother[i] = -1; } bool VisualDraggableFeature::IsMouseOver(int mx,int my) { diff --git a/aegisub/src/visual_feature.h b/aegisub/src/visual_feature.h index 659a650a0..c9436a230 100644 --- a/aegisub/src/visual_feature.h +++ b/aegisub/src/visual_feature.h @@ -77,14 +77,9 @@ public: int layer; /// Layer; Higher = above - int value; /// userdata; used by drag tool for time - int value2; /// more userdata - AssDialogue* line; /// The dialogue line this feature is for int lineN; /// The line's index in the file - int brother[4]; /// userdata; generally indexes of other features in an array - /// @brief Is the given point over this feature? /// @param mx x coordinate to test /// @param my y coordinate to test diff --git a/aegisub/src/visual_tool.cpp b/aegisub/src/visual_tool.cpp index c0de38151..59003deaf 100644 --- a/aegisub/src/visual_tool.cpp +++ b/aegisub/src/visual_tool.cpp @@ -61,6 +61,9 @@ #include "video_provider_manager.h" #include "visual_feature.h" #include "visual_tool.h" +#include "visual_tool_clip.h" +#include "visual_tool_drag.h" +#include "visual_tool_vector_clip.h" const wxColour IVisualTool::colour[4] = {wxColour(106,32,19), wxColour(255,169,40), wxColour(255,253,185), wxColour(187,0,0)}; @@ -676,4 +679,8 @@ void VisualTool::SetOverride(AssDialogue* line, wxString tag, wxStr parent->SetFocus(); } +// If only export worked template class VisualTool; +template class VisualTool; +template class VisualTool; +template class VisualTool; diff --git a/aegisub/src/visual_tool_clip.cpp b/aegisub/src/visual_tool_clip.cpp index b340afff3..efd5a373c 100644 --- a/aegisub/src/visual_tool_clip.cpp +++ b/aegisub/src/visual_tool_clip.cpp @@ -150,43 +150,39 @@ void VisualToolClip::PopulateFeatureList() { int i = 0; features[i].x = curX1; features[i].y = curY1; - features[i].brother[0] = 1; - features[i].brother[1] = 2; - features[i].brother[2] = 3; + features[i].horiz = &features[1]; + features[i].vert = &features[2]; features[i].type = DRAG_SMALL_CIRCLE; i++; // Top-right features[i].x = curX2; features[i].y = curY1; - features[i].brother[0] = 0; - features[i].brother[1] = 3; - features[i].brother[2] = 2; + features[i].horiz = &features[0]; + features[i].vert = &features[3]; features[i].type = DRAG_SMALL_CIRCLE; i++; // Bottom-left features[i].x = curX1; features[i].y = curY2; - features[i].brother[0] = 3; - features[i].brother[1] = 0; - features[i].brother[2] = 1; + features[i].horiz = &features[3]; + features[i].vert = &features[0]; features[i].type = DRAG_SMALL_CIRCLE; i++; // Bottom-right features[i].x = curX2; features[i].y = curY2; - features[i].brother[0] = 2; - features[i].brother[1] = 1; - features[i].brother[2] = 0; + features[i].horiz = &features[2]; + features[i].vert = &features[1]; features[i].type = DRAG_SMALL_CIRCLE; i++; } /// @brief Initialize /// @param feature -bool VisualToolClip::InitializeDrag(VisualDraggableFeature &feature) { +bool VisualToolClip::InitializeDrag(ClipCorner &feature) { curDiag = GetActiveDialogueLine(); curDiag->StripTag(L"\\clip"); curDiag->StripTag(L"\\iclip"); @@ -195,10 +191,10 @@ bool VisualToolClip::InitializeDrag(VisualDraggableFeature &feature) { /// @brief Update drag /// @param feature -void VisualToolClip::UpdateDrag(VisualDraggableFeature &feature) { +void VisualToolClip::UpdateDrag(ClipCorner &feature) { // Update brothers - features[feature.brother[0]].y = feature.y; - features[feature.brother[1]].x = feature.x; + feature.horiz->y = feature.y; + feature.vert->x = feature.x; // Get "cur" from features curX1 = features[0].x; @@ -213,6 +209,6 @@ void VisualToolClip::UpdateDrag(VisualDraggableFeature &feature) { /// @brief Done dragging /// @param feature -void VisualToolClip::CommitDrag(VisualDraggableFeature &feature) { +void VisualToolClip::CommitDrag(ClipCorner &feature) { CommitHold(); } diff --git a/aegisub/src/visual_tool_clip.h b/aegisub/src/visual_tool_clip.h index 53eb324bc..624c694ee 100644 --- a/aegisub/src/visual_tool_clip.h +++ b/aegisub/src/visual_tool_clip.h @@ -37,12 +37,26 @@ #include "visual_feature.h" #include "visual_tool.h" +/// @class ClipCorner +/// @brief VisualDraggableFeature with siblings +class ClipCorner : public VisualDraggableFeature { +public: + ClipCorner* horiz; /// Other corner on this corner's horizontal line + ClipCorner* vert; /// Other corner on this corner's vertical line + /// @brief Constructor + ClipCorner() + : VisualDraggableFeature() + , horiz(NULL) + , vert(NULL) + { } +}; + /// DOCME /// @class VisualToolClip /// @brief DOCME /// /// DOCME -class VisualToolClip : public VisualTool { +class VisualToolClip : public VisualTool { private: /// DOCME @@ -73,9 +87,9 @@ private: /// @brief DOCME /// void PopulateFeatureList(); - bool InitializeDrag(VisualDraggableFeature &feature); - void UpdateDrag(VisualDraggableFeature &feature); - void CommitDrag(VisualDraggableFeature &feature); + bool InitializeDrag(ClipCorner &feature); + void UpdateDrag(ClipCorner &feature); + void CommitDrag(ClipCorner &feature); public: VisualToolClip(VideoDisplay *parent, VideoState const& video, wxToolBar *); diff --git a/aegisub/src/visual_tool_drag.cpp b/aegisub/src/visual_tool_drag.cpp index 80f5edb1b..394c3c2bc 100644 --- a/aegisub/src/visual_tool_drag.cpp +++ b/aegisub/src/visual_tool_drag.cpp @@ -128,57 +128,53 @@ void VisualToolDrag::Draw() { // Draw arrows for (size_t i=0;ibrother[0]]; + if (features[i].type == DRAG_BIG_SQUARE) continue; + VisualDraggableFeature *p2 = &features[i]; + VisualDraggableFeature *p1 = &features[features[i].parent]; - // Has arrow? - bool hasArrow = p2->type == DRAG_BIG_CIRCLE; - int arrowLen = hasArrow ? 10 : 0; + // Has arrow? + bool hasArrow = p2->type == DRAG_BIG_CIRCLE; + int arrowLen = hasArrow ? 10 : 0; - // See if the distance between them is enough - int dx = p2->x - p1->x; - int dy = p2->y - p1->y; - int dist = (int)sqrt(double(dx*dx + dy*dy)); - if (dist < 20+arrowLen) continue; + // See if the distance between them is enough + int dx = p2->x - p1->x; + int dy = p2->y - p1->y; + int dist = (int)sqrt(double(dx*dx + dy*dy)); + if (dist < 20+arrowLen) continue; - // Get end points - int x1 = p1->x + dx*10/dist; - int x2 = p2->x - dx*(10+arrowLen)/dist; - int y1 = p1->y + dy*10/dist; - int y2 = p2->y - dy*(10+arrowLen)/dist; + // Get end points + int x1 = p1->x + dx*10/dist; + int x2 = p2->x - dx*(10+arrowLen)/dist; + int y1 = p1->y + dy*10/dist; + int y2 = p2->y - dy*(10+arrowLen)/dist; - // Draw arrow - if (hasArrow) { - // Calculate angle - double angle = atan2(double(y2-y1),double(x2-x1))+1.570796; - int sx = int(cos(angle)*4); - int sy = int(-sin(angle)*4); + // Draw arrow + if (hasArrow) { + // Calculate angle + double angle = atan2(double(y2-y1),double(x2-x1))+1.570796; + int sx = int(cos(angle)*4); + int sy = int(-sin(angle)*4); - // Arrow line - SetLineColour(colour[3],0.8f,2); - DrawLine(x1,y1,x2,y2); + // Arrow line + SetLineColour(colour[3],0.8f,2); + DrawLine(x1,y1,x2,y2); - // Arrow head - DrawLine(x2+sx,y2-sy,x2-sx,y2+sy); - DrawLine(x2+sx,y2-sy,x2+dx*10/dist,y2+dy*10/dist); - DrawLine(x2-sx,y2+sy,x2+dx*10/dist,y2+dy*10/dist); - } + // Arrow head + DrawLine(x2+sx,y2-sy,x2-sx,y2+sy); + DrawLine(x2+sx,y2-sy,x2+dx*10/dist,y2+dy*10/dist); + DrawLine(x2-sx,y2+sy,x2+dx*10/dist,y2+dy*10/dist); + } - // Draw dashed line - else { - SetLineColour(colour[3],0.5f,2); - DrawDashedLine(x1,y1,x2,y2,6); - } + // Draw dashed line + else { + SetLineColour(colour[3],0.5f,2); + DrawDashedLine(x1,y1,x2,y2,6); } } } /// @brief Populate list void VisualToolDrag::PopulateFeatureList() { - // Clear features features.clear(); // Get video data @@ -204,16 +200,16 @@ void VisualToolDrag::PopulateFeatureList() { GetLineMove(diag,hasMove,x1,y1,x2,y2,t1,t2); // Create \pos feature - VisualDraggableFeature feat; + VisualToolDragDraggableFeature feat; feat.x = x1; feat.y = y1; feat.layer = 0; feat.type = DRAG_BIG_SQUARE; - feat.value = t1; + feat.time = t1; feat.line = diag; feat.lineN = i; features.push_back(feat); - int parentN = features.size()-1; + feat.parent = features.size() - 1; // Create move destination feature if (hasMove) { @@ -221,32 +217,22 @@ void VisualToolDrag::PopulateFeatureList() { feat.y = y2; feat.layer = 1; feat.type = DRAG_BIG_CIRCLE; - feat.value = t2; + feat.time = t2; feat.line = diag; feat.lineN = i; features.push_back(feat); - - // Add each other as brothers. - int n = features.size(); - features[n-1].brother[0] = parentN; - features[parentN].brother[0] = n-1; + features[feat.parent].parent = features.size() - 1; } - // Create org feature if (torgx != x1 || torgy != y1) { feat.x = torgx; feat.y = torgy; feat.layer = -1; feat.type = DRAG_BIG_TRIANGLE; - feat.value = 0; + feat.time = 0; feat.line = diag; feat.lineN = i; features.push_back(feat); - - // Add each other as brothers. - int n = features.size(); - features[n-1].brother[0] = parentN; - features[parentN].brother[1] = n-1; } } } @@ -255,47 +241,44 @@ void VisualToolDrag::PopulateFeatureList() { /// @brief Update drag /// @param feature -void VisualToolDrag::UpdateDrag(VisualDraggableFeature &feature) { - // Update "value" to reflect the time of the frame in which the feature is being dragged +void VisualToolDrag::UpdateDrag(VisualToolDragDraggableFeature &feature) { + // Update "time" to reflect the time of the frame in which the feature is being dragged int time = VFR_Output.GetTimeAtFrame(frame_n,true,true); - feature.value = MID(0,time - feature.line->Start.GetMS(),feature.line->End.GetMS()-feature.line->Start.GetMS()); + feature.time = MID(0,time - feature.line->Start.GetMS(),feature.line->End.GetMS()-feature.line->Start.GetMS()); } /// @brief Commit drag /// @param feature -void VisualToolDrag::CommitDrag(VisualDraggableFeature &feature) { +void VisualToolDrag::CommitDrag(VisualToolDragDraggableFeature &feature) { // Origin if (feature.type == DRAG_BIG_TRIANGLE) { int x = feature.x; int y = feature.y; parent->ToScriptCoords(&x, &y); SetOverride(feature.line, L"\\org",wxString::Format(L"(%i,%i)",x,y)); + return; } + VisualToolDragDraggableFeature *p = feature->parent > -1 ? &features[feature->parent] : NULL; + if (feature->type == DRAG_BIG_CIRCLE) { + std::swap(feature, p); + } + + int x1 = feature->x; + int y1 = feature->y; + parent->ToScriptCoords(&x1, &y1); + // Position - else if (feature.brother[0] == -1) { - int x = feature.x; - int y = feature.y; - parent->ToScriptCoords(&x, &y); - SetOverride(feature.line, L"\\pos",wxString::Format(L"(%i,%i)",x,y)); + if (!p) { + SetOverride(feature.line, L"\\pos", wxString::Format(L"(%i,%i)", x1, y1)); } - // Move else { - // Get source on p1 and dest on p2 - VisualDraggableFeature *p1,*p2; - p1 = &feature; - if (p1->type == DRAG_BIG_CIRCLE) p1 = &features[p1->brother[0]]; - p2 = &features[p1->brother[0]]; - - int x1 = p1->x; - int y1 = p1->y; - parent->ToScriptCoords(&x1, &y1); - int x2 = p2->x; - int y2 = p2->y; + int x2 = p->x; + int y2 = p->y; parent->ToScriptCoords(&x2, &y2); // Set override - SetOverride(feature.line, L"\\move", wxString::Format(L"(%i,%i,%i,%i,%i,%i)", x1, y1, x2, y2, p1->value, p2->value)); + SetOverride(feature->line, L"\\move", wxString::Format(L"(%i,%i,%i,%i,%i,%i)", x1, y1, x2, y2, feature->time, p->time)); } } diff --git a/aegisub/src/visual_tool_drag.h b/aegisub/src/visual_tool_drag.h index 8ecf90976..63097d0db 100644 --- a/aegisub/src/visual_tool_drag.h +++ b/aegisub/src/visual_tool_drag.h @@ -42,13 +42,26 @@ #include "visual_feature.h" #include "visual_tool.h" +/// @class VisualToolDragDraggableFeature +/// @brief VisualDraggableFeature with a time value +class VisualToolDragDraggableFeature : public VisualDraggableFeature { +public: + int time; + int parent; + VisualToolDragDraggableFeature() + : VisualDraggableFeature() + , time(0) + , parent(-1) + { } +}; + /// DOCME /// @class VisualToolDrag /// @brief DOCME /// /// DOCME -class VisualToolDrag : public VisualTool { +class VisualToolDrag : public VisualTool { private: /// DOCME wxToolBar *toolBar; @@ -60,8 +73,8 @@ private: /// bool CanDrag() { return true; } void PopulateFeatureList(); - void UpdateDrag(VisualDraggableFeature &feature); - void CommitDrag(VisualDraggableFeature &feature); + void UpdateDrag(VisualToolDragDraggableFeature &feature); + void CommitDrag(VisualToolDragDraggableFeature &feature); void UpdateToggleButtons(); void DoRefresh(); diff --git a/aegisub/src/visual_tool_vector_clip.cpp b/aegisub/src/visual_tool_vector_clip.cpp index c65933f0f..f58af4ec9 100644 --- a/aegisub/src/visual_tool_vector_clip.cpp +++ b/aegisub/src/visual_tool_vector_clip.cpp @@ -206,7 +206,7 @@ void VisualToolVectorClip::Draw() { void VisualToolVectorClip::PopulateFeatureList() { // Clear features.clear(); - VisualDraggableFeature feat; + VisualToolVectorClipDraggableFeature feat; // Go through each curve bool isFirst = true; @@ -218,8 +218,8 @@ void VisualToolVectorClip::PopulateFeatureList() { feat.x = (int)cur->p1.x; feat.y = (int)cur->p1.y; feat.type = DRAG_SMALL_CIRCLE; - feat.value = i; - feat.value2 = 0; + feat.index = i; + feat.point = 0; features.push_back(feat); } @@ -228,8 +228,8 @@ void VisualToolVectorClip::PopulateFeatureList() { feat.x = (int)cur->p2.x; feat.y = (int)cur->p2.y; feat.type = DRAG_SMALL_CIRCLE; - feat.value = i; - feat.value2 = 1; + feat.index = i; + feat.point = 1; features.push_back(feat); } @@ -241,22 +241,20 @@ void VisualToolVectorClip::PopulateFeatureList() { // Control points feat.x = (int)cur->p2.x; feat.y = (int)cur->p2.y; - feat.value = i; - feat.value2 = 1; - feat.brother[0] = size-1; + feat.index = i; + feat.point = 1; feat.type = DRAG_SMALL_SQUARE; features.push_back(feat); feat.x = (int)cur->p3.x; feat.y = (int)cur->p3.y; - feat.value2 = 2; - feat.brother[0] = size+2; + feat.point = 2; features.push_back(feat); // End point feat.x = (int)cur->p4.x; feat.y = (int)cur->p4.y; feat.type = DRAG_SMALL_CIRCLE; - feat.value2 = 3; + feat.point = 3; features.push_back(feat); } } @@ -264,27 +262,27 @@ void VisualToolVectorClip::PopulateFeatureList() { /// @brief Update /// @param feature -void VisualToolVectorClip::UpdateDrag(VisualDraggableFeature &feature) { - spline.MovePoint(feature.value,feature.value2,wxPoint(feature.x,feature.y)); +void VisualToolVectorClip::UpdateDrag(VisualToolVectorClipDraggableFeature &feature) { + spline.MovePoint(feature.index,feature.point,wxPoint(feature.x,feature.y)); } /// @brief Commit /// @param feature -void VisualToolVectorClip::CommitDrag(VisualDraggableFeature &feature) { +void VisualToolVectorClip::CommitDrag(VisualToolVectorClipDraggableFeature &feature) { SetOverride(GetActiveDialogueLine(), inverse ? L"\\iclip" : L"\\clip", L"(" + spline.EncodeToASS() + L")"); } /// @brief Clicked a feature /// @param feature /// @return -bool VisualToolVectorClip::InitializeDrag(VisualDraggableFeature &feature) { +bool VisualToolVectorClip::InitializeDrag(VisualToolVectorClipDraggableFeature &feature) { // Delete a control point if (mode == 5) { int i = 0; for (std::list::iterator cur=spline.curves.begin();cur!=spline.curves.end();i++,cur++) { - if (i == feature.value) { + if (i == feature.index) { // Update next - if (i != 0 || feature.value2 != 0) { + if (i != 0 || feature.point != 0) { std::list::iterator next = cur; next++; if (next != spline.curves.end()) next->p1 = cur->p1; diff --git a/aegisub/src/visual_tool_vector_clip.h b/aegisub/src/visual_tool_vector_clip.h index 1736ef4dd..4abcf064c 100644 --- a/aegisub/src/visual_tool_vector_clip.h +++ b/aegisub/src/visual_tool_vector_clip.h @@ -40,10 +40,27 @@ class wxToolBar; +/// @class VisualToolVectorClipDraggableFeature +/// @brief VisualDraggableFeature with information about a feature's location +/// in the spline +class VisualToolVectorClipDraggableFeature : public VisualDraggableFeature { +public: + /// Which curve in the spline this feature is a point on + int index; + /// 0-3; indicates which part of the curve this point is + int point; + /// @brief Constructor + VisualToolVectorClipDraggableFeature() + : VisualDraggableFeature() + , index(0) + , point(0) + { } +}; + /// DOCME /// @class VisualToolVectorClip /// @brief DOCME -class VisualToolVectorClip : public VisualTool { +class VisualToolVectorClip : public VisualTool { private: /// DOCME @@ -75,9 +92,9 @@ private: void PopulateFeatureList(); - void UpdateDrag(VisualDraggableFeature &feature); - void CommitDrag(VisualDraggableFeature &feature); - bool InitializeDrag(VisualDraggableFeature &feature); + void UpdateDrag(VisualToolVectorClipDraggableFeature &feature); + void CommitDrag(VisualToolVectorClipDraggableFeature &feature); + bool InitializeDrag(VisualToolVectorClipDraggableFeature &feature); void DoRefresh();