animations/source/animcore/animcore.cxx   |   14 ++++++++++++--
 include/oox/ppt/animationspersist.hxx     |    1 +
 oox/source/ppt/timenode.cxx               |    6 ++++++
 oox/source/ppt/timenodelistcontext.cxx    |    2 +-
 sd/qa/unit/export-tests-ooxml1.cxx        |    5 +++++
 sd/source/filter/eppt/pptx-animations.cxx |    3 ++-
 6 files changed, 27 insertions(+), 4 deletions(-)

New commits:
commit 020c721fa937d63b2c1b1bf6185ce1060e630676
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Wed Jan 27 14:25:21 2021 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Wed Jan 27 18:04:44 2021 +0100

    PPTX filter: fix lost is-narration property for slide narrations
    
    Otherwise removing narrations don't work in powerpoint, it would say
    there are no narrations, just plain media shapes.
    
    Change-Id: Ibd0478540ac018bc23f81223846518b3bf7c7c2a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110016
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/animations/source/animcore/animcore.cxx 
b/animations/source/animcore/animcore.cxx
index 428578fbb831..adb41c26c0e7 100644
--- a/animations/source/animcore/animcore.cxx
+++ b/animations/source/animcore/animcore.cxx
@@ -352,6 +352,7 @@ private:
     // XAudio
     double mfVolume;
     bool mbHideDuringShow;
+    bool mbNarration;
 
     // XCommand
     sal_Int16 mnCommand;
@@ -440,6 +441,7 @@ AnimationNode::AnimationNode( sal_Int16 nNodeType )
     mnFadeColor(0),
     mfVolume(1.0),
     mbHideDuringShow(false),
+    mbNarration(false),
     mnCommand(0),
     mnIterateType( css::presentation::ShapeAnimationSubType::AS_WHOLE ),
     mfIterateInterval(0.0)
@@ -511,6 +513,7 @@ AnimationNode::AnimationNode( const AnimationNode& rNode )
     // XAudio
     mfVolume( rNode.mfVolume ),
     mbHideDuringShow(rNode.mbHideDuringShow),
+    mbNarration(rNode.mbNarration),
 
     // XCommand
     mnCommand( rNode.mnCommand ),
@@ -1832,11 +1835,18 @@ void SAL_CALL AnimationNode::setHideDuringShow(sal_Bool 
bHideDuringShow)
 
 sal_Bool SAL_CALL AnimationNode::getNarration()
 {
-    return false;
+    osl::Guard<osl::Mutex> aGuard(maMutex);
+    return mbNarration;
 }
 
-void SAL_CALL AnimationNode::setNarration(sal_Bool /*bNarration*/)
+void SAL_CALL AnimationNode::setNarration(sal_Bool bNarration)
 {
+    osl::Guard<osl::Mutex> aGuard(maMutex);
+    if (static_cast<bool>(bNarration) != mbNarration)
+    {
+        mbNarration = bNarration;
+        fireChangeListener();
+    }
 }
 
 // XCommand
diff --git a/include/oox/ppt/animationspersist.hxx 
b/include/oox/ppt/animationspersist.hxx
index f2288929ad6e..8c8bb766d5aa 100644
--- a/include/oox/ppt/animationspersist.hxx
+++ b/include/oox/ppt/animationspersist.hxx
@@ -44,6 +44,7 @@ namespace oox::ppt {
         NP_SUBITEM, NP_TARGET, NP_COMMAND, NP_PARAMETER,
         NP_VALUES, NP_FORMULA, NP_KEYTIMES, NP_DISPLAY,
         NP_HIDEDURINGSHOW,
+        NP_ISNARRATION,
         NP_SIZE_
     };
 
diff --git a/oox/source/ppt/timenode.cxx b/oox/source/ppt/timenode.cxx
index 978c24a0eabe..5d7604ec0952 100644
--- a/oox/source/ppt/timenode.cxx
+++ b/oox/source/ppt/timenode.cxx
@@ -342,6 +342,12 @@ namespace oox::ppt {
                             xAudio->setHideDuringShow(bBool);
                         }
                         break;
+                    case NP_ISNARRATION:
+                        if (xAudio.is() && (aValue >>= bBool))
+                        {
+                            xAudio->setNarration(bBool);
+                        }
+                        break;
                     case NP_TARGET:
 
                         if (xParent.is() && xParent->getType() == 
AnimationNodeType::ITERATE)
diff --git a/oox/source/ppt/timenodelistcontext.cxx 
b/oox/source/ppt/timenodelistcontext.cxx
index d30e69f53be1..6ecd0985cd0a 100644
--- a/oox/source/ppt/timenodelistcontext.cxx
+++ b/oox/source/ppt/timenodelistcontext.cxx
@@ -174,7 +174,7 @@ namespace oox::ppt {
                 sal_Int32 aElement = getCurrentElement();
                 if( aElement == PPT_TOKEN( audio ) )
                 {
-                    // TODO deal with mbIsNarration
+                    mpNode->getNodeProperties()[NP_ISNARRATION] <<= 
mbIsNarration;
                 }
                 else if( aElement == PPT_TOKEN( video ) )
                 {
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx 
b/sd/qa/unit/export-tests-ooxml1.cxx
index b8189c73a87e..da61677f7b48 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -1358,6 +1358,11 @@ void SdOOXMLExportTest1::testNarrationMimeType()
     // i.e. <p:cMediaNode> had the default visibility -> bitmap was visible 
during slideshow.
     assertXPath(pSlideDoc, "//p:childTnLst/p:audio/p:cMediaNode", 
"showWhenStopped", "0");
 
+    // Without the accompanying fix in place, this test would have failed with:
+    // - ... no attribute 'isNarration' exist
+    // i.e. <p:audio> was not a narration -> could not mass-remove narrations 
on the UI.
+    assertXPath(pSlideDoc, "//p:childTnLst/p:audio", "isNarration", "1");
+
     xDocShRef->DoClose();
 }
 
diff --git a/sd/source/filter/eppt/pptx-animations.cxx 
b/sd/source/filter/eppt/pptx-animations.cxx
index 7b64ed365b55..5de9475857d3 100644
--- a/sd/source/filter/eppt/pptx-animations.cxx
+++ b/sd/source/filter/eppt/pptx-animations.cxx
@@ -1235,7 +1235,8 @@ void PPTXAnimationExport::WriteAnimationNodeAudio()
         mrPowerPointExport.embedEffectAudio(mpFS, sUrl, sRelId, sName);
     }
 
-    mpFS->startElementNS(XML_p, XML_audio);
+    bool bNarration = xAudio->getNarration();
+    mpFS->startElementNS(XML_p, XML_audio, XML_isNarration, bNarration ? "1" : 
"0");
     bool bHideDuringShow = xAudio->getHideDuringShow();
     mpFS->startElementNS(XML_p, XML_cMediaNode, XML_showWhenStopped, 
bHideDuringShow ? "0" : "1");
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to