sd/source/ui/dlg/sddlgfact.cxx |    5 +
 sd/source/ui/dlg/sddlgfact.hxx |    5 -
 sd/source/ui/func/fuoaprms.cxx |  158 ++++++++++++++++++++++++++---------------
 sd/source/ui/inc/fuoaprms.hxx  |    4 +
 4 files changed, 116 insertions(+), 56 deletions(-)

New commits:
commit 0bf1be97789a0bd59e8310c75a02edd91fb1ce11
Author:     Hubert Figuière <h...@collabora.com>
AuthorDate: Thu Aug 15 13:31:37 2024 -0400
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Fri Aug 16 21:08:01 2024 +0200

    impress/draw: make the SdActionDlg (Interaction...) dialog async
    
    Make SdAbstractSfxDialog_Impl support async for all.
    
    Signed-off-by: Hubert Figuière <h...@collabora.com>
    Change-Id: I9e2df8369f8f1fde252d079464a188c155a26057
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171959
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Tested-by: Caolán McNamara <caolan.mcnam...@collabora.com>
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sd/source/ui/dlg/sddlgfact.cxx b/sd/source/ui/dlg/sddlgfact.cxx
index 381217151132..661e9e57204c 100644
--- a/sd/source/ui/dlg/sddlgfact.cxx
+++ b/sd/source/ui/dlg/sddlgfact.cxx
@@ -546,6 +546,11 @@ void SdAbstractSfxDialog_Impl::SetText( const OUString& 
rStr )
     m_xDlg->set_title(rStr);
 }
 
+bool SdAbstractSfxDialog_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+    return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
 const GDIMetaFile& AbstractSdVectorizeDlg_Impl::GetGDIMetaFile() const
 {
     return m_xDlg->GetGDIMetaFile();
diff --git a/sd/source/ui/dlg/sddlgfact.hxx b/sd/source/ui/dlg/sddlgfact.hxx
index 8edfd2c70934..6697d437a666 100644
--- a/sd/source/ui/dlg/sddlgfact.hxx
+++ b/sd/source/ui/dlg/sddlgfact.hxx
@@ -335,15 +335,16 @@ public:
 class SdAbstractSfxDialog_Impl : public SfxAbstractDialog
 {
 private:
-    std::unique_ptr<SfxSingleTabDialogController> m_xDlg;
+    std::shared_ptr<SfxSingleTabDialogController> m_xDlg;
 public:
-    SdAbstractSfxDialog_Impl(std::unique_ptr<SfxSingleTabDialogController> 
pDlg)
+    SdAbstractSfxDialog_Impl(std::shared_ptr<SfxSingleTabDialogController> 
pDlg)
         : m_xDlg(std::move(pDlg))
     {
     }
     virtual short   Execute() override;
     virtual const SfxItemSet*   GetOutputItemSet() const override;
     virtual void    SetText( const OUString& rStr ) override;
+    virtual bool StartExecuteAsync(AsyncContext &rCtx) override;
 };
 
 class AbstractSdVectorizeDlg_Impl :public AbstractSdVectorizeDlg
diff --git a/sd/source/ui/func/fuoaprms.cxx b/sd/source/ui/func/fuoaprms.cxx
index fd01f9befd1d..0cfe11374dd9 100644
--- a/sd/source/ui/func/fuoaprms.cxx
+++ b/sd/source/ui/func/fuoaprms.cxx
@@ -42,6 +42,7 @@
 #include <sdabstdlg.hxx>
 #include <sdresid.hxx>
 #include <tools/helpers.hxx>
+#include <tpaction.hxx>
 #include <basegfx/polygon/b2dpolygon.hxx>
 #include <memory>
 
@@ -73,8 +74,6 @@ rtl::Reference<FuPoor> FuObjectAnimationParameters::Create( 
ViewShell* pViewSh,
 
 void FuObjectAnimationParameters::DoExecute( SfxRequest& rReq )
 {
-    SfxUndoManager* pUndoMgr = 
mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager();
-
     const SdrMarkList& rMarkList  = mpView->GetMarkedObjectList();
     const size_t nCount = rMarkList.GetMarkCount();
 
@@ -336,124 +335,175 @@ void FuObjectAnimationParameters::DoExecute( 
SfxRequest& rReq )
     if(!pArgs)
     {
         // fill ItemSet for dialog
-        SfxItemSetFixed<ATTR_ANIMATION_START, ATTR_ACTION_END> 
aSet(mpDoc->GetPool());
+        std::shared_ptr<SfxItemSet> aSet = 
std::make_shared<SfxItemSetFixed<ATTR_ANIMATION_START, 
ATTR_ACTION_END>>(mpDoc->GetPool());
 
         // fill the set
         if (nAnimationSet == ATTR_SET)
-            aSet.Put( SfxBoolItem( ATTR_ANIMATION_ACTIVE, bActive));
+            aSet->Put( SfxBoolItem( ATTR_ANIMATION_ACTIVE, bActive));
         else if (nAnimationSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ANIMATION_ACTIVE);
+            aSet->InvalidateItem(ATTR_ANIMATION_ACTIVE);
         else
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, false));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_ACTIVE, false));
 
         if (nEffectSet == ATTR_SET)
-            aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, 
static_cast<sal_uInt16>(eEffect)));
+            aSet->Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, 
static_cast<sal_uInt16>(eEffect)));
         else if (nEffectSet == ATTR_MIXED)
-            aSet.InvalidateItem( ATTR_ANIMATION_EFFECT );
+            aSet->InvalidateItem( ATTR_ANIMATION_EFFECT );
         else
-            aSet.Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, 
sal_uInt16(presentation::AnimationEffect_NONE)));
+            aSet->Put(SfxUInt16Item(ATTR_ANIMATION_EFFECT, 
sal_uInt16(presentation::AnimationEffect_NONE)));
 
         if (nTextEffectSet == ATTR_SET)
-            aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, 
static_cast<sal_uInt16>(eTextEffect)));
+            aSet->Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, 
static_cast<sal_uInt16>(eTextEffect)));
         else if (nTextEffectSet == ATTR_MIXED)
-            aSet.InvalidateItem( ATTR_ANIMATION_TEXTEFFECT );
+            aSet->InvalidateItem( ATTR_ANIMATION_TEXTEFFECT );
         else
-            aSet.Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, 
sal_uInt16(presentation::AnimationEffect_NONE)));
+            aSet->Put(SfxUInt16Item(ATTR_ANIMATION_TEXTEFFECT, 
sal_uInt16(presentation::AnimationEffect_NONE)));
 
         if (nSpeedSet == ATTR_SET)
-            aSet.Put(SfxUInt16Item(ATTR_ANIMATION_SPEED, 
static_cast<sal_uInt16>(eSpeed)));
+            aSet->Put(SfxUInt16Item(ATTR_ANIMATION_SPEED, 
static_cast<sal_uInt16>(eSpeed)));
         else
-            aSet.InvalidateItem(ATTR_ANIMATION_SPEED);
+            aSet->InvalidateItem(ATTR_ANIMATION_SPEED);
 
         if (nFadeOutSet == ATTR_SET)
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, bFadeOut));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, bFadeOut));
         else if (nFadeOutSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ANIMATION_FADEOUT);
+            aSet->InvalidateItem(ATTR_ANIMATION_FADEOUT);
         else
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, false));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_FADEOUT, false));
 
         if (nFadeColorSet == ATTR_SET)
-            aSet.Put(SvxColorItem(aFadeColor, ATTR_ANIMATION_COLOR));
+            aSet->Put(SvxColorItem(aFadeColor, ATTR_ANIMATION_COLOR));
         else if (nFadeColorSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ANIMATION_COLOR);
+            aSet->InvalidateItem(ATTR_ANIMATION_COLOR);
         else
-            aSet.Put(SvxColorItem(COL_LIGHTGRAY, ATTR_ANIMATION_COLOR));
+            aSet->Put(SvxColorItem(COL_LIGHTGRAY, ATTR_ANIMATION_COLOR));
 
         if (nInvisibleSet == ATTR_SET)
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, bInvisible));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, bInvisible));
         else if (nInvisibleSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ANIMATION_INVISIBLE);
+            aSet->InvalidateItem(ATTR_ANIMATION_INVISIBLE);
         else
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, false));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_INVISIBLE, false));
 
         if (nSoundOnSet == ATTR_SET)
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, bSoundOn));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, bSoundOn));
         else if (nSoundOnSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ANIMATION_SOUNDON);
+            aSet->InvalidateItem(ATTR_ANIMATION_SOUNDON);
         else
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, false));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_SOUNDON, false));
 
         if (nSoundFileSet == ATTR_SET)
-            aSet.Put(SfxStringItem(ATTR_ANIMATION_SOUNDFILE, aSound));
+            aSet->Put(SfxStringItem(ATTR_ANIMATION_SOUNDFILE, aSound));
         else
-            aSet.InvalidateItem(ATTR_ANIMATION_SOUNDFILE);
+            aSet->InvalidateItem(ATTR_ANIMATION_SOUNDFILE);
 
         if (nPlayFullSet == ATTR_SET)
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, bPlayFull));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, bPlayFull));
         else if (nPlayFullSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ANIMATION_PLAYFULL);
+            aSet->InvalidateItem(ATTR_ANIMATION_PLAYFULL);
         else
-            aSet.Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, false));
+            aSet->Put(SfxBoolItem(ATTR_ANIMATION_PLAYFULL, false));
 
         if (nClickActionSet == ATTR_SET)
-            aSet.Put(SfxUInt16Item(ATTR_ACTION, 
static_cast<sal_uInt16>(eClickAction)));
+            aSet->Put(SfxUInt16Item(ATTR_ACTION, 
static_cast<sal_uInt16>(eClickAction)));
         else if (nClickActionSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ACTION);
+            aSet->InvalidateItem(ATTR_ACTION);
         else
-            aSet.Put(SfxUInt16Item(ATTR_ACTION, 
sal_uInt16(presentation::ClickAction_NONE)));
+            aSet->Put(SfxUInt16Item(ATTR_ACTION, 
sal_uInt16(presentation::ClickAction_NONE)));
 
         if (nBookmarkSet == ATTR_SET)
-            aSet.Put(SfxStringItem(ATTR_ACTION_FILENAME, aBookmark));
+            aSet->Put(SfxStringItem(ATTR_ACTION_FILENAME, aBookmark));
         else
-            aSet.InvalidateItem(ATTR_ACTION_FILENAME);
+            aSet->InvalidateItem(ATTR_ACTION_FILENAME);
 
         if (nSecondEffectSet == ATTR_SET)
-            aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, 
static_cast<sal_uInt16>(eSecondEffect)));
+            aSet->Put(SfxUInt16Item(ATTR_ACTION_EFFECT, 
static_cast<sal_uInt16>(eSecondEffect)));
         else if (nSecondEffectSet == ATTR_MIXED)
-            aSet.InvalidateItem( ATTR_ACTION_EFFECT );
+            aSet->InvalidateItem( ATTR_ACTION_EFFECT );
         else
-            aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECT, 
sal_uInt16(presentation::AnimationEffect_NONE)));
+            aSet->Put(SfxUInt16Item(ATTR_ACTION_EFFECT, 
sal_uInt16(presentation::AnimationEffect_NONE)));
 
         if (nSecondSpeedSet == ATTR_SET)
-            aSet.Put(SfxUInt16Item(ATTR_ACTION_EFFECTSPEED, 
static_cast<sal_uInt16>(eSecondSpeed)));
+            aSet->Put(SfxUInt16Item(ATTR_ACTION_EFFECTSPEED, 
static_cast<sal_uInt16>(eSecondSpeed)));
         else
-            aSet.InvalidateItem(ATTR_ACTION_EFFECTSPEED);
+            aSet->InvalidateItem(ATTR_ACTION_EFFECTSPEED);
 
         if (nSecondSoundOnSet == ATTR_SET)
-            aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, bSecondSoundOn));
+            aSet->Put(SfxBoolItem(ATTR_ACTION_SOUNDON, bSecondSoundOn));
         else if (nSecondSoundOnSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ACTION_SOUNDON);
+            aSet->InvalidateItem(ATTR_ACTION_SOUNDON);
         else
-            aSet.Put(SfxBoolItem(ATTR_ACTION_SOUNDON, false));
+            aSet->Put(SfxBoolItem(ATTR_ACTION_SOUNDON, false));
 
         if (nSecondPlayFullSet == ATTR_SET)
-            aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, bSecondPlayFull));
+            aSet->Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, bSecondPlayFull));
         else if (nSecondPlayFullSet == ATTR_MIXED)
-            aSet.InvalidateItem(ATTR_ACTION_PLAYFULL);
+            aSet->InvalidateItem(ATTR_ACTION_PLAYFULL);
         else
-            aSet.Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, false));
+            aSet->Put(SfxBoolItem(ATTR_ACTION_PLAYFULL, false));
+
+        std::shared_ptr<SfxRequest> xRequest = 
std::make_shared<SfxRequest>(rReq);
+        rReq.Ignore(); // the 'old' request is not relevant any more
 
         SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
-        ScopedVclPtr<SfxAbstractDialog> pDlg( 
pFact->CreatSdActionDialog(mpViewShell->GetFrameWeld(), &aSet, mpView) );
+        VclPtr<SfxAbstractDialog> pDlg( 
pFact->CreatSdActionDialog(mpViewShell->GetFrameWeld(), &*aSet, mpView) );
+        rtl::Reference<FuObjectAnimationParameters> xThis( this ); // avoid 
destruction within async processing
+        pDlg->StartExecuteAsync([pDlg, xThis, xRequest, aSet](sal_Int32 
nResult){
+            if (nResult == RET_OK) {
+                xThis->Finish(xRequest, pDlg);
+            }
+            pDlg->disposeOnce();
+        });
+    }
+}
 
-        short nResult = pDlg->Execute();
+void FuObjectAnimationParameters::Finish( const std::shared_ptr<SfxRequest>& 
xRequest, const VclPtr<SfxAbstractDialog>& pDlg )
+{
+    SfxUndoManager* pUndoMgr = 
mpViewShell->GetViewFrame()->GetObjectShell()->GetUndoManager();
 
-        if( nResult != RET_OK )
-            return;
+    const SdrMarkList& rMarkList  = mpView->GetMarkedObjectList();
+    const size_t nCount = rMarkList.GetMarkCount();
 
-        rReq.Done( *( pDlg->GetOutputItemSet() ) );
-        pArgs = rReq.GetArgs();
-    }
+    short nAnimationSet     = ATTR_MISSING;
+    short nEffectSet        = ATTR_MISSING;
+    short nTextEffectSet    = ATTR_MISSING;
+    short nSpeedSet         = ATTR_MISSING;
+    short nFadeColorSet     = ATTR_MISSING;
+    short nFadeOutSet       = ATTR_MISSING;
+    short nInvisibleSet     = ATTR_MISSING;
+    short nSoundOnSet       = ATTR_MISSING;
+    short nSoundFileSet     = ATTR_MISSING;
+    short nPlayFullSet      = ATTR_MISSING;
+    short nClickActionSet   = ATTR_MISSING;
+    short nBookmarkSet      = ATTR_MISSING;
+
+    short nSecondEffectSet      = ATTR_MISSING;
+    short nSecondSpeedSet       = ATTR_MISSING;
+    short nSecondSoundOnSet     = ATTR_MISSING;
+    short nSecondPlayFullSet    = ATTR_MISSING;
+
+    presentation::AnimationEffect eEffect         = 
presentation::AnimationEffect_NONE;
+    presentation::AnimationEffect eTextEffect     = 
presentation::AnimationEffect_NONE;
+    presentation::AnimationSpeed  eSpeed          = 
presentation::AnimationSpeed_MEDIUM;
+    bool            bActive         = false;
+    bool            bFadeOut        = false;
+    Color           aFadeColor      = COL_LIGHTGRAY;
+    bool            bInvisible      = false;
+    bool            bSoundOn        = false;
+    OUString        aSound;
+    bool            bPlayFull       = false;
+    presentation::ClickAction     eClickAction    = 
presentation::ClickAction_NONE;
+    OUString        aBookmark;
+
+    presentation::AnimationEffect eSecondEffect   = 
presentation::AnimationEffect_NONE;
+    presentation::AnimationSpeed  eSecondSpeed    = 
presentation::AnimationSpeed_MEDIUM;
+    bool            bSecondSoundOn  = false;
+    bool            bSecondPlayFull = false;
+
+    SdAnimationInfo* pInfo;
+
+    xRequest->Done( *( pDlg->GetOutputItemSet() ) );
+    auto pArgs = xRequest->GetArgs();
 
     // evaluation of the ItemSets
     if (pArgs->GetItemState(ATTR_ANIMATION_ACTIVE) == SfxItemState::SET)
diff --git a/sd/source/ui/inc/fuoaprms.hxx b/sd/source/ui/inc/fuoaprms.hxx
index 3e5432a4e092..5e63b1c56513 100644
--- a/sd/source/ui/inc/fuoaprms.hxx
+++ b/sd/source/ui/inc/fuoaprms.hxx
@@ -19,7 +19,10 @@
 
 #pragma once
 
+#include <sfx2/sfxdlg.hxx>
+
 #include "fupoor.hxx"
+#include "tpaction.hxx"
 
 namespace sd {
 
@@ -31,6 +34,7 @@ public:
     static rtl::Reference<FuPoor> Create( ViewShell* pViewSh, ::sd::Window* 
pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq );
     virtual void DoExecute( SfxRequest& rReq ) override;
 
+    void Finish( const std::shared_ptr<SfxRequest>& rReq, const 
VclPtr<SfxAbstractDialog>& pDlg );
 private:
 
     FuObjectAnimationParameters (

Reply via email to