diff --git a/src/utils/accessibility.cpp b/src/utils/accessibility.cpp index 84852f22d..7b5cb95d6 100644 --- a/src/utils/accessibility.cpp +++ b/src/utils/accessibility.cpp @@ -1,53 +1,85 @@ /* utils/accessibility.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2022 g10 Code GmbH SPDX-FileContributor: Ingo Klöcker SPDX-License-Identifier: GPL-2.0-or-later */ #include #include "accessibility.h" #include -#include +#include #include +#include + +using namespace Kleo; + namespace { QString getAccessibleText(QObject *object, QAccessible::Text t) { QString name; if (const auto *const iface = QAccessible::queryAccessibleInterface(object)) { name = iface->text(t); } return name; } } QString Kleo::getAccessibleName(QObject *object) { return getAccessibleText(object, QAccessible::Name); } QString Kleo::getAccessibleDescription(QObject *object) { return getAccessibleText(object, QAccessible::Description); } QString Kleo::invalidEntryText() { return i18nc("text for screen readers to indicate that the associated object, " "such as a form field, has an error", "invalid entry"); } QString Kleo::requiredText() { return i18nc("text for screen readers to indicate that the associated object, " "such as a form field must be filled out", "required"); } + +LabelHelper::LabelHelper() +{ + QAccessible::installActivationObserver(this); +} + +LabelHelper::~LabelHelper() +{ + QAccessible::removeActivationObserver(this); +} + +void LabelHelper::addLabel(QLabel *label) +{ + mLabels.push_back(label); + accessibilityActiveChanged(QAccessible::isActive()); +} + +void LabelHelper::accessibilityActiveChanged(bool active) +{ + // Allow text labels to get focus if accessibility is active + const auto focusPolicy = active ? Qt::StrongFocus : Qt::ClickFocus; + std::for_each(std::cbegin(mLabels), std::cend(mLabels), + [focusPolicy](const auto &label) { + if (label) { + label->setFocusPolicy(focusPolicy); + } + }); +} diff --git a/src/utils/accessibility.h b/src/utils/accessibility.h index 55980a5b0..9baebf4ee 100644 --- a/src/utils/accessibility.h +++ b/src/utils/accessibility.h @@ -1,20 +1,43 @@ /* utils/accessibility.h This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2022 g10 Code GmbH SPDX-FileContributor: Ingo Klöcker SPDX-License-Identifier: GPL-2.0-or-later */ #pragma once +#include +#include + +class QLabel; class QObject; class QString; namespace Kleo { QString getAccessibleName(QObject *object); QString getAccessibleDescription(QObject *object); QString invalidEntryText(); QString requiredText(); + + /** + * Simple helper that sets the focus policy of the associated labels + * to \c Qt::StrongFocus if an assistive tool is active. + */ + class LabelHelper: public QAccessible::ActivationObserver + { + public: + LabelHelper(); + ~LabelHelper() override; + Q_DISABLE_COPY_MOVE(LabelHelper) + + void addLabel(QLabel *label); + + private: + void accessibilityActiveChanged(bool active) override; + + std::vector> mLabels; + }; }