Доступность
- Доступность GTK
- GtkAccessible — Интерфейс доступности
- GtkATContext — Объект, взаимодействующий с технологиями вспомогательных средств
Стандартный интерфейс доступности
Интерфейс GtkAccessible предоставляет информацию о доступности элементов пользовательского интерфейса приложения. Приложения вспомогательных технологий (AT), такие как Orca, передают эту информацию пользователям с ограниченными возможностями, чтобы помочь им использовать приложение.
Стандартные элементы управления GTK реализуют интерфейс GtkAccessible и поэтому по умолчанию доступны для AT. Это означает, что если вы используете элементы управления GTK, такие как GtkButton, GtkEntry или GtkListView, вам нужно предоставить только специфичные для приложения детали, когда значения по умолчанию неполны. Вы можете сделать это, установив соответствующие свойства в ваших шаблонах GtkBuilder и файлах определений пользовательского интерфейса или установив свойства, определенные интерфейсом GtkAccessible.
Если вы реализуете свой собственный тип, производный от GtkWidget, вам необходимо установить свойства GtkAccessible самостоятельно и предоставить реализацию виртуальных функций GtkAccessible.
Доступные роли и атрибуты
Основные понятия доступного виджета — роли и атрибуты; каждый элемент управления GTK имеет роль, а его функциональность описывается набором атрибутов.
Роли
Роли определяют таксономию и семантику элемента управления пользовательского интерфейса для любых приложений вспомогательной технологии; например, кнопка будет иметь роль GTK_ACCESSIBLE_ROLE_BUTTON; поле ввода — роль GTK_ACCESSIBLE_ROLE_TEXTBOX; переключатель — роль GTK_ACCESSIBLE_ROLE_CHECKBOX; и т. д.
Каждая роль является частью экземпляра виджета и не может быть изменена со временем или в результате действия пользователя. Роли позволяют приложениям вспомогательной технологии идентифицировать элемент управления пользовательского интерфейса и решить, как его представить пользователю; если роль какой-либо части пользовательского интерфейса приложения меняется, элемент управления необходимо удалить и заменить другим с соответствующей ролью.
Список доступных ролей
Каждое имя роли является частью перечисления GtkAccessibleRole.
| Название роли | Описание | Соответствующий виджет GTK |
|---|---|---|
BUTTON | Элемент управления, выполняющий действие при нажатии | GtkButton, GtkLinkButton, GtkExpander |
CHECKBOX | Элемент управления с тремя возможными значениями: true, false, или undefined | GtkCheckButton |
COMBOBOX | Элемент управления, который можно развернуть для отображения списка возможных значений для выбора | GtkComboBox |
COLUMN_HEADER | Заголовок в списке с колонками | GtkColumnView |
DIALOG | Диалоговое окно, которое запрашивает у пользователя ввод информации или требует ответа | GtkDialog и подклассы |
GRID | Сетка элементов | GtkFlowBox, GtkGridView |
GRID_CELL | Элемент в сетке | GtkFlowBoxChild, GtkGridView, GtkColumnView |
IMG | Изображение | GtkImage, GtkPicture |
LABEL | Видимое имя или заголовок для компонента пользовательского интерфейса | GtkLabel |
LINK | Кликкаемая гиперссылка | GtkLinkButton |
LIST | Список элементов | GtkListBox |
LIST_ITEM | Элемент в списке | GtkListBoxRow |
MENU | Меню | GtkPopoverMenu |
MENU_BAR | Панель меню | GtkPopoverMenuBar |
MENU_ITEM | Элемент меню | Элементы в GtkPopoverMenu |
MENU_ITEM_CHECKBOX | Элемент меню с опцией выбора | Элементы в GtkPopoverMenu |
MENU_ITEM_RADIO | Элемент радиоменю | Элементы в GtkPopoverMenu |
METER | Представляет значение в известном диапазоне | GtkLevelBar |
NONE | Не представлено в дереве доступности | ползунок GtkScale |
PROGRESS_BAR | Элемент, отображающий прогресс | GtkProgressBar |
RADIO | Элемент выбора с опцией выбора в группе радиоэлементов | GtkCheckButton |
ROW | Строка в списке с колонками | GtkColumnView |
SCROLLBAR | Графический объект, управляющий прокруткой содержимого | GtkScrollbar |
SEARCH_BOX | Поле ввода для ввода поисковых критериев | GtkSearchEntry |
SEPARATOR | Разделитель, разделяющий разделы содержимого или группы элементов | GtkSeparator |
SPIN_BUTTON | Элемент управления диапазоном, позволяющий выбрать среди отдельных вариантов | GtkSpinButton |
SWITCH | Элемент управления, представляющий значения включено/выключено | GtkSwitch |
TAB | Вкладка в списке вкладок для переключения страниц | GtkStackSwitcher, GtkNotebook |
TAB_LIST | Список вкладок для переключения страниц | GtkStackSwitcher, GtkNotebook |
TAB_PANEL | Страница в блокноте или стеке | GtkStack |
TEXT_BOX | Тип ввода, который позволяет использовать свободный текст в качестве значения. | GtkEntry, GtkPasswordEntry, GtkTextView |
TREE_GRID | Список с колонками, подобный treeview | GtkColumnView |
WINDOW | Окно приложения | GtkWindow |
... | … |
Дополнительную информацию см. в списке ролей WAI-ARIA.
Атрибуты
Атрибуты предоставляют специфическую информацию об элементе пользовательского интерфейса с поддержкой доступности и описывают его для приложений с функциями поддержки. GTK разделяет атрибуты доступности на три категории:
свойства, описываемые значениями перечисления GtkAccessibleProperty
отношения, описываемые значениями перечисления GtkAccessibleRelation
состояния, описываемые значениями перечисления GtkAccessibleState
Каждый атрибут принимает значение определенного типа.
В отличие от ролей, атрибуты могут изменяться со временем или в ответ на действия пользователя; например:
переключатель изменит свое состояние
GTK_ACCESSIBLE_STATE_CHECKEDкаждый раз при переключении, будь то пользователем или программноустановка mnemonics на GtkLabel обновит отношение
GTK_ACCESSIBLE_RELATION_LABELLED_BYэлемента с ссылкой на меткуизменение экземпляра GtkAdjustment в GtkScrollbar изменит свойства
GTK_ACCESSIBLE_PROPERTY_VALUE_MAX,GTK_ACCESSIBLE_PROPERTY_VALUE_MINиGTK_ACCESSIBLE_PROPERTY_VALUE_NOWмаксимальным, минимальным и текущим значениями свойства GtkAdjustment
Дополнительную информацию см. в списке атрибутов WAI-ARIA.
Список доступных состояний
Каждое имя состояния является частью перечисления GtkAccessibleState.
| Имя состояния | Атрибут ARIA | Тип значения | Примечания |
|---|---|---|---|
GTK_ACCESSIBLE_STATE_BUSY | “aria-busy” | boolean | |
GTK_ACCESSIBLE_STATE_CHECKED | “aria-checked” | GtkAccessibleTristate | Указывает текущее состояние GtkCheckButton |
GTK_ACCESSIBLE_STATE_DISABLED | “aria-disabled” | boolean | Соответствует свойству “sensitive” для GtkWidget |
GTK_ACCESSIBLE_STATE_EXPANDED | “aria-expanded” | boolean или undefined | Соответствует свойству “expanded” для GtkExpander |
GTK_ACCESSIBLE_STATE_HIDDEN | “aria-hidden” | boolean | Соответствует свойству “visible” для GtkWidget |
GTK_ACCESSIBLE_STATE_INVALID | “aria-invalid” | GtkAccessibleInvalidState | Устанавливается, когда элемент показывает ошибку |
GTK_ACCESSIBLE_STATE_PRESSED | “aria-pressed” | GtkAccessibleTristate | Указывает текущее состояние GtkToggleButton |
GTK_ACCESSIBLE_STATE_SELECTED | “aria-selected” | boolean или undefined | Устанавливается, когда элемент выделен |
Список доступных свойств
Каждое имя свойства является частью перечисления GtkAccessibleProperty.
Список доступных отношений
Каждое имя отношения является частью перечисления GtkAccessibleRelation.
Примечание: При использовании gtk_accessible_update_relation() с отношением, требующим список объектов GtkAccessible, необходимо передавать каждый объект доступности по отдельности, за которым следует NULL.
Правила разработки приложений
Даже если стандартные элементы управления интерфейсом пользователя, предоставляемые GTK, содержат информацию об обеспечении доступности по умолчанию, для разработчиков приложений существуют дополнительные свойства и соображения. Например, если ваше приложение предоставляет пользователю форму для заполнения, необходимо убедиться в том, что:
контейнер формы имеет роль
GTK_ACCESSIBLE_ROLE_FORMкаждое поле ввода текста в форме имеет отношение
GTK_ACCESSIBLE_RELATION_LABELLED_BYк элементу метки, который его описывает
Еще один пример: если вы создаете панель инструментов, содержащую кнопки только с иконками, необходимо убедиться в том, что:
контейнер имеет роль
GTK_ACCESSIBLE_ROLE_TOOLBARкаждая кнопка имеет свойство
GTK_ACCESSIBLE_PROPERTY_LABEL, содержащее удобочитаемое и локализованное действие, выполняемое при нажатии; например, "“Копировать“, "“Вставить“, "“Добавить слой“ или "“Удалить“
GTK попытается заполнить некоторую информацию, используя вспомогательные свойства элементов управления интерфейсом пользователя, например, метка доступности будет взята из метки или текста по умолчанию, используемого элементом управления интерфейсом пользователя, или из его всплывающей подсказки, если свойство GTK_ACCESSIBLE_PROPERTY_LABEL или отношение GTK_ACCESSIBLE_RELATION_LABELLED_BY не заданы. Тем не менее, хорошей практикой и гигиеной проекта является явное указание свойств доступности, так же как хорошей практикой является указание всплывающих подсказок и стилизованных классов.
Разработчики приложений, использующие GTK, должны обеспечивать доступность своих элементов управления интерфейсом пользователя в процессе разработки. При использовании шаблонов GtkBuilder и файлов определения интерфейса пользователя GTK предоставляет инструмент проверки, который проверяет, имеет ли каждый элемент интерфейса пользователя действительную роль и свойства; этот инструмент можно использовать в составе набора тестов приложения, чтобы избежать регрессий.
Реализации
Каждый элемент управления интерфейсом пользователя реализует интерфейс GtkAccessible, чтобы разработчики виджетов и приложений могли задавать роли, состояния и отношения между элементами управления интерфейсом пользователя. Этот API является чисто описательным.
Каждая реализация GtkAccessible должна предоставить экземпляр GtkATContext, который действует как прокси для API доступности конкретной платформы:
AT-SPI на Linux/BSD
NSAccessibility на macOS
Active Accessibility на Windows
Кроме того, для набора тестов GTK доступен специальный бэкенд доступности, чтобы обеспечить воспроизводимость проблем в конвейере непрерывной интеграции.
Практики авторизации
Практики авторизации предназначены для разработчиков приложений, а также разработчиков элементов графического интерфейса, основанных на GTK.
Функционально, роли GtkAccessible, состояния, свойства и отношения аналогичны CSS для технологий辅助. Например, для пользователей считывателей экрана различные доступные атрибуты управляют отображением их невизуального опыта. Неправильные роли и атрибуты могут привести к полностью недоступному пользовательскому интерфейсу.
Роль — это обещание
Следующий код:
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_BUTTON);
является обещанием, что создаваемый виджет будет обеспечивать те же взаимодействия с клавиатурой, которые ожидаются от кнопки. Доступная роль кнопки не превратит автоматически любой виджет в GtkButton; но если ваш виджет ведет себя как кнопка, использование GTK_ACCESSIBLE_ROLE_BUTTON позволит любой технологии辅助 обработать его так же, как они бы обработали GtkButton.
Атрибуты могут скрывать и улучшать
Атрибуты доступности могут использоваться для переопределения содержимого элемента пользовательского интерфейса, например:
gtk_label_set_text (GTK_LABEL (label), "Some text");
gtk_accessible_update_property (GTK_ACCESSIBLE (label),
GTK_ACCESSIBLE_PROPERTY_LABEL,
"Assistive technologies users will perceive "
"this text, not the contents of the label",
-1);
В приведенном выше примере свойство “label” переопределит содержимое виджета метки.
Атрибуты также могут улучшать пользовательский интерфейс:
gtk_button_set_label (GTK_BUTTON (button), "Download");
gtk_box_append (GTK_BOX (button), button);
gtk_label_set_text (GTK_LABEL (label), "Final report.pdf");
gtk_box_append (GTK_BOX (box), label);
gtk_accessible_update_relation (GTK_ACCESSIBLE (button),
GTK_ACCESSIBLE_RELATION_LABELLED_BY,
g_list_append (NULL, label),
-1);
В приведенном выше примере технология辅助 прочитает доступную метку кнопки как “Скачать окончательный отчет.pdf”.
Возможность скрывать и улучшать может быть двусторонним мечом, так как может привести к непреднамеренному переопределению доступной семантики существующих виджетов.
Скрытие элементов пользовательского интерфейса из доступного дерева
API доступности в основном используется для выражения семантики, полезной для технологий辅助, но его также можно использовать для скрытия элементов. Каноническим способом сделать это является использование GTK_ACCESSIBLE_ROLE_PRESENTATION, который объявляет, что элемент пользовательского интерфейса предназначен только для целей представления и, как следствие, не оказывает существенного влияния на доступность интерфейса.
Роль “представление” не следует путать со состоянием GTK_ACCESSIBLE_STATE_HIDDEN; состояние “скрытый” является временным и обычно контролируется отображением и скрытием виджета с помощью API GtkWidget.
Шаблоны проектирования и пользовательские виджеты
При создании пользовательских виджетов следование установленным шаблонам может помочь обеспечить, чтобы виджеты хорошо работали и для пользователей доступных технологий.
Кнопки
Кнопка — это виджет, позволяющий пользователям запускать действие. Хотя рекомендуется использовать GtkButton для всего, что выглядит и ведет себя как кнопка, возможно применение поведения кнопки к элементам пользовательского интерфейса, таким как изображения, с помощью жеста GtkGestureClick. При этом вы должны:
Назначить вашему виджету роль
GTK_ACCESSIBLE_ROLE_BUTTONУстановить действие без параметров, которое активирует виджет
Пользовательские поля ввода
Для пользовательских полей ввода настоятельно рекомендуется реализовать интерфейс GtkEditable с использованием виджета GtkText в качестве делегата. Если вы это сделаете, GTK сделает функциональность редактирования текста ваших виджетов доступной таким же образом, как GtkSpinButton или GtkSearchEntry.
Пользовательский интерфейс на основе вкладок
Если вы создаете интерфейс на основе вкладок, рекомендуется использовать GtkStack в качестве основы и просто создать пользовательский виджет вкладки для управления активной страницей стека. При этом следующие дополнительные шаги обеспечат доступность ваших вкладок таким же образом, как GtkStackSwitcher или GtkNotebook:
Назначьте контейнеру вкладок роль
GTK_ACCESSIBLE_ROLE_TAB_LISTНазначьте виджетам вкладок роль
GTK_ACCESSIBLE_ROLE_TABУстановите отношение
GTK_ACCESSIBLE_RELATION_CONTROLSмежду каждой вкладкой и объектом GtkStackPage для ее страницыУстановите свойство
GTK_ACCESSIBLE_PROPERTY_SELECTEDна каждой вкладке, причем активной вкладке присваивается значениеTRUE, всем остальнымFALSE
Чтобы разрешить изменение активной вкладки с помощью технологий доступности, можно экспортировать действия. Поскольку интерфейсы доступности поддерживают только действия без параметров, вы можете предоставить действия previous-tab и next-tab для контейнера вкладок, позволяющие пользователям просматривать вкладки по одной, или добавить действие activate-tab на каждую вкладку.
Управление значениями
Управление значением (т. е. виджет, который управляет одномерной величиной, которая может быть представлена с помощью GtkAdjustment) может быть представлено технологиям доступности путем установки свойств GTK_ACCESSIBLE_PROPERTY_VALUE_MIN, GTK_ACCESSIBLE_PROPERTY_VALUE_MAX и GTK_ACCESSIBLE_PROPERTY_VALUE_NOW.
Чтобы разрешить изменение значения с помощью технологий доступности, вы можете экспортировать действия. Поскольку интерфейсы доступности поддерживают только действия без параметров, вы должны предоставить такие действия, как increase-value и decrease-value.
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/Accessibility.html