diff options
author | Sarper Akdemir <sarper.akdemir.extern@allotropia.de> | 2023-07-18 16:57:59 +0300 |
---|---|---|
committer | Thorsten Behrens <thorsten.behrens@allotropia.de> | 2023-07-21 01:37:18 +0200 |
commit | 2c8c436c4a8546276e285dd18f3f7ded091a2c4e (patch) | |
tree | 42c2c380b57a5037bef21591ee685cb17ac0fc4d /sd | |
parent | 3d4f9e3818cde6efcf88a8bfa39eb42c0fa949f8 (diff) |
tdf#152992: for Impress/Draw add horizontal hit tolerance for quick text edit
Implements horizontal hit tolerance for quick text edit in Impress & Draw
making it more forgiving. Previously it was required to click exactly on
the glyph to get a direct text cursor.
Refactors hittestprocessor2d so that it now supports pseudo per axis hit
tolerance.
i.e. underlying isInEpsilonRange hit check is still the same utilizing
the larger tolerance of the two per axis tolerance, but the preliminary
check that uses aPolygonRange.grow() and later aPolygonRange.isInside()
now filters hit misses out with respect to the per axis hit tolerance.
Utilizes hittestprocessor2d's new per axis tolerance to introduce hit
tolerance for quick text edit, making it similar to TextEdit mode hit
tolerance which only has horizontal tolerance.
Fixes wrong use of BoundRect hit to determine text frame border hits.
Which previously only made sense for TextFrame borders, and was mostly
useless for shapes with text inside.
Change-Id: I749e63752da05b01270bfcab2632c41879a848ec
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154640
Reviewed-by: Heiko Tietze <heiko.tietze@documentfoundation.org>
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
Diffstat (limited to 'sd')
-rw-r--r-- | sd/source/ui/func/fudraw.cxx | 12 | ||||
-rw-r--r-- | sd/source/ui/func/fusel.cxx | 12 | ||||
-rw-r--r-- | sd/source/ui/view/sdview3.cxx | 13 |
3 files changed, 18 insertions, 19 deletions
diff --git a/sd/source/ui/func/fudraw.cxx b/sd/source/ui/func/fudraw.cxx index ed4478747e8c..fca4f65fa54e 100644 --- a/sd/source/ui/func/fudraw.cxx +++ b/sd/source/ui/func/fudraw.cxx @@ -588,8 +588,8 @@ bool FuDraw::SetPointer(const SdrObject* pObj, const Point& rPos) return false; const SdrLayerIDSet* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers(); - sal_uInt16 nHitLog(sal_uInt16(mpWindow->PixelToLogic(Size(HITPIX, 0)).Width())); - ::tools::Long n2HitLog(nHitLog * 2); + double fHitLog(mpWindow->PixelToLogic(Size(HITPIX, 0)).Width()); + ::tools::Long n2HitLog(fHitLog * 2); Point aHitPosR(rPos); Point aHitPosL(rPos); Point aHitPosT(rPos); @@ -601,13 +601,13 @@ bool FuDraw::SetPointer(const SdrObject* pObj, const Point& rPos) aHitPosB.AdjustY(-n2HitLog); if (!pObj->IsClosedObj() - || (SdrObjectPrimitiveHit(*pObj, aHitPosR, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, + || (SdrObjectPrimitiveHit(*pObj, aHitPosR, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false) - && SdrObjectPrimitiveHit(*pObj, aHitPosL, nHitLog, *mpView->GetSdrPageView(), + && SdrObjectPrimitiveHit(*pObj, aHitPosL, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false) - && SdrObjectPrimitiveHit(*pObj, aHitPosT, nHitLog, *mpView->GetSdrPageView(), + && SdrObjectPrimitiveHit(*pObj, aHitPosT, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false) - && SdrObjectPrimitiveHit(*pObj, aHitPosB, nHitLog, *mpView->GetSdrPageView(), + && SdrObjectPrimitiveHit(*pObj, aHitPosB, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false))) { // hit inside the object (without margin) or open object diff --git a/sd/source/ui/func/fusel.cxx b/sd/source/ui/func/fusel.cxx index 4a897e7df7f2..4d7fec5f8d43 100644 --- a/sd/source/ui/func/fusel.cxx +++ b/sd/source/ui/func/fusel.cxx @@ -1237,8 +1237,8 @@ bool FuSelection::HandleImageMapClick(const SdrObject* pObj, const Point& rPos) } const SdrLayerIDSet* pVisiLayer = &mpView->GetSdrPageView()->GetVisibleLayers(); - sal_uInt16 nHitLog = sal_uInt16(mpWindow->PixelToLogic(Size(HITPIX, 0)).Width()); - const ::tools::Long n2HitLog = nHitLog * 2; + double fHitLog = mpWindow->PixelToLogic(Size(HITPIX, 0)).Width(); + const ::tools::Long n2HitLog = fHitLog * 2; Point aHitPosR(rPos); Point aHitPosL(rPos); Point aHitPosT(rPos); @@ -1250,13 +1250,13 @@ bool FuSelection::HandleImageMapClick(const SdrObject* pObj, const Point& rPos) aHitPosB.AdjustY(-n2HitLog); if (!bClosed || !bFilled - || (SdrObjectPrimitiveHit(*pObj, aHitPosR, nHitLog, *mpView->GetSdrPageView(), pVisiLayer, + || (SdrObjectPrimitiveHit(*pObj, aHitPosR, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false) - && SdrObjectPrimitiveHit(*pObj, aHitPosL, nHitLog, *mpView->GetSdrPageView(), + && SdrObjectPrimitiveHit(*pObj, aHitPosL, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false) - && SdrObjectPrimitiveHit(*pObj, aHitPosT, nHitLog, *mpView->GetSdrPageView(), + && SdrObjectPrimitiveHit(*pObj, aHitPosT, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false) - && SdrObjectPrimitiveHit(*pObj, aHitPosB, nHitLog, *mpView->GetSdrPageView(), + && SdrObjectPrimitiveHit(*pObj, aHitPosB, {fHitLog, fHitLog}, *mpView->GetSdrPageView(), pVisiLayer, false))) { if (SvxIMapInfo::GetIMapInfo(pObj)) diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx index 06f07048455e..7065c677246b 100644 --- a/sd/source/ui/view/sdview3.cxx +++ b/sd/source/ui/view/sdview3.cxx @@ -1378,9 +1378,8 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper, SfxItemSet aSet( mrDoc.GetPool() ); bool bClosed = pPickObj->IsClosedObj(); ::sd::Window* pWin = mpViewSh->GetActiveWindow(); - sal_uInt16 nHitLog = static_cast<sal_uInt16>(pWin->PixelToLogic( - Size(FuPoor::HITPIX, 0 ) ).Width()); - const ::tools::Long n2HitLog = nHitLog << 1; + double fHitLog = pWin->PixelToLogic(Size(FuPoor::HITPIX, 0 ) ).Width(); + const ::tools::Long n2HitLog = fHitLog * 2; Point aHitPosR( rPos ); Point aHitPosL( rPos ); Point aHitPosT( rPos ); @@ -1393,10 +1392,10 @@ bool View::InsertData( const TransferableDataHelper& rDataHelper, aHitPosB.AdjustY( -n2HitLog ); if( bClosed && - SdrObjectPrimitiveHit(*pPickObj, aHitPosR, nHitLog, *GetSdrPageView(), pVisiLayer, false) && - SdrObjectPrimitiveHit(*pPickObj, aHitPosL, nHitLog, *GetSdrPageView(), pVisiLayer, false) && - SdrObjectPrimitiveHit(*pPickObj, aHitPosT, nHitLog, *GetSdrPageView(), pVisiLayer, false) && - SdrObjectPrimitiveHit(*pPickObj, aHitPosB, nHitLog, *GetSdrPageView(), pVisiLayer, false) ) + SdrObjectPrimitiveHit(*pPickObj, aHitPosR, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) && + SdrObjectPrimitiveHit(*pPickObj, aHitPosL, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) && + SdrObjectPrimitiveHit(*pPickObj, aHitPosT, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) && + SdrObjectPrimitiveHit(*pPickObj, aHitPosB, {fHitLog, fHitLog}, *GetSdrPageView(), pVisiLayer, false) ) { // area fill if(eFill == drawing::FillStyle_SOLID ) |