From 4d98ea25afcc8d0ca07b850c84c71f2a6a0357d4 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Wed, 4 Jul 2007 21:47:26 +0000 Subject: [PATCH] Made it possible to drag the origin while in both rotation modes. Originally committed to SVN as r1355. --- aegisub/visual_feature.cpp | 13 +++++---- aegisub/visual_tool.cpp | 1 + aegisub/visual_tool_rotatexy.cpp | 42 +++++++++++++++++++++++++--- aegisub/visual_tool_rotatexy.h | 5 ++++ aegisub/visual_tool_rotatez.cpp | 48 +++++++++++++++++++++++++++----- aegisub/visual_tool_rotatez.h | 5 ++++ 6 files changed, 97 insertions(+), 17 deletions(-) diff --git a/aegisub/visual_feature.cpp b/aegisub/visual_feature.cpp index d0f09d244..5e79786b5 100644 --- a/aegisub/visual_feature.cpp +++ b/aegisub/visual_feature.cpp @@ -73,9 +73,10 @@ bool VisualDraggableFeature::IsMouseOver(int mx,int my) { // Triangle else if (type == DRAG_BIG_TRIANGLE) { - if (my < y-8 || my > y+8) return false; + int _my = my+2; + if (_my < y-8 || _my > y+8) return false; int dx = mx-x; - int dy = my-y-8; + int dy = _my-y-8; return (16*dx+9*dy < 0 && 16*dx-9*dy > 0); } @@ -113,10 +114,10 @@ void VisualDraggableFeature::Draw(OpenGLWrapper *gl) { // Triangle else if (type == DRAG_BIG_TRIANGLE) { - gl->DrawTriangle(x-9,y-8,x+9,y-8,x,y+8); - gl->DrawLine(x,y-2,x,y-18); - gl->DrawLine(x,y-2,x-14,y+6); - gl->DrawLine(x,y-2,x+14,y+6); + gl->DrawTriangle(x-9,y-6,x+9,y-6,x,y+10); + gl->DrawLine(x,y,x,y-16); + gl->DrawLine(x,y,x-14,y+8); + gl->DrawLine(x,y,x+14,y+8); } // Small circle diff --git a/aegisub/visual_tool.cpp b/aegisub/visual_tool.cpp index cc5133ef6..1e7a21b1d 100644 --- a/aegisub/visual_tool.cpp +++ b/aegisub/visual_tool.cpp @@ -585,6 +585,7 @@ void VisualTool::GetLineClip(AssDialogue *diag,int &x1,int &y1,int &x2,int &y2) // Set override void VisualTool::SetOverride(wxString tag,wxString value) { VideoContext::Get()->grid->editBox->SetOverride(tag,value,0,false); + parent->SetFocus(); } diff --git a/aegisub/visual_tool_rotatexy.cpp b/aegisub/visual_tool_rotatexy.cpp index 73a6ac2be..e0511564d 100644 --- a/aegisub/visual_tool_rotatexy.cpp +++ b/aegisub/visual_tool_rotatexy.cpp @@ -53,6 +53,9 @@ VisualToolRotateXY::VisualToolRotateXY(VideoDisplay *_parent) : VisualTool(_parent) { _parent->ShowCursor(false); + AssDialogue *line = GetActiveDialogueLine(); + GetLinePosition(line,odx,ody,orgx,orgy); + GetLineRotation(line,curAngleX,curAngleY,rz); } @@ -73,7 +76,8 @@ void VisualToolRotateXY::Draw() { // Pivot coordinates int dx=0,dy=0; - GetLinePosition(line,dx,dy,orgx,orgy); + if (dragging) GetLinePosition(line,dx,dy); + else GetLinePosition(line,dx,dy,orgx,orgy); dx = orgx; dy = orgy; @@ -90,9 +94,7 @@ void VisualToolRotateXY::Draw() { SetFillColour(colour[1],0.3f); // Draw pivot - DrawCircle(dx,dy,7); - DrawLine(dx,dy-16,dx,dy+16); - DrawLine(dx-16,dy,dx+16,dy); + DrawAllFeatures(); // Transform grid glMatrixMode(GL_MODELVIEW); @@ -230,3 +232,35 @@ void VisualToolRotateXY::CommitHold() { SetOverride(_T("\\frx"),PrettyFloat(wxString::Format(_T("(%0.3f)"),curAngleX))); SetOverride(_T("\\fry"),PrettyFloat(wxString::Format(_T("(%0.3f)"),curAngleY))); } + + +////////////////// +// Get \org pivot +void VisualToolRotateXY::PopulateFeatureList() { + // Get line + curDiag = GetActiveDialogueLine(); + GetLinePosition(curDiag,odx,ody,orgx,orgy); + + // Set features + features.resize(1); + VisualDraggableFeature &feat = features.back(); + feat.x = orgx; + feat.y = orgy; + feat.line = curDiag; + feat.type = DRAG_BIG_TRIANGLE; +} + + +/////////////////////////// +// Update dragging of \org +void VisualToolRotateXY::UpdateDrag(VisualDraggableFeature &feature) { + orgx = feature.x; + orgy = feature.y; +} + + +/////////////////////////// +// Commit dragging of \org +void VisualToolRotateXY::CommitDrag(VisualDraggableFeature &feature) { + SetOverride(_T("\\org"),wxString::Format(_T("(%i,%i)"),feature.x,feature.y)); +} diff --git a/aegisub/visual_tool_rotatexy.h b/aegisub/visual_tool_rotatexy.h index 8080850d1..685403807 100644 --- a/aegisub/visual_tool_rotatexy.h +++ b/aegisub/visual_tool_rotatexy.h @@ -56,6 +56,11 @@ private: void UpdateHold(); void CommitHold(); + bool CanDrag() { return true; } + void PopulateFeatureList(); + void UpdateDrag(VisualDraggableFeature &feature); + void CommitDrag(VisualDraggableFeature &feature); + public: VisualToolRotateXY(VideoDisplay *parent); diff --git a/aegisub/visual_tool_rotatez.cpp b/aegisub/visual_tool_rotatez.cpp index e700f711b..7805d1122 100644 --- a/aegisub/visual_tool_rotatez.cpp +++ b/aegisub/visual_tool_rotatez.cpp @@ -53,6 +53,9 @@ VisualToolRotateZ::VisualToolRotateZ(VideoDisplay *_parent) : VisualTool(_parent) { _parent->ShowCursor(false); + AssDialogue *line = GetActiveDialogueLine(); + GetLinePosition(line,odx,ody,orgx,orgy); + GetLineRotation(line,rx,ry,curAngle); } @@ -71,9 +74,13 @@ void VisualToolRotateZ::Draw() { AssDialogue *line = GetActiveDialogueLine(); if (!line) return; + // Draw pivot + DrawAllFeatures(); + // Radius int dx=0,dy=0; - GetLinePosition(line,dx,dy,orgx,orgy); + if (dragging) GetLinePosition(line,dx,dy); + else GetLinePosition(line,dx,dy,orgx,orgy); int radius = (int) sqrt(double((dx-orgx)*(dx-orgx)+(dy-orgy)*(dy-orgy))); int oRadius = radius; if (radius < 50) radius = 50; @@ -102,11 +109,6 @@ void VisualToolRotateZ::Draw() { SetLineColour(colour[0]); SetFillColour(colour[1],0.3f); - // Draw pivot - DrawCircle(dx,dy,7); - DrawLine(dx,dy-16,dx,dy+16); - DrawLine(dx-16,dy,dx+16,dy); - // Set up the projection glMatrixMode(GL_MODELVIEW); glPushMatrix(); @@ -155,7 +157,7 @@ void VisualToolRotateZ::Draw() { glPopMatrix(); // Draw line to mouse - if (mouseX != -1) { + if (mouseX != -1 && !dragging && GetHighlightedFeature() == -1) { SetLineColour(colour[0]); DrawLine(dx,dy,mx,my); } @@ -196,3 +198,35 @@ void VisualToolRotateZ::UpdateHold() { void VisualToolRotateZ::CommitHold() { SetOverride(_T("\\frz"),PrettyFloat(wxString::Format(_T("(%0.3f)"),curAngle))); } + + +////////////////// +// Get \org pivot +void VisualToolRotateZ::PopulateFeatureList() { + // Get line + curDiag = GetActiveDialogueLine(); + GetLinePosition(curDiag,odx,ody,orgx,orgy); + + // Set features + features.resize(1); + VisualDraggableFeature &feat = features.back(); + feat.x = orgx; + feat.y = orgy; + feat.line = curDiag; + feat.type = DRAG_BIG_TRIANGLE; +} + + +/////////////////////////// +// Update dragging of \org +void VisualToolRotateZ::UpdateDrag(VisualDraggableFeature &feature) { + orgx = feature.x; + orgy = feature.y; +} + + +/////////////////////////// +// Commit dragging of \org +void VisualToolRotateZ::CommitDrag(VisualDraggableFeature &feature) { + SetOverride(_T("\\org"),wxString::Format(_T("(%i,%i)"),feature.x,feature.y)); +} diff --git a/aegisub/visual_tool_rotatez.h b/aegisub/visual_tool_rotatez.h index 48db04f65..45bdb3b02 100644 --- a/aegisub/visual_tool_rotatez.h +++ b/aegisub/visual_tool_rotatez.h @@ -55,6 +55,11 @@ private: void UpdateHold(); void CommitHold(); + bool CanDrag() { return true; } + void PopulateFeatureList(); + void UpdateDrag(VisualDraggableFeature &feature); + void CommitDrag(VisualDraggableFeature &feature); + public: VisualToolRotateZ(VideoDisplay *parent);