include/svx/svdoashp.hxx       |    3 ++-
 svx/source/svdraw/svdoashp.cxx |   17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 2 deletions(-)

New commits:
commit 45ff1bdf2690e00b8df2803b33b1ac24eb405acf
Author: Caolán McNamara <caol...@redhat.com>
Date:   Mon Sep 25 14:45:51 2017 +0100

    Improve resizing chevrons so the control point is a fixed distance from end
    
    during resizing, because...
    
    "If I want to use LibreOffice Draw to illustrate process steps with chevrons
    (which I do a lot, working on for example customer project roadmaps), I 
always
    get stuck if the steps I want to illustrate are not equal lengths, because 
the
    sizes/angles of the chevron "arrow heads" are proportional to the length of 
the
    chevron, rather than being fixed, and thus don't "fit" together. Which makes
    for an incredibly ugly diagram."
    
    Change-Id: Ib8b5e0ea7db5383cae754127023f7ab12d748537
    Reviewed-on: https://gerrit.libreoffice.org/42754
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>

diff --git a/include/svx/svdoashp.hxx b/include/svx/svdoashp.hxx
index ea222ed578de..85f5e9dc68ca 100644
--- a/include/svx/svdoashp.hxx
+++ b/include/svx/svdoashp.hxx
@@ -57,11 +57,12 @@ enum class CustomShapeHandleModes
     RESIZE_ABSOLUTE_Y    = 8,
     MOVE_SHAPE           = 16,
     ORTHO4               = 32,
+    RESIZE_ABSOLUTE_NEGX = 64
 };
 
 namespace o3tl
 {
-    template<> struct typed_flags<CustomShapeHandleModes> : 
is_typed_flags<CustomShapeHandleModes, 63> {};
+    template<> struct typed_flags<CustomShapeHandleModes> : 
is_typed_flags<CustomShapeHandleModes, 127> {};
 }
 
 struct SdrCustomShapeInteraction
diff --git a/svx/source/svdraw/svdoashp.cxx b/svx/source/svdraw/svdoashp.cxx
index 532337571d05..4f01a19d8411 100644
--- a/svx/source/svdraw/svdoashp.cxx
+++ b/svx/source/svdraw/svdoashp.cxx
@@ -617,6 +617,11 @@ std::vector< SdrCustomShapeInteraction > 
SdrObjCustomShape::GetInteractionHandle
                         }
                         break;
 
+                        case mso_sptChevron :
+                        case mso_sptHomePlate :
+                             nMode |= 
CustomShapeHandleModes::RESIZE_ABSOLUTE_NEGX;
+                        break;
+
                         case mso_sptWedgeRectCallout :
                         case mso_sptWedgeRRectCallout :
                         case mso_sptCloudCallout :
@@ -1523,6 +1528,11 @@ void SdrObjCustomShape::NbcResize( const Point& rRef, 
const Fraction& rxFact, co
                 sal_Int32 nX = ( aIter->aPosition.X - aOld.Left() ) + 
maRect.Left();
                 aIter->xInteraction->setControllerPosition( css::awt::Point( 
nX, aIter->xInteraction->getPosition().Y ) );
             }
+            else if ( aIter->nMode & 
CustomShapeHandleModes::RESIZE_ABSOLUTE_NEGX )
+            {
+                sal_Int32 nX = maRect.Right() - (aOld.Right() - 
aIter->aPosition.X);
+                aIter->xInteraction->setControllerPosition( css::awt::Point( 
nX, aIter->xInteraction->getPosition().Y ) );
+            }
             if ( aIter->nMode & CustomShapeHandleModes::RESIZE_ABSOLUTE_Y )
             {
                 sal_Int32 nY = ( aIter->aPosition.Y - aOld.Top() ) + 
maRect.Top();
@@ -1535,6 +1545,7 @@ void SdrObjCustomShape::NbcResize( const Point& rRef, 
const Fraction& rxFact, co
     }
     InvalidateRenderGeometry();
 }
+
 void SdrObjCustomShape::NbcRotate( const Point& rRef, long nAngle, double sn, 
double cs )
 {
     bool bMirroredX = IsMirroredX();
@@ -1933,8 +1944,12 @@ void SdrObjCustomShape::DragResizeCustomShape( const 
tools::Rectangle& rNewRect
             {
                 if ( aIter->nMode & CustomShapeHandleModes::RESIZE_FIXED )
                     aIter->xInteraction->setControllerPosition( 
aIter->aPosition );
-                if ( aIter->nMode & CustomShapeHandleModes::RESIZE_ABSOLUTE_X )
+                if ( aIter->nMode & CustomShapeHandleModes::RESIZE_ABSOLUTE_X 
||
+                     aIter->nMode & 
CustomShapeHandleModes::RESIZE_ABSOLUTE_NEGX )
                 {
+                    if (aIter->nMode & 
CustomShapeHandleModes::RESIZE_ABSOLUTE_NEGX)
+                        bOldMirroredX = !bOldMirroredX;
+
                     sal_Int32 nX;
                     if ( bOldMirroredX )
                     {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to