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: */

Reply via email to