diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-10-27 12:20:11 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-10-27 16:45:33 +0200 |
commit | 3c0d04344321db2f7dc1db13ea72590884704f9f (patch) | |
tree | 4d18bcaa579fd9134eb92b68b8132387fdb6d39a /svtools/source/control | |
parent | e9393a27646d5d43317cbdae9785e9e0319b4cc8 (diff) |
make fat valueset selection rectangles solid
as used in writer's bullets and numbering valuesets
Change-Id: I4ac028fa9ef71163f29024352bb4fb7aeef0865a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124273
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svtools/source/control')
-rw-r--r-- | svtools/source/control/valueset.cxx | 106 |
1 files changed, 67 insertions, 39 deletions
diff --git a/svtools/source/control/valueset.cxx b/svtools/source/control/valueset.cxx index 13f2abfa0df5..0a73e0418c72 100644 --- a/svtools/source/control/valueset.cxx +++ b/svtools/source/control/valueset.cxx @@ -20,8 +20,11 @@ #include <sal/config.h> #include <o3tl/safeint.hxx> +#include <basegfx/matrix/b2dhommatrix.hxx> +#include <basegfx/polygon/b2dpolygontools.hxx> #include <tools/debug.hxx> #include <comphelper/base64.hxx> +#include <vcl/canvastools.hxx> #include <vcl/decoview.hxx> #include <vcl/event.hxx> #include <vcl/svapp.hxx> @@ -1272,68 +1275,93 @@ void ValueSet::ImplDrawSelect(vcl::RenderContext& rRenderContext, } else { - if (bDrawSel) - { - rRenderContext.SetLineColor(aDoubleColor); - tools::PolyPolygon aPolyPoly(1); - aPolyPoly.Insert(aRect); - rRenderContext.DrawTransparent(aPolyPoly, nTransparencePercent); - } - if (mbDoubleSel) + rRenderContext.SetLineColor(aDoubleColor); + tools::Rectangle aFocusRect; + + if (!mbDoubleSel) { - aRect.AdjustLeft( 1 ); - aRect.AdjustTop( 1 ); - aRect.AdjustRight( -1 ); - aRect.AdjustBottom( -1 ); + // an outer rectangle surrounding a "focus" rectangle, surrounding + // an inner rectangle. Focus rectangle is always drawn, but rendered + // empty when there is no focus. e.g. as seen in color valuesets if (bDrawSel) { tools::PolyPolygon aPolyPoly(1); aPolyPoly.Insert(aRect); rRenderContext.DrawTransparent(aPolyPoly, nTransparencePercent); } - } - aRect.AdjustLeft( 1 ); - aRect.AdjustTop( 1 ); - aRect.AdjustRight( -1 ); - aRect.AdjustBottom( -1 ); - tools::Rectangle aRect2 = aRect; - aRect.AdjustLeft( 1 ); - aRect.AdjustTop( 1 ); - aRect.AdjustRight( -1 ); - aRect.AdjustBottom( -1 ); - if (bDrawSel) - { - tools::PolyPolygon aPolyPoly(1); - aPolyPoly.Insert(aRect); - rRenderContext.DrawTransparent(aPolyPoly, nTransparencePercent); - } - if (mbDoubleSel) - { + aRect.AdjustLeft( 1 ); aRect.AdjustTop( 1 ); aRect.AdjustRight( -1 ); aRect.AdjustBottom( -1 ); + + aFocusRect = aRect; + + aRect.AdjustLeft( 1 ); + aRect.AdjustTop( 1 ); + aRect.AdjustRight( -1 ); + aRect.AdjustBottom( -1 ); + if (bDrawSel) { tools::PolyPolygon aPolyPoly(1); aPolyPoly.Insert(aRect); rRenderContext.DrawTransparent(aPolyPoly, nTransparencePercent); } - } - if (bDrawSel) - { - rRenderContext.SetLineColor(aSingleColor); + if (bDrawSel) + rRenderContext.SetLineColor(aSingleColor); + else + rRenderContext.SetLineColor(COL_LIGHTGRAY); + + rRenderContext.DrawRect(aFocusRect); } else { - rRenderContext.SetLineColor(COL_LIGHTGRAY); + // a thick bordered rectangle surrounding an optional "focus" + // rectangle which is only drawn when focused, as seen in format, + // bullets and numbering in writer + const int nAdjust = 2; + + aRect.AdjustLeft(nAdjust); + aRect.AdjustTop(nAdjust); + aRect.AdjustRight(-nAdjust); + aRect.AdjustBottom(-nAdjust); + + aFocusRect = aRect; + + if (bDrawSel) + { + const basegfx::B2DPolygon aRectPoly( + basegfx::utils::createPolygonFromRect( + vcl::unotools::b2DRectangleFromRectangle(aRect))); + + const int nThickness = nAdjust * 2; + + if (!rRenderContext.DrawPolyLineDirect(basegfx::B2DHomMatrix(), + aRectPoly, + nThickness, + nTransparencePercent / 100.0, + nullptr, + basegfx::B2DLineJoin::Miter)) + { + SAL_WARN("svtools", "presumably impossible in practice, but fallback to see something"); + rRenderContext.DrawPolyLine(aRectPoly, nThickness, basegfx::B2DLineJoin::Miter); + } + } + + if (bFocus) + { + if (bDrawSel) + rRenderContext.SetLineColor(aSingleColor); + else + rRenderContext.SetLineColor(COL_LIGHTGRAY); + rRenderContext.DrawRect(aFocusRect); + } } - tools::PolyPolygon aPolyPoly(1); - aPolyPoly.Insert(aRect2); - rRenderContext.DrawTransparent(aPolyPoly, nTransparencePercent); + if (bFocus) - InvertFocusRect(rRenderContext, aRect2); + InvertFocusRect(rRenderContext, aFocusRect); } ImplDrawItemText(rRenderContext, pItem->maText); |