From 8370542eb2e5d21feebca9f0c7fd855b5773d855 Mon Sep 17 00:00:00 2001 From: ed Date: Tue, 7 Sep 2021 17:33:02 +0100 Subject: [PATCH] Accessibility: Only use AccessibilityRole::toggleButton role and add AccessibilityActionType::toggle for ToggleButtons --- .../juce_gui_basics/buttons/juce_Button.cpp | 26 +++++++++---------- .../buttons/juce_ToggleButton.cpp | 5 ++++ .../buttons/juce_ToggleButton.h | 2 ++ .../widgets/juce_ToolbarItemComponent.cpp | 6 +++-- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/modules/juce_gui_basics/buttons/juce_Button.cpp b/modules/juce_gui_basics/buttons/juce_Button.cpp index ec5e070b0e..078d8a0f1d 100644 --- a/modules/juce_gui_basics/buttons/juce_Button.cpp +++ b/modules/juce_gui_basics/buttons/juce_Button.cpp @@ -208,8 +208,6 @@ void Button::setClickingTogglesState (bool shouldToggle) noexcept // it is that this button represents, and the button will update its state to reflect this // in the applicationCommandListChanged() method. jassert (commandManagerToUse == nullptr || ! clickTogglesState); - - invalidateAccessibilityHandler(); } bool Button::getClickingTogglesState() const noexcept @@ -708,10 +706,10 @@ void Button::repeatTimerCallback() class ButtonAccessibilityHandler : public AccessibilityHandler { public: - explicit ButtonAccessibilityHandler (Button& buttonToWrap) + explicit ButtonAccessibilityHandler (Button& buttonToWrap, AccessibilityRole role) : AccessibilityHandler (buttonToWrap, - getButtonRole (buttonToWrap), - getAccessibilityActions (buttonToWrap)), + isRadioButton (buttonToWrap) ? AccessibilityRole::radioButton : role, + getAccessibilityActions (buttonToWrap, role)), button (buttonToWrap) { } @@ -720,7 +718,7 @@ public: { auto state = AccessibilityHandler::getCurrentState(); - if (button.getClickingTogglesState() || button.getRadioGroupId() != 0) + if (isToggleButton (getRole()) || isRadioButton (button)) { state = state.withCheckable(); @@ -744,20 +742,22 @@ public: String getHelp() const override { return button.getTooltip(); } private: - static AccessibilityRole getButtonRole (const Button& b) + static bool isToggleButton (AccessibilityRole role) noexcept { - if (b.getRadioGroupId() != 0) return AccessibilityRole::radioButton; - if (b.getClickingTogglesState()) return AccessibilityRole::toggleButton; + return role == AccessibilityRole::toggleButton; + } - return AccessibilityRole::button; + static bool isRadioButton (const Button& button) noexcept + { + return button.getRadioGroupId() != 0; } - static AccessibilityActions getAccessibilityActions (Button& button) + static AccessibilityActions getAccessibilityActions (Button& button, AccessibilityRole role) { auto actions = AccessibilityActions().addAction (AccessibilityActionType::press, [&button] { button.triggerClick(); }); - if (button.getClickingTogglesState()) + if (isToggleButton (role)) actions = actions.addAction (AccessibilityActionType::toggle, [&button] { button.setToggleState (! button.getToggleState(), sendNotification); }); @@ -772,7 +772,7 @@ private: std::unique_ptr Button::createAccessibilityHandler() { - return std::make_unique (*this); + return std::make_unique (*this, AccessibilityRole::button); } } // namespace juce diff --git a/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp b/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp index 0c556c4e9f..bffb22e04e 100644 --- a/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp +++ b/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp @@ -57,4 +57,9 @@ void ToggleButton::colourChanged() repaint(); } +std::unique_ptr ToggleButton::createAccessibilityHandler() +{ + return std::make_unique (*this, AccessibilityRole::toggleButton); +} + } // namespace juce diff --git a/modules/juce_gui_basics/buttons/juce_ToggleButton.h b/modules/juce_gui_basics/buttons/juce_ToggleButton.h index 3f27376b8c..b864f58573 100644 --- a/modules/juce_gui_basics/buttons/juce_ToggleButton.h +++ b/modules/juce_gui_basics/buttons/juce_ToggleButton.h @@ -84,6 +84,8 @@ protected: void colourChanged() override; private: + std::unique_ptr createAccessibilityHandler() override; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToggleButton) }; diff --git a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp index 8bf56b1f4c..9bf7d6b2eb 100644 --- a/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp @@ -246,8 +246,10 @@ std::unique_ptr ToolbarItemComponent::createAccessibilityH && itemId != ToolbarItemFactory::spacerId && itemId != ToolbarItemFactory::flexibleSpacerId); - return shouldItemBeAccessible ? std::make_unique (*this) - : nullptr; + if (! shouldItemBeAccessible) + return nullptr; + + return std::make_unique (*this, AccessibilityRole::button); } } // namespace juce