From 6c5f8dffa6ef0ea6436597d93aa717d7dc6b8e56 Mon Sep 17 00:00:00 2001 From: Reza Bakhshi Laktasaraei <74649066+rezabakhshilaktasaraei@users.noreply.github.com> Date: Sat, 1 Nov 2025 05:38:41 +0330 Subject: [PATCH] Add accessibility value API to RpWidget Add keyboard controls and accessibility value reporting to ContinuousSlider Remove redundant accessibilityRole overrides from intro pages; set Step role to Dialog --- Telegram/Resources/langs/lang.strings | 1 + Telegram/SourceFiles/intro/intro_code.h | 4 -- .../SourceFiles/intro/intro_code_input.cpp | 5 ++ Telegram/SourceFiles/intro/intro_code_input.h | 1 + .../SourceFiles/intro/intro_password_check.h | 4 -- Telegram/SourceFiles/intro/intro_phone.h | 3 - Telegram/SourceFiles/intro/intro_qr.h | 3 - Telegram/SourceFiles/intro/intro_step.h | 2 +- .../SourceFiles/settings/settings_chat.cpp | 11 +++- .../SourceFiles/settings/settings_intro.cpp | 10 ++++ .../SourceFiles/settings/settings_main.cpp | 1 + .../ui/widgets/continuous_sliders.cpp | 60 +++++++++++++++++++ .../ui/widgets/continuous_sliders.h | 10 ++++ 13 files changed, 99 insertions(+), 16 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index ac4778e273..c2dbf4ba1b 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -742,6 +742,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_language" = "Language"; "lng_settings_default_scale" = "Default interface scale"; +"lng_settings_scale" = "Interface scale"; "lng_settings_connection_type" = "Connection type"; "lng_settings_downloading_update" = "Downloading update {progress}..."; "lng_settings_privacy_title" = "Privacy"; diff --git a/Telegram/SourceFiles/intro/intro_code.h b/Telegram/SourceFiles/intro/intro_code.h index 87f6bf873a..a9d22ad31b 100644 --- a/Telegram/SourceFiles/intro/intro_code.h +++ b/Telegram/SourceFiles/intro/intro_code.h @@ -31,10 +31,6 @@ public: not_null account, not_null data); - QAccessible::Role accessibilityRole() override { - return QAccessible::Role::Dialog; - } - bool hasBack() const override { return true; } diff --git a/Telegram/SourceFiles/intro/intro_code_input.cpp b/Telegram/SourceFiles/intro/intro_code_input.cpp index 3f1c1a2636..def7730729 100644 --- a/Telegram/SourceFiles/intro/intro_code_input.cpp +++ b/Telegram/SourceFiles/intro/intro_code_input.cpp @@ -166,6 +166,10 @@ QString CodeInput::accessibilityName() { return tr::lng_code_ph(tr::now); } +QString CodeInput::accessibilityValue() const { + return collectDigits(); +} + void CodeInput::setDigitsCountMax(int digitsCount) { _digitsCountMax = digitsCount; @@ -315,6 +319,7 @@ void CodeInput::insertCodeAndSubmit(const QString &code) { && _digits[_currentIndex]->digit() != kDigitNone) { requestCode(); } + accessibilityValueChanged(collectDigits()); } QString CodeInput::collectDigits() const { diff --git a/Telegram/SourceFiles/intro/intro_code_input.h b/Telegram/SourceFiles/intro/intro_code_input.h index 2d72d9f94b..9f9652401a 100644 --- a/Telegram/SourceFiles/intro/intro_code_input.h +++ b/Telegram/SourceFiles/intro/intro_code_input.h @@ -22,6 +22,7 @@ public: return QAccessible::EditableText; } QString accessibilityName() override; + QString accessibilityValue() const override; void setDigitsCountMax(int digitsCount); diff --git a/Telegram/SourceFiles/intro/intro_password_check.h b/Telegram/SourceFiles/intro/intro_password_check.h index 0f1aa9556f..9bfcbad3d8 100644 --- a/Telegram/SourceFiles/intro/intro_password_check.h +++ b/Telegram/SourceFiles/intro/intro_password_check.h @@ -29,10 +29,6 @@ public: not_null account, not_null data); - QAccessible::Role accessibilityRole() override { - return QAccessible::Role::Dialog; - } - void setInnerFocus() override; void activate() override; void cancelled() override; diff --git a/Telegram/SourceFiles/intro/intro_phone.h b/Telegram/SourceFiles/intro/intro_phone.h index 7754719f7f..2dc7c37c17 100644 --- a/Telegram/SourceFiles/intro/intro_phone.h +++ b/Telegram/SourceFiles/intro/intro_phone.h @@ -28,9 +28,6 @@ public: not_null account, not_null data); - QAccessible::Role accessibilityRole() override { - return QAccessible::Role::Dialog; - } QString accessibilityName() override; void selectCountry(const QString &country); diff --git a/Telegram/SourceFiles/intro/intro_qr.h b/Telegram/SourceFiles/intro/intro_qr.h index 52cb517f36..2598b7cdf8 100644 --- a/Telegram/SourceFiles/intro/intro_qr.h +++ b/Telegram/SourceFiles/intro/intro_qr.h @@ -25,9 +25,6 @@ public: not_null account, not_null data); - QAccessible::Role accessibilityRole() override { - return QAccessible::Role::Dialog; - } QString accessibilityName() override; QString accessibilityDescription() override; diff --git a/Telegram/SourceFiles/intro/intro_step.h b/Telegram/SourceFiles/intro/intro_step.h index d151f455d8..e71f570a71 100644 --- a/Telegram/SourceFiles/intro/intro_step.h +++ b/Telegram/SourceFiles/intro/intro_step.h @@ -46,7 +46,7 @@ public: ~Step(); QAccessible::Role accessibilityRole() override { - return QAccessible::Role::Pane; + return QAccessible::Role::Dialog; } QString accessibilityName() override { return _titleText.current(); diff --git a/Telegram/SourceFiles/settings/settings_chat.cpp b/Telegram/SourceFiles/settings/settings_chat.cpp index 58e6616c36..76311e35f8 100644 --- a/Telegram/SourceFiles/settings/settings_chat.cpp +++ b/Telegram/SourceFiles/settings/settings_chat.cpp @@ -1609,7 +1609,16 @@ void SetupDefaultThemes( } }; group->setChangedCallback([=](Type type) { - group->setValue(chosen()); + const auto scheme = ranges::find( + kSchemesList, + type, + &Scheme::type); + if (scheme != end(kSchemesList)) { + apply(*scheme); + } + else { + group->setValue(chosen()); + } }); for (const auto &scheme : kSchemesList) { refreshColorizer(scheme.type); diff --git a/Telegram/SourceFiles/settings/settings_intro.cpp b/Telegram/SourceFiles/settings/settings_intro.cpp index ba5b3c4661..68f0e5b5fd 100644 --- a/Telegram/SourceFiles/settings/settings_intro.cpp +++ b/Telegram/SourceFiles/settings/settings_intro.cpp @@ -351,6 +351,16 @@ void IntroWidget::showContent(not_null window) { } void IntroWidget::setInnerFocus() { + const auto layout = _innerWrap->entity(); + for (const auto childObject : layout->children()) { + auto childWidget = qobject_cast(childObject); + + if (childWidget && childWidget->focusPolicy() != Qt::NoFocus) { + childWidget->setFocus(Qt::OtherFocusReason); + return; + } + } + setFocus(); } diff --git a/Telegram/SourceFiles/settings/settings_main.cpp b/Telegram/SourceFiles/settings/settings_main.cpp index 0320235e34..cb773b0b63 100644 --- a/Telegram/SourceFiles/settings/settings_main.cpp +++ b/Telegram/SourceFiles/settings/settings_main.cpp @@ -867,6 +867,7 @@ void SetupInterfaceScale( icon ? st::settingsScalePadding : st::settingsBigScalePadding); const auto slider = sliderWithLabel.slider; const auto label = sliderWithLabel.label; + slider->setAccessibleName(tr::lng_settings_scale(tr::now)); const auto updateLabel = [=](int scale) { const auto labelText = [&](int scale) { diff --git a/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp b/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp index 859c7584e8..140434d30a 100644 --- a/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp +++ b/Telegram/SourceFiles/ui/widgets/continuous_sliders.cpp @@ -131,6 +131,66 @@ void ContinuousSlider::wheelEvent(QWheelEvent *e) { _byWheelFinished->callOnce(kByWheelFinishedTimeout); } +void ContinuousSlider::keyPressEvent(QKeyEvent* e) { + const auto key = e->key(); + auto newValue = _value; + + constexpr auto smallStep = 0.01; + constexpr auto largeStep = 0.10; + + switch (key) { + case Qt::Key_Right: + case Qt::Key_Up: + newValue = _value + smallStep; + break; + + case Qt::Key_Left: + case Qt::Key_Down: + newValue = _value - smallStep; + break; + + case Qt::Key_PageUp: + newValue = _value + largeStep; + break; + + case Qt::Key_PageDown: + newValue = _value - largeStep; + break; + + case Qt::Key_Home: + newValue = 0.0; + break; + + case Qt::Key_End: + newValue = 1.0; + break; + + default: + RpWidget::keyPressEvent(e); + return; + } + + e->accept(); + + newValue = std::clamp(_adjustCallback + ? _adjustCallback(newValue) + : newValue, 0.0, 1.0); + + if (newValue != _value) { + setValue(newValue); + + if (_changeProgressCallback) { + _changeProgressCallback(_value); + } + if (_changeFinishedCallback) { + _changeFinishedCallback(_value); + } + const int percent = std::max(0, std::min(100, qRound(_value * 100.))); + const QString valueText = QString::number(percent) + '%'; + accessibilityValueChanged(QVariant(valueText)); + } +} + void ContinuousSlider::updateDownValueFromPos(const QPoint &pos) { _downValue = computeValue(pos); update(); diff --git a/Telegram/SourceFiles/ui/widgets/continuous_sliders.h b/Telegram/SourceFiles/ui/widgets/continuous_sliders.h index cec921c8c4..cbf1dafddb 100644 --- a/Telegram/SourceFiles/ui/widgets/continuous_sliders.h +++ b/Telegram/SourceFiles/ui/widgets/continuous_sliders.h @@ -58,6 +58,15 @@ public: void setMoveByWheel(bool move); + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::Slider; + } + + QString accessibilityValue() const override { + const auto percent = std::clamp(qRound(_value * 100.), 0, 100); + return QString::number(percent) + '%'; + } + protected: void mouseMoveEvent(QMouseEvent *e) override; void mousePressEvent(QMouseEvent *e) override; @@ -65,6 +74,7 @@ protected: void wheelEvent(QWheelEvent *e) override; void enterEventHook(QEnterEvent *e) override; void leaveEventHook(QEvent *e) override; + void keyPressEvent(QKeyEvent* e) override; float64 fadeOpacity() const { return _fadeOpacity;