[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [calligra/krita-fixed-transform-kazakov] krita/plugins/tools/tool_transform2: Fix cursors for the tr
From:       Dmitry Kazakov <dimula73 () gmail ! com>
Date:       2013-01-23 13:25:40
Message-ID: 20130123132540.CB275A6091 () git ! kde ! org
[Download RAW message or body]

Git commit 2593548d314d0567e309e80f4596937b477d0585 by Dmitry Kazakov.
Committed on 23/01/2013 at 14:25.
Pushed by dkazakov into branch 'krita-fixed-transform-kazakov'.

Fix cursors for the transform tool when the canvas is rotated

BUG:313120

M  +42   -54   krita/plugins/tools/tool_transform2/kis_tool_transform.cc
M  +5    -3    krita/plugins/tools/tool_transform2/kis_tool_transform.h

http://commits.kde.org/calligra/2593548d314d0567e309e80f4596937b477d0585

diff --git a/krita/plugins/tools/tool_transform2/kis_tool_transform.cc \
b/krita/plugins/tools/tool_transform2/kis_tool_transform.cc index 52306cb..95c938f 100644
--- a/krita/plugins/tools/tool_transform2/kis_tool_transform.cc
+++ b/krita/plugins/tools/tool_transform2/kis_tool_transform.cc
@@ -97,16 +97,9 @@ KisToolTransform::KisToolTransform(KoCanvasBase * canvas)
     m_scaleCursors[5] = KisCursor::sizeBDiagCursor();
     m_scaleCursors[6] = KisCursor::sizeVerCursor();
     m_scaleCursors[7] = KisCursor::sizeFDiagCursor();
-    QPixmap shearPixmap;
-    shearPixmap.load(KStandardDirs::locate("data", "calligra/icons/cursor_shear.png"));
-    m_shearCursors[7] = QCursor(shearPixmap.transformed(QTransform().rotate(45)));
-    m_shearCursors[6] = QCursor(shearPixmap.transformed(QTransform().rotate(90)));
-    m_shearCursors[5] = QCursor(shearPixmap.transformed(QTransform().rotate(135)));
-    m_shearCursors[4] = QCursor(shearPixmap.transformed(QTransform().rotate(180)));
-    m_shearCursors[3] = QCursor(shearPixmap.transformed(QTransform().rotate(225)));
-    m_shearCursors[2] = QCursor(shearPixmap.transformed(QTransform().rotate(270)));
-    m_shearCursors[1] = QCursor(shearPixmap.transformed(QTransform().rotate(315)));
-    m_shearCursors[0] = QCursor(shearPixmap);
+
+    m_shearCursorPixmap.load(KStandardDirs::locate("data", "calligra/icons/cursor_shear.png"));
+
     m_defaultPointsPerLine = 3;
     m_imageTooBig = false;
     m_origDevice = 0;
@@ -169,21 +162,6 @@ double KisToolTransform::distsq(const QPointF & v, const QPointF & w)
     return v2.x()*v2.x() + v2.y()*v2.y();
 }
 
-int KisToolTransform::octant(double x, double y)
-{
-    double angle = atan2(- y, x) + M_PI / 8;
-    // M_PI / 8 to get the correct octant
-
-    // we want an angle in [0; 2 * Pi[
-    angle = fmod(angle, 2. * M_PI);
-    if (angle < 0)
-            angle += 2 * M_PI;
-
-    int octant = (int)(angle * 4. / M_PI);
-
-    return octant;
-}
-
 void KisToolTransform::storeArgs(ToolTransformArgs &args)
 {
     args = m_currentArgs;
@@ -627,11 +605,33 @@ void KisToolTransform::paint(QPainter& gc, const KoViewConverter &converter)
     }
 }
 
-void KisToolTransform::setFunctionalCursor()
+QCursor KisToolTransform::getScaleCursor(const QPointF &handlePt)
+{
+    QPointF direction = handlePt - m_currentArgs.transformedCenter();
+    qreal angle = atan2(-direction.y(), direction.x());
+    qreal rotationAngle = m_canvas->rotationAngle() * M_PI / 180.0;
+    angle -= rotationAngle - M_PI / 8.0;
+
+    angle = fmod(angle, 2.0 * M_PI);
+    if (angle < 0) {
+        angle += 2.0 * M_PI;
+    }
+
+    int octant = (int)(angle * 4. / M_PI);
+    return m_scaleCursors[octant];
+}
+
+QCursor KisToolTransform::getShearCursor(const QPointF &direction)
 {
-    QPointF dir_vect;
-    int rotOctant;
+    qreal angle = atan2(-direction.y(), direction.x());
+    qreal rotationAngle = m_canvas->rotationAngle() * M_PI / 180.0;
+    angle -= rotationAngle;
 
+    return QCursor(m_shearCursorPixmap.transformed(QTransform().rotateRadians(-angle)));;
+}
+
+void KisToolTransform::setFunctionalCursor()
+{
     if (!m_strokeId) {
         useCursor(KisCursor::pointingHandCursor());
     } else if (m_currentArgs.mode() == ToolTransformArgs::WARP) {
@@ -653,55 +653,43 @@ void KisToolTransform::setFunctionalCursor()
             useCursor(KisCursor::rotateCursor());
             break;
         case RIGHTSCALE:
-            dir_vect = m_middleRightProj - m_currentArgs.transformedCenter();
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_scaleCursors[rotOctant]);
+            useCursor(getScaleCursor(m_middleRightProj));
             break;
         case TOPSCALE:
-            dir_vect = m_middleTopProj - m_currentArgs.transformedCenter();
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_scaleCursors[rotOctant]);
+            useCursor(getScaleCursor(m_middleTopProj));
             break;
         case LEFTSCALE:
-            dir_vect = m_middleLeftProj - m_currentArgs.transformedCenter();
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_scaleCursors[rotOctant]);
+            useCursor(getScaleCursor(m_middleLeftProj));
             break;
         case BOTTOMSCALE:
-            dir_vect = m_middleBottomProj - m_currentArgs.transformedCenter();
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_scaleCursors[rotOctant]);
+            useCursor(getScaleCursor(m_middleBottomProj));
             break;
         case TOPRIGHTSCALE:
+            useCursor(getScaleCursor(m_topRightProj));
+            break;
         case BOTTOMLEFTSCALE:
-            useCursor(KisCursor::sizeBDiagCursor());
+            useCursor(getScaleCursor(m_bottomLeftProj));
             break;
         case TOPLEFTSCALE:
+            useCursor(getScaleCursor(m_topLeftProj));
+            break;
         case BOTTOMRIGHTSCALE:
-            useCursor(KisCursor::sizeFDiagCursor());
+            useCursor(getScaleCursor(m_bottomRightProj));
             break;
         case MOVECENTER:
             useCursor(KisCursor::handCursor());
             break;
         case BOTTOMSHEAR:
-            dir_vect = m_bottomRightProj - m_bottomLeftProj;
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_shearCursors[rotOctant]);
+            useCursor(getShearCursor(m_bottomLeftProj - m_bottomRightProj));
             break;
         case RIGHTSHEAR:
-            dir_vect = m_bottomRightProj - m_topRightProj;
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_shearCursors[rotOctant]);
+            useCursor(getShearCursor(m_bottomRightProj - m_topRightProj));
             break;
         case TOPSHEAR:
-            dir_vect = m_topRightProj - m_topLeftProj;
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_shearCursors[rotOctant]);
+            useCursor(getShearCursor(m_topRightProj - m_topLeftProj));
             break;
         case LEFTSHEAR:
-            dir_vect = m_bottomLeftProj - m_topLeftProj;
-            rotOctant = octant(dir_vect.x(), dir_vect.y());
-            useCursor(m_shearCursors[rotOctant]);
+            useCursor(getShearCursor(m_topLeftProj - m_bottomLeftProj));
             break;
         }
     }
diff --git a/krita/plugins/tools/tool_transform2/kis_tool_transform.h \
b/krita/plugins/tools/tool_transform2/kis_tool_transform.h index 3a30d5a..7438dd9 100644
--- a/krita/plugins/tools/tool_transform2/kis_tool_transform.h
+++ b/krita/plugins/tools/tool_transform2/kis_tool_transform.h
@@ -231,8 +231,10 @@ private:
     int det(const QPointF & v, const QPointF & w);
     // Square of the euclidian distance
     double distsq(const QPointF & v, const QPointF & w);
-    // The octant of the direction given by vector (x,y)
-    int octant(double x, double y);
+
+    QCursor getScaleCursor(const QPointF &handlePt);
+    QCursor getShearCursor(const QPointF &direction);
+
     // Makes a copy of m_currentArgs into args
     void storeArgs(ToolTransformArgs &args);
     // Makes a copy of args into m_currentArgs
@@ -284,7 +286,7 @@ private:
     function m_function; // current transformation function
 
     QCursor m_scaleCursors[8]; // cursors for the 8 directions
-    QCursor m_shearCursors[8];
+    QPixmap m_shearCursorPixmap;
 
     ToolTransformArgs m_currentArgs;
     ToolTransformArgs m_clickArgs;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic