svx/source/tbxctrls/extrusioncontrols.cxx |   53 ++++++++++++++++++++++-----
 svx/source/tbxctrls/extrusioncontrols.hxx |    4 ++
 svx/source/tbxctrls/fontworkgallery.cxx   |   57 +++++++++++++++++++++++++-----
 3 files changed, 94 insertions(+), 20 deletions(-)

New commits:
commit 37147e03918ed73c34e5a63bf775c98f0b9238ec
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Mon Oct 25 20:39:41 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Oct 28 14:40:57 2021 +0200

    tdf#145296 better fix to launch dialog when active radiobutton is clicked
    
    Uses a mouse-release workaround to detect the case of clicking on an
    already active radiobutton which gives a result basically
    indistinguishable from the pre 7.2 experience
    
    Change-Id: Ic7ac6fa20843466b1d0c77586e25f4aabf814328
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124286
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    Tested-by: Jenkins

diff --git a/svx/source/tbxctrls/extrusioncontrols.cxx 
b/svx/source/tbxctrls/extrusioncontrols.cxx
index 6e040da5b1dd..e51c479ffe43 100644
--- a/svx/source/tbxctrls/extrusioncontrols.cxx
+++ b/svx/source/tbxctrls/extrusioncontrols.cxx
@@ -341,6 +341,7 @@ 
ExtrusionDepthWindow::ExtrusionDepthWindow(svt::PopupWindowController* pControl,
     , meUnit(FieldUnit::NONE)
     , mfDepth( -1.0 )
     , mbSettingValue(false)
+    , mbCommandDispatched(false)
 {
     mxDepth0->connect_toggled(LINK(this, ExtrusionDepthWindow, SelectHdl));
     mxDepth1->connect_toggled(LINK(this, ExtrusionDepthWindow, SelectHdl));
@@ -349,6 +350,7 @@ 
ExtrusionDepthWindow::ExtrusionDepthWindow(svt::PopupWindowController* pControl,
     mxDepth4->connect_toggled(LINK(this, ExtrusionDepthWindow, SelectHdl));
     mxInfinity->connect_toggled(LINK(this, ExtrusionDepthWindow, SelectHdl));
     mxCustom->connect_toggled(LINK(this, ExtrusionDepthWindow, SelectHdl));
+    mxCustom->connect_mouse_release(LINK(this, ExtrusionDepthWindow, 
MouseReleaseHdl));
 
     AddStatusListener( gsExtrusionDepth );
     AddStatusListener( gsMetricUnit );
@@ -443,23 +445,33 @@ void ExtrusionDepthWindow::statusChanged(
     }
 }
 
+void ExtrusionDepthWindow::DispatchDepthDialog()
+{
+    Sequence< PropertyValue > aArgs( 2 );
+    aArgs[0].Name = "Depth";
+    aArgs[0].Value <<= mfDepth;
+    aArgs[1].Name = "Metric";
+    aArgs[1].Value <<= static_cast<sal_Int32>( meUnit );
+
+    rtl::Reference<svt::PopupWindowController> xControl(mxControl);
+    xControl->EndPopupMode();
+    xControl->dispatchCommand(".uno:ExtrusionDepthDialog", aArgs);
+    mbCommandDispatched = true;
+}
+
 IMPL_LINK(ExtrusionDepthWindow, SelectHdl, weld::Toggleable&, rButton, void)
 {
     if (mbSettingValue || !rButton.get_active())
         return;
 
+    // see MouseReleaseHdl for mbCommandDispatched check, there's no guarantee
+    // this toggle will happen before that mouse release though it does in
+    // practice for vcl and gtk
+    if (mbCommandDispatched)
+        return;
+
     if (mxCustom->get_active())
-    {
-        Sequence< PropertyValue > aArgs( 2 );
-        aArgs[0].Name = "Depth";
-        aArgs[0].Value <<= mfDepth;
-        aArgs[1].Name = "Metric";
-        aArgs[1].Value <<= static_cast<sal_Int32>( meUnit );
-
-        rtl::Reference<svt::PopupWindowController> xControl(mxControl);
-        xControl->EndPopupMode();
-        xControl->dispatchCommand(".uno:ExtrusionDepthDialog", aArgs);
-    }
+        DispatchDepthDialog();
     else
     {
         double fDepth;
@@ -490,12 +502,31 @@ IMPL_LINK(ExtrusionDepthWindow, SelectHdl, 
weld::Toggleable&, rButton, void)
         aArgs[0].Value <<= fDepth;
 
         mxControl->dispatchCommand( gsExtrusionDepth,  aArgs );
+        mbCommandDispatched = true;
         implSetDepth( fDepth );
 
         mxControl->EndPopupMode();
     }
 }
 
+IMPL_LINK_NOARG(ExtrusionDepthWindow, MouseReleaseHdl, const MouseEvent&, bool)
+{
+    /*
+     tdf#145296 if the "custom" radiobutton was presented preselected as
+     toggled on and the user clicked on it then there's no toggled signal sent
+     because the item was already toggled on and didn't change state.
+
+     So if that happens launch the custom spacing dialog explicitly here on
+     mouse release.
+    */
+    if (mxCustom->get_active() && !mbCommandDispatched)
+    {
+        DispatchDepthDialog();
+        return true;
+    }
+    return false;
+}
+
 // ExtrusionDirectionControl
 ExtrusionDepthController::ExtrusionDepthController(
     const Reference< XComponentContext >& rxContext
diff --git a/svx/source/tbxctrls/extrusioncontrols.hxx 
b/svx/source/tbxctrls/extrusioncontrols.hxx
index 0f0f54dbf457..7e0043487274 100644
--- a/svx/source/tbxctrls/extrusioncontrols.hxx
+++ b/svx/source/tbxctrls/extrusioncontrols.hxx
@@ -104,12 +104,16 @@ private:
     FieldUnit   meUnit;
     double      mfDepth;
     bool        mbSettingValue;
+    bool        mbCommandDispatched;
 
     DECL_LINK( SelectHdl, weld::Toggleable&, void );
+    DECL_LINK( MouseReleaseHdl, const MouseEvent&, bool );
 
     void    implFillStrings( FieldUnit eUnit );
     void    implSetDepth( double fDepth );
 
+    void    DispatchDepthDialog();
+
 public:
     ExtrusionDepthWindow(svt::PopupWindowController* pControl, weld::Widget* 
pParentWindow);
     virtual void GrabFocus() override;
diff --git a/svx/source/tbxctrls/fontworkgallery.cxx 
b/svx/source/tbxctrls/fontworkgallery.cxx
index a5c812c03b63..7bfec4b860c0 100644
--- a/svx/source/tbxctrls/fontworkgallery.cxx
+++ b/svx/source/tbxctrls/fontworkgallery.cxx
@@ -477,13 +477,17 @@ private:
     std::unique_ptr<weld::RadioButton> mxVeryLoose;
     std::unique_ptr<weld::RadioButton> mxCustom;
     std::unique_ptr<weld::CheckButton> mxKernPairs;
+    sal_Int32 mnCharacterSpacing;
     bool mbSettingValue;
+    bool mbCommandDispatched;
 
     DECL_LINK( KernSelectHdl, weld::Toggleable&, void );
     DECL_LINK( SelectHdl, weld::Toggleable&, void );
+    DECL_LINK( MouseReleaseHdl, const MouseEvent&, bool );
 
     void    implSetCharacterSpacing( sal_Int32 nCharacterSpacing, bool 
bEnabled );
     void    implSetKernCharacterPairs(bool bKernOnOff, bool bEnabled);
+    void    DispatchSpacingDialog();
 };
 
 }
@@ -501,7 +505,9 @@ 
FontworkCharacterSpacingWindow::FontworkCharacterSpacingWindow(svt::PopupWindowC
     , mxVeryLoose(m_xBuilder->weld_radio_button("veryloose"))
     , mxCustom(m_xBuilder->weld_radio_button("custom"))
     , mxKernPairs(m_xBuilder->weld_check_button("kernpairs"))
+    , mnCharacterSpacing(0)
     , mbSettingValue(false)
+    , mbCommandDispatched(false)
 {
     mxVeryTight->connect_toggled(LINK(this, FontworkCharacterSpacingWindow, 
SelectHdl));
     mxTight->connect_toggled(LINK(this, FontworkCharacterSpacingWindow, 
SelectHdl));
@@ -509,6 +515,7 @@ 
FontworkCharacterSpacingWindow::FontworkCharacterSpacingWindow(svt::PopupWindowC
     mxLoose->connect_toggled(LINK(this, FontworkCharacterSpacingWindow, 
SelectHdl));
     mxVeryLoose->connect_toggled(LINK(this, FontworkCharacterSpacingWindow, 
SelectHdl));
     mxCustom->connect_toggled(LINK(this, FontworkCharacterSpacingWindow, 
SelectHdl));
+    mxCustom->connect_mouse_release(LINK(this, FontworkCharacterSpacingWindow, 
MouseReleaseHdl));
 
     mxKernPairs->connect_toggled(LINK(this, FontworkCharacterSpacingWindow, 
KernSelectHdl));
 
@@ -563,6 +570,8 @@ void 
FontworkCharacterSpacingWindow::implSetCharacterSpacing( sal_Int32 nCharact
             break;
     }
 
+    mnCharacterSpacing = nCharacterSpacing;
+
     mbSettingValue = bSettingValue;
 }
 
@@ -613,12 +622,25 @@ IMPL_LINK_NOARG(FontworkCharacterSpacingWindow, 
KernSelectHdl, weld::Toggleable&
     aArgs[0].Value <<= bKernOnOff;
 
     mxControl->dispatchCommand( gsFontworkKernCharacterPairs, aArgs );
+    mbCommandDispatched = true;
 
     implSetKernCharacterPairs(bKernOnOff, true);
 
     mxControl->EndPopupMode();
 }
 
+void FontworkCharacterSpacingWindow::DispatchSpacingDialog()
+{
+    Sequence< PropertyValue > aArgs( 1 );
+    aArgs[0].Name = OUString(gsFontworkCharacterSpacing).copy(5);
+    aArgs[0].Value <<= mnCharacterSpacing;
+
+    rtl::Reference<svt::PopupWindowController> xControl(mxControl);
+    xControl->EndPopupMode();
+    xControl->dispatchCommand(".uno:FontworkCharacterSpacingDialog", aArgs);
+    mbCommandDispatched = true;
+}
+
 IMPL_LINK(FontworkCharacterSpacingWindow, SelectHdl, weld::Toggleable&, 
rButton, void)
 {
     if (!rButton.get_active())
@@ -627,16 +649,14 @@ IMPL_LINK(FontworkCharacterSpacingWindow, SelectHdl, 
weld::Toggleable&, rButton,
     if (mbSettingValue)
         return;
 
-    if (mxCustom->get_active())
-    {
-        Sequence< PropertyValue > aArgs( 1 );
-        aArgs[0].Name = OUString(gsFontworkCharacterSpacing).copy(5);
-        aArgs[0].Value <<= sal_Int32(100);
+    // see MouseReleaseHdl for mbCommandDispatched check, there's no guarantee
+    // this toggle will happen before that mouse release though it does in
+    // practice for vcl and gtk
+    if (mbCommandDispatched)
+        return;
 
-        rtl::Reference<svt::PopupWindowController> xControl(mxControl);
-        xControl->EndPopupMode();
-        xControl->dispatchCommand(".uno:FontworkCharacterSpacingDialog", 
aArgs);
-    }
+    if (mxCustom->get_active())
+        DispatchSpacingDialog();
     else
     {
         sal_Int32 nCharacterSpacing;
@@ -656,6 +676,7 @@ IMPL_LINK(FontworkCharacterSpacingWindow, SelectHdl, 
weld::Toggleable&, rButton,
         aArgs[0].Value <<= nCharacterSpacing;
 
         mxControl->dispatchCommand( gsFontworkCharacterSpacing,  aArgs );
+        mbCommandDispatched = true;
 
         implSetCharacterSpacing( nCharacterSpacing, true );
     }
@@ -663,6 +684,24 @@ IMPL_LINK(FontworkCharacterSpacingWindow, SelectHdl, 
weld::Toggleable&, rButton,
     mxControl->EndPopupMode();
 }
 
+IMPL_LINK_NOARG(FontworkCharacterSpacingWindow, MouseReleaseHdl, const 
MouseEvent&, bool)
+{
+    /*
+     tdf#145296 if the "custom" radiobutton was presented preselected as
+     toggled on and the user clicked on it then there's no toggled signal sent
+     because the item was already toggled on and didn't change state.
+
+     So if that happens launch the custom spacing dialog explicitly here on
+     mouse release.
+    */
+    if (mxCustom->get_active() && !mbCommandDispatched)
+    {
+        DispatchSpacingDialog();
+        return true;
+    }
+    return false;
+}
+
 namespace {
 
 class FontworkCharacterSpacingControl : public svt::PopupWindowController

Reply via email to