diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2020-05-27 15:27:14 +0200 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2020-07-30 13:36:55 +0200 |
commit | 7bcf2daf86d793086f8028b1da9cf167047295ff (patch) | |
tree | e78b774bdf3fbbfca68bd88ba3f45ad085221d17 /svx | |
parent | 5a677ca3715b7e1da3f3a2a79083f06958d97aaa (diff) |
svx: add ability to show sub-selections in a marked object
Draws selection rectangles inside the object window.
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95347
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
(cherry picked from commit cf812f15b3295a17a9b5d7e3a1c51b00dcbf2629)
Change-Id: I994477426489ea4cea89c86f9e51c9978f16b350
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95921
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
(cherry picked from commit fe69802e22bb2c8365b7542f3f0fbf71cb6182e7)
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdmrkv.cxx | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 4871df93b629..31f2d0373154 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -46,6 +46,7 @@ #include <sdr/overlay/overlayrollingrectangle.hxx> #include <svx/sdr/overlay/overlaymanager.hxx> #include <svx/sdr/table/tablecontroller.hxx> +#include <svx/sdr/overlay/overlayselection.hxx> #include <svx/sdr/contact/viewcontact.hxx> #include <svx/sdrpaintwindow.hxx> #include <svx/sdrpagewindow.hxx> @@ -130,6 +131,38 @@ void ImplMarkingOverlay::SetSecondPosition(const basegfx::B2DPoint& rNewPosition } } +class MarkingSubSelectionOverlay +{ + sdr::overlay::OverlayObjectList maObjects; + +public: + MarkingSubSelectionOverlay(const SdrPaintView& rView, std::vector<basegfx::B2DRectangle> const & rSelections) + { + if (comphelper::LibreOfficeKit::isActive()) + return; // We do client-side object manipulation with the Kit API + + for (sal_uInt32 a(0); a < rView.PaintWindowCount(); a++) + { + SdrPaintWindow* pCandidate = rView.GetPaintWindow(a); + const rtl::Reference<sdr::overlay::OverlayManager>& xTargetOverlay = pCandidate->GetOverlayManager(); + + if (xTargetOverlay.is()) + { + const SvtOptionsDrawinglayer aSvtOptionsDrawinglayer; + const Color aHighlightColor = aSvtOptionsDrawinglayer.getHilightColor(); + + std::unique_ptr<sdr::overlay::OverlaySelection> pNew = + std::make_unique<sdr::overlay::OverlaySelection>( + sdr::overlay::OverlayType::Transparent, + aHighlightColor, rSelections, false); + + xTargetOverlay->add(*pNew); + maObjects.append(std::move(pNew)); + } + } + } +}; + // MarkView @@ -674,6 +707,8 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell) SdrHdlKind eSaveKind(SdrHdlKind::Move); SdrObject* pSaveObj = nullptr; + mpMarkingSubSelectionOverlay.reset(); + if(pSaveOldFocusHdl && pSaveOldFocusHdl->GetObj() && dynamic_cast<const SdrPathObj*>(pSaveOldFocusHdl->GetObj()) != nullptr @@ -774,6 +809,11 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell) { return; } + + if (!maSubSelectionList.empty()) + { + mpMarkingSubSelectionOverlay = std::make_unique<MarkingSubSelectionOverlay>(*this, maSubSelectionList); + } } tools::Rectangle aRect(GetMarkedObjRect()); @@ -1900,7 +1940,8 @@ void collectUIInformation(SdrObject* pObj) } -void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, bool bUnmark, bool bImpNoSetMarkHdl) +void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, bool bUnmark, bool bDoNoSetMarkHdl, + std::vector<basegfx::B2DRectangle> const & rSubSelections) { if (pObj!=nullptr && pPV!=nullptr && IsObjMarkable(pObj, pPV)) { BrkAction(); @@ -1917,7 +1958,10 @@ void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, bool bUnmark, bool GetMarkedObjectListWriteAccess().DeleteMark(nPos); } } - if (!bImpNoSetMarkHdl) { + + maSubSelectionList = rSubSelections; + + if (!bDoNoSetMarkHdl) { MarkListHasChanged(); AdjustMarkHdl(); } |