Files
ElyOffice/patches/libreoffice/0036-lok-impress-slide-show.patch
T
ZacharyZhang-NY b7fca0146d Ely Office: six offline-first desktop apps in Rust and GPUI
ElyDoc, ElyTable, ElyShow (LibreOfficeKit), ElyPDF (MuPDF), ElyTree (Git),
ElyMark (Milkdown and CodeMirror in CEF). ElyMail and ElyAgent follow.
2026-10-08 21:20:08 -04:00

91 lines
4.0 KiB
Diff

LOK: Impress reads every slide as a show plays it
.uno:SlideShow lists each slide: hidden, notes as text, the transition
and effects in the .uno:SlideTransition and .uno:SlideAnimations shapes,
and its media with frames. .uno:SlideMedia entries carry their frame,
x, y, width and height in 1/100 mm.
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index d8f1dee..035566a 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -2067,7 +2067,8 @@ bool SdXImpressDocument::supportsCommand(std::u16string_view rCommand)
{
return rCommand == u"SlideDesign" || rCommand == u"SlideObjects" || rCommand == u"Chart"
|| rCommand == u"SlideNotes" || rCommand == u"SlideTransition"
- || rCommand == u"SlideAnimations" || rCommand == u"SlideMedia";
+ || rCommand == u"SlideAnimations" || rCommand == u"SlideMedia"
+ || rCommand == u"SlideShow";
}
namespace
@@ -2226,12 +2227,12 @@ void lcl_SlideNotes(::tools::JsonWriter& rJson, SdDrawDocument& rDoc, sd::DrawVi
rJson.put("rich", pText && !sd::DrawViewShell::NotesLook(pText->GetTextObject(), rDoc.GetPool()));
}
-/// The shown slide's media: list place, file, link.
-void lcl_SlideMedia(::tools::JsonWriter& rJson, sd::DrawViewShell& rShell)
+/// A slide's media: list place, frame, file, link.
+void lcl_SlideMedia(::tools::JsonWriter& rJson, SdPage& rPage)
{
sal_Int64 nAt = 0;
auto aList = rJson.startArray("media");
- for (const rtl::Reference<SdrObject>& pObj : *rShell.GetActualPage())
+ for (const rtl::Reference<SdrObject>& pObj : rPage)
{
if (pObj->isAnnotationObject())
continue;
@@ -2249,11 +2250,38 @@ void lcl_SlideMedia(::tools::JsonWriter& rJson, sd::DrawViewShell& rShell)
rJson.put("file", aFile);
rJson.put("missing", aFile.isEmpty() || osl::DirectoryItem::get(aFile, aItem) != osl::FileBase::E_None);
rJson.put("loop", rItem.isLoop());
+ const ::tools::Rectangle& rRect = pMedia->GetLogicRect();
+ rJson.put("x", sal_Int64(rRect.Left()));
+ rJson.put("y", sal_Int64(rRect.Top()));
+ rJson.put("width", sal_Int64(rRect.GetWidth()));
+ rJson.put("height", sal_Int64(rRect.GetHeight()));
}
++nAt;
}
}
+/// Each slide for a show: hidden, notes, motion, media.
+void lcl_SlideShow(::tools::JsonWriter& rJson, SdDrawDocument& rDoc)
+{
+ auto aList = rJson.startArray("slides");
+ for (sal_uInt16 i = 0; i < rDoc.GetSdPageCount(PageKind::Standard); ++i)
+ {
+ SdPage* pPage = rDoc.GetSdPage(i, PageKind::Standard);
+ SdPage* pNotes = rDoc.GetSdPage(i, PageKind::Notes);
+ auto pObj = pNotes ? dynamic_cast<SdrTextObj*>(pNotes->GetPresObj(PresObjKind::Notes)) : nullptr;
+ const OutlinerParaObject* pText = pObj && !pObj->IsEmptyPresObj() ? pObj->GetOutlinerParaObject() : nullptr;
+ auto aOne = rJson.startStruct();
+ rJson.put("hidden", pPage->IsExcluded());
+ rJson.put("notes", pText ? pText->GetTextObject().GetText(LINEEND_LF) : OUString());
+ {
+ auto aTransition = rJson.startNode("transition");
+ DrawViewShell::WriteKitTransition(rJson, *pPage);
+ }
+ DrawViewShell::WriteKitAnimations(rJson, *pPage);
+ lcl_SlideMedia(rJson, *pPage);
+ }
+}
+
/// The shown slide's objects, selection, guides and snapping.
void lcl_SlideObjects(::tools::JsonWriter& rJson, sd::DrawViewShell& rShell)
{
@@ -2325,7 +2353,12 @@ void SdXImpressDocument::getCommandValues(::tools::JsonWriter& rJsonWriter, std:
if (rCommand == ".uno:SlideMedia")
{
if (DrawViewShell* pShell = GetViewShell())
- lcl_SlideMedia(rJsonWriter, *pShell);
+ lcl_SlideMedia(rJsonWriter, *pShell->GetActualPage());
+ return;
+ }
+ if (rCommand == ".uno:SlideShow")
+ {
+ lcl_SlideShow(rJsonWriter, *mpDoc);
return;
}
if (rCommand == ".uno:SlideTransition" || rCommand == ".uno:SlideAnimations")