From c559d31e9056370c03f0ab311ccf6d70b2528d32 Mon Sep 17 00:00:00 2001 From: ed Date: Fri, 2 Jul 2021 11:40:37 +0100 Subject: [PATCH] Accessibility: Override Accessibility::getHelp() for JUCE widgets that support tooltips --- .../juce_gui_basics/widgets/juce_ComboBox.cpp | 1 + .../widgets/juce_ImageComponent.cpp | 20 ++++++++- .../juce_gui_basics/widgets/juce_Label.cpp | 9 ++-- .../juce_gui_basics/widgets/juce_ListBox.cpp | 2 + .../widgets/juce_ProgressBar.cpp | 43 +++++++++++++------ .../juce_gui_basics/widgets/juce_Slider.cpp | 30 ++++++++++--- .../widgets/juce_TableListBox.cpp | 2 + .../widgets/juce_TextEditor.cpp | 10 ++++- .../juce_gui_basics/widgets/juce_TreeView.cpp | 5 +++ 9 files changed, 99 insertions(+), 23 deletions(-) diff --git a/modules/juce_gui_basics/widgets/juce_ComboBox.cpp b/modules/juce_gui_basics/widgets/juce_ComboBox.cpp index 26718ad128..391b41b46f 100644 --- a/modules/juce_gui_basics/widgets/juce_ComboBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_ComboBox.cpp @@ -662,6 +662,7 @@ public: } String getTitle() const override { return comboBox.getText(); } + String getHelp() const override { return comboBox.getTooltip(); } private: static AccessibilityActions getAccessibilityActions (ComboBox& comboBox) diff --git a/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp b/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp index f5279148ca..ea7cbc5567 100644 --- a/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp @@ -83,7 +83,25 @@ void ImageComponent::paint (Graphics& g) //============================================================================== std::unique_ptr ImageComponent::createAccessibilityHandler() { - return std::make_unique (*this, AccessibilityRole::image); + class ImageComponentAccessibilityHandler : public AccessibilityHandler + { + public: + explicit ImageComponentAccessibilityHandler (ImageComponent& imageComponentToWrap) + : AccessibilityHandler (imageComponentToWrap, AccessibilityRole::image), + imageComponent (imageComponentToWrap) + { + } + + String getHelp() const override { return imageComponent.getTooltip(); } + + private: + ImageComponent& imageComponent; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ImageComponentAccessibilityHandler) + }; + + return std::make_unique (*this); } } // namespace juce diff --git a/modules/juce_gui_basics/widgets/juce_Label.cpp b/modules/juce_gui_basics/widgets/juce_Label.cpp index 91d6b5c3c6..53bd3791dd 100644 --- a/modules/juce_gui_basics/widgets/juce_Label.cpp +++ b/modules/juce_gui_basics/widgets/juce_Label.cpp @@ -529,10 +529,8 @@ public: { } - String getTitle() const override - { - return label.getText(); - } + String getTitle() const override { return label.getText(); } + String getHelp() const override { return label.getTooltip(); } AccessibleState getCurrentState() const override { @@ -557,6 +555,9 @@ private: private: Label& label; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LabelValueInterface) }; static AccessibilityActions getAccessibilityActions (Label& label) diff --git a/modules/juce_gui_basics/widgets/juce_ListBox.cpp b/modules/juce_gui_basics/widgets/juce_ListBox.cpp index 06c01a228e..87ec67c783 100644 --- a/modules/juce_gui_basics/widgets/juce_ListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_ListBox.cpp @@ -210,6 +210,8 @@ public: return {}; } + String getHelp() const override { return rowComponent.getTooltip(); } + AccessibleState getCurrentState() const override { if (auto* m = rowComponent.owner.getModel()) diff --git a/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp b/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp index 7e84947c33..a2edcb4cf1 100644 --- a/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp +++ b/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp @@ -120,29 +120,48 @@ void ProgressBar::timerCallback() //============================================================================== std::unique_ptr ProgressBar::createAccessibilityHandler() { - class ValueInterface : public AccessibilityRangedNumericValueInterface + class ProgressBarAccessibilityHandler : public AccessibilityHandler { public: - explicit ValueInterface (ProgressBar& progressBarToWrap) - : progressBar (progressBarToWrap) + explicit ProgressBarAccessibilityHandler (ProgressBar& progressBarToWrap) + : AccessibilityHandler (progressBarToWrap, + AccessibilityRole::progressBar, + AccessibilityActions{}, + AccessibilityHandler::Interfaces { std::make_unique (progressBarToWrap) }), + progressBar (progressBarToWrap) { } - bool isReadOnly() const override { return true; } - void setValue (double) override { jassertfalse; } - double getCurrentValue() const override { return progressBar.progress; } - AccessibleValueRange getRange() const override { return { { 0.0, 1.0 }, 0.001 }; } + String getHelp() const override { return progressBar.getTooltip(); } private: + class ValueInterface : public AccessibilityRangedNumericValueInterface + { + public: + explicit ValueInterface (ProgressBar& progressBarToWrap) + : progressBar (progressBarToWrap) + { + } + + bool isReadOnly() const override { return true; } + void setValue (double) override { jassertfalse; } + double getCurrentValue() const override { return progressBar.progress; } + AccessibleValueRange getRange() const override { return { { 0.0, 1.0 }, 0.001 }; } + + private: + ProgressBar& progressBar; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueInterface) + }; + ProgressBar& progressBar; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueInterface) + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProgressBarAccessibilityHandler) }; - return std::make_unique (*this, - AccessibilityRole::progressBar, - AccessibilityActions{}, - AccessibilityHandler::Interfaces { std::make_unique (*this) }); + return std::make_unique (*this); } } // namespace juce diff --git a/modules/juce_gui_basics/widgets/juce_Slider.cpp b/modules/juce_gui_basics/widgets/juce_Slider.cpp index 9d7ba69aa3..a9b479c203 100644 --- a/modules/juce_gui_basics/widgets/juce_Slider.cpp +++ b/modules/juce_gui_basics/widgets/juce_Slider.cpp @@ -1678,8 +1678,22 @@ void Slider::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel Component::mouseWheelMove (e, wheel); } -std::unique_ptr Slider::createAccessibilityHandler() +//============================================================================== +class SliderAccessibilityHandler : public AccessibilityHandler { +public: + explicit SliderAccessibilityHandler (Slider& sliderToWrap) + : AccessibilityHandler (sliderToWrap, + AccessibilityRole::slider, + AccessibilityActions{}, + AccessibilityHandler::Interfaces { std::make_unique (sliderToWrap) }), + slider (sliderToWrap) + { + } + + String getHelp() const override { return slider.getTooltip(); } + +private: class ValueInterface : public AccessibilityValueInterface { public: @@ -1715,13 +1729,19 @@ std::unique_ptr Slider::createAccessibilityHandler() Slider& slider; Value valueToControl; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueInterface) }; - return std::make_unique (*this, - AccessibilityRole::slider, - AccessibilityActions{}, - AccessibilityHandler::Interfaces { std::make_unique (*this) }); + Slider& slider; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SliderAccessibilityHandler) +}; + +std::unique_ptr Slider::createAccessibilityHandler() +{ + return std::make_unique (*this); } } // namespace juce diff --git a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp index 4a619e0b25..4f33df2271 100644 --- a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp @@ -249,6 +249,8 @@ public: return {}; } + String getHelp() const override { return rowComponent.getTooltip(); } + AccessibleState getCurrentState() const override { if (auto* m = rowComponent.owner.getModel()) diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp index 7317805fb4..ab0e699e5f 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp @@ -2700,10 +2700,13 @@ public: : AccessibilityHandler (textEditorToWrap, textEditorToWrap.isReadOnly() ? AccessibilityRole::staticText : AccessibilityRole::editableText, {}, - { std::make_unique (textEditorToWrap) }) + { std::make_unique (textEditorToWrap) }), + textEditor (textEditorToWrap) { } + String getHelp() const override { return textEditor.getTooltip(); } + private: class TextEditorTextInterface : public AccessibilityTextInterface { @@ -2762,8 +2765,13 @@ private: private: TextEditor& textEditor; + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextEditorTextInterface) }; + TextEditor& textEditor; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextEditorAccessibilityHandler) }; diff --git a/modules/juce_gui_basics/widgets/juce_TreeView.cpp b/modules/juce_gui_basics/widgets/juce_TreeView.cpp index afafae3ca6..41fd2a6596 100644 --- a/modules/juce_gui_basics/widgets/juce_TreeView.cpp +++ b/modules/juce_gui_basics/widgets/juce_TreeView.cpp @@ -97,6 +97,11 @@ private: return itemComponent.getRepresentedItem().getAccessibilityName(); } + String getHelp() const override + { + return itemComponent.getRepresentedItem().getTooltip(); + } + AccessibleState getCurrentState() const override { auto& treeItem = itemComponent.getRepresentedItem();