[orca] Make the progressbar update intervals independent
- From: Joanmarie Diggs <joanied src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [orca] Make the progressbar update intervals independent
- Date: Thu, 30 Jun 2016 06:19:55 +0000 (UTC)
commit b2c6ca1f4d4e1b1a56e9be20ba6c1986a871a0ba
Author: Joanmarie Diggs <jdiggs igalia com>
Date: Thu Jun 30 02:05:10 2016 -0400
Make the progressbar update intervals independent
Note that there is no change to the GUI yet. That can come later if
need be. In the meantime:
* The default value for beeps is 0.
* The default value for non-beeps (i.e. speech and braille) is 10.
* The "frequency" spin button controls only non-beeps.
* If you want to make beeps less frequent, or have different values for
speech and braille, you can accomplish this via orca-customizations.py
Example:
import orca.settings
orca.settings.progressBarBeepInterval = 1
orca.settings.progressBarSpeechInterval = 2
orca.settings.progressBarBrailleInterval = 3
src/orca/braille_generator.py | 21 +++++++++++---
src/orca/generator.py | 60 ++++++++++++++++++++++++++++++++++++++++-
src/orca/script_utilities.py | 44 ------------------------------
src/orca/scripts/default.py | 3 --
src/orca/settings.py | 3 ++
src/orca/sound_generator.py | 15 +++++++++-
src/orca/speech_generator.py | 21 +++++++++++---
7 files changed, 110 insertions(+), 57 deletions(-)
---
diff --git a/src/orca/braille_generator.py b/src/orca/braille_generator.py
index 552201b..e86cb2b 100644
--- a/src/orca/braille_generator.py
+++ b/src/orca/braille_generator.py
@@ -355,19 +355,19 @@ class BrailleGenerator(generator.Generator):
def _generateProgressBarIndex(self, obj, **args):
if not args.get('isProgressBarUpdate') \
- or not _settingsManager.getSetting('brailleProgressBarUpdates'):
+ or not self._shouldPresentProgressBarUpdate(obj, **args):
return []
- acc, updateTime, updateValue = self._script.utilities.getMostRecentProgressBarUpdate()
+ acc, updateTime, updateValue = self._getMostRecentProgressBarUpdate()
if acc != obj:
- number, count = self._script.utilities.getProgressBarNumberAndCount(obj)
+ number, count = self.getProgressBarNumberAndCount(obj)
return ['%s' % number]
return []
def _generateProgressBarValue(self, obj, **args):
if args.get('isProgressBarUpdate') \
- and not _settingsManager.getSetting('brailleProgressBarUpdates'):
+ and not self._shouldPresentProgressBarUpdate(obj, **args):
return []
percent = self._script.utilities.getValueAsPercent(obj)
@@ -376,6 +376,19 @@ class BrailleGenerator(generator.Generator):
return []
+ def _getProgressBarUpdateInterval(self):
+ interval = _settingsManager.getSetting('progressBarBrailleInterval')
+ if interval is None:
+ return super()._getProgressBarUpdateInterval()
+
+ return int(interval)
+
+ def _shouldPresentProgressBarUpdate(self, obj, **args):
+ if not _settingsManager.getSetting('brailleProgressBarUpdates'):
+ return False
+
+ return super()._shouldPresentProgressBarUpdate(obj, **args)
+
#####################################################################
# #
# Unfortunate hacks. #
diff --git a/src/orca/generator.py b/src/orca/generator.py
index 043da61..7d62755 100644
--- a/src/orca/generator.py
+++ b/src/orca/generator.py
@@ -1,6 +1,7 @@
# Orca
#
# Copyright 2009 Sun Microsystems Inc.
+# Copyright 2015-2016 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
@@ -22,7 +23,8 @@
__id__ = "$Id:$"
__version__ = "$Revision:$"
__date__ = "$Date:$"
-__copyright__ = "Copyright (c) 2009 Sun Microsystems Inc."
+__copyright__ = "Copyright (c) 2009 Sun Microsystems Inc." \
+ "Copyright (c) 2015-2016 Igalia, S.L."
__license__ = "LGPL"
import sys
@@ -36,6 +38,7 @@ from . import debug
from . import messages
from . import object_properties
from . import settings
+from . import settings_manager
import collections
@@ -58,6 +61,8 @@ def _formatExceptionInfo(maxTBlevel=5):
#
METHOD_PREFIX = "_generate"
+_settingsManager = settings_manager.getManager()
+
class Generator:
"""Takes accessible objects and generates a presentation for those
objects. See the generate method, which is the primary entry
@@ -71,6 +76,7 @@ class Generator:
self._mode = mode
self._script = script
+ self._activeProgressBars = {}
self._methodsDict = {}
for method in \
[z for z in [getattr(self, y).__get__(self, self.__class__) for y in [x for x in dir(self) if
x.startswith(METHOD_PREFIX)]] if isinstance(z, collections.Callable)]:
@@ -253,6 +259,9 @@ class Generator:
for element in result:
debug.println(debug.LEVEL_ALL, " %s" % element)
+ if args.get('isProgressBarUpdate') and result:
+ self.setProgressBarUpdateTimeAndValue(obj)
+
return result
#####################################################################
@@ -1070,6 +1079,55 @@ class Generator:
def _generateProgressBarValue(self, obj, **args):
return []
+ def _getProgressBarUpdateInterval(self):
+ return int(_settingsManager.getSetting('progressBarUpdateInterval'))
+
+ def _shouldPresentProgressBarUpdate(self, obj, **args):
+ percent = self._script.utilities.getValueAsPercent(obj)
+ lastTime, lastValue = self.getProgressBarUpdateTimeAndValue(obj, type=self)
+ if percent == lastValue:
+ return False
+
+ if percent == 100:
+ return True
+
+ interval = int(time.time() - lastTime)
+ return interval >= self._getProgressBarUpdateInterval()
+
+ def _cleanUpCachedProgressBars(self):
+ isValid = lambda x: not (self._script.utilities.isZombie(x) or self._script.utilities.isDead(x))
+ bars = list(filter(isValid, self._activeProgressBars))
+ self._activeProgressBars = {x:self._activeProgressBars.get(x) for x in bars}
+
+ def _getMostRecentProgressBarUpdate(self):
+ self._cleanUpCachedProgressBars()
+ if not self._activeProgressBars.values():
+ return None, 0.0, None
+
+ sortedValues = sorted(self._activeProgressBars.values(), key=lambda x: x[0])
+ prevTime, prevValue = sortedValues[-1]
+ return list(self._activeProgressBars.keys())[-1], prevTime, prevValue
+
+ def getProgressBarNumberAndCount(self, obj):
+ self._cleanUpCachedProgressBars()
+ if not obj in self._activeProgressBars:
+ self._activeProgressBars[obj] = 0.0, None
+
+ thisValue = self.getProgressBarUpdateTimeAndValue(obj)
+ index = list(self._activeProgressBars.values()).index(thisValue)
+ return index + 1, len(self._activeProgressBars)
+
+ def getProgressBarUpdateTimeAndValue(self, obj, **args):
+ if not obj in self._activeProgressBars:
+ self._activeProgressBars[obj] = 0.0, None
+
+ return self._activeProgressBars.get(obj)
+
+ def setProgressBarUpdateTimeAndValue(self, obj, lastTime=None, lastValue=None):
+ lastTime = lastTime or time.time()
+ lastValue = lastValue or self._script.utilities.getValueAsPercent(obj)
+ self._activeProgressBars[obj] = lastTime, lastValue
+
def _getAlternativeRole(self, obj, **args):
if self._script.utilities.isMath(obj):
if self._script.utilities.isMathFraction(obj):
diff --git a/src/orca/script_utilities.py b/src/orca/script_utilities.py
index 0e9d076..04d9afc 100644
--- a/src/orca/script_utilities.py
+++ b/src/orca/script_utilities.py
@@ -96,7 +96,6 @@ class Utilities:
"""
self._script = script
- self._activeProgressBars = {}
self._clipboardHandlerId = None
#########################################################################
@@ -845,16 +844,6 @@ class Utilities:
if self.hasNoSize(obj):
return False, "Has no size"
- percent = self.getValueAsPercent(obj)
- lastTime, lastValue = self.getProgressBarUpdateTimeAndValue(obj)
- if percent == lastValue:
- return False, "Value (%s) hasn't changed" % percent
-
- interval = int(time.time() - lastTime)
- if interval < int(_settingsManager.getSetting('progressBarUpdateInterval')):
- if percent != 100:
- return False, "Last update was only %is ago" % interval
-
if _settingsManager.getSetting('ignoreStatusBarProgressBars'):
isStatusBar = lambda x: x and x.getRole() == pyatspi.ROLE_STATUS_BAR
if pyatspi.findAncestor(obj, isStatusBar):
@@ -881,39 +870,6 @@ class Utilities:
return True, "Not handled by any other case"
- def _cleanUpCachedProgressBars(self):
- isValid = lambda x: not (self.isZombie(x) or self.isDead(x))
- bars = list(filter(isValid, self._activeProgressBars))
- self._activeProgressBars = {x:self._activeProgressBars.get(x) for x in bars}
-
- def getProgressBarNumberAndCount(self, obj):
- self._cleanUpCachedProgressBars()
- if not obj in self._activeProgressBars:
- self._activeProgressBars[obj] = 0.0, None
-
- thisValue = self.getProgressBarUpdateTimeAndValue(obj)
- index = list(self._activeProgressBars.values()).index(thisValue)
- return index + 1, len(self._activeProgressBars)
-
- def getMostRecentProgressBarUpdate(self):
- self._cleanUpCachedProgressBars()
- if not self._activeProgressBars.values():
- return None, 0.0, None
-
- sortedValues = sorted(self._activeProgressBars.values(), key=lambda x: x[0])
- prevTime, prevValue = sortedValues[-1]
- return list(self._activeProgressBars.keys())[-1], prevTime, prevValue
-
- def getProgressBarUpdateTimeAndValue(self, obj):
- if not obj in self._activeProgressBars:
- self._activeProgressBars[obj] = 0.0, None
- return self._activeProgressBars.get(obj)
-
- def setProgressBarUpdateTimeAndValue(self, obj, lastTime=None, lastValue=None):
- lastTime = lastTime or time.time()
- lastValue = lastValue or self.getValueAsPercent(obj)
- self._activeProgressBars[obj] = lastTime, lastValue
-
def getValueAsPercent(self, obj):
try:
value = obj.queryValue()
diff --git a/src/orca/scripts/default.py b/src/orca/scripts/default.py
index f24f1b4..5bdc769 100644
--- a/src/orca/scripts/default.py
+++ b/src/orca/scripts/default.py
@@ -2700,9 +2700,6 @@ class Script(script.Script):
debug.println(debug.LEVEL_INFO, msg, True)
return
- if isProgressBarUpdate:
- self.utilities.setProgressBarUpdateTimeAndValue(obj)
-
self.pointOfReference["oldValue"] = value.currentValue
self.updateBraille(obj, isProgressBarUpdate=isProgressBarUpdate)
speech.speak(self.speechGenerator.generateSpeech(
diff --git a/src/orca/settings.py b/src/orca/settings.py
index 2b1ffc3..d7b6816 100644
--- a/src/orca/settings.py
+++ b/src/orca/settings.py
@@ -290,6 +290,9 @@ speakProgressBarUpdates = True
brailleProgressBarUpdates = False
beepProgressBarUpdates = False
progressBarUpdateInterval = 10
+progressBarSpeechInterval = None
+progressBarBrailleInterval = None
+progressBarBeepInterval = 0
progressBarVerbosity = PROGRESS_BAR_APPLICATION
ignoreStatusBarProgressBars = True
diff --git a/src/orca/sound_generator.py b/src/orca/sound_generator.py
index b8a79df..c8cbafe 100644
--- a/src/orca/sound_generator.py
+++ b/src/orca/sound_generator.py
@@ -289,7 +289,7 @@ class SoundGenerator(generator.Generator):
"""Returns an array of sounds representing the progress bar value."""
if args.get('isProgressBarUpdate'):
- if not _settingsManager.getSetting('beepProgressBarUpdates'):
+ if not self._shouldPresentProgressBarUpdate(obj, **args):
return []
elif not _settingsManager.getSetting('playSoundForValue'):
return []
@@ -315,6 +315,19 @@ class SoundGenerator(generator.Generator):
return [Tone(duration, frequency, volumeMultiplier, Tone.SINE_WAVE)]
+ def _getProgressBarUpdateInterval(self):
+ interval = _settingsManager.getSetting('progressBarBeepInterval')
+ if interval is None:
+ return super()._getProgressBarUpdateInterval()
+
+ return int(interval)
+
+ def _shouldPresentProgressBarUpdate(self, obj, **args):
+ if not _settingsManager.getSetting('beepProgressBarUpdates'):
+ return False
+
+ return super()._shouldPresentProgressBarUpdate(obj, **args)
+
#####################################################################
# #
# Role and hierarchical information #
diff --git a/src/orca/speech_generator.py b/src/orca/speech_generator.py
index 4067d9b..d9350e5 100644
--- a/src/orca/speech_generator.py
+++ b/src/orca/speech_generator.py
@@ -1668,13 +1668,13 @@ class SpeechGenerator(generator.Generator):
def _generateProgressBarIndex(self, obj, **args):
if not args.get('isProgressBarUpdate') \
- or not _settingsManager.getSetting('speakProgressBarUpdates'):
+ or not self._shouldPresentProgressBarUpdate(obj, **args):
return []
result = []
- acc, updateTime, updateValue = self._script.utilities.getMostRecentProgressBarUpdate()
+ acc, updateTime, updateValue = self._getMostRecentProgressBarUpdate()
if acc != obj:
- number, count = self._script.utilities.getProgressBarNumberAndCount(obj)
+ number, count = self.getProgressBarNumberAndCount(obj)
result = [messages.PROGRESS_BAR_NUMBER % (number)]
result.extend(self.voice(SYSTEM))
@@ -1682,7 +1682,7 @@ class SpeechGenerator(generator.Generator):
def _generateProgressBarValue(self, obj, **args):
if args.get('isProgressBarUpdate') \
- and not _settingsManager.getSetting('speakProgressBarUpdates'):
+ and not self._shouldPresentProgressBarUpdate(obj, **args):
return []
result = []
@@ -1693,6 +1693,19 @@ class SpeechGenerator(generator.Generator):
return result
+ def _getProgressBarUpdateInterval(self):
+ interval = _settingsManager.getSetting('progressBarSpeechInterval')
+ if interval is None:
+ interval = super()._getProgressBarUpdateInterval()
+
+ return int(interval)
+
+ def _shouldPresentProgressBarUpdate(self, obj, **args):
+ if not _settingsManager.getSetting('speakProgressBarUpdates'):
+ return False
+
+ return super()._shouldPresentProgressBarUpdate(obj, **args)
+
def _generateDefaultButton(self, obj, **args):
"""Returns an array of strings (and possibly voice and audio
specifications) that represent the default button in a dialog.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]