Skip to content

Commit 9317bb7

Browse files
committed
Update MathCATPreferences.py
Added function to handle validation more elegantly
1 parent 0180707 commit 9317bb7

File tree

1 file changed

+43
-146
lines changed

1 file changed

+43
-146
lines changed

NVDA-addon/addon/globalPlugins/MathCAT/MathCATPreferences.py

Lines changed: 43 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from logHandler import log # logging
1212

1313
# initialize the user preferences tuples
14-
user_preferences = dict([("", "")])
14+
user_preferences = {}
1515
#Speech_Language is derived from the folder structure
1616
Speech_Impairment = ("LearningDisability", "Blindness", "LowVision")
1717
#Speech_SpeechStyle is derived from the yaml files under the selected language
@@ -23,11 +23,9 @@
2323
#Navigation_OverView is boolean
2424
Navigation_NavVerbosity = ("Terse", "Medium", "Verbose")
2525
#Navigation_AutoZoomOut is boolean
26-
2726
Braille_BrailleNavHighlight = ("Off", "FirstChar", "EndPoints", "All")
2827
Braille_BrailleCode = ("Nemeth", "UEB")
2928

30-
3129
class UserInterface(MathCATgui.MathCATPreferencesDialog):
3230
def __init__(self,parent):
3331
#initialize parent class
@@ -97,6 +95,7 @@ def set_ui_values(self):
9795
self.m_choiceLanguage.SetSelection(0)
9896
#now get the available SpeechStyles from the folder structure and set to the preference setting is possible
9997
self.GetSpeechStyles(user_preferences["Speech"]["SpeechStyle"])
98+
#set the rest of the UI elements
10099
self.m_choiceSpeechAmount.SetSelection(Speech_Verbosity.index(user_preferences["Speech"]["Verbosity"]))
101100
self.m_sliderRelativeSpeed.SetValue(user_preferences["Speech"]["MathRate"])
102101
self.m_choiceSpeechForChemical.SetSelection(Speech_Chemistry.index(user_preferences["Speech"]["Chemistry"]))
@@ -154,10 +153,6 @@ def load_default_preferences():
154153
if os.path.exists(UserInterface.path_to_default_preferences()):
155154
with open(UserInterface.path_to_default_preferences(), encoding='utf-8') as f:
156155
user_preferences = yaml.load(f, Loader=yaml.FullLoader)
157-
else:
158-
#default preferences file is NOT found
159-
wx.MessageBox(_(u"MathCat preferences file not found. The program will now exit."), "Error", wx.OK | wx.ICON_ERROR)
160-
os.sys.exit(-1)
161156

162157
def load_user_preferences():
163158
global user_preferences
@@ -167,162 +162,64 @@ def load_user_preferences():
167162
# merge with the default preferences, overwriting with the user's values
168163
user_preferences.update(yaml.load(f, Loader=yaml.FullLoader))
169164

170-
def validate_user_preferences():
165+
def validate(key1, key2, valid_values, default_value):
171166
global user_preferences
172-
#check each user preference value to ensure it is present and valid, set default value if not
173-
174-
# Speech:
175-
#Impairment: Blindness # LearningDisability, LowVision, Blindness
176-
valid_test_passed = False
177-
try:
178-
if user_preferences["Speech"]["Impairment"] in ["LearningDisability", "LowVision", "Blindness"]:
179-
valid_test_passed = True
180-
except:
181-
pass
182-
if not valid_test_passed:
183-
user_preferences["Speech"]["Impairment"] = "Blindness"
184-
185-
# Language: en # any known language code and sub-code -- could be en-uk, etc
186-
valid_test_passed = False
187-
try:
188-
if user_preferences["Speech"]["Language"] != "":
189-
valid_test_passed = True
167+
try:
168+
if valid_values == None:
169+
#any value is valid
170+
if user_preferences[key1][key2] != "":
171+
return
172+
if (type(valid_values[0]) == int) and (type(valid_values[1]) == int):
173+
#any value between lower and upper bounds is valid
174+
if (user_preferences[key1][key2] >= valid_values(0)) and (user_preferences[key1][key2] <= valid_values(1)):
175+
return
176+
else:
177+
#any value in the list is valid
178+
if user_preferences[key1][key2] in valid_values:
179+
return
190180
except:
181+
#the preferences entry does not exist
191182
pass
192-
if not valid_test_passed:
193-
user_preferences["Speech"]["Language"] = "en"
183+
if not key1 in user_preferences:
184+
user_preferences[key1] = {key2: default_value}
185+
else:
186+
user_preferences[key1][key2] = default_value
194187

188+
def validate_user_preferences():
189+
#check each user preference value to ensure it is present and valid, set default value if not
190+
# Speech:
191+
#Impairment: Blindness # LearningDisability, LowVision, Blindness
192+
UserInterface.validate("Speech", "Impairment", ["LearningDisability", "LowVision", "Blindness"], "Blindness")
193+
# Language: en # any known language code and sub-code -- could be en-uk, etc
194+
UserInterface.validate("Speech", "Language", None, "en")
195195
# Verbosity: Medium # Terse, Medium, Verbose
196-
valid_test_passed = False
197-
try:
198-
if user_preferences["Speech"]["Verbosity"] in ["Terse", "Medium", "Verbose"]:
199-
valid_test_passed = True
200-
except:
201-
pass
202-
if not valid_test_passed:
203-
user_preferences["Speech"]["Verbosity"] = "Medium"
204-
196+
UserInterface.validate("Speech", "Verbosity", ["Terse", "Medium", "Verbose"], "Medium")
205197
# MathRate: 100 # Change from text speech rate (%)
206-
valid_test_passed = False
207-
try:
208-
if (user_preferences["Speech"]["MathRate"] > 0):
209-
valid_test_passed = True
210-
except:
211-
pass
212-
if not valid_test_passed:
213-
user_preferences["Speech"]["MathRate"] = 100
214-
198+
UserInterface.validate("Speech", "MathRate", [0,200], 100)
215199
# SpeechStyle: ClearSpeak # Any known speech style (falls back to ClearSpeak)
216-
valid_test_passed = False
217-
try:
218-
if user_preferences["Speech"]["SpeechStyle"] != "":
219-
valid_test_passed = True
220-
except:
221-
pass
222-
if not valid_test_passed:
223-
user_preferences["Speech"]["SpeechStyle"] = "ClearSpeak"
224-
200+
UserInterface.validate("Speech", "SpeechStyle", None, "ClearSpeak")
225201
# SubjectArea: General # FIX: still working on this
226-
valid_test_passed = False
227-
try:
228-
if user_preferences["Speech"]["SubjectArea"] != "":
229-
valid_test_passed = True
230-
except:
231-
pass
232-
if not valid_test_passed:
233-
user_preferences["Speech"]["SubjectArea"] = "General"
234-
202+
UserInterface.validate("Speech", "SubjectArea", None, "General")
235203
# Chemistry: SpellOut # SpellOut (H 2 0), AsCompound (Water), Off (H sub 2 O)
236-
valid_test_passed = False
237-
try:
238-
if user_preferences["Speech"]["Chemistry"] in ["SpellOut", "AsCompound", "Off"]:
239-
valid_test_passed = True
240-
except:
241-
pass
242-
if not valid_test_passed:
243-
user_preferences["Speech"]["Chemistry"] = "SpellOut"
244-
204+
UserInterface.validate("Speech", "Chemistry", ["SpellOut", "AsCompound", "Off"], "SpellOut")
245205
#Navigation:
246206
# NavMode: Enhanced # Enhanced, Simple, Character
247-
valid_test_passed = False
248-
try:
249-
if user_preferences["Navigation"]["NavMode"] in ["Enhanced", "Simple", "Character"]:
250-
valid_test_passed = True
251-
except:
252-
pass
253-
if not valid_test_passed:
254-
user_preferences["Navigation"]["NavMode"] = "Enhanced"
255-
207+
UserInterface.validate("Navigation", "NavMode", ["Enhanced", "Simple", "Character"], "Enhanced")
256208
# ResetNavMode: false # remember previous value and use it
257-
valid_test_passed = False
258-
try:
259-
if (user_preferences["Navigation"]["ResetNavMode"]) or (not user_preferences["Navigation"]["ResetNavMode"]) :
260-
valid_test_passed = True
261-
except:
262-
pass
263-
if not valid_test_passed:
264-
user_preferences["Navigation"]["ResetNavMode"] = False
265-
266-
# Overview: false # speak the expression or give a description/overview
267-
valid_test_passed = False
268-
try:
269-
if (user_preferences["Navigation"]["Overview"]) or True :
270-
valid_test_passed = True
271-
except:
272-
pass
273-
if not valid_test_passed:
274-
user_preferences["Navigation"]["Overview"] = False
275-
209+
UserInterface.validate("Navigation", "ResetNavMode", [False, True], False)
210+
# Overview: false # speak the expression or give a description/overview
211+
UserInterface.validate("Navigation", "Overview", [False, True] ,False)
276212
# ResetOverview: true # remember previous value and use it
277-
valid_test_passed = False
278-
try:
279-
if (user_preferences["Navigation"]["ResetOverview"]) or True :
280-
valid_test_passed = True
281-
except:
282-
pass
283-
if not valid_test_passed:
284-
user_preferences["Navigation"]["ResetOverview"] = True
285-
286-
# NavVerbosity: Medium # Terse, Medium, Verbose (words to say for nav command)
287-
valid_test_passed = False
288-
try:
289-
if user_preferences["Navigation"]["NavVerbosity"] in ["Terse", "Medium", "Verbose"]:
290-
valid_test_passed = True
291-
except:
292-
pass
293-
if not valid_test_passed:
294-
user_preferences["Navigation"]["NavVerbosity"] = "Medium"
295-
213+
UserInterface.validate("Navigation", "ResetOverview", [False, True], True)
214+
# NavVerbosity: Medium # Terse, Medium, Full (words to say for nav command)
215+
UserInterface.validate("Navigation", "NavVerbosity", ["Terse", "Medium", "Full"], "Medium")
296216
# AutoZoomOut: true # Auto zoom out of 2D exprs (use shift-arrow to force zoom out if unchecked)
297-
valid_test_passed = False
298-
try:
299-
if (user_preferences["Navigation"]["AutoZoomOut"]) or True :
300-
valid_test_passed = True
301-
except:
302-
pass
303-
if not valid_test_passed:
304-
user_preferences["Navigation"]["AutoZoomOut"] = True
305-
217+
UserInterface.validate("Navigation", "AutoZoomOut", [False, True], True)
306218
#Braille:
307219
# BrailleNavHighlight: EndPoints # Highlight with dots 7 & 8 the current nav node -- values are Off, FirstChar, EndPoints, All
308-
valid_test_passed = False
309-
try:
310-
if user_preferences["Braille"]["BrailleNavHighlight"] in ["Off", "FirstChar", "EndPoints", "All"]:
311-
valid_test_passed = True
312-
except:
313-
pass
314-
if not valid_test_passed:
315-
user_preferences["Braille"]["BrailleNavHighlight"] = "EndPoints"
316-
220+
UserInterface.validate("Braille", "BrailleNavHighlight", ["Off", "FirstChar", "EndPoints", "All"], "EndPoints")
317221
# BrailleCode: "Nemeth" # Any supported braille code (currently Nemeth, UEB)
318-
valid_test_passed = False
319-
try:
320-
if user_preferences["Braille"]["BrailleCode"] in ["Nemeth", "UEB"]:
321-
valid_test_passed = True
322-
except:
323-
pass
324-
if not valid_test_passed:
325-
user_preferences["Braille"]["BrailleCode"] = "Nemeth"
222+
UserInterface.validate("Braille", "BrailleCode", ["Nemeth", "UEB"], "Nemeth")
326223

327224
def write_user_preferences():
328225
if not os.path.exists(UserInterface.path_to_user_preferences_folder()):

0 commit comments

Comments
 (0)