%PDF- %PDF-
Direktori : /lib/python3/dist-packages/orca/ |
Current File : //lib/python3/dist-packages/orca/ax_utilities_collection.py |
# Utilities for finding all objects that meet a certain criteria. # # Copyright 2023 Igalia, S.L. # Author: Joanmarie Diggs <jdiggs@igalia.com> # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the # Free Software Foundation, Inc., Franklin Street, Fifth Floor, # Boston MA 02110-1301 USA. """ Utilities for finding all objects that meet a certain criteria. These utilities are app-type- and toolkit-agnostic. Utilities that might have different implementations or results depending on the type of app (e.g. terminal, chat, web) or toolkit (e.g. Qt, Gtk) should be in script_utilities.py file(s). N.B. There are currently utilities that should never have custom implementations that live in script_utilities.py files. These will be moved over time. """ __id__ = "$Id$" __version__ = "$Revision$" __date__ = "$Date$" __copyright__ = "Copyright (c) 2023 Igalia, S.L." __license__ = "LGPL" import inspect import time import gi gi.require_version("Atspi", "2.0") from gi.repository import Atspi from . import debug from .ax_collection import AXCollection from .ax_object import AXObject from .ax_utilities_role import AXUtilitiesRole from .ax_utilities_state import AXUtilitiesState class AXUtilitiesCollection: """Utilities for finding all objects that meet a certain criteria.""" @staticmethod def _apply_predicate(matches, pred): if not matches: return [] start = time.time() tokens = ["AXUtilitiesCollection: Applying predicate ", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) matches = list(filter(pred, matches)) msg = f"AXUtilitiesCollection: {len(matches)} matches found in {time.time() - start:.4f}s" debug.printMessage(debug.LEVEL_INFO, msg, True) return matches @staticmethod def _find_all_with_states(root, state_list, state_match_type, pred=None): if not (root and state_list): return [] state_list = list(state_list) tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, state_match_type, "of:", state_list] debug.printTokens(debug.LEVEL_INFO, tokens, True) rule = AXCollection.create_match_rule(states=state_list, state_match_type=state_match_type) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def _find_all_with_role(root, role_list, role_match_type, pred=None): if not (root and role_list): return [] role_list = list(role_list) tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, role_match_type, "of:", role_list] debug.printTokens(debug.LEVEL_INFO, tokens, True) rule = AXCollection.create_match_rule(roles=role_list, role_match_type=role_match_type) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_with_interfaces(root, interface_list, pred=None): """Returns all descendants of root which implement all the specified interfaces""" if not (root and interface_list): return [] interface_list = list(interface_list) tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "all of:", interface_list] debug.printTokens(debug.LEVEL_INFO, tokens, True) rule = AXCollection.create_match_rule(interfaces=interface_list) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_with_role(root, role_list, pred=None): """Returns all descendants of root with any of the specified roles""" return AXUtilitiesCollection._find_all_with_role( root, role_list, Atspi.CollectionMatchType.ANY, pred) @staticmethod def find_all_without_roles(root, role_list, pred=None): """Returns all descendants of root which have none of the specified roles""" return AXUtilitiesCollection._find_all_with_role( root, role_list, Atspi.CollectionMatchType.NONE, pred) @staticmethod def find_all_with_role_and_all_states(root, role_list, state_list, pred=None): """Returns all descendants of root with any of the roles, and all the states""" if not (root and role_list and state_list): return [] role_list = list(role_list) state_list = list(state_list) tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "Roles:", role_list, "States:", state_list] debug.printTokens(debug.LEVEL_INFO, tokens, True) rule = AXCollection.create_match_rule( roles=role_list, states=state_list, state_match_type=Atspi.CollectionMatchType.ALL) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_with_role_and_any_state(root, role_list, state_list, pred=None): """Returns all descendants of root with any of the roles, and any of the states""" if not (root and role_list and state_list): return [] role_list = list(role_list) state_list = list(state_list) tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "Roles:", role_list, "States:", state_list] debug.printTokens(debug.LEVEL_INFO, tokens, True) rule = AXCollection.create_match_rule( roles=role_list, states=state_list, state_match_type=Atspi.CollectionMatchType.ANY) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_with_role_without_states(root, role_list, state_list, pred=None): """Returns all descendants of root with any of the roles, and none of the states""" if not (root and role_list and state_list): return [] role_list = list(role_list) state_list = list(state_list) tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "Roles:", role_list, "States:", state_list] debug.printTokens(debug.LEVEL_INFO, tokens, True) rule = AXCollection.create_match_rule( roles=role_list, states=state_list, state_match_type=Atspi.CollectionMatchType.NONE) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_with_states(root, state_list, pred=None): """Returns all descendants of root which have all of the specified states""" return AXUtilitiesCollection._find_all_with_states( root, state_list, Atspi.CollectionMatchType.ALL, pred) @staticmethod def find_all_with_any_state(root, state_list, pred=None): """Returns all descendants of root which have any of the specified states""" return AXUtilitiesCollection._find_all_with_states( root, state_list, Atspi.CollectionMatchType.ANY, pred) @staticmethod def find_all_without_states(root, state_list, pred=None): """Returns all descendants of root which have none of the specified states""" return AXUtilitiesCollection._find_all_with_states( root, state_list, Atspi.CollectionMatchType.NONE, pred) @staticmethod def find_all_accelerator_labels(root, pred=None): """Returns all descendants of root with the accelerator label role""" roles = [Atspi.Role.ACCELERATOR_LABEL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_alerts(root, pred=None): """Returns all descendants of root with the alert role""" roles = [Atspi.Role.ALERT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_animations(root, pred=None): """Returns all descendants of root with the animation role""" roles = [Atspi.Role.ANIMATION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_arrows(root, pred=None): """Returns all descendants of root with the arrow role""" roles = [Atspi.Role.ARROW] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_articles(root, pred=None): """Returns all descendants of root with the article role""" roles = [Atspi.Role.ARTICLE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_audios(root, pred=None): """Returns all descendants of root with the audio role""" roles = [Atspi.Role.AUDIO] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_autocompletes(root, pred=None): """Returns all descendants of root with the autocomplete role""" roles = [Atspi.Role.AUTOCOMPLETE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_block_quotes(root, pred=None): """Returns all descendants of root with the block quote role""" roles = [Atspi.Role.BLOCK_QUOTE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_buttons(root, pred=None): """Returns all descendants of root with the push- or toggle-button role""" roles = [Atspi.Role.PUSH_BUTTON, Atspi.Role.TOGGLE_BUTTON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_calendars(root, pred=None): """Returns all descendants of root with the calendar role""" roles = [Atspi.Role.CALENDAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_canvases(root, pred=None): """Returns all descendants of root with the canvas role""" roles = [Atspi.Role.CANVAS] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_captions(root, pred=None): """Returns all descendants of root with the caption role""" roles = [Atspi.Role.CAPTION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_charts(root, pred=None): """Returns all descendants of root with the chart role""" roles = [Atspi.Role.CHART] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_check_boxes(root, pred=None): """Returns all descendants of root with the checkbox role""" roles = [Atspi.Role.CHECK_BOX] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_check_menu_items(root, pred=None): """Returns all descendants of root with the check menuitem role""" roles = [Atspi.Role.CHECK_MENU_ITEM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_clickables(root, pred=None): """Returns all non-focusable descendants of root which support the click action""" if root is None: return [] interfaces = ["Action"] states = [Atspi.StateType.FOCUSABLE] state_match_type = Atspi.CollectionMatchType.NONE roles = AXUtilitiesRole.get_roles_to_exclude_from_clickables_list() roles_match_type = Atspi.CollectionMatchType.NONE attributes = ["xml-roles:gridcell"] attribute_match_type = Atspi.CollectionMatchType.NONE tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, roles_match_type, "of:", roles, ". pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) def is_match(obj): result = AXObject.has_action(obj, "click") tokens = ["AXUtilitiesCollection:", obj, AXObject.actions_as_string(obj), "has click Action:", result] debug.printTokens(debug.LEVEL_INFO, tokens, True) if not result: return False return pred is None or pred(obj) rule = AXCollection.create_match_rule( interfaces=interfaces, attributes=attributes, attribute_match_type=attribute_match_type, roles=roles, role_match_type=roles_match_type, states=states, state_match_type=state_match_type) matches = AXCollection.get_all_matches(root, rule) matches = AXUtilitiesCollection._apply_predicate(matches, is_match) return matches @staticmethod def find_all_color_choosers(root, pred=None): """Returns all descendants of root with the color_chooser role""" roles = [Atspi.Role.COLOR_CHOOSER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_column_headers(root, pred=None): """Returns all descendants of root with the column header role""" roles = [Atspi.Role.COLUMN_HEADER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_combo_boxes(root, pred=None): """Returns all descendants of root with the combobox role""" roles = [Atspi.Role.COMBO_BOX] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_comments(root, pred=None): """Returns all descendants of root with the comment role""" roles = [Atspi.Role.COMMENT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_content_deletions(root, pred=None): """Returns all descendants of root with the content deletion role""" roles = [Atspi.Role.CONTENT_DELETION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_content_insertions(root, pred=None): """Returns all descendants of root with the content insertion role""" roles = [Atspi.Role.CONTENT_INSERTION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_date_editors(root, pred=None): """Returns all descendants of root with the date editor role""" roles = [Atspi.Role.DATE_EDITOR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_definitions(root, pred=None): """Returns all descendants of root with the definition role""" roles = [Atspi.Role.DEFINITION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_description_lists(root, pred=None): """Returns all descendants of root with the description list role""" roles = [Atspi.Role.DESCRIPTION_LIST] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_description_terms(root, pred=None): """Returns all descendants of root with the description term role""" roles = [Atspi.Role.DESCRIPTION_TERM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_description_values(root, pred=None): """Returns all descendants of root with the description value role""" roles = [Atspi.Role.DESCRIPTION_VALUE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_desktop_frames(root, pred=None): """Returns all descendants of root with the desktop frame role""" roles = [Atspi.Role.DESKTOP_FRAME] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_desktop_icons(root, pred=None): """Returns all descendants of root with the desktop icon role""" roles = [Atspi.Role.DESKTOP_ICON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_dials(root, pred=None): """Returns all descendants of root with the dial role""" roles = [Atspi.Role.DIAL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_dialogs(root, pred=None): """Returns all descendants of root with the dialog role""" roles = [Atspi.Role.DIALOG] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_dialogs_and_alerts(root, pred=None): """Returns all descendants of root that has any dialog or alert role""" roles = AXUtilitiesRole.get_dialog_roles(True) return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_directory_panes(root, pred=None): """Returns all descendants of root with the directory pane role""" roles = [Atspi.Role.DIRECTORY_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_documents(root, pred=None): """Returns all descendants of root that has any document-related role""" roles = AXUtilitiesRole.get_document_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_document_emails(root, pred=None): """Returns all descendants of root with the document email role""" roles = [Atspi.Role.DOCUMENT_EMAIL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_document_frames(root, pred=None): """Returns all descendants of root with the document frame role""" roles = [Atspi.Role.DOCUMENT_FRAME] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_document_presentations(root, pred=None): """Returns all descendants of root with the document presentation role""" roles = [Atspi.Role.DOCUMENT_PRESENTATION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_document_spreadsheets(root, pred=None): """Returns all descendants of root with the document spreadsheet role""" roles = [Atspi.Role.DOCUMENT_SPREADSHEET] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_document_texts(root, pred=None): """Returns all descendants of root with the document text role""" roles = [Atspi.Role.DOCUMENT_TEXT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_document_webs(root, pred=None): """Returns all descendants of root with the document web role""" roles = [Atspi.Role.DOCUMENT_WEB] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_drawing_areas(root, pred=None): """Returns all descendants of root with the drawing area role""" roles = [Atspi.Role.DRAWING_AREA] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_editable_objects(root, must_be_focusable=True, pred=None): """Returns all descendants of root which are editable""" states = [Atspi.StateType.EDITABLE] if must_be_focusable: states.append(Atspi.StateType.FOCUSABLE) return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_editbars(root, pred=None): """Returns all descendants of root with the editbar role""" roles = [Atspi.Role.EDITBAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_embeddeds(root, pred=None): """Returns all descendants of root with the embedded role""" roles = [Atspi.Role.EMBEDDED] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_entries(root, pred=None): """Returns all descendants of root with the entry role""" roles = [Atspi.Role.ENTRY] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_extendeds(root, pred=None): """Returns all descendants of root with the extended role""" roles = [Atspi.Role.EXTENDED] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_file_choosers(root, pred=None): """Returns all descendants of root with the file chooser role""" roles = [Atspi.Role.FILE_CHOOSER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_fillers(root, pred=None): """Returns all descendants of root with the filler role""" roles = [Atspi.Role.FILLER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_focusable_objects(root, pred=None): """Returns all descendants of root which are focusable""" states = [Atspi.StateType.FOCUSABLE] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_focusable_objects_with_click_ancestor(root, pred=None): """Returns all focusable descendants of root which support the click-ancestor action""" if root is None: return [] interfaces = ["Action"] states = [Atspi.StateType.FOCUSABLE] state_match_type = Atspi.CollectionMatchType.ANY roles = AXUtilitiesRole.get_roles_to_exclude_from_clickables_list() roles_match_type = Atspi.CollectionMatchType.NONE tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, roles_match_type, "of:", roles, ". pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) def is_match(obj): result = AXObject.has_action(obj, "click-ancestor") tokens = ["AXUtilitiesCollection:", obj, AXObject.actions_as_string(obj), "has click-ancestor Action:", result] debug.printTokens(debug.LEVEL_INFO, tokens, True) if not result: return False return pred is None or pred(obj) rule = AXCollection.create_match_rule( interfaces=interfaces, roles=roles, role_match_type=roles_match_type, states=states, state_match_type=state_match_type) matches = AXCollection.get_all_matches(root, rule) matches = AXUtilitiesCollection._apply_predicate(matches, is_match) return matches @staticmethod def find_all_focused_objects(root, pred=None): """Returns all descendants of root which are focused""" states = [Atspi.StateType.FOCUSED] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_focus_traversables(root, pred=None): """Returns all descendants of root with the focus traversable role""" roles = [Atspi.Role.FOCUS_TRAVERSABLE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_font_choosers(root, pred=None): """Returns all descendants of root with the font chooser role""" roles = [Atspi.Role.FONT_CHOOSER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_footers(root, pred=None): """Returns all descendants of root with the footer role""" roles = [Atspi.Role.FOOTER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_footnotes(root, pred=None): """Returns all descendants of root with the footnote role""" roles = [Atspi.Role.FOOTNOTE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_forms(root, pred=None): """Returns all descendants of root with the form role""" roles = [Atspi.Role.FORM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_form_fields(root, must_be_focusable=True, pred=None): """Returns all descendants of root with a form-field-related role""" roles = AXUtilitiesRole.get_form_field_roles() if not must_be_focusable: return AXUtilitiesCollection.find_all_with_role(root, roles, pred) states = [Atspi.StateType.FOCUSABLE] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_frames(root, pred=None): """Returns all descendants of root with the frame role""" roles = [Atspi.Role.FRAME] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_glass_panes(root, pred=None): """Returns all descendants of root with the glass pane role""" roles = [Atspi.Role.GLASS_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_grids(root, pred=None): """Returns all descendants of root that are grids""" if root is None: return [] tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) roles = [Atspi.Role.TABLE] attributes = ["xml-roles:grid"] rule = AXCollection.create_match_rule(roles=roles, attributes=attributes) grids = AXCollection.get_all_matches(root, rule) if pred is not None: AXUtilitiesCollection._apply_predicate(grids, pred) return grids @staticmethod def find_all_grid_cells(root, pred=None): """Returns all descendants of root that are grid cells""" if root is None: return [] grids = AXUtilitiesCollection.find_all_grids(root, pred) if not grids: return [] tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) cells = [] for grid in grids: cells.extend(AXUtilitiesCollection.find_all_table_cells(grid)) if pred is not None: AXUtilitiesCollection._apply_predicate(cells, pred) return cells @staticmethod def find_all_groupings(root, pred=None): """Returns all descendants of root with the grouping role""" roles = [Atspi.Role.GROUPING] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_headers(root, pred=None): """Returns all descendants of root with the header role""" roles = [Atspi.Role.HEADER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_headings(root, pred=None): """Returns all descendants of root with the heading role""" roles = [Atspi.Role.HEADING] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_headings_at_level(root, level, pred=None): """Returns all descendants of root with the heading role""" if root is None: return [] tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "Level:", level, "pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) roles = [Atspi.Role.HEADING] attributes = [f"level:{level}"] rule = AXCollection.create_match_rule(roles=roles, attributes=attributes) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_html_containers(root, pred=None): """Returns all descendants of root with the html container role""" roles = [Atspi.Role.HTML_CONTAINER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_horizontal_scrollbars(root, pred=None): """Returns all descendants of root that is a horizontal scrollbar""" roles = [Atspi.Role.SCROLL_BAR] states = [Atspi.StateType.HORIZONTAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_horizontal_separators(root, pred=None): """Returns all descendants of root that is a horizontal separator""" roles = [Atspi.Role.SEPARATOR] states = [Atspi.StateType.HORIZONTAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_horizontal_sliders(root, pred=None): """Returns all descendants of root that is a horizontal slider""" roles = [Atspi.Role.SLIDER] states = [Atspi.StateType.HORIZONTAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_icons(root, pred=None): """Returns all descendants of root with the icon role""" roles = [Atspi.Role.ICON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_icons_and_canvases(root, pred=None): """Returns all descendants of root with the icon or canvas role""" roles = [Atspi.Role.ICON, Atspi.Role.CANVAS] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_images(root, pred=None): """Returns all descendants of root with the image role""" roles = [Atspi.Role.IMAGE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_images_and_canvases(root, pred=None): """Returns all descendants of root with the image or canvas role""" roles = [Atspi.Role.IMAGE, Atspi.Role.CANVAS] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_images_and_image_maps(root, pred=None): """Returns all descendants of root with the image or image map role""" roles = [Atspi.Role.IMAGE, Atspi.Role.IMAGE_MAP] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_image_maps(root, pred=None): """Returns all descendants of root with the image map role""" roles = [Atspi.Role.IMAGE_MAP] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_info_bars(root, pred=None): """Returns all descendants of root with the info bar role""" roles = [Atspi.Role.INFO_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_input_method_windows(root, pred=None): """Returns all descendants of root with the input method window role""" roles = [Atspi.Role.INPUT_METHOD_WINDOW] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_internal_frames(root, pred=None): """Returns all descendants of root with the internal frame role""" roles = [Atspi.Role.INTERNAL_FRAME] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_labels(root, pred=None): """Returns all descendants of root with the label role""" roles = [Atspi.Role.LABEL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_labels_and_captions(root, pred=None): """Returns all descendants of root with the label or caption role""" roles = [Atspi.Role.LABEL, Atspi.Role.CAPTION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_landmarks(root, pred=None): """Returns all descendants of root with the landmark role""" roles = [Atspi.Role.LANDMARK] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_layered_panes(root, pred=None): """Returns all descendants of root with the layered pane role""" roles = [Atspi.Role.LAYERED_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_level_bars(root, pred=None): """Returns all descendants of root with the level bar role""" roles = [Atspi.Role.LEVEL_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_links(root, must_be_focusable=True, pred=None): """Returns all descendants of root with the link role""" roles = [Atspi.Role.LINK] if not must_be_focusable: return AXUtilitiesCollection.find_all_with_role(root, roles, pred) states = [Atspi.StateType.FOCUSABLE] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_live_regions(root, pred=None): """Returns all descendants of root that are live regions""" if root is None: return [] tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) attributes = [] levels = ["off", "polite", "assertive"] for level in levels: attributes.append('container-live:' + level) rule = AXCollection.create_match_rule(attributes=attributes) matches = AXCollection.get_all_matches(root, rule) if pred is not None: matches = AXUtilitiesCollection._apply_predicate(matches, pred) return matches @staticmethod def find_all_lists(root, pred=None): """Returns all descendants of root with the list role""" roles = [Atspi.Role.LIST] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_list_boxes(root, pred=None): """Returns all descendants of root with the list box role""" roles = [Atspi.Role.LIST_BOX] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_list_items(root, pred=None): """Returns all descendants of root with the list item role""" roles = [Atspi.Role.LIST_ITEM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_logs(root, pred=None): """Returns all descendants of root with the log role""" roles = [Atspi.Role.LOG] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_marks(root, pred=None): """Returns all descendants of root with the mark role""" roles = [Atspi.Role.MARK] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_marquees(root, pred=None): """Returns all descendants of root with the marquee role""" roles = [Atspi.Role.MARQUEE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_maths(root, pred=None): """Returns all descendants of root with the math role""" roles = [Atspi.Role.MATH] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_math_fractions(root, pred=None): """Returns all descendants of root with the math fraction role""" roles = [Atspi.Role.MATH_FRACTION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_math_roots(root, pred=None): """Returns all descendants of root with the math root role""" roles = [Atspi.Role.MATH_ROOT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_menus(root, pred=None): """Returns all descendants of root with the menu role""" roles = [Atspi.Role.MENU] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_menu_bars(root, pred=None): """Returns all descendants of root with the menubar role""" roles = [Atspi.Role.MENU_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_menu_items(root, pred=None): """Returns all descendants of root with the menu item role""" roles = [Atspi.Role.MENU_ITEM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_menu_items_of_any_kind(root, pred=None): """Returns all descendants of root that has any menu item role""" roles = AXUtilitiesRole.get_menu_item_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_menu_related_objects(root, pred=None): """Returns all descendants of root that has any menu-related role""" roles = AXUtilitiesRole.get_menu_related_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_modal_dialogs(root, pred=None): """Returns all descendants of root with the alert or dialog role and modal state""" roles = AXUtilitiesRole.get_dialog_roles(True) states = [Atspi.StateType.MODAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_multi_line_entries(root, pred=None): """Returns all descendants of root with the entry role and multiline state""" roles = [Atspi.Role.ENTRY] states = [Atspi.StateType.MULTI_LINE] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_notifications(root, pred=None): """Returns all descendants of root with the notification role""" roles = [Atspi.Role.NOTIFICATION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_option_panes(root, pred=None): """Returns all descendants of root with the option pane role""" roles = [Atspi.Role.OPTION_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_pages(root, pred=None): """Returns all descendants of root with the page role""" roles = [Atspi.Role.PAGE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_page_tabs(root, pred=None): """Returns all descendants of root with the page tab role""" roles = [Atspi.Role.PAGE_TAB] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_page_tab_lists(root, pred=None): """Returns all descendants of root with the page tab list role""" roles = [Atspi.Role.PAGE_TAB_LIST] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_page_tab_list_related_objects(root, pred=None): """Returns all descendants of root with the page tab or page tab list role""" roles = [Atspi.Role.PAGE_TAB_LIST, Atspi.Role.PAGE_TAB] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_panels(root, pred=None): """Returns all descendants of root with the panel role""" roles = [Atspi.Role.PANEL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_paragraphs(root, treat_headings_as_paragraphs=False, pred=None): """Returns all descendants of root with the paragraph role""" roles = [Atspi.Role.PARAGRAPH] if treat_headings_as_paragraphs: roles.append(Atspi.Role.HEADING) return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_password_texts(root, pred=None): """Returns all descendants of root with the password text role""" roles = [Atspi.Role.PASSWORD_TEXT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_popup_menus(root, pred=None): """Returns all descendants of root with the popup menu role""" roles = [Atspi.Role.POPUP_MENU] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_progress_bars(root, pred=None): """Returns all descendants of root with the progress bar role""" roles = [Atspi.Role.PROGRESS_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_push_buttons(root, pred=None): """Returns all descendants of root with the push button role""" roles = [Atspi.Role.PUSH_BUTTON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_push_button_menus(root, pred=None): """Returns all descendants of root with the push button menu role""" roles = [Atspi.Role.PUSH_BUTTON_MENU] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_radio_buttons(root, pred=None): """Returns all descendants of root with the radio button role""" roles = [Atspi.Role.RADIO_BUTTON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_radio_menu_items(root, pred=None): """Returns all descendants of root with the radio menu item role""" roles = [Atspi.Role.RADIO_MENU_ITEM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_ratings(root, pred=None): """Returns all descendants of root with the rating role""" roles = [Atspi.Role.RATING] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_root_panes(root, pred=None): """Returns all descendants of root with the root pane role""" roles = [Atspi.Role.ROOT_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_row_headers(root, pred=None): """Returns all descendants of root with the row header role""" roles = [Atspi.Role.ROW_HEADER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_rulers(root, pred=None): """Returns all descendants of root with the ruler role""" roles = [Atspi.Role.RULER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_scroll_bars(root, pred=None): """Returns all descendants of root with the scrollbar role""" roles = [Atspi.Role.SCROLL_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_scroll_panes(root, pred=None): """Returns all descendants of root with the scroll pane role""" roles = [Atspi.Role.SCROLL_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_sections(root, pred=None): """Returns all descendants of root with the section role""" roles = [Atspi.Role.SECTION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_selectable_objects(root, pred=None): """Returns all descendants of root which are selectable""" states = [Atspi.StateType.SELECTABLE] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_selected_objects(root, pred=None): """Returns all descendants of root which are selected""" states = [Atspi.StateType.SELECTED] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_separators(root, pred=None): """Returns all descendants of root with the separator role""" roles = [Atspi.Role.SEPARATOR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_set_containers(root, pred=None): """Returns all descendants of root with a set container role""" roles = AXUtilitiesRole.get_set_container_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_showing_objects(root, pred=None): """Returns all descendants of root which are showing""" states = [Atspi.StateType.SHOWING] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_showing_and_visible_objects(root, pred=None): """Returns all descendants of root which are showing and visible""" states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_showing_or_visible_objects(root, pred=None): """Returns all descendants of root which are showing or visible""" states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] return AXUtilitiesCollection.find_all_with_any_state(root, states, pred) @staticmethod def find_all_single_line_entries(root, pred=None): """Returns all descendants of root with the entry role and multiline state""" roles = [Atspi.Role.ENTRY] states = [Atspi.StateType.SINGLE_LINE] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_sliders(root, pred=None): """Returns all descendants of root with the slider role""" roles = [Atspi.Role.SLIDER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_spin_buttons(root, pred=None): """Returns all descendants of root with the spin button role""" roles = [Atspi.Role.SPIN_BUTTON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_split_panes(root, pred=None): """Returns all descendants of root with the split pane role""" roles = [Atspi.Role.SPLIT_PANE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_statics(root, pred=None): """Returns all descendants of root with the static role""" roles = [Atspi.Role.STATIC] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_status_bars(root, pred=None): """Returns all descendants of root with the statusbar role""" roles = [Atspi.Role.STATUS_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_subscripts(root, pred=None): """Returns all descendants of root with the subscript role""" roles = [Atspi.Role.SUBSCRIPT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_subscripts_and_superscripts(root, pred=None): """Returns all descendants of root with the subscript or superscript role""" roles = [Atspi.Role.SUBSCRIPT, Atspi.Role.SUPERSCRIPT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_suggestions(root, pred=None): """Returns all descendants of root with the suggestion role""" roles = [Atspi.Role.SUGGESTION] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_superscripts(root, pred=None): """Returns all descendants of root with the superscript role""" roles = [Atspi.Role.SUPERSCRIPT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_supports_action(root, pred=None): """Returns all descendants of root which support the action interface""" interfaces = ["Action"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_document(root, pred=None): """Returns all descendants of root which support the document interface""" interfaces = ["Document"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_editable_text(root, pred=None): """Returns all descendants of root which support the editable text interface""" interfaces = ["EditableText"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_hypertext(root, pred=None): """Returns all descendants of root which support the hypertext interface""" interfaces = ["Hypertext"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_hyperlink(root, pred=None): """Returns all descendants of root which support the hyperlink interface""" interfaces = ["Hyperlink"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_selection(root, pred=None): """Returns all descendants of root which support the selection interface""" interfaces = ["Selection"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_table(root, pred=None): """Returns all descendants of root which support the table interface""" interfaces = ["Table"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_table_cell(root, pred=None): """Returns all descendants of root which support the table cell interface""" interfaces = ["TableCell"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_text(root, pred=None): """Returns all descendants of root which support the text interface""" interfaces = ["Text"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_supports_value(root, pred=None): """Returns all descendants of root which support the value interface""" interfaces = ["Value"] return AXUtilitiesCollection.find_all_with_interfaces(root, interfaces, pred) @staticmethod def find_all_tables(root, pred=None): """Returns all descendants of root with the table role""" if root is None: return [] tokens = ["AXUtilitiesCollection:", inspect.currentframe(), "Root:", root, "pred:", pred] debug.printTokens(debug.LEVEL_INFO, tokens, True) roles = [Atspi.Role.TABLE] attributes = ["layout-guess:true"] attribute_match_type = Atspi.CollectionMatchType.NONE rule = AXCollection.create_match_rule( roles=roles, attributes=attributes, attribute_match_type=attribute_match_type) tables = AXCollection.get_all_matches(root, rule) if pred is not None: AXUtilitiesCollection._apply_predicate(tables, pred) return tables @staticmethod def find_all_table_cells(root, pred=None): """Returns all descendants of root with the table cell role""" roles = [Atspi.Role.TABLE_CELL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_table_cells_and_headers(root, pred=None): """Returns all descendants of root with the table cell or a header-related role""" roles = AXUtilitiesRole.get_table_cell_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_table_column_headers(root, pred=None): """Returns all descendants of root with the table column header role""" roles = [Atspi.Role.TABLE_COLUMN_HEADER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_table_headers(root, pred=None): """Returns all descendants of root that has a table header related role""" roles = AXUtilitiesRole.get_table_header_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_table_related_objects(root, pred=None, include_caption=False): """Returns all descendants of root that has a table related role""" roles = AXUtilitiesRole.get_table_related_roles(include_caption) return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_table_rows(root, pred=None): """Returns all descendants of root with the table row role""" roles = [Atspi.Role.TABLE_ROW] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_table_row_headers(root, pred=None): """Returns all descendants of root with the table row header role""" roles = [Atspi.Role.TABLE_ROW_HEADER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_tearoff_menu_items(root, pred=None): """Returns all descendants of root with the tearoff menu item role""" roles = [Atspi.Role.TEAROFF_MENU_ITEM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_terminals(root, pred=None): """Returns all descendants of root with the terminal role""" roles = [Atspi.Role.TERMINAL] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_texts(root, pred=None): """Returns all descendants of root with the text role""" roles = [Atspi.Role.TEXT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_text_inputs(root, pred=None): """Returns all descendants of root that has any role associated with textual input""" roles = [Atspi.Role.ENTRY, Atspi.Role.PASSWORD_TEXT, Atspi.Role.SPIN_BUTTON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_timers(root, pred=None): """Returns all descendants of root with the timer role""" roles = [Atspi.Role.TIMER] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_title_bars(root, pred=None): """Returns all descendants of root with the titlebar role""" roles = [Atspi.Role.TITLE_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_toggle_buttons(root, pred=None): """Returns all descendants of root with the toggle button role""" roles = [Atspi.Role.TOGGLE_BUTTON] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_tool_bars(root, pred=None): """Returns all descendants of root with the toolbar role""" roles = [Atspi.Role.TOOL_BAR] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_tool_tips(root, pred=None): """Returns all descendants of root with the tooltip role""" roles = [Atspi.Role.TOOL_TIP] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_trees(root, pred=None): """Returns all descendants of root with the tree role""" roles = [Atspi.Role.TREE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_trees_and_tree_tables(root, pred=None): """Returns all descendants of root with the tree or tree table role""" roles = [Atspi.Role.TREE, Atspi.Role.TREE_TABLE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_tree_related_objects(root, pred=None): """Returns all descendants of root that has a tree related role""" roles = AXUtilitiesRole.get_tree_related_roles() return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_tree_items(root, pred=None): """Returns all descendants of root with the tree item role""" roles = [Atspi.Role.TREE_ITEM] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_tree_tables(root, pred=None): """Returns all descendants of root with the tree table role""" roles = [Atspi.Role.TREE_TABLE] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_unrelated_labels(root, must_be_showing=True, pred=None): """Returns all the descendants of root that have a label role, but no relations""" def _pred(obj): if AXObject.get_relations(obj): return False if pred is not None: return pred(obj) return True roles = [Atspi.Role.LABEL, Atspi.Role.STATIC] if not must_be_showing: matches = AXUtilitiesCollection.find_all_with_role(root, roles, _pred) else: states = [Atspi.StateType.SHOWING] matches = AXUtilitiesCollection.find_all_with_role_and_all_states( root, roles, states, _pred) return matches @staticmethod def find_all_unvisited_links(root, must_be_focusable=True, pred=None): """Returns all descendants of root with the link role and without the visited state""" roles = [Atspi.Role.LINK] states = [Atspi.StateType.VISITED] result = AXUtilitiesCollection.find_all_with_role_without_states(root, roles, states, pred) if must_be_focusable: result = list(filter(AXUtilitiesState.is_focusable, result)) return result @staticmethod def find_all_vertical_scrollbars(root, pred=None): """Returns all descendants of root that is a vertical scrollbar""" roles = [Atspi.Role.SCROLL_BAR] states = [Atspi.StateType.VERTICAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_vertical_separators(root, pred=None): """Returns all descendants of root that is a vertical separator""" roles = [Atspi.Role.SEPARATOR] states = [Atspi.StateType.VERTICAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_vertical_sliders(root, pred=None): """Returns all descendants of root that is a vertical slider""" roles = [Atspi.Role.SLIDER] states = [Atspi.StateType.VERTICAL] return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_all_visible_objects(root, pred=None): """Returns all descendants of root which are visible""" states = [Atspi.StateType.VISIBLE] return AXUtilitiesCollection.find_all_with_states(root, states, pred) @staticmethod def find_all_videos(root, pred=None): """Returns all descendants of root with the video role""" roles = [Atspi.Role.VIDEO] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_viewports(root, pred=None): """Returns all descendants of root with the viewport role""" roles = [Atspi.Role.VIEWPORT] return AXUtilitiesCollection.find_all_with_role(root, roles, pred) @staticmethod def find_all_visited_links(root, must_be_focusable=True, pred=None): """Returns all descendants of root with the link role and focused and visited states""" roles = [Atspi.Role.LINK] states = [Atspi.StateType.VISITED] if must_be_focusable: states.append(Atspi.StateType.FOCUSABLE) return AXUtilitiesCollection.find_all_with_role_and_all_states(root, roles, states, pred) @staticmethod def find_default_button(root): """Returns the default button inside root""" roles = [Atspi.Role.PUSH_BUTTON] states = [Atspi.StateType.IS_DEFAULT] rule = AXCollection.create_match_rule(roles=roles, states=states) return AXCollection.get_first_match(root, rule) @staticmethod def find_focused_object(root): """Returns the focused object inside root""" states = [Atspi.StateType.FOCUSED] rule = AXCollection.create_match_rule(states=states) return AXCollection.get_first_match(root, rule) @staticmethod def find_status_bar(root): """Returns the status bar inside root""" roles = [Atspi.Role.STATUS_BAR] states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] rule = AXCollection.create_match_rule(roles=roles, states=states) return AXCollection.get_first_match(root, rule) @staticmethod def has_combo_box_or_list_box(root): """Returns True if there's a showing, visible combobox or listbox inside root""" roles = [Atspi.Role.COMBO_BOX, Atspi.Role.LIST_BOX] states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] rule = AXCollection.create_match_rule(roles=roles, states=states) return bool(AXCollection.get_first_match(root, rule)) @staticmethod def has_editable_object(root): """Returns True if there's a showing, visible, editable object inside root""" states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE, Atspi.StateType.EDITABLE] rule = AXCollection.create_match_rule(states=states) return bool(AXCollection.get_first_match(root, rule)) @staticmethod def has_scroll_pane(root): """Returns True if there's a showing, visible scroll pane inside root""" roles = [Atspi.Role.SCROLL_PANE] states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] rule = AXCollection.create_match_rule(roles=roles, states=states) return bool(AXCollection.get_first_match(root, rule)) @staticmethod def has_split_pane(root): """Returns True if there's a showing, visible split pane inside root""" roles = [Atspi.Role.SPLIT_PANE] states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] rule = AXCollection.create_match_rule(roles=roles, states=states) return bool(AXCollection.get_first_match(root, rule)) @staticmethod def has_tree_or_tree_table(root): """Returns True if there's a showing, visible tree or tree table inside root""" roles = [Atspi.Role.TREE, Atspi.Role.TREE_TABLE] states = [Atspi.StateType.SHOWING, Atspi.StateType.VISIBLE] rule = AXCollection.create_match_rule(roles=roles, states=states) return bool(AXCollection.get_first_match(root, rule))