%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/orca/ |
| Current File : //lib/python3/dist-packages/orca/ax_collection.py |
# Utilities for obtaining objects via the collection interface.
#
# 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 obtaining objects via the collection interface.
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 time
import gi
gi.require_version("Atspi", "2.0")
from gi.repository import Atspi
from . import debug
from .ax_object import AXObject
class AXCollection:
"""Utilities for obtaining objects via the collection interface."""
# Too many arguments and too many local variables.
# This function wraps Atspi.MatchRule.new which has all the arguments.
# pylint: disable=R0913,R0914
@staticmethod
def create_match_rule(states=[],
state_match_type=Atspi.CollectionMatchType.ALL,
attributes=[],
attribute_match_type=Atspi.CollectionMatchType.ANY,
roles=[],
role_match_type=Atspi.CollectionMatchType.ANY,
interfaces=[],
interface_match_type=Atspi.CollectionMatchType.ALL,
invert=False):
"""Creates a match rule based on the supplied criteria."""
state_set = Atspi.StateSet()
if states:
for state in states:
state_set.add(state)
attributes_dict = {}
if attributes:
for attr in attributes:
key, value = attr.split(":", 1)
value = value.replace(":", r"\:")
if key in attributes_dict:
attributes_dict[key] = attributes_dict[key] + ":" + value
else:
attributes_dict[key] = value
try:
rule = Atspi.MatchRule.new(state_set,
state_match_type,
attributes_dict,
attribute_match_type,
roles,
role_match_type,
interfaces,
interface_match_type,
invert)
except Exception as error:
tokens = ["AXCollection: Exception in create_match_rule:", error]
debug.printTokens(debug.LEVEL_INFO, tokens, True)
return None
return rule
# pylint: enable=R0913,R0914
@staticmethod
def get_all_matches(obj, rule, order=Atspi.CollectionSortOrder.CANONICAL):
"""Returns a list of objects matching the specified rule."""
if not AXObject.supports_collection(obj):
return []
if rule is None:
return []
start = time.time()
try:
# 0 means no limit on the number of results
# The final argument, traverse, is not supported but is expected.
matches = Atspi.Collection.get_matches(obj, rule, order, 0, True)
except Exception as error:
tokens = ["AXCollection: Exception in get_all_matches:", error]
debug.printTokens(debug.LEVEL_INFO, tokens, True)
return []
msg = f"AXCollection: {len(matches)} match(es) found in {time.time() - start:.4f}s"
debug.printMessage(debug.LEVEL_INFO, msg, True)
return matches
@staticmethod
def get_first_match(obj, rule, order=Atspi.CollectionSortOrder.CANONICAL):
"""Returns the first object matching the specified rule."""
if not AXObject.supports_collection(obj):
return None
if rule is None:
return None
start = time.time()
try:
# 1 means limit the number of results to 1
# The final argument, traverse, is not supported but is expected.
matches = Atspi.Collection.get_matches(obj, rule, order, 1, True)
except Exception as error:
tokens = ["AXCollection: Exception in get_first_match:", error]
debug.printTokens(debug.LEVEL_INFO, tokens, True)
return None
match = None
if matches:
match = matches[0]
tokens = ["AXCollection: found", match, f"in {time.time() - start:.4f}s"]
debug.printTokens(debug.LEVEL_INFO, tokens, True)
return match