summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/svx/sdr/overlay/overlayselection.hxx3
-rw-r--r--sc/source/ui/view/gridwin.cxx70
-rw-r--r--svx/source/sdr/overlay/overlayselection.cxx10
3 files changed, 62 insertions, 21 deletions
diff --git a/include/svx/sdr/overlay/overlayselection.hxx b/include/svx/sdr/overlay/overlayselection.hxx
index b83322acbf61..a05de575e430 100644
--- a/include/svx/sdr/overlay/overlayselection.hxx
+++ b/include/svx/sdr/overlay/overlayselection.hxx
@@ -30,7 +30,8 @@ namespace sdr::overlay
{
Invert,
Solid,
- Transparent
+ Transparent,
+ NoFill
};
class SVXCORE_DLLPUBLIC OverlaySelection final : public OverlayObject
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index c79a6493f6c6..239b014cd5c9 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -6241,8 +6241,8 @@ void ScGridWindow::ImpCreateOverlayObjects()
{
UpdateHighlightOverlay();
UpdateSelectionOverlay();
- UpdateAutoFillOverlay();
UpdateCursorOverlay();
+ UpdateAutoFillOverlay();
UpdateCopySourceOverlay();
UpdateDragRectOverlay();
UpdateHeaderOverlay();
@@ -6720,9 +6720,24 @@ void ScGridWindow::UpdateCursorOverlay()
std::move(aRanges),
false, false));
+ // Internal white contrast rectangle
+ std::vector< basegfx::B2DRange > aRangesInternal;
+ basegfx::B2DRange aRBInternal(aPixelRects[0].Right(), aPixelRects[2].Bottom(),
+ aPixelRects[1].Left() - 1, aPixelRects[3].Top() - 1);
+ aRBInternal.transform(aTransform);
+ aRangesInternal.push_back(aRBInternal);
+
+ std::unique_ptr<sdr::overlay::OverlayObject> pOverlayInternal(new sdr::overlay::OverlaySelection(
+ sdr::overlay::OverlayType::NoFill,
+ COL_WHITE,
+ std::move(aRangesInternal),
+ true, false));
+
xOverlayManager->add(*pOverlay);
+ xOverlayManager->add(*pOverlayInternal);
mpOOCursors.reset(new sdr::overlay::OverlayObjectList);
mpOOCursors->append(std::move(pOverlay));
+ mpOOCursors->append(std::move(pOverlayInternal));
}
}
}
@@ -6925,13 +6940,11 @@ void ScGridWindow::UpdateAutoFillOverlay()
ScDocument& rDoc = mrViewData.GetDocument();
bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
- // tdf#143733 tdf#145080 - improve border visibility
- // constants picked for maximum consistency at 100%
- // size = 6 at 100% (as before), 50% = 4.5, 200% = 9, 400% = 15
- const float fScaleFactor = 3 * GetDPIScaleFactor();
- const double fZoom(3 * mrViewData.GetZoomX());
- // Size should be even
- Size aFillHandleSize(fZoom + fScaleFactor, fZoom + fScaleFactor);
+ // tdf#162006 Ensures the AutoFill handle is visible at any zoom level
+ // At 100% = Total Size 8 (2px for the external white line; 6px for the handle itself)
+ const double fScaleFactor(2 + 2 * GetDPIScaleFactor());
+ const double fZoom(2 + 2 * mrViewData.GetZoomX());
+ Size aFillHandleSize(fScaleFactor + fZoom, fScaleFactor + fZoom);
Point aFillPos = mrViewData.GetScrPos( nX, nY, eWhich, true );
tools::Long nSizeXPix;
@@ -6970,26 +6983,47 @@ void ScGridWindow::UpdateAutoFillOverlay()
}
else if (xOverlayManager.is())
{
+ const basegfx::B2DHomMatrix aTransform(GetOutDev()->GetInverseViewTransformation());
+
+ // Outer rectangle (always white for contrast)
+ std::vector< basegfx::B2DRange > aRangesOuter;
+ basegfx::B2DRange aRBOuter = vcl::unotools::b2DRectangleFromRectangle(aFillRect);
+ aRBOuter.transform(aTransform);
+ aRangesOuter.push_back(aRBOuter);
+
+ std::unique_ptr<sdr::overlay::OverlayObject> pOverlayOuter(new sdr::overlay::OverlaySelection(
+ sdr::overlay::OverlayType::Solid,
+ COL_WHITE,
+ std::move(aRangesOuter),
+ false, false));
+
+ // Inner rectangle
+ std::vector< basegfx::B2DRange > aRangesInner;
+ tools::Rectangle aRectInner(aFillRect);
+ aRectInner.AdjustTop(1);
+ aRectInner.AdjustBottom(-1);
+ aRectInner.AdjustLeft(1);
+ aRectInner.AdjustRight(-1);
+ basegfx::B2DRange aRBInner = vcl::unotools::b2DRectangleFromRectangle(aRectInner);
+ aRBInner.transform(aTransform);
+ aRangesInner.push_back(aRBInner);
+
Color aHandleColor = SC_MOD()->GetColorConfig().GetColorValue(svtools::CALCCELLFOCUS).nColor;
if (mrViewData.GetActivePart() != eWhich)
// non-active pane uses a different color.
aHandleColor = SC_MOD()->GetColorConfig().GetColorValue(svtools::CALCPAGEBREAKAUTOMATIC).nColor;
- std::vector< basegfx::B2DRange > aRanges;
- const basegfx::B2DHomMatrix aTransform(GetOutDev()->GetInverseViewTransformation());
- basegfx::B2DRange aRB = vcl::unotools::b2DRectangleFromRectangle(aFillRect);
-
- aRB.transform(aTransform);
- aRanges.push_back(aRB);
- std::unique_ptr<sdr::overlay::OverlayObject> pOverlay(new sdr::overlay::OverlaySelection(
+ std::unique_ptr<sdr::overlay::OverlayObject> pOverlayInner(new sdr::overlay::OverlaySelection(
sdr::overlay::OverlayType::Solid,
aHandleColor,
- std::move(aRanges),
+ std::move(aRangesInner),
false, false));
- xOverlayManager->add(*pOverlay);
+ xOverlayManager->add(*pOverlayOuter);
+ xOverlayManager->add(*pOverlayInner);
mpOOAutoFill.reset(new sdr::overlay::OverlayObjectList);
- mpOOAutoFill->append(std::move(pOverlay));
+ mpOOAutoFill->append(std::move(pOverlayOuter));
+ mpOOAutoFill->append(std::move(pOverlayInner));
}
}
diff --git a/svx/source/sdr/overlay/overlayselection.cxx b/svx/source/sdr/overlay/overlayselection.cxx
index 78a1421943d5..ff0b3a4a12f7 100644
--- a/svx/source/sdr/overlay/overlayselection.cxx
+++ b/svx/source/sdr/overlay/overlayselection.cxx
@@ -153,10 +153,16 @@ namespace sdr::overlay
std::move(aRetval))
};
}
- else if(OverlayType::Transparent == maLastOverlayType)
+ else if(maLastOverlayType == OverlayType::Transparent || maLastOverlayType == OverlayType::NoFill)
{
+ // Determine transparency level
+ double fTransparence;
+ if (maLastOverlayType == OverlayType::NoFill)
+ fTransparence = 1;
+ else
+ fTransparence = mnLastTransparence / 100.0;
+
// embed all rectangles in transparent paint
- const double fTransparence(mnLastTransparence / 100.0);
const drawinglayer::primitive2d::Primitive2DReference aUnifiedTransparence(
new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
std::move(aRetval),