avmedia/source/viewer/mediawindow.cxx                     |    8 -
 include/avmedia/mediawindow.hxx                           |    1 
 svx/inc/sdr/contact/viewobjectcontactofsdrmediaobj.hxx    |    4 
 svx/source/sdr/contact/viewobjectcontactofsdrmediaobj.cxx |   65 ++++++++------
 4 files changed, 47 insertions(+), 31 deletions(-)

New commits:
commit 6f938dce6eaa927cfde39491ef7a0bc1d07df66b
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Feb 18 21:09:30 2022 +0000
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Sat Feb 19 12:01:54 2022 +0100

    update video pos and size after change if currently playing
    
    I'd prefer if it changed size during the resizing/repositioning, but
    at least make it immediately take the final size after the
    resize/reposition has happened.
    
    Change-Id: Ic3b4dd23921ad5cf6092f1514dd6538f9946998a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130178
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/avmedia/source/viewer/mediawindow.cxx 
b/avmedia/source/viewer/mediawindow.cxx
index 6c61a7e9b361..c251f020225e 100644
--- a/avmedia/source/viewer/mediawindow.cxx
+++ b/avmedia/source/viewer/mediawindow.cxx
@@ -142,30 +142,30 @@ bool MediaWindow::start()
     return mpImpl->start();
 }
 
-
 void MediaWindow::updateMediaItem( MediaItem& rItem ) const
 {
     mpImpl->updateMediaItem( rItem );
 }
 
-
 void MediaWindow::executeMediaItem( const MediaItem& rItem )
 {
     mpImpl->executeMediaItem( rItem );
 }
 
-
 void MediaWindow::show()
 {
     mpImpl->Show();
 }
 
-
 void MediaWindow::hide()
 {
     mpImpl->Hide();
 }
 
+bool MediaWindow::isVisible() const
+{
+    return mpImpl->IsVisible();
+}
 
 vcl::Window* MediaWindow::getWindow() const
 {
diff --git a/include/avmedia/mediawindow.hxx b/include/avmedia/mediawindow.hxx
index 78e0b1a299a3..d031f51adaf0 100644
--- a/include/avmedia/mediawindow.hxx
+++ b/include/avmedia/mediawindow.hxx
@@ -74,6 +74,7 @@ namespace avmedia
 
         void                show();
         void                hide();
+        bool                isVisible() const;
 
     public:
 
diff --git a/svx/inc/sdr/contact/viewobjectcontactofsdrmediaobj.hxx 
b/svx/inc/sdr/contact/viewobjectcontactofsdrmediaobj.hxx
index 21fbed38142c..d362048df3db 100644
--- a/svx/inc/sdr/contact/viewobjectcontactofsdrmediaobj.hxx
+++ b/svx/inc/sdr/contact/viewobjectcontactofsdrmediaobj.hxx
@@ -51,7 +51,11 @@ namespace sdr::contact
             void    updateMediaItem( ::avmedia::MediaItem& rItem ) const;
             void    executeMediaItem( const ::avmedia::MediaItem& rItem );
 
+            virtual void ActionChanged() override;
+
         private:
+            void updateMediaWindow() const;
+
 #if HAVE_FEATURE_AVMEDIA
             std::unique_ptr<sdr::contact::SdrMediaWindow> mpMediaWindow;
 #endif
diff --git a/svx/source/sdr/contact/viewobjectcontactofsdrmediaobj.cxx 
b/svx/source/sdr/contact/viewobjectcontactofsdrmediaobj.cxx
index 27768ff0777f..0241fabd5661 100644
--- a/svx/source/sdr/contact/viewobjectcontactofsdrmediaobj.cxx
+++ b/svx/source/sdr/contact/viewobjectcontactofsdrmediaobj.cxx
@@ -84,6 +84,43 @@ Size ViewObjectContactOfSdrMediaObj::getPreferredSize() const
     return aRet;
 }
 
+void ViewObjectContactOfSdrMediaObj::ActionChanged()
+{
+    ViewObjectContactOfSdrObj::ActionChanged();
+    if (mpMediaWindow && mpMediaWindow->isVisible())
+        updateMediaWindow();
+}
+
+void ViewObjectContactOfSdrMediaObj::updateMediaWindow() const
+{
+    basegfx::B2DRange aViewRange(getObjectRange());
+    
aViewRange.transform(GetObjectContact().getViewInformation2D().getViewTransformation());
+
+    const tools::Rectangle aViewRectangle(
+        static_cast<sal_Int32>(floor(aViewRange.getMinX())), 
static_cast<sal_Int32>(floor(aViewRange.getMinY())),
+        static_cast<sal_Int32>(ceil(aViewRange.getMaxX())), 
static_cast<sal_Int32>(ceil(aViewRange.getMaxY())));
+
+    // mpMediaWindow contains a SalObject window and gtk won't accept
+    // the size until after the SalObject widget is shown but if we
+    // show it before setting a size then vcl will detect that the
+    // vcl::Window has no size and make it invisible instead. If we
+    // call setPosSize twice with the same size before and after show
+    // then the second attempt is a no-op as vcl caches the size.
+
+    // so call it initially with a size arbitrarily 1 pixel wider than
+    // we want so we have an initial size to make vcl happy
+    tools::Rectangle aInitialRect(aViewRectangle);
+    aInitialRect.AdjustRight(1);
+    mpMediaWindow->setPosSize(aInitialRect);
+
+    // then make it visible
+    mpMediaWindow->show();
+
+    // set the final desired size which is different to let vcl send it
+    // through to gtk which will now accept it as the underlying
+    // m_pSocket of GtkSalObject::SetPosSize is now visible
+    mpMediaWindow->setPosSize(aViewRectangle);
+}
 
 void ViewObjectContactOfSdrMediaObj::updateMediaItem( ::avmedia::MediaItem& 
rItem ) const
 {
@@ -100,33 +137,7 @@ void ViewObjectContactOfSdrMediaObj::updateMediaItem( 
::avmedia::MediaItem& rIte
     }
     else
     {
-        basegfx::B2DRange aViewRange(getObjectRange());
-        
aViewRange.transform(GetObjectContact().getViewInformation2D().getViewTransformation());
-
-        const tools::Rectangle aViewRectangle(
-            static_cast<sal_Int32>(floor(aViewRange.getMinX())), 
static_cast<sal_Int32>(floor(aViewRange.getMinY())),
-            static_cast<sal_Int32>(ceil(aViewRange.getMaxX())), 
static_cast<sal_Int32>(ceil(aViewRange.getMaxY())));
-
-        // mpMediaWindow contains a SalObject window and gtk won't accept
-        // the size until after the SalObject widget is shown but if we
-        // show it before setting a size then vcl will detect that the
-        // vcl::Window has no size and make it invisible instead. If we
-        // call setPosSize twice with the same size before and after show
-        // then the second attempt is a no-op as vcl caches the size.
-
-        // so call it initially with a size arbitrarily 1 pixel wider than
-        // we want so we have an initial size to make vcl happy
-        tools::Rectangle aInitialRect(aViewRectangle);
-        aInitialRect.AdjustRight(1);
-        mpMediaWindow->setPosSize(aInitialRect);
-
-        // then make it visible
-        mpMediaWindow->show();
-
-        // set the final desired size which is different to let vcl send it
-        // through to gtk which will now accept it as the underlying
-        // m_pSocket of GtkSalObject::SetPosSize is now visible
-        mpMediaWindow->setPosSize(aViewRectangle);
+        updateMediaWindow();
     }
 #else
     (void) rItem;

Reply via email to