[orca] Make the progressbar update intervals independent



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]