diff options
author | Marco Cecchetti <mrcekets@gmail.com> | 2018-11-29 22:37:45 +0100 |
---|---|---|
committer | Jan Holesovsky <kendy@collabora.com> | 2018-12-10 12:40:24 +0100 |
commit | e9164b9bc8bd39e02f99cf7c08e38ea0b1e1134a (patch) | |
tree | 5f4a3c037b9dc85d49c950ce40c4cf74e5ef77a9 /svx/source | |
parent | dd89dc8df8d82ab43f34a0c8fcfa67f93aefcb99 (diff) |
lok: shape scaling rework
Now shape scaling is handled through the transform dialog instead of
simulating a drag and drop event in core.
For Impress the unit used for length is '100th mm' instead of twips,
so we need to transform positions and size from twips to '100th mm'.
Anyway since we don't know in SetGeoAttrToMarked if the new data is
due to a mouse event or by entering a new value in the transormation
dialog or in the side pane, for Impress we need to convert the new
values sent by the dialogs from '100th mm' to twips which are
converted back in SetGeoAttrToMarked.
For performing a uniform scaling when the shape/image is rotated we
need to inform the client about the rotation angle for the selected
graphic object that has been achieved but appending an angle argument
to the graphic selection callback.
Now it is also possible to reverse shapes/images through negative
scaling.
Change-Id: I8a32f3e4b28f36e884a59c59b7e1351e85ef4489
Reviewed-on: https://gerrit.libreoffice.org/64696
Tested-by: Jenkins
Reviewed-by: Jan Holesovsky <kendy@collabora.com>
Diffstat (limited to 'svx/source')
-rw-r--r-- | svx/source/sidebar/possize/PosSizePropertyPanel.cxx | 66 | ||||
-rw-r--r-- | svx/source/svdraw/svdedtv1.cxx | 58 | ||||
-rw-r--r-- | svx/source/svdraw/svdmrkv.cxx | 11 |
3 files changed, 113 insertions, 22 deletions
diff --git a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx index 1afdf1e725b9..e210f75cfdd9 100644 --- a/svx/source/sidebar/possize/PosSizePropertyPanel.cxx +++ b/svx/source/sidebar/possize/PosSizePropertyPanel.cxx @@ -38,15 +38,35 @@ #include <svl/aeitem.hxx> #include <svx/svdview.hxx> #include <svx/transfrmhelper.hxx> -#include <sal/log.hxx> +#include <comphelper/lok.hxx> using namespace css; using namespace css::uno; const char USERITEM_NAME[] = "FitItem"; -namespace svx { namespace sidebar { +namespace { +bool lcl_twipsNeeded(const SdrView* pView) +{ + const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); + if (bTiledRendering) + { + // We gets the position in twips + if (OutputDevice* pOutputDevice = pView->GetFirstOutputDevice()) + { + if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + return true; + } + } + } + return false; +} + +} // anonymouus ns + +namespace svx { namespace sidebar { PosSizePropertyPanel::PosSizePropertyPanel( vcl::Window* pParent, @@ -373,6 +393,11 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, ChangePosXHdl, Edit&, void ) Fraction aUIScale = mpView->GetModel()->GetUIScale(); lX = long( lX * aUIScale ); + if (lcl_twipsNeeded(mpView)) + { + lX = OutputDevice::LogicToLogic(lX, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aPosXItem( SID_ATTR_TRANSFORM_POS_X,static_cast<sal_uInt32>(lX)); GetBindings()->GetDispatcher()->ExecuteList( @@ -390,6 +415,11 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, ChangePosYHdl, Edit&, void ) Fraction aUIScale = mpView->GetModel()->GetUIScale(); lY = long( lY * aUIScale ); + if (lcl_twipsNeeded(mpView)) + { + lY = OutputDevice::LogicToLogic(lY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aPosYItem( SID_ATTR_TRANSFORM_POS_Y,static_cast<sal_uInt32>(lY)); GetBindings()->GetDispatcher()->ExecuteList( @@ -447,9 +477,18 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, AngleModifiedHdl, Edit&, void ) // #i123993# Need to take UIScale into account when executing rotations const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0); + long nRotateX = basegfx::fround(mlRotX * fUIScale); + long nRotateY = basegfx::fround(mlRotY * fUIScale); + + if (lcl_twipsNeeded(mpView)) + { + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::Map100thMM, MapUnit::MapTwip); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,static_cast<sal_uInt32>(nTmp)); - SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale)); - SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale)); + SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, nRotateX); + SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, nRotateY); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem }); @@ -462,9 +501,18 @@ IMPL_LINK_NOARG( PosSizePropertyPanel, RotationHdl, DialControl*, void ) // #i123993# Need to take UIScale into account when executing rotations const double fUIScale(mpView && mpView->GetModel() ? double(mpView->GetModel()->GetUIScale()) : 1.0); + long nRotateX = basegfx::fround(mlRotX * fUIScale); + long nRotateY = basegfx::fround(mlRotY * fUIScale); + + if (lcl_twipsNeeded(mpView)) + { + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::Map100thMM, MapUnit::MapTwip); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + SfxInt32Item aAngleItem( SID_ATTR_TRANSFORM_ANGLE,static_cast<sal_uInt32>(nTmp)); - SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, basegfx::fround(mlRotX * fUIScale)); - SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, basegfx::fround(mlRotY * fUIScale)); + SfxInt32Item aRotXItem( SID_ATTR_TRANSFORM_ROT_X, nRotateX); + SfxInt32Item aRotYItem( SID_ATTR_TRANSFORM_ROT_Y, nRotateY); GetBindings()->GetDispatcher()->ExecuteList(SID_ATTR_TRANSFORM, SfxCallMode::RECORD, { &aAngleItem, &aRotXItem, &aRotYItem }); @@ -831,6 +879,12 @@ void PosSizePropertyPanel::executeSize() lHeight = OutputDevice::LogicToLogic( lHeight, MapUnit::Map100thMM, mePoolUnit ); lHeight = static_cast<long>(mpMtrWidth->Denormalize( lHeight )); + if (lcl_twipsNeeded(mpView)) + { + lWidth = OutputDevice::LogicToLogic(lWidth, MapUnit::Map100thMM, MapUnit::MapTwip); + lHeight = OutputDevice::LogicToLogic(lHeight, MapUnit::Map100thMM, MapUnit::MapTwip); + } + // put Width & Height to itemset SfxUInt32Item aWidthItem( SID_ATTR_TRANSFORM_WIDTH, static_cast<sal_uInt32>(lWidth)); SfxUInt32Item aHeightItem( SID_ATTR_TRANSFORM_HEIGHT, static_cast<sal_uInt32>(lHeight)); diff --git a/svx/source/svdraw/svdedtv1.cxx b/svx/source/svdraw/svdedtv1.cxx index 784cbc462215..b0a53732e973 100644 --- a/svx/source/svdraw/svdedtv1.cxx +++ b/svx/source/svdraw/svdedtv1.cxx @@ -1425,6 +1425,20 @@ static Point ImpGetPoint(const tools::Rectangle& rRect, RectPoint eRP) void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) { + bool bDealingWithTwips = false; + const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); + if (bTiledRendering) + { + // We gets the position in twips + if (OutputDevice* pOutputDevice = mpMarkedPV->GetView().GetFirstOutputDevice()) + { + if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) + { + bDealingWithTwips = true; + } + } + } + tools::Rectangle aRect(GetMarkedObjRect()); if(GetSdrPageView()) @@ -1439,8 +1453,14 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) SdrObject* pObj=nullptr; RectPoint eSizePoint=RectPoint::MM; - long nPosDX=0; - long nPosDY=0; + long nPosX=aRect.Left(); + long nPosY=aRect.Top(); + if (bDealingWithTwips) + { + nPosX = OutputDevice::LogicToLogic(nPosX, MapUnit::Map100thMM, MapUnit::MapTwip); + nPosY = OutputDevice::LogicToLogic(nPosY, MapUnit::Map100thMM, MapUnit::MapTwip); + } + long nSizX=0; long nSizY=0; long nRotateAngle=0; @@ -1482,26 +1502,29 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) // position if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_POS_X,true,&pPoolItem)) { - nPosDX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue()-aRect.Left(); + nPosX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgPos=true; } if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_POS_Y,true,&pPoolItem)){ - nPosDY=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue()-aRect.Top(); + nPosY=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgPos=true; } // size if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_WIDTH,true,&pPoolItem)) { - nSizX=static_cast<const SfxUInt32Item*>(pPoolItem)->GetValue(); + nSizX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgSiz=true; bChgWdh=true; } if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_HEIGHT,true,&pPoolItem)) { - nSizY=static_cast<const SfxUInt32Item*>(pPoolItem)->GetValue(); + nSizY=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue(); bChgSiz=true; bChgHgt=true; } if (bChgSiz) { - eSizePoint=static_cast<RectPoint>(rAttr.Get(SID_ATTR_TRANSFORM_SIZE_POINT).GetValue()); + if (bTiledRendering && SfxItemState::SET != rAttr.GetItemState(SID_ATTR_TRANSFORM_SIZE_POINT, true, &pPoolItem)) + eSizePoint = RectPoint::LT; + else + eSizePoint = static_cast<RectPoint>(rAttr.Get(SID_ATTR_TRANSFORM_SIZE_POINT).GetValue()); } // rotation @@ -1573,6 +1596,18 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) bSetAttr=true; } + if(bDealingWithTwips) { + nPosX = OutputDevice::LogicToLogic(nPosX, MapUnit::MapTwip, MapUnit::Map100thMM); + nPosY = OutputDevice::LogicToLogic(nPosY, MapUnit::MapTwip, MapUnit::Map100thMM); + nSizX = OutputDevice::LogicToLogic(nSizX, MapUnit::MapTwip, MapUnit::Map100thMM); + nSizY = OutputDevice::LogicToLogic(nSizY, MapUnit::MapTwip, MapUnit::Map100thMM); + nRotateX = OutputDevice::LogicToLogic(nRotateX, MapUnit::MapTwip, MapUnit::Map100thMM); + nRotateY = OutputDevice::LogicToLogic(nRotateY, MapUnit::MapTwip, MapUnit::Map100thMM); + } + + long nPosDX = nPosX - aRect.Left(); + long nPosDY = nPosY - aRect.Top(); + ForcePossibilities(); BegUndo(SvxResId(STR_EditTransform),GetDescriptionOfMarkedObjects()); @@ -1601,15 +1636,6 @@ void SdrEditView::SetGeoAttrToMarked(const SfxItemSet& rAttr) if(GetSdrPageView()) { - const bool bTiledRendering = comphelper::LibreOfficeKit::isActive(); - if(bTiledRendering) { - // We gets the position in twips - if (OutputDevice* pOutputDevice = mpMarkedPV->GetView().GetFirstOutputDevice()) - { - if (pOutputDevice->GetMapMode().GetMapUnit() == MapUnit::Map100thMM) - aRef = OutputDevice::LogicToLogic(aRef, MapMode(MapUnit::MapTwip), MapMode(MapUnit::Map100thMM)); - } - } GetSdrPageView()->PagePosToLogic(aRef); } diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 8c4be9154284..42926e718100 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -782,6 +782,17 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell) } if(SfxViewShell* pViewShell = GetSfxViewShell()) { + + long nRotAngle(0); + if(GetMarkedObjectCount()) + { + SdrMark* pM = GetSdrMarkByIndex(0); + SdrObject* pO = pM->GetMarkedSdrObj(); + + nRotAngle = pO->GetRotateAngle(); + sSelection += OString(", ") + OString::number(nRotAngle); + } + if (pOtherShell) { // Another shell wants to know about our existing |