|
37 | 37 | _UIA_TRANSFORM_PATTERN_ID = 10016 |
38 | 38 | _UIA_WINDOW_PATTERN_ID = 10009 |
39 | 39 | _UIA_LEGACYIACCESSIBLE_PATTERN_ID = 10018 |
| 40 | +_UIA_SELECTION_PATTERN_ID = 10001 |
| 41 | +_UIA_MULTIPLEVIEW_PATTERN_ID = 10008 |
40 | 42 | _UIA_AUTOMATIONID_PROPERTY = 30011 |
41 | 43 | _EXPAND_STATES = {0: "collapsed", 1: "expanded", 2: "partial", 3: "leaf"} |
42 | 44 | _WINDOW_VISUAL_STATES = {"normal": 0, "maximized": 1, "minimized": 2} |
@@ -370,6 +372,54 @@ def legacy_default_action(self, name=None, role=None, app_name=None, |
370 | 372 | "IUIAutomationLegacyIAccessiblePattern", |
371 | 373 | lambda pattern: pattern.DoDefaultAction()) |
372 | 374 |
|
| 375 | + def get_selection(self, name=None, role=None, app_name=None, |
| 376 | + automation_id=None) -> Optional[Dict[str, Any]]: |
| 377 | + raw = self._find_raw(name, role, app_name, automation_id) |
| 378 | + pattern = self._pattern(raw, _UIA_SELECTION_PATTERN_ID, |
| 379 | + "IUIAutomationSelectionPattern") if raw else None |
| 380 | + if pattern is None: |
| 381 | + return None |
| 382 | + try: |
| 383 | + items = _header_names(pattern.GetCurrentSelection()) |
| 384 | + can_multiple = bool(pattern.CurrentCanSelectMultiple) |
| 385 | + required = bool(pattern.CurrentIsSelectionRequired) |
| 386 | + except (OSError, AttributeError): |
| 387 | + return None |
| 388 | + return {"items": items, "can_select_multiple": can_multiple, |
| 389 | + "is_required": required} |
| 390 | + |
| 391 | + def _multiple_view(self, name, role, app_name, automation_id): |
| 392 | + raw = self._find_raw(name, role, app_name, automation_id) |
| 393 | + return self._pattern(raw, _UIA_MULTIPLEVIEW_PATTERN_ID, |
| 394 | + "IUIAutomationMultipleViewPattern") if raw else None |
| 395 | + |
| 396 | + def list_views(self, name=None, role=None, app_name=None, |
| 397 | + automation_id=None) -> Optional[Dict[str, Any]]: |
| 398 | + pattern = self._multiple_view(name, role, app_name, automation_id) |
| 399 | + if pattern is None: |
| 400 | + return None |
| 401 | + try: |
| 402 | + view_ids = list(pattern.GetCurrentSupportedViews()) |
| 403 | + current = int(pattern.CurrentCurrentView) |
| 404 | + except (OSError, AttributeError, ValueError, TypeError): |
| 405 | + return None |
| 406 | + return {"current": _view_name(pattern, current), |
| 407 | + "views": [_view_name(pattern, view_id) for view_id in view_ids]} |
| 408 | + |
| 409 | + def set_view(self, view="", name=None, role=None, app_name=None, |
| 410 | + automation_id=None): |
| 411 | + pattern = self._multiple_view(name, role, app_name, automation_id) |
| 412 | + if pattern is None: |
| 413 | + return False |
| 414 | + try: |
| 415 | + for view_id in pattern.GetCurrentSupportedViews(): |
| 416 | + if _view_name(pattern, view_id) == str(view): |
| 417 | + pattern.SetCurrentView(int(view_id)) |
| 418 | + return True |
| 419 | + except (OSError, AttributeError, ValueError, TypeError): |
| 420 | + return False |
| 421 | + return False |
| 422 | + |
373 | 423 | def get_table_headers(self, name=None, role=None, app_name=None, |
374 | 424 | automation_id=None) -> Optional[Dict[str, Any]]: |
375 | 425 | raw = self._find_raw(name, role, app_name, automation_id) |
@@ -511,6 +561,14 @@ def _read_row(pattern, row: int, cols: int): |
511 | 561 | return cells |
512 | 562 |
|
513 | 563 |
|
| 564 | +def _view_name(pattern, view_id) -> str: |
| 565 | + """Return a MultipleViewPattern view's name, or '' on failure.""" |
| 566 | + try: |
| 567 | + return str(pattern.GetViewName(int(view_id)) or "") |
| 568 | + except (OSError, AttributeError, ValueError, TypeError): |
| 569 | + return "" |
| 570 | + |
| 571 | + |
514 | 572 | def _header_names(array) -> List[str]: |
515 | 573 | """Read an IUIAutomationElementArray of header elements into name strings.""" |
516 | 574 | names: List[str] = [] |
|
0 commit comments