From abab44a02b4585b72efb14e6306536a44bc57f89 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 22 Oct 2025 21:56:29 +0400 Subject: [PATCH] Adapt latest lib_ui changes for accessibility. --- Telegram/SourceFiles/core/application.cpp | 5 +- Telegram/SourceFiles/intro/intro_code.cpp | 1 - Telegram/SourceFiles/intro/intro_code.h | 4 ++ .../SourceFiles/intro/intro_code_input.cpp | 6 ++- Telegram/SourceFiles/intro/intro_code_input.h | 5 ++ .../intro/intro_password_check.cpp | 1 - .../SourceFiles/intro/intro_password_check.h | 4 ++ Telegram/SourceFiles/intro/intro_phone.cpp | 5 +- Telegram/SourceFiles/intro/intro_phone.h | 5 ++ Telegram/SourceFiles/intro/intro_qr.cpp | 48 ++++++++++++------- Telegram/SourceFiles/intro/intro_qr.h | 6 +++ Telegram/SourceFiles/intro/intro_step.cpp | 5 +- Telegram/SourceFiles/intro/intro_step.h | 10 ++++ Telegram/SourceFiles/intro/intro_widget.cpp | 2 +- .../SourceFiles/settings/settings_intro.cpp | 11 ++++- Telegram/SourceFiles/ui/countryinput.cpp | 5 +- Telegram/SourceFiles/ui/countryinput.h | 7 +++ .../window/window_connecting_widget.cpp | 5 +- Telegram/lib_base | 2 +- Telegram/lib_ui | 2 +- 20 files changed, 101 insertions(+), 38 deletions(-) diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index e4ace6cdd5..76900ac133 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -86,7 +86,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/qthelp_regex.h" #include "base/qthelp_url.h" #include "boxes/premium_limits_box.h" -#include "ui/accessibility.h" +#include "ui/accessible/ui_accessible_factory.h" #include "ui/boxes/confirm_box.h" #include "ui/controls/location_picker.h" #include "styles/style_window.h" @@ -261,8 +261,6 @@ void Application::run() { startLocalStorage(); - Ui::InstallAccessibleFactory(); - style::SetCustomFont(settings().customFontFamily()); style::internal::StartFonts(); @@ -289,6 +287,7 @@ void Application::run() { QCoreApplication::instance()->installTranslator(_translator.get()); style::StartManager(cScale()); + Ui::Accessible::Init(); Ui::InitTextOptions(); Ui::StartCachedCorners(); Ui::Emoji::Init(); diff --git a/Telegram/SourceFiles/intro/intro_code.cpp b/Telegram/SourceFiles/intro/intro_code.cpp index 63b4d975af..e41810e8fd 100644 --- a/Telegram/SourceFiles/intro/intro_code.cpp +++ b/Telegram/SourceFiles/intro/intro_code.cpp @@ -39,7 +39,6 @@ CodeWidget::CodeWidget( , _callTimeout(getData()->callTimeout) , _callLabel(this, st::introDescription) , _checkRequestTimer([=] { checkRequest(); }) { - setAccessibleRole(QAccessible::Role::Dialog); Lang::Updated( ) | rpl::start_with_next([=] { refreshLang(); diff --git a/Telegram/SourceFiles/intro/intro_code.h b/Telegram/SourceFiles/intro/intro_code.h index a9d22ad31b..87f6bf873a 100644 --- a/Telegram/SourceFiles/intro/intro_code.h +++ b/Telegram/SourceFiles/intro/intro_code.h @@ -31,6 +31,10 @@ 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 79e6ccc17e..3f1c1a2636 100644 --- a/Telegram/SourceFiles/intro/intro_code_input.cpp +++ b/Telegram/SourceFiles/intro/intro_code_input.cpp @@ -160,8 +160,10 @@ void CodeDigit::paintEvent(QPaintEvent *e) { CodeInput::CodeInput(QWidget *parent) : Ui::RpWidget(parent) { setFocusPolicy(Qt::StrongFocus); - setAccessibleRole(QAccessible::Role::EditableText); - setAccessibleName(tr::lng_code_ph(tr::now)); +} + +QString CodeInput::accessibilityName() { + return tr::lng_code_ph(tr::now); } void CodeInput::setDigitsCountMax(int digitsCount) { diff --git a/Telegram/SourceFiles/intro/intro_code_input.h b/Telegram/SourceFiles/intro/intro_code_input.h index 9b5094aa8f..2d72d9f94b 100644 --- a/Telegram/SourceFiles/intro/intro_code_input.h +++ b/Telegram/SourceFiles/intro/intro_code_input.h @@ -18,6 +18,11 @@ class CodeInput final : public Ui::RpWidget { public: CodeInput(QWidget *parent); + QAccessible::Role accessibilityRole() override { + return QAccessible::EditableText; + } + QString accessibilityName() override; + void setDigitsCountMax(int digitsCount); void setCode(QString code); diff --git a/Telegram/SourceFiles/intro/intro_password_check.cpp b/Telegram/SourceFiles/intro/intro_password_check.cpp index 5213e515ba..748e304fe1 100644 --- a/Telegram/SourceFiles/intro/intro_password_check.cpp +++ b/Telegram/SourceFiles/intro/intro_password_check.cpp @@ -37,7 +37,6 @@ PasswordCheckWidget::PasswordCheckWidget( , _codeField(this, st::introPassword, tr::lng_signin_code()) , _toRecover(this, tr::lng_signin_recover(tr::now)) , _toPassword(this, tr::lng_signin_try_password(tr::now)) { - setAccessibleRole(QAccessible::Role::Dialog); Expects(_passwordState.hasPassword); Lang::Updated( diff --git a/Telegram/SourceFiles/intro/intro_password_check.h b/Telegram/SourceFiles/intro/intro_password_check.h index 9bfcbad3d8..0f1aa9556f 100644 --- a/Telegram/SourceFiles/intro/intro_password_check.h +++ b/Telegram/SourceFiles/intro/intro_password_check.h @@ -29,6 +29,10 @@ 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.cpp b/Telegram/SourceFiles/intro/intro_phone.cpp index ebb5e389d1..356ba687a0 100644 --- a/Telegram/SourceFiles/intro/intro_phone.cpp +++ b/Telegram/SourceFiles/intro/intro_phone.cpp @@ -62,7 +62,6 @@ PhoneWidget::PhoneWidget( st::introPhone, [](const QString &s) { return Countries::Groups(s); }) , _checkRequestTimer([=] { checkRequest(); }) { - setAccessibleRole(QAccessible::Role::Dialog); _code->setAccessibleName(tr::lng_country_code(tr::now)); _phone->setAccessibleName(tr::lng_phone_number(tr::now)); _phone->frontBackspaceEvent( @@ -105,6 +104,10 @@ PhoneWidget::PhoneWidget( _changed = false; } +QString PhoneWidget::accessibilityName() { + return tr::lng_phone_title(tr::now); +} + void PhoneWidget::setupQrLogin() { const auto qrLogin = Ui::CreateChild( this, diff --git a/Telegram/SourceFiles/intro/intro_phone.h b/Telegram/SourceFiles/intro/intro_phone.h index 3770df59cf..7754719f7f 100644 --- a/Telegram/SourceFiles/intro/intro_phone.h +++ b/Telegram/SourceFiles/intro/intro_phone.h @@ -28,6 +28,11 @@ public: not_null account, not_null data); + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::Dialog; + } + QString accessibilityName() override; + void selectCountry(const QString &country); void setInnerFocus() override; diff --git a/Telegram/SourceFiles/intro/intro_qr.cpp b/Telegram/SourceFiles/intro/intro_qr.cpp index 030adf4005..d45ca8f695 100644 --- a/Telegram/SourceFiles/intro/intro_qr.cpp +++ b/Telegram/SourceFiles/intro/intro_qr.cpp @@ -79,9 +79,19 @@ namespace { auto palettes = rpl::single(rpl::empty) | rpl::then( style::PaletteChanged() ); - auto result = Ui::CreateChild(parent.get()); - result->setAccessibleRole(QAccessible::Role::Graphic); - result->setAccessibleName(tr::lng_intro_qr_title(tr::now)); + class QrWidget final : public Ui::RpWidget { + public: + using RpWidget::RpWidget; + + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::Graphic; + } + QString accessibilityName() override { + return tr::lng_intro_qr_title(tr::now); + } + + }; + auto result = Ui::CreateChild(parent.get()); const auto state = result->lifetime().make_state( [=] { result->update(); }); state->waiting.start(); @@ -183,20 +193,6 @@ QrWidget::QrWidget( setTitleText(rpl::single(QString())); setDescriptionText(rpl::single(QString())); setErrorCentered(true); - setAccessibleRole(QAccessible::Role::Dialog); - setAccessibleName(tr::lng_intro_qr_title(tr::now)); - - const auto texts = { - tr::lng_intro_qr_step1, - tr::lng_intro_qr_step2, - tr::lng_intro_qr_step3, - }; - QString fullDescription; - int index = 1; - for (const auto& text : texts) { - fullDescription += QString::number(index++) + ". " + text(tr::now) + "\n"; - } - setAccessibleDescription(fullDescription); cancelNearestDcRequest(); @@ -213,6 +209,24 @@ QrWidget::QrWidget( }, lifetime()); } +QString QrWidget::accessibilityName() { + return tr::lng_intro_qr_title(tr::now); +} + +QString QrWidget::accessibilityDescription() { + const auto phrases = { + tr::lng_intro_qr_step1, + tr::lng_intro_qr_step2, + tr::lng_intro_qr_step3, + }; + auto result = QString(); + auto index = 0; + for (const auto &phrase : phrases) { + result.append(QString::number(++index)).append(". ").append(phrase(tr::now)).append('\n'); + } + return result; +} + int QrWidget::errorTop() const { return contentTop() + st::introQrErrorTop; } diff --git a/Telegram/SourceFiles/intro/intro_qr.h b/Telegram/SourceFiles/intro/intro_qr.h index 7cc166a4bc..16cdc156cd 100644 --- a/Telegram/SourceFiles/intro/intro_qr.h +++ b/Telegram/SourceFiles/intro/intro_qr.h @@ -21,6 +21,12 @@ public: not_null account, not_null data); + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::Dialog; + } + QString accessibilityName() override; + QString accessibilityDescription() override; + void activate() override; void finished() override; void cancelled() override; diff --git a/Telegram/SourceFiles/intro/intro_step.cpp b/Telegram/SourceFiles/intro/intro_step.cpp index 1b09922de7..2ad66ccd28 100644 --- a/Telegram/SourceFiles/intro/intro_step.cpp +++ b/Telegram/SourceFiles/intro/intro_step.cpp @@ -77,7 +77,6 @@ Step::Step( _hasCover ? st::introCoverDescription : st::introDescription)) { - setAccessibleRole(QAccessible::Pane); hide(); style::PaletteChanged( ) | rpl::start_with_next([=] { @@ -95,7 +94,7 @@ Step::Step( _titleText.value( ) | rpl::start_with_next([=](const QString &text) { _title->setText(text); - setAccessibleName(text); + accessibilityNameChanged(); updateLabelsPosition(); }, lifetime()); @@ -107,8 +106,8 @@ Step::Step( EntityType::Spoiler, &EntityInText::type); label->setMarkedText(text); - setAccessibleDescription(text.text); label->setAttribute(Qt::WA_TransparentForMouseEvents, hasSpoiler); + accessibilityDescriptionChanged(); updateLabelsPosition(); }, lifetime()); } diff --git a/Telegram/SourceFiles/intro/intro_step.h b/Telegram/SourceFiles/intro/intro_step.h index 32ba62926c..c4275cd93d 100644 --- a/Telegram/SourceFiles/intro/intro_step.h +++ b/Telegram/SourceFiles/intro/intro_step.h @@ -45,6 +45,16 @@ public: bool hasCover = false); ~Step(); + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::Pane; + } + QString accessibilityName() override { + return _titleText.current(); + } + QString accessibilityDescription() override { + return _descriptionText.current().text; + } + [[nodiscard]] Main::Account &account() const { return *_account; } diff --git a/Telegram/SourceFiles/intro/intro_widget.cpp b/Telegram/SourceFiles/intro/intro_widget.cpp index 1fae9dc991..2bd5f650a2 100644 --- a/Telegram/SourceFiles/intro/intro_widget.cpp +++ b/Telegram/SourceFiles/intro/intro_widget.cpp @@ -141,7 +141,7 @@ Widget::Widget( }, lifetime()); _back->entity()->setClickedCallback([=] { backRequested(); }); - _back->entity()->setAccessibleName(tr::lng_go_back(tr::now)); + _back->entity()->accessibilitySetName(tr::lng_go_back(tr::now)); _back->hide(anim::type::instant); if (_changeLanguage) { diff --git a/Telegram/SourceFiles/settings/settings_intro.cpp b/Telegram/SourceFiles/settings/settings_intro.cpp index 7a2986d8f9..ba5b3c4661 100644 --- a/Telegram/SourceFiles/settings/settings_intro.cpp +++ b/Telegram/SourceFiles/settings/settings_intro.cpp @@ -178,6 +178,11 @@ public: QWidget *parent, not_null window); + QAccessible::Role accessibilityRole() override { + return QAccessible::Dialog; + } + QString accessibilityName() override; + void forceContentRepaint(); rpl::producer desiredHeightValue() const override; @@ -224,8 +229,6 @@ IntroWidget::IntroWidget( , _wrap(this) , _scroll(Ui::CreateChild(_wrap.data())) , _topShadow(this) { - setAccessibleRole(QAccessible::Dialog); - setAccessibleName(tr::lng_menu_settings(tr::now)); _wrap->setAttribute(Qt::WA_OpaquePaintEvent); _wrap->paintRequest( ) | rpl::start_with_next([=](QRect clip) { @@ -247,6 +250,10 @@ IntroWidget::IntroWidget( })); } +QString IntroWidget::accessibilityName() { + return tr::lng_menu_settings(tr::now); +} + void IntroWidget::updateControlsGeometry() { if (!_innerWrap) { return; diff --git a/Telegram/SourceFiles/ui/countryinput.cpp b/Telegram/SourceFiles/ui/countryinput.cpp index 9e1f347bcc..45123cd255 100644 --- a/Telegram/SourceFiles/ui/countryinput.cpp +++ b/Telegram/SourceFiles/ui/countryinput.cpp @@ -8,7 +8,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/countryinput.h" #include "lang/lang_keys.h" -#include "ui/accessibility.h" #include "ui/widgets/scroll_area.h" #include "ui/widgets/multi_select.h" #include "ui/effects/ripple_animation.h" @@ -31,8 +30,6 @@ CountryInput::CountryInput( , _text(tr::lng_country_code(tr::now)) { resize(_st.width, _st.heightMin); setFocusPolicy(Qt::StrongFocus); - setAccessibleRole(QAccessible::Role::PushButton); - setAccessibleName(_text); } void CountryInput::paintEvent(QPaintEvent *e) { @@ -202,5 +199,5 @@ void CountryInput::setText(const QString &newText) { _text = _st.style.font->elided( newText, width() - _st.textMargins.left() - _st.textMargins.right()); - setAccessibleName(newText); + accessibilityNameChanged(); } diff --git a/Telegram/SourceFiles/ui/countryinput.h b/Telegram/SourceFiles/ui/countryinput.h index 741bfdaeee..76068dcc76 100644 --- a/Telegram/SourceFiles/ui/countryinput.h +++ b/Telegram/SourceFiles/ui/countryinput.h @@ -28,6 +28,13 @@ public: std::shared_ptr show, const style::InputField &st); + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::PushButton; + } + QString accessibilityName() override { + return _text; + } + [[nodiscard]] QString iso() const { return _chosenIso; } diff --git a/Telegram/SourceFiles/window/window_connecting_widget.cpp b/Telegram/SourceFiles/window/window_connecting_widget.cpp index ae13ac2f55..ba3ee79093 100644 --- a/Telegram/SourceFiles/window/window_connecting_widget.cpp +++ b/Telegram/SourceFiles/window/window_connecting_widget.cpp @@ -91,6 +91,10 @@ public: not_null account, const Layout &layout); + QAccessible::Role accessibilityRole() override { + return QAccessible::Role::StatusBar; + } + void refreshRetryLink(bool hasRetry); void setLayout(const Layout &layout); void setProgressVisibility(bool visible); @@ -498,7 +502,6 @@ ConnectionState::Widget::Widget( : AbstractButton(parent) , _account(account) , _currentLayout(layout) { - setAccessibleRole(QAccessible::StatusBar); _proxyIcon = Ui::CreateChild(this); _progress = Ui::CreateChild(this); diff --git a/Telegram/lib_base b/Telegram/lib_base index 5266793487..1bafbf169a 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit 52667934873036f8e462bc983a3a2ac7f2f144be +Subproject commit 1bafbf169a20bd9cf0afc539b44cc2379eb82aec diff --git a/Telegram/lib_ui b/Telegram/lib_ui index bfbb6e0f9b..9aaa2d963f 160000 --- a/Telegram/lib_ui +++ b/Telegram/lib_ui @@ -1 +1 @@ -Subproject commit bfbb6e0f9baf571e20f9ab3d06211254cdc1a5b1 +Subproject commit 9aaa2d963f5d20cfbb43f52844d435923a160289