diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2020-05-27 15:27:14 +0200 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2020-06-02 18:55:07 +0200 |
commit | cf812f15b3295a17a9b5d7e3a1c51b00dcbf2629 (patch) | |
tree | 1845ff84e2731c7ecb5b7446099c93e429e71602 /svx/source | |
parent | 36071e96e75556285ece937923e5240e343e2185 (diff) |
svx: add ability to show sub-selections in a marked object
Draws selection rectangles inside the object window.
Change-Id: I994477426489ea4cea89c86f9e51c9978f16b350
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95347
Tested-by: Tomaž Vajngerl <quikee@gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'svx/source')
-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 988f33183a40..037bc7e4ad63 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -41,6 +41,7 @@ #include <sdr/overlay/overlayrollingrectangle.hxx> #include <svx/sdr/contact/objectcontact.hxx> #include <svx/sdr/overlay/overlaymanager.hxx> +#include <svx/sdr/overlay/overlayselection.hxx> #include <svx/sdr/contact/viewcontact.hxx> #include <svx/sdrpaintwindow.hxx> #include <svx/sdrpagewindow.hxx> @@ -125,6 +126,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 @@ -920,6 +953,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 @@ -1014,6 +1049,11 @@ void SdrMarkView::SetMarkHandles(SfxViewShell* pOtherShell) { return; } + + if (!maSubSelectionList.empty()) + { + mpMarkingSubSelectionOverlay = std::make_unique<MarkingSubSelectionOverlay>(*this, maSubSelectionList); + } } tools::Rectangle aRect(GetMarkedObjRect()); @@ -1909,7 +1949,8 @@ void collectUIInformation(const 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(); @@ -1926,7 +1967,10 @@ void SdrMarkView::MarkObj(SdrObject* pObj, SdrPageView* pPV, bool bUnmark, bool GetMarkedObjectListWriteAccess().DeleteMark(nPos); } } - if (!bImpNoSetMarkHdl) { + + maSubSelectionList = rSubSelections; + + if (!bDoNoSetMarkHdl) { MarkListHasChanged(); AdjustMarkHdl(); } |