%PDF- %PDF-
| Direktori : /lib/python3/dist-packages/orca/ |
| Current File : //lib/python3/dist-packages/orca/speech_and_verbosity_manager.py |
# Orca
#
# Copyright 2005-2008 Sun Microsystems Inc.
# Copyright 2011-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 configuring speech and verbosity settings."""
__id__ = "$Id$"
__version__ = "$Revision$"
__date__ = "$Date$"
__copyright__ = "Copyright (c) 2005-2008 Sun Microsystems Inc." \
"Copyright (c) 2016-2023 Igalia, S.L."
__license__ = "LGPL"
from . import cmdnames
from . import debug
from . import focus_manager
from . import input_event
from . import keybindings
from . import messages
from . import settings
from . import settings_manager
from . import speech
from .ax_table import AXTable
_settings_manager = settings_manager.getManager()
class SpeechAndVerbosityManager:
"""Configures speech and verbosity settings."""
def __init__(self):
self._handlers = self.get_handlers(True)
self._bindings = keybindings.KeyBindings()
def get_bindings(self, refresh=False, is_desktop=True):
"""Returns the speech and verbosity manager keybindings."""
if refresh:
msg = "SPEECH AND VERBOSITY MANAGER: Refreshing bindings."
debug.printMessage(debug.LEVEL_INFO, msg, True)
self._setup_bindings()
elif self._bindings.isEmpty():
self._setup_bindings()
return self._bindings
def get_handlers(self, refresh=False):
"""Returns the speech and verbosity manager handlers."""
if refresh:
msg = "SPEECH AND VERBOSITY MANAGER: Refreshing handlers."
debug.printMessage(debug.LEVEL_INFO, msg, True)
self._setup_handlers()
return self._handlers
def _setup_handlers(self):
"""Sets up the speech and verbosity input event handlers."""
self._handlers = {}
self._handlers["cycleCapitalizationStyleHandler"] = \
input_event.InputEventHandler(
self.cycle_capitalization_style,
cmdnames.CYCLE_CAPITALIZATION_STYLE)
self._handlers["cycleSpeakingPunctuationLevelHandler"] = \
input_event.InputEventHandler(
self.cycle_punctuation_level,
cmdnames.CYCLE_PUNCTUATION_LEVEL)
self._handlers["cycleSynthesizerHandler"] = \
input_event.InputEventHandler(
self.cycle_synthesizer,
cmdnames.CYCLE_SYNTHESIZER)
self._handlers["cycleKeyEchoHandler"] = \
input_event.InputEventHandler(
self.cycle_key_echo,
cmdnames.CYCLE_KEY_ECHO)
self._handlers["changeNumberStyleHandler"] = \
input_event.InputEventHandler(
self.change_number_style,
cmdnames.CHANGE_NUMBER_STYLE)
self._handlers["toggleSilenceSpeechHandler"] = \
input_event.InputEventHandler(
self.toggle_speech,
cmdnames.TOGGLE_SPEECH)
self._handlers["toggleSpeechVerbosityHandler"] = \
input_event.InputEventHandler(
self.toggle_verbosity,
cmdnames.TOGGLE_SPEECH_VERBOSITY)
self._handlers["toggleSpeakingIndentationJustificationHandler"] = \
input_event.InputEventHandler(
self.toggle_indentation_and_justification,
cmdnames.TOGGLE_SPOKEN_INDENTATION_AND_JUSTIFICATION)
self._handlers["toggleTableCellReadModeHandler"] = \
input_event.InputEventHandler(
self.toggle_table_cell_reading_mode,
cmdnames.TOGGLE_TABLE_CELL_READ_MODE)
self._handlers["decreaseSpeechRateHandler"] = \
input_event.InputEventHandler(
self.decrease_rate,
cmdnames.DECREASE_SPEECH_RATE)
self._handlers["increaseSpeechRateHandler"] = \
input_event.InputEventHandler(
self.increase_rate,
cmdnames.INCREASE_SPEECH_RATE)
self._handlers["decreaseSpeechPitchHandler"] = \
input_event.InputEventHandler(
self.decrease_pitch,
cmdnames.DECREASE_SPEECH_PITCH)
self._handlers["increaseSpeechPitchHandler"] = \
input_event.InputEventHandler(
self.increase_pitch,
cmdnames.INCREASE_SPEECH_PITCH)
self._handlers["decreaseSpeechVolumeHandler"] = \
input_event.InputEventHandler(
self.decrease_volume,
cmdnames.DECREASE_SPEECH_VOLUME)
self._handlers["increaseSpeechVolumeHandler"] = \
input_event.InputEventHandler(
self.increase_volume,
cmdnames.INCREASE_SPEECH_VOLUME)
msg = "SPEECH AND VERBOSITY MANAGER: Handlers set up."
debug.printMessage(debug.LEVEL_INFO, msg, True)
def _setup_bindings(self):
"""Sets up the speech and verbosity key bindings."""
self._bindings = keybindings.KeyBindings()
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("cycleCapitalizationStyleHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("cycleSpeakingPunctuationLevelHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("cycleSynthesizerHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("cycleKeyEchoHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("changeNumberStyleHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("decreaseSpeechRateHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("increaseSpeechRateHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("decreaseSpeechPitchHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("increaseSpeechPitchHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("decreaseSpeechVolumeHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("increaseSpeechVolumeHandler")))
self._bindings.add(
keybindings.KeyBinding(
"",
keybindings.defaultModifierMask,
keybindings.NO_MODIFIER_MASK,
self._handlers.get("toggleSpeakingIndentationJustificationHandler")))
self._bindings.add(
keybindings.KeyBinding(
"s",
keybindings.defaultModifierMask,
keybindings.ORCA_MODIFIER_MASK,
self._handlers.get("toggleSilenceSpeechHandler")))
self._bindings.add(
keybindings.KeyBinding(
"v",
keybindings.defaultModifierMask,
keybindings.ORCA_MODIFIER_MASK,
self._handlers.get("toggleSpeechVerbosityHandler")))
self._bindings.add(
keybindings.KeyBinding(
"F11",
keybindings.defaultModifierMask,
keybindings.ORCA_MODIFIER_MASK,
self._handlers.get("toggleTableCellReadModeHandler")))
msg = "SPEECH AND VERBOSITY MANAGER: Bindings set up."
debug.printMessage(debug.LEVEL_INFO, msg, True)
def _get_server(self):
return speech.getSpeechServer()
def decrease_rate(self, script, event=None):
"""Decreases the speech rate"""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.decreaseSpeechRate()
return True
def increase_rate(self, script, event=None):
"""Increases the speech rate"""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.increaseSpeechRate()
return True
def decrease_pitch(self, script, event=None):
"""Decreases the speech pitch"""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.decreaseSpeechPitch()
return True
def increase_pitch(self, script, event=None):
"""Increase the speech pitch"""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.increaseSpeechPitch()
return True
def decrease_volume(self, script, event=None):
"""Decreases the speech volume"""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.decreaseSpeechVolume()
return True
def increase_volume(self, script, event=None):
"""Increases the speech volume"""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.increaseSpeechVolume()
return True
def update_capitalization_style(self):
"""Updates the capitalization style based on the value in settings."""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.updateCapitalizationStyle()
return True
def update_punctuation_level(self):
"""Updates the punctuation level based on the value in settings."""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
server.updatePunctuationLevel()
return True
def cycle_synthesizer(self, script, event=None):
"""Cycle through the speech-dispatcher's available output modules."""
server = self._get_server()
if server is None:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get speech server."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
available = server.list_output_modules()
if not available:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get output modules."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
current = server.getOutputModule()
if not current:
msg = "SPEECH AND VERBOSITY MANAGER: Cannot get current output module."
debug.printMessage(debug.LEVEL_INFO, msg, True)
return True
index = available.index(current) + 1
if index == len(available):
index = 0
server.setOutputModule(available[index])
script.presentMessage(available[index])
return True
def cycle_capitalization_style(self, script, event=None):
"""Cycle through the speech-dispatcher capitalization styles."""
current_style = _settings_manager.getSetting('capitalizationStyle')
if current_style == settings.CAPITALIZATION_STYLE_NONE:
new_style = settings.CAPITALIZATION_STYLE_SPELL
full = messages.CAPITALIZATION_SPELL_FULL
brief = messages.CAPITALIZATION_SPELL_BRIEF
elif current_style == settings.CAPITALIZATION_STYLE_SPELL:
new_style = settings.CAPITALIZATION_STYLE_ICON
full = messages.CAPITALIZATION_ICON_FULL
brief = messages.CAPITALIZATION_ICON_BRIEF
else:
new_style = settings.CAPITALIZATION_STYLE_NONE
full = messages.CAPITALIZATION_NONE_FULL
brief = messages.CAPITALIZATION_NONE_BRIEF
_settings_manager.setSetting('capitalizationStyle', new_style)
script.presentMessage(full, brief)
self.update_capitalization_style()
return True
def cycle_punctuation_level(self, script, event=None):
"""Cycle through the punctuation levels for speech."""
current_level = _settings_manager.getSetting('verbalizePunctuationStyle')
if current_level == settings.PUNCTUATION_STYLE_NONE:
new_level = settings.PUNCTUATION_STYLE_SOME
full = messages.PUNCTUATION_SOME_FULL
brief = messages.PUNCTUATION_SOME_BRIEF
elif current_level == settings.PUNCTUATION_STYLE_SOME:
new_level = settings.PUNCTUATION_STYLE_MOST
full = messages.PUNCTUATION_MOST_FULL
brief = messages.PUNCTUATION_MOST_BRIEF
elif current_level == settings.PUNCTUATION_STYLE_MOST:
new_level = settings.PUNCTUATION_STYLE_ALL
full = messages.PUNCTUATION_ALL_FULL
brief = messages.PUNCTUATION_ALL_BRIEF
else:
new_level = settings.PUNCTUATION_STYLE_NONE
full = messages.PUNCTUATION_NONE_FULL
brief = messages.PUNCTUATION_NONE_BRIEF
_settings_manager.setSetting('verbalizePunctuationStyle', new_level)
script.presentMessage(full, brief)
self.update_punctuation_level()
return True
def cycle_key_echo(self, script, event=None):
"""Cycle through the key echo levels."""
(new_key, new_word, new_sentence) = (False, False, False)
key = _settings_manager.getSetting('enableKeyEcho')
word = _settings_manager.getSetting('enableEchoByWord')
sentence = _settings_manager.getSetting('enableEchoBySentence')
if (key, word, sentence) == (False, False, False):
(new_key, new_word, new_sentence) = (True, False, False)
full = messages.KEY_ECHO_KEY_FULL
brief = messages.KEY_ECHO_KEY_BRIEF
elif (key, word, sentence) == (True, False, False):
(new_key, new_word, new_sentence) = (False, True, False)
full = messages.KEY_ECHO_WORD_FULL
brief = messages.KEY_ECHO_WORD_BRIEF
elif (key, word, sentence) == (False, True, False):
(new_key, new_word, new_sentence) = (False, False, True)
full = messages.KEY_ECHO_SENTENCE_FULL
brief = messages.KEY_ECHO_SENTENCE_BRIEF
elif (key, word, sentence) == (False, False, True):
(new_key, new_word, new_sentence) = (True, True, False)
full = messages.KEY_ECHO_KEY_AND_WORD_FULL
brief = messages.KEY_ECHO_KEY_AND_WORD_BRIEF
elif (key, word, sentence) == (True, True, False):
(new_key, new_word, new_sentence) = (False, True, True)
full = messages.KEY_ECHO_WORD_AND_SENTENCE_FULL
brief = messages.KEY_ECHO_WORD_AND_SENTENCE_BRIEF
else:
(new_key, new_word, new_sentence) = (False, False, False)
full = messages.KEY_ECHO_NONE_FULL
brief = messages.KEY_ECHO_NONE_BRIEF
_settings_manager.setSetting('enableKeyEcho', new_key)
_settings_manager.setSetting('enableEchoByWord', new_word)
_settings_manager.setSetting('enableEchoBySentence', new_sentence)
script.presentMessage(full, brief)
return True
def change_number_style(self, script, event=None):
"""Changes spoken number style between digits and words."""
speak_digits = _settings_manager.getSetting('speakNumbersAsDigits')
if speak_digits:
brief = messages.NUMBER_STYLE_WORDS_BRIEF
full = messages.NUMBER_STYLE_WORDS_FULL
else:
brief = messages.NUMBER_STYLE_DIGITS_BRIEF
full = messages.NUMBER_STYLE_DIGITS_FULL
_settings_manager.setSetting('speakNumbersAsDigits', not speak_digits)
script.presentMessage(full, brief)
return True
def toggle_speech(self, script, event=None):
"""Toggles speech."""
script.presentationInterrupt()
if _settings_manager.getSetting('silenceSpeech'):
_settings_manager.setSetting('silenceSpeech', False)
script.presentMessage(messages.SPEECH_ENABLED)
elif not _settings_manager.getSetting('enableSpeech'):
_settings_manager.setSetting('enableSpeech', True)
speech.init()
script.presentMessage(messages.SPEECH_ENABLED)
else:
script.presentMessage(messages.SPEECH_DISABLED)
_settings_manager.setSetting('silenceSpeech', True)
return True
def toggle_verbosity(self, script, event=None):
"""Toggles speech verbosity level between verbose and brief."""
value = _settings_manager.getSetting('speechVerbosityLevel')
if value == settings.VERBOSITY_LEVEL_BRIEF:
script.presentMessage(messages.SPEECH_VERBOSITY_VERBOSE)
_settings_manager.setSetting('speechVerbosityLevel', settings.VERBOSITY_LEVEL_VERBOSE)
else:
script.presentMessage(messages.SPEECH_VERBOSITY_BRIEF)
_settings_manager.setSetting('speechVerbosityLevel', settings.VERBOSITY_LEVEL_BRIEF)
return True
def toggle_indentation_and_justification(self, script, event=None):
"""Toggles the speaking of indentation and justification."""
value = _settings_manager.getSetting('enableSpeechIndentation')
_settings_manager.setSetting('enableSpeechIndentation', not value)
if _settings_manager.getSetting('enableSpeechIndentation'):
full = messages.INDENTATION_JUSTIFICATION_ON_FULL
brief = messages.INDENTATION_JUSTIFICATION_ON_BRIEF
else:
full = messages.INDENTATION_JUSTIFICATION_OFF_FULL
brief = messages.INDENTATION_JUSTIFICATION_OFF_BRIEF
script.presentMessage(full, brief)
return True
def toggle_table_cell_reading_mode(self, script, event=None):
"""Toggles between speak cell and speak row."""
table = AXTable.get_table(focus_manager.getManager().get_locus_of_focus())
if table is None:
script.presentMessage(messages.TABLE_NOT_IN_A)
return True
if not script.utilities.getDocumentForObject(table):
setting_name = 'readFullRowInGUITable'
elif script.utilities.isSpreadSheetTable(table):
setting_name = 'readFullRowInSpreadSheet'
else:
setting_name = 'readFullRowInDocumentTable'
speak_row = _settings_manager.getSetting(setting_name)
_settings_manager.setSetting(setting_name, not speak_row)
if not speak_row:
msg = messages.TABLE_MODE_ROW
else:
msg = messages.TABLE_MODE_CELL
script.presentMessage(msg)
return True
_manager = SpeechAndVerbosityManager()
def getManager():
"""Returns the Speech and Verbosity Manager"""
return _manager