sd/inc/drawdoc.hxx | 1 sd/source/core/drawdoc2.cxx | 81 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+)
New commits: commit 764e6c5d9030cdebd9131c9e1f98118fbdc1d947 Author: Mohit Marathe <[email protected]> AuthorDate: Mon Dec 1 19:13:40 2025 +0530 Commit: Mohit Marathe <[email protected]> CommitDate: Thu Dec 4 13:44:24 2025 +0100 sd: indicate page order using connectors in canvas page The connectors are glued to the preview shapes. Signed-off-by: Mohit Marathe <[email protected]> Change-Id: I168208899b06e3c6d3b24f5e4055894310b12e22 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194923 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/sd/inc/drawdoc.hxx b/sd/inc/drawdoc.hxx index 8b3e3656d37d..bef514d5b9c8 100644 --- a/sd/inc/drawdoc.hxx +++ b/sd/inc/drawdoc.hxx @@ -1183,6 +1183,7 @@ private: SAL_DLLPRIVATE void populatePagePreviewsGrid(); SAL_DLLPRIVATE void updatePagePreviewsGrid(SdPage* pPage); + SAL_DLLPRIVATE void connectPagePreviews(); SAL_DLLPRIVATE virtual void PageListChanged() override; SAL_DLLPRIVATE virtual void MasterPageListChanged() override; diff --git a/sd/source/core/drawdoc2.cxx b/sd/source/core/drawdoc2.cxx index c5ac123fb6f1..832315fb7abd 100644 --- a/sd/source/core/drawdoc2.cxx +++ b/sd/source/core/drawdoc2.cxx @@ -28,6 +28,7 @@ #include <svx/svdopage.hxx> #include <svx/svdoole2.hxx> #include <svx/svdundo.hxx> +#include <svx/svdoedge.hxx> #include <vcl/svapp.hxx> #include <editeng/eeitem.hxx> #include <editeng/editobj.hxx> @@ -54,8 +55,16 @@ #include <undo/undomanager.hxx> #include <sfx2/lokhelper.hxx> #include <unomodel.hxx> +#include <svx/constructhelper.hxx> + +#include <svx/strings.hrc> +#include <svx/svdobj.hxx> +#include <svx/sxekitm.hxx> +#include <svx/xlnedit.hxx> +#include <svx/xlnedwit.hxx> #include <DrawDocShell.hxx> +#include <ViewShell.hxx> #include "PageListWatcher.hxx" #include <strings.hxx> @@ -1519,6 +1528,7 @@ void SdDrawDocument::ImportCanvasPage() pPage->NbcRemoveObject(0); } populatePagePreviewsGrid(); + connectPagePreviews(); } } @@ -1639,6 +1649,7 @@ sal_uInt16 SdDrawDocument::GetOrInsertCanvasPage() } populatePagePreviewsGrid(); + connectPagePreviews(); return pCanvasPage->GetPageNum() / 2; } @@ -1746,4 +1757,74 @@ void SdDrawDocument::updatePagePreviewsGrid(SdPage* pPage) mpCanvasPage->CreatePresObj(PresObjKind::PagePreview, true, ::tools::Rectangle(Point(nX,nY), Size(nPreviewWidth, nPreviewHeight)), OUString(), nPageNum); } } + +void SdDrawDocument::connectPagePreviews() +{ + if (!HasCanvasPage()) + return; + SdrObjList* pObjList = mpCanvasPage.get(); + std::vector<SdrPageObj*> aPageOrder(GetSdPageCount(PageKind::Standard) - 1, nullptr); + + SdrObjListIter aIter(pObjList, SdrIterMode::Flat); + for (SdrObject* pObj = aIter.Next(); pObj; pObj = aIter.Next()) + { + if (pObj->GetObjIdentifier() == SdrObjKind::Page) + { + SdrPageObj* pPageObj = static_cast<SdrPageObj*>(pObj); + SdPage* pPage = static_cast<SdPage*>(pPageObj->GetReferencedPage()); + sal_uInt16 nIndex = (pPage->GetPageNum() - 1) / 2 - 1; // without canvas page + aPageOrder[nIndex] = pPageObj; + } + } + + for (size_t i = 0; i < aPageOrder.size() - 1; i++) + { + SdrPageObj* pPageObj1 = aPageOrder[i]; + SdrPageObj* pPageObj2 = aPageOrder[i + 1]; + + ::tools::Rectangle aRect1 = pPageObj1->GetSnapRect(); + ::tools::Rectangle aRect2 = pPageObj2->GetSnapRect(); + + Point aStart(aRect1.RightCenter()); + Point aEnd(aRect2.LeftCenter()); + + rtl::Reference<SdrObject> pObj( + SdrObjFactory::MakeNewObject(*this, SdrInventor::Default, SdrObjKind::Edge)); + + SdrEdgeObj* pEdge = dynamic_cast<SdrEdgeObj*>(pObj.get()); + pEdge->SetTailPoint(true, aStart); + pEdge->SetTailPoint(false, aEnd); + + // glue the connectors to preview shapes + pEdge->ConnectToNode(true, pPageObj1); + pEdge->ConnectToNode(false, pPageObj2); + + SfxItemSet aAttr(GetPool()); + + // curved connector + aAttr.Put(SdrEdgeKindItem(SdrEdgeKind::Bezier)); + + // copied from FuConstructRectangle::SetLineEnds + ::basegfx::B2DPolyPolygon aArrow( + ConstructHelper::GetLineEndPoly(RID_SVXSTR_ARROW, *this)); + if (!aArrow.count()) + { + ::basegfx::B2DPolygon aNewArrow; + aNewArrow.append(::basegfx::B2DPoint(10.0, 0.0)); + aNewArrow.append(::basegfx::B2DPoint(0.0, 30.0)); + aNewArrow.append(::basegfx::B2DPoint(20.0, 30.0)); + aNewArrow.setClosed(true); + aArrow.append(aNewArrow); + } + + ::tools::Long nWidth = 600; + aAttr.Put(XLineEndItem(SdResId(RID_SVXSTR_ARROW), aArrow)); + aAttr.Put(XLineEndWidthItem(nWidth)); + + pEdge->SetMergedItemSet(aAttr); + + pObj->SetMarkProtect(true); + mpCanvasPage->NbcInsertObject(pObj.get()); + } +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
