summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-10-25 20:39:41 +0100
committerCaolán McNamara <caolanm@redhat.com>2021-10-28 14:40:57 +0200
commit37147e03918ed73c34e5a63bf775c98f0b9238ec (patch)
tree02b4e564641c929ed482139c61709540140be357
parenttdf#136715 sw: fix table Undo to update table style (diff)
downloadcore-37147e03918ed73c34e5a63bf775c98f0b9238ec.tar.gz
core-37147e03918ed73c34e5a63bf775c98f0b9238ec.zip
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.stahl@allotropia.de> Tested-by: Jenkins
-rw-r--r--svx/source/tbxctrls/extrusioncontrols.cxx53
-rw-r--r--svx/source/tbxctrls/extrusioncontrols.hxx4
-rw-r--r--svx/source/tbxctrls/fontworkgallery.cxx57
3 files changed, 94 insertions, 20 deletions
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