%PDF- %PDF-
Direktori : /lib/python3/dist-packages/orca/ |
Current File : //lib/python3/dist-packages/orca/flat_review_presenter.py |
# Orca # # Copyright 2005-2008 Sun Microsystems Inc. # Copyright 2016-2023 Igalia, S.L. # # 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. """Module for flat-review commands""" __id__ = "$Id$" __version__ = "$Revision$" __date__ = "$Date$" __copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc." \ "Copyright (c) 2016-2023 Igalia, S.L." __license__ = "LGPL" import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from . import braille from . import cmdnames from . import debug from . import flat_review from . import focus_manager from . import guilabels from . import input_event from . import keybindings from . import messages from . import orca_state from . import script_manager from . import settings_manager from . import settings class FlatReviewPresenter: """Provides access to on-screen objects via flat-review.""" def __init__(self): self._context = None self._current_contents = "" self._restrict = settings_manager.getManager().getSetting("flatReviewIsRestricted") self._handlers = self.get_handlers(True) self._desktop_bindings = keybindings.KeyBindings() self._laptop_bindings = keybindings.KeyBindings() self._gui = None def is_active(self): """Returns True if the flat review presenter is active.""" return self._context is not None def get_or_create_context(self, script=None): """Returns the flat review context, creating one if necessary.""" # TODO - JD: Scripts should not be able to interact with the # context directly. get_or_create_context is public temporarily # to prevent breakage. if not self._context: msg = f"FLAT REVIEW PRESENTER: Creating new context. Restrict: {self._restrict}" debug.printMessage(debug.LEVEL_INFO, msg, True) if self._restrict: mode, obj = focus_manager.getManager().get_active_mode_and_object_of_interest() self._context = flat_review.Context(script, root=obj) else: self._context = flat_review.Context(script) focus_manager.getManager().emit_region_changed( self._context.getCurrentAccessible(), mode=focus_manager.FLAT_REVIEW) if script is not None: script.justEnteredFlatReviewMode = True script.targetCursorCell = script.getBrailleCursorCell() return self._context msg = f"FLAT REVIEW PRESENTER: Using existing context. Restrict: {self._restrict}" debug.printMessage(debug.LEVEL_INFO, msg, True) # If we are in unrestricted mode, update the context as below. # If the context already exists, but the active mode is not flat review, update # the flat review location to that of the object of interest -- if the object of # interest is in the flat review context (which means it's on screen). In some # cases the object of interest will not be in the flat review context because it # is represented by descendant text objects. setCurrentToZoneWithObject checks # for this condition and if it can find a zone whose ancestor is the object of # interest, it will set the current zone to the descendant, causing Orca to # present the text at the location of the object of interest. mode, obj = focus_manager.getManager().get_active_mode_and_object_of_interest() obj = obj or focus_manager.getManager().get_locus_of_focus() if mode != focus_manager.FLAT_REVIEW and obj != self._context.getCurrentAccessible() \ and not self._restrict: tokens = ["FLAT REVIEW PRESENTER: Attempting to update location from", self._context.getCurrentAccessible(), "to", obj] debug.printTokens(debug.LEVEL_INFO, tokens, True) self._context.setCurrentToZoneWithObject(obj) # If we are restricting, and the current mode is not flat review, calculate a new context if self._restrict and mode != focus_manager.FLAT_REVIEW: msg = "FLAT REVIEW PRESENTER: Creating new restricted context." debug.printMessage(debug.LEVEL_INFO, msg, True) self._context = flat_review.Context(script, obj) return self._context def get_bindings(self, refresh=False, is_desktop=True): """Returns the flat-review-presenter keybindings.""" if refresh: msg = "FLAT REVIEW PRESENTER: Refreshing bindings." debug.printMessage(debug.LEVEL_INFO, msg, True) self._setup_bindings() elif is_desktop and self._desktop_bindings.isEmpty(): self._setup_bindings() elif not is_desktop and self._laptop_bindings.isEmpty(): self._setup_bindings() if is_desktop: return self._desktop_bindings return self._laptop_bindings def get_braille_bindings(self): """Returns the flat-review-presenter braille bindings.""" bindings = {} try: bindings[braille.brlapi.KEY_CMD_LNUP] = \ self._handlers.get("reviewAboveHandler") bindings[braille.brlapi.KEY_CMD_LNDN] = \ self._handlers.get("reviewBelowHandler") bindings[braille.brlapi.KEY_CMD_FREEZE] = \ self._handlers.get("toggleFlatReviewModeHandler") bindings[braille.brlapi.KEY_CMD_TOP_LEFT] = \ self._handlers.get("reviewHomeHandler") bindings[braille.brlapi.KEY_CMD_BOT_LEFT] = \ self._handlers.get("reviewBottomLeftHandler") except Exception as error: tokens = ["FLAT REVIEW PRESENTER: Exception getting braille bindings:", error] debug.printTokens(debug.LEVEL_INFO, tokens, True) return {} return bindings def get_handlers(self, refresh=False): """Returns the flat-review-presenter handlers.""" if refresh: msg = "WHERE AM I PRESENTER: Refreshing handlers." debug.printMessage(debug.LEVEL_INFO, msg, True) self._setup_handlers() return self._handlers def _setup_bindings(self): """Sets up the flat-review-presenter key bindings.""" self._setup_desktop_bindings() self._setup_laptop_bindings() def _setup_handlers(self): """Sets up the flat-review-presenter input event handlers.""" self._handlers = {} self._handlers["toggleFlatReviewModeHandler"] = \ input_event.InputEventHandler( self.toggle_flat_review_mode, cmdnames.TOGGLE_FLAT_REVIEW) self._handlers["reviewHomeHandler"] = \ input_event.InputEventHandler( self.go_home, cmdnames.REVIEW_HOME) self._handlers["reviewEndHandler"] = \ input_event.InputEventHandler( self.go_end, cmdnames.REVIEW_END) self._handlers["reviewBottomLeftHandler"] = \ input_event.InputEventHandler( self.go_bottom_left, cmdnames.REVIEW_BOTTOM_LEFT) self._handlers["reviewPreviousLineHandler"] = \ input_event.InputEventHandler( self.go_previous_line, cmdnames.REVIEW_PREVIOUS_LINE) self._handlers["reviewCurrentLineHandler"] = \ input_event.InputEventHandler( self.present_line, cmdnames.REVIEW_CURRENT_LINE) self._handlers["reviewNextLineHandler"] = \ input_event.InputEventHandler( self.go_next_line, cmdnames.REVIEW_NEXT_LINE) self._handlers["reviewSpellCurrentLineHandler"] = \ input_event.InputEventHandler( self.spell_line, cmdnames.REVIEW_SPELL_CURRENT_LINE) self._handlers["reviewPhoneticCurrentLineHandler"] = \ input_event.InputEventHandler( self.phonetic_line, cmdnames.REVIEW_PHONETIC_CURRENT_LINE) self._handlers["reviewEndOfLineHandler"] = \ input_event.InputEventHandler( self.go_end_of_line, cmdnames.REVIEW_END_OF_LINE) self._handlers["reviewPreviousItemHandler"] = \ input_event.InputEventHandler( self.go_previous_item, cmdnames.REVIEW_PREVIOUS_ITEM) self._handlers["reviewCurrentItemHandler"] = \ input_event.InputEventHandler( self.present_item, cmdnames.REVIEW_CURRENT_ITEM) self._handlers["reviewNextItemHandler"] = \ input_event.InputEventHandler( self.go_next_item, cmdnames.REVIEW_NEXT_ITEM) self._handlers["reviewSpellCurrentItemHandler"] = \ input_event.InputEventHandler( self.spell_item, cmdnames.REVIEW_SPELL_CURRENT_ITEM) self._handlers["reviewPhoneticCurrentItemHandler"] = \ input_event.InputEventHandler( self.phonetic_item, cmdnames.REVIEW_PHONETIC_CURRENT_ITEM) self._handlers["reviewPreviousCharacterHandler"] = \ input_event.InputEventHandler( self.go_previous_character, cmdnames.REVIEW_PREVIOUS_CHARACTER) self._handlers["reviewCurrentCharacterHandler"] = \ input_event.InputEventHandler( self.present_character, cmdnames.REVIEW_CURRENT_CHARACTER) self._handlers["reviewSpellCurrentCharacterHandler"] = \ input_event.InputEventHandler( self.spell_character, cmdnames.REVIEW_SPELL_CURRENT_CHARACTER) self._handlers["reviewUnicodeCurrentCharacterHandler"] = \ input_event.InputEventHandler( self.unicode_current_character, cmdnames.REVIEW_UNICODE_CURRENT_CHARACTER) self._handlers["reviewNextCharacterHandler"] = \ input_event.InputEventHandler( self.go_next_character, cmdnames.REVIEW_NEXT_CHARACTER) self._handlers["reviewCurrentAccessibleHandler"] = \ input_event.InputEventHandler( self.present_object, cmdnames.REVIEW_CURRENT_ACCESSIBLE) self._handlers["reviewAboveHandler"] = \ input_event.InputEventHandler( self.go_above, cmdnames.REVIEW_ABOVE) self._handlers["reviewBelowHandler"] = \ input_event.InputEventHandler( self.go_below, cmdnames.REVIEW_BELOW) self._handlers["showContentsHandler"] = \ input_event.InputEventHandler( self.show_contents, cmdnames.FLAT_REVIEW_SHOW_CONTENTS) self._handlers["flatReviewCopyHandler"] = \ input_event.InputEventHandler( self.copy_to_clipboard, cmdnames.FLAT_REVIEW_COPY) self._handlers["flatReviewAppendHandler"] = \ input_event.InputEventHandler( self.append_to_clipboard, cmdnames.FLAT_REVIEW_APPEND) self._handlers["flatReviewSayAllHandler"] = \ input_event.InputEventHandler( self.say_all, cmdnames.SAY_ALL_FLAT_REVIEW) self._handlers["flatReviewToggleRestrictHandler"] = \ input_event.InputEventHandler( self.toggle_restrict, cmdnames.TOGGLE_RESTRICT_FLAT_REVIEW) msg = "FLAT REVIEW PRESENTER: Handlers set up." debug.printMessage(debug.LEVEL_INFO, msg, True) def _setup_desktop_bindings(self): """Sets up the flat-review-presenter desktop key bindings.""" self._desktop_bindings = keybindings.KeyBindings() self._desktop_bindings.add( keybindings.KeyBinding( "KP_Subtract", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("toggleFlatReviewModeHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Add", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewSayAllHandler"), 2)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Home", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewHomeHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Home", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewPreviousLineHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Up", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewCurrentLineHandler"), 1)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Up", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewSpellCurrentLineHandler"), 2)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Up", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewPhoneticCurrentLineHandler"), 3)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Page_Up", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewNextLineHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Page_Up", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewEndHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Left", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewPreviousItemHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Left", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewAboveHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Begin", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewCurrentItemHandler"), 1)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Begin", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewSpellCurrentItemHandler"), 2)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Begin", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewPhoneticCurrentItemHandler"), 3)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Begin", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewCurrentAccessibleHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Right", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewNextItemHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Right", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewBelowHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_End", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewPreviousCharacterHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_End", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewEndOfLineHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Down", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewCurrentCharacterHandler"), 1)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Down", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewSpellCurrentCharacterHandler"), 2)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Down", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewUnicodeCurrentCharacterHandler"), 3)) self._desktop_bindings.add( keybindings.KeyBinding( "KP_Page_Down", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("reviewNextCharacterHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("showContentsHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewCopyHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewAppendHandler"))) self._desktop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewToggleRestrictHandler"))) msg = "FLAT REVIEW PRESENTER: Desktop bindings set up." debug.printMessage(debug.LEVEL_INFO, msg, True) def _setup_laptop_bindings(self): """Sets up and returns the flat-review-presenter laptop key bindings.""" self._laptop_bindings = keybindings.KeyBindings() self._laptop_bindings.add( keybindings.KeyBinding( "p", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("toggleFlatReviewModeHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "semicolon", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("flatReviewSayAllHandler"), 2)) self._laptop_bindings.add( keybindings.KeyBinding( "u", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewPreviousLineHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "u", keybindings.defaultModifierMask, keybindings.ORCA_CTRL_MODIFIER_MASK, self._handlers.get("reviewHomeHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "i", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewCurrentLineHandler"), 1)) self._laptop_bindings.add( keybindings.KeyBinding( "i", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewSpellCurrentLineHandler"), 2)) self._laptop_bindings.add( keybindings.KeyBinding( "i", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewPhoneticCurrentLineHandler"), 3)) self._laptop_bindings.add( keybindings.KeyBinding( "o", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewNextLineHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "o", keybindings.defaultModifierMask, keybindings.ORCA_CTRL_MODIFIER_MASK, self._handlers.get("reviewEndHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "j", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewPreviousItemHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "j", keybindings.defaultModifierMask, keybindings.ORCA_CTRL_MODIFIER_MASK, self._handlers.get("reviewAboveHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "k", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewCurrentItemHandler"), 1)) self._laptop_bindings.add( keybindings.KeyBinding( "k", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewSpellCurrentItemHandler"), 2)) self._laptop_bindings.add( keybindings.KeyBinding( "k", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewPhoneticCurrentItemHandler"), 3)) self._laptop_bindings.add( keybindings.KeyBinding( "k", keybindings.defaultModifierMask, keybindings.ORCA_CTRL_MODIFIER_MASK, self._handlers.get("reviewCurrentAccessibleHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "l", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewNextItemHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "l", keybindings.defaultModifierMask, keybindings.ORCA_CTRL_MODIFIER_MASK, self._handlers.get("reviewBelowHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "m", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewPreviousCharacterHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "m", keybindings.defaultModifierMask, keybindings.ORCA_CTRL_MODIFIER_MASK, self._handlers.get("reviewEndOfLineHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "comma", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewCurrentCharacterHandler"), 1)) self._laptop_bindings.add( keybindings.KeyBinding( "comma", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewSpellCurrentCharacterHandler"), 2)) self._laptop_bindings.add( keybindings.KeyBinding( "comma", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewUnicodeCurrentCharacterHandler"), 3)) self._laptop_bindings.add( keybindings.KeyBinding( "period", keybindings.defaultModifierMask, keybindings.ORCA_MODIFIER_MASK, self._handlers.get("reviewNextCharacterHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("showContentsHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewCopyHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewAppendHandler"))) self._laptop_bindings.add( keybindings.KeyBinding( "", keybindings.defaultModifierMask, keybindings.NO_MODIFIER_MASK, self._handlers.get("flatReviewToggleRestrictHandler"))) msg = "FLAT REVIEW PRESENTER: Laptop bindings set up." debug.printMessage(debug.LEVEL_INFO, msg, True) def start(self, script=None, event=None): """Starts flat review.""" if self._context: msg = "FLAT REVIEW PRESENTER: Already in flat review" debug.printMessage(debug.LEVEL_INFO, msg, True) return msg = "FLAT REVIEW PRESENTER: Starting flat review" debug.printMessage(debug.LEVEL_INFO, msg, True) if script is None: script = script_manager.getManager().getActiveScript() self.get_or_create_context(script) if event is None: return if settings_manager.getManager().getSetting('speechVerbosityLevel') \ != settings.VERBOSITY_LEVEL_BRIEF: script.presentMessage(messages.FLAT_REVIEW_START) self._item_presentation(script, event, script.targetCursorCell) def quit(self, script=None, event=None): """Quits flat review.""" if self._context is None: msg = "FLAT REVIEW PRESENTER: Not in flat review" debug.printMessage(debug.LEVEL_INFO, msg, True) return msg = "FLAT REVIEW PRESENTER: Quitting flat review" debug.printMessage(debug.LEVEL_INFO, msg, True) self._context = None focus = focus_manager.getManager().get_locus_of_focus() focus_manager.getManager().emit_region_changed(focus, mode=focus_manager.FOCUS_TRACKING) if event is None or script is None: return if settings_manager.getManager().getSetting('speechVerbosityLevel') \ != settings.VERBOSITY_LEVEL_BRIEF: script.presentMessage(messages.FLAT_REVIEW_STOP) script.updateBraille(focus) def toggle_flat_review_mode(self, script, event=None): """Toggles between flat review mode and focus tracking mode.""" if self.is_active(): self.quit(script, event) return True self.start(script, event) return True def go_home(self, script, event=None): """Moves to the top left of the current window.""" self._context = self.get_or_create_context(script) self._context.goBegin(flat_review.Context.WINDOW) self.present_line(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def go_end(self, script, event=None): """Moves to the bottom right of the current window.""" self._context = self.get_or_create_context(script) self._context.goEnd(flat_review.Context.WINDOW) self.present_line(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def go_bottom_left(self, script, event=None): """Moves to the bottom left of the current window.""" self._context = self.get_or_create_context(script) self._context.goEnd(flat_review.Context.WINDOW) self._context.goBegin(flat_review.Context.LINE) self.present_line(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def go_previous_line(self, script, event=None): """Moves to the previous line.""" self._context = self.get_or_create_context(script) if self._context.goPrevious(flat_review.Context.LINE, flat_review.Context.WRAP_LINE): self.present_line(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def present_line(self, script, event=None): """Presents the current line.""" self._line_presentation(script, event, 1) return True def go_next_line(self, script, event=None): """Moves to the next line.""" self._context = self.get_or_create_context(script) if self._context.goNext(flat_review.Context.LINE, flat_review.Context.WRAP_LINE): self.present_line(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def spell_line(self, script, event=None): """Presents the current line letter by letter.""" self._line_presentation(script, event, 2) return True def phonetic_line(self, script, event=None): """Presents the current line letter by letter phonetically.""" self._line_presentation(script, event, 3) return True def go_start_of_line(self, script, event=None): """Moves to the beginning of the current line.""" self._context = self.get_or_create_context(script) self._context.goEnd(flat_review.Context.LINE) self.present_character(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def go_end_of_line(self, script, event=None): """Moves to the end of the line.""" self._context = self.get_or_create_context(script) self._context.goEnd(flat_review.Context.LINE) self.present_character(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def go_previous_item(self, script, event=None): """Moves to the previous item or word.""" self._context = self.get_or_create_context(script) if self._context.goPrevious(flat_review.Context.WORD, flat_review.Context.WRAP_LINE): self.present_item(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def present_item(self, script, event=None, target_cursor_cell=0): """Presents the current item/word.""" self._item_presentation(script, event, target_cursor_cell, 1) return True def go_next_item(self, script, event=None): """Moves to the next item or word.""" self._context = self.get_or_create_context(script) if self._context.goNext(flat_review.Context.WORD, flat_review.Context.WRAP_LINE): self.present_item(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def spell_item(self, script, event=None): """Presents the current item/word letter by letter.""" self._item_presentation(script, event, script.targetCursorCell, 2) return True def phonetic_item(self, script, event=None): """Presents the current word letter by letter phonetically.""" self._item_presentation(script, event, script.targetCursorCell, 3) return True def go_previous_character(self, script, event=None): """Moves to the previous character.""" self._context = self.get_or_create_context(script) if self._context.goPrevious(flat_review.Context.CHAR, flat_review.Context.WRAP_LINE): self.present_character(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def present_character(self, script, event=None): """Presents the current character.""" self._character_presentation(script, event, 1) return True def go_next_character(self, script, event=None): """Moves to the next character.""" self._context = self.get_or_create_context(script) if self._context.goNext(flat_review.Context.CHAR, flat_review.Context.WRAP_LINE): self.present_character(script, event) script.targetCursorCell = script.getBrailleCursorCell() return True def spell_character(self, script, event=None): """Presents the current character phonetically.""" self._character_presentation(script, event, 2) return True def unicode_current_character(self, script, event=None): """Presents the current character's unicode value.""" self._character_presentation(script, event, 3) return True def go_above(self, script, event=None): """Moves to the character above.""" self._context = self.get_or_create_context(script) if self._context.goAbove(flat_review.Context.CHAR, flat_review.Context.WRAP_LINE): self.present_item(script, event, script.targetCursorCell) return True def go_below(self, script, event=None): """Moves to the character below.""" self._context = self.get_or_create_context(script) if self._context.goBelow(flat_review.Context.CHAR, flat_review.Context.WRAP_LINE): self.present_item(script, event, script.targetCursorCell) return True def get_current_object(self, script, event=None): """Returns the current accessible object.""" self._context = self.get_or_create_context(script) return self._context.getCurrentAccessible() def present_object(self, script, event=None): """Presents the current accessible object.""" self._context = self.get_or_create_context(script) if not isinstance(event, input_event.BrailleEvent): script.presentObject(self._context.getCurrentAccessible(), speechonly=True) focus_manager.getManager().emit_region_changed( self._context.getCurrentAccessible(), mode=focus_manager.FLAT_REVIEW) return True def left_click_on_object(self, script, event=None): """Attempts to synthesize a left click on the current accessible.""" self._context = self.get_or_create_context(script) return self._context.clickCurrent(1) def right_click_on_object(self, script, event=None): """Attempts to synthesize a left click on the current accessible.""" self._context = self.get_or_create_context(script) return self._context.clickCurrent(3) def route_pointer_to_object(self, script, event=None): """Routes the mouse pointer to the current accessible.""" self._context = self.get_or_create_context(script) return self._context.routeToCurrent() def get_braille_regions(self, script, event=None): """Returns the braille regions and region with focus being reviewed.""" self._context = self.get_or_create_context(script) regions, focused_region = self._context.getCurrentBrailleRegions() return [regions, focused_region] def _get_all_lines(self, script, event=None): """Returns a list of textual lines representing the contents.""" lines = [] self._context = self.get_or_create_context(script) self._context.goBegin(flat_review.Context.WINDOW) string = self._context.getCurrent(flat_review.Context.LINE)[0] while string is not None: lines.append(string.rstrip("\n")) if not self._context.goNext(flat_review.Context.LINE, flat_review.Context.WRAP_LINE): break string = self._context.getCurrent(flat_review.Context.LINE)[0] return lines def say_all(self, script, event=None): """Speaks the contents of the entire window.""" for string in self._get_all_lines(script, event): if not string.isspace(): script.speakMessage(string, script.speechGenerator.voice(string=string)) return True def show_contents(self, script, event=None): """Displays the entire flat review contents in a text view.""" msg = "FLAT REVIEW PRESENTER: Showing contents." debug.printMessage(debug.LEVEL_INFO, msg, True) text = "\n".join(self._get_all_lines(script, event)) title = guilabels.FLAT_REVIEW_CONTENTS self._gui = FlatReviewContextGUI(script, title, text) self._gui.show_gui() return True def copy_to_clipboard(self, script, event=None): """Copies the string just presented to the clipboard.""" if not self.is_active(): script.presentMessage(messages.FLAT_REVIEW_NOT_IN) return True script.utilities.setClipboardText(self._current_contents.rstrip("\n")) script.presentMessage(messages.FLAT_REVIEW_COPIED) return True def append_to_clipboard(self, script, event=None): """Appends the string just presented to the clipboard.""" if not self.is_active(): script.presentMessage(messages.FLAT_REVIEW_NOT_IN) return True script.utilities.appendTextToClipboard(self._current_contents.rstrip("\n")) script.presentMessage(messages.FLAT_REVIEW_APPENDED) return True def toggle_restrict(self, script, event=None): """ Toggles the restricting of flat review to the current object. """ self._restrict = not self._restrict settings_manager.getManager().setSetting("flatReviewIsRestricted", self._restrict) if self._restrict: script.presentMessage(messages.FLAT_REVIEW_RESTRICTED) else: script.presentMessage(messages.FLAT_REVIEW_UNRESTRICTED) if self.is_active(): # Reset the context self._context = None self.start() return True def _line_presentation(self, script, event, speech_type=1): """Presents the current line.""" self._context = self.get_or_create_context(script) line_string = self._context.getCurrent(flat_review.Context.LINE)[0] or "" voice = script.speechGenerator.voice(string=line_string) if not isinstance(event, input_event.BrailleEvent): if not line_string or line_string == "\n": script.speakMessage(messages.BLANK) elif line_string.isspace(): script.speakMessage(messages.WHITE_SPACE) elif line_string.isupper() and (speech_type < 2 or speech_type > 3): script.speakMessage(line_string, voice) elif speech_type == 2: script.spellCurrentItem(line_string) elif speech_type == 3: script.phoneticSpellCurrentItem(line_string) else: line_string = script.utilities.adjustForRepeats(line_string) script.speakMessage(line_string, voice) focus_manager.getManager().emit_region_changed( self._context.getCurrentAccessible(), mode=focus_manager.FLAT_REVIEW) script.updateBrailleReview() self._current_contents = line_string return True def _item_presentation(self, script, event, target_cursor_cell=0, speech_type=1): """Presents the current item/word.""" self._context = self.get_or_create_context(script) word_string = self._context.getCurrent(flat_review.Context.WORD)[0] or "" voice = script.speechGenerator.voice(string=word_string) if not isinstance(event, input_event.BrailleEvent): if not word_string or word_string == "\n": script.speakMessage(messages.BLANK) else: line_string = self._context.getCurrent(flat_review.Context.LINE)[0] or "" if line_string == "\n": script.speakMessage(messages.BLANK) elif word_string.isspace(): script.speakMessage(messages.WHITE_SPACE) elif word_string.isupper() and speech_type == 1: script.speakMessage(word_string, voice) elif speech_type == 2: script.spellCurrentItem(word_string) elif speech_type == 3: script.phoneticSpellCurrentItem(word_string) elif speech_type == 1: word_string = script.utilities.adjustForRepeats(word_string) script.speakMessage(word_string, voice) focus_manager.getManager().emit_region_changed( self._context.getCurrentAccessible(), mode=focus_manager.FLAT_REVIEW) script.updateBrailleReview(target_cursor_cell) self._current_contents = word_string return True def _character_presentation(self, script, event, speech_type=1): """Presents the current character.""" self._context = self.get_or_create_context(script) char_string = self._context.getCurrent(flat_review.Context.CHAR)[0] or "" if not isinstance(event, input_event.BrailleEvent): if not char_string: script.speakMessage(messages.BLANK) else: line_string = self._context.getCurrent(flat_review.Context.LINE)[0] or "" if line_string == "\n" and speech_type != 3: script.speakMessage(messages.BLANK) elif speech_type == 3: script.speakUnicodeCharacter(char_string) elif speech_type == 2: script.phoneticSpellCurrentItem(char_string) else: script.speakCharacter(char_string) focus_manager.getManager().emit_region_changed( self._context.getCurrentAccessible(), mode=focus_manager.FLAT_REVIEW) script.updateBrailleReview() self._current_contents = char_string return True class FlatReviewContextGUI: """Presents the entire flat review context in a text view""" def __init__(self, script, title, text): self._script = script self._gui = self._create_dialog(title, text) def _create_dialog(self, title, text): """Creates the dialog.""" dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL, (Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)) dialog.set_default_size(800, 600) scrolled_window = Gtk.ScrolledWindow() scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) textbuffer = Gtk.TextBuffer() textbuffer.set_text(text) textbuffer.place_cursor(textbuffer.get_start_iter()) textview = Gtk.TextView(buffer=textbuffer) textview.set_wrap_mode(Gtk.WrapMode.WORD) scrolled_window.add(textview) scrolled_window.set_hexpand(True) scrolled_window.set_vexpand(True) dialog.get_content_area().pack_start(scrolled_window, True, True, 0) dialog.connect("response", self.on_response) return dialog def on_response(self, dialog, response): """Handler for the 'response' signal of the dialog.""" if response == Gtk.ResponseType.CLOSE: self._gui.destroy() def show_gui(self): """Shows the dialog.""" self._gui.show_all() time_stamp = orca_state.lastInputEvent.timestamp if time_stamp == 0: time_stamp = Gtk.get_current_event_time() self._gui.present_with_time(time_stamp) _presenter = FlatReviewPresenter() def getPresenter(): """Returns the Flat Review Presenter""" return _presenter