[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