Remove unavailable implementations from the impelementation list when an option is selected.

This commit is contained in:
Ferdi Franceschini
2014-07-04 13:46:47 +10:00
parent abcf19553b
commit a802f98a24

View File

@ -3,18 +3,18 @@
# View Screen has 3 parts # View Screen has 3 parts
# (Instrument Configuration), (Configuration Options), (Option Implementation) # (Instrument Configuration), (Configuration Options), (Option Implementation)
# Uses MVC implemented as InstConfigData<M>, InstConfigView<V>, ConfigEdit<C> # Uses MVC implemented as InstConfigData<M>, InstConfigView<V>, InstConfigManager<C>
# #
# InstConfigData <>--- ConfigParser.SafeConfig # InstConfigData <>--- ConfigParser.SafeConfig
# |--set_cfparse() # |--set_cfparse()
# ConfigEdit <>--- InstConfigData, PresentationData # InstConfigManager <>--- InstConfigData, PresentationData
# |--set_cfdata(), set_presdata() # |--set_cfdata(), set_presdata()
# |--set_xyz_data() call self.cfgdata.set_xyz() methods # |--set_xyz_data() call self.cfgdata.set_xyz() methods
# #
# urwid.Frame # urwid.Frame
# ^ # ^
# InstConfigView <>--- ConfigEdit, PresentationData # InstConfigView <>--- InstConfigManager, PresentationData
# |--set_cfedit(), set_presdata() # |--set_cfedit(), set_presdata()
# #
# PresentationData # PresentationData
@ -30,8 +30,6 @@ import copy
from collections import defaultdict from collections import defaultdict
## TODO Configuration Editor
## Configuration Viewer
Palette = [ Palette = [
('body', 'dark cyan', '', 'standout'), ('body', 'dark cyan', '', 'standout'),
('focus', 'dark red', '', 'standout'), ('focus', 'dark red', '', 'standout'),
@ -69,7 +67,6 @@ class CheckBoxListWalker(urwid.SimpleListWalker):
return return
# Selects listwalker to display for ImpListBox on focus
class OptionListWalker(CheckBoxListWalker): class OptionListWalker(CheckBoxListWalker):
def __init__(self, opt_dict, statechange_cb): def __init__(self, opt_dict, statechange_cb):
urwid.register_signal(OptionListWalker, ['focus_change']) urwid.register_signal(OptionListWalker, ['focus_change'])
@ -212,9 +209,10 @@ class InstConfigData:
self.opt_dict[s]['permanent'] = permanent self.opt_dict[s]['permanent'] = permanent
self.opt_dict[s]['imptype'] = imptype self.opt_dict[s]['imptype'] = imptype
if selected_imp in self.imp2opt_dict: if selected_imp in self.imp2opt_dict:
self.opt_dict[s]['selected_imp'] = "none" self.opt_dict[s]['selected_imp'] = 'none'
else: else:
self.opt_dict[s]['selected_imp'] = selected_imp self.opt_dict[s]['selected_imp'] = selected_imp
if selected_imp != 'none':
print 'Add imp2opt_dict[{0}] = {1}'.format(selected_imp,s) print 'Add imp2opt_dict[{0}] = {1}'.format(selected_imp,s)
self.imp2opt_dict[selected_imp] = s self.imp2opt_dict[selected_imp] = s
@ -228,7 +226,7 @@ class InstConfigData:
self.imp_dict[key].append(s) self.imp_dict[key].append(s)
if s not in self.imp2opt_dict: if s not in self.imp2opt_dict:
print 'Add imp2opt_dict[{0}] = none'.format(s) print 'Add imp2opt_dict[{0}] = none'.format(s)
self.imp2opt_dict[s] = "none" self.imp2opt_dict[s] = 'none'
def read_config_file(self, config_filename): def read_config_file(self, config_filename):
@ -274,7 +272,6 @@ class InstConfigData:
cfile.write("%s = %s\n" % (option, self.file_parser.get(section, option))) cfile.write("%s = %s\n" % (option, self.file_parser.get(section, option)))
cfile.write("\n") cfile.write("\n")
#self.file_parser.write(cfile)
def cf_statechange(self, checkbox, new_state, udat=None): def cf_statechange(self, checkbox, new_state, udat=None):
cfg_id = checkbox.get_label() cfg_id = checkbox.get_label()
@ -302,30 +299,18 @@ class InstConfigManager:
cf_msg_index = 8 cf_msg_index = 8
options = [] options = []
imp_lw_dict = {} imp_lw_dict = {}
def __init__(self, cfdat): def __init__(self, cf_dat):
self.cfdat = cfdat self.cf_dat = cf_dat
urwid.register_signal(InstConfigManager, ['focus_change']) urwid.register_signal(InstConfigManager, ['focus_change'])
for opt,dict in cfdat.opt_dict.iteritems(): for opt,dict in cf_dat.opt_dict.iteritems():
self.options.append((opt, dict['imptype'])) self.options.append((opt, dict['imptype']))
# imp_items = []
# for imp in cfdat.imp_dict[dict['imptype']]:
# if imp == dict['selected_imp']:
# imp_items.append((imp, True))
# else:
# imp_items.append((imp, False))
# imp_items.sort()
# self.imp_lw_dict[opt] = RadioButtonListWalker(imp_items, on_state_change=self.imp_statechange, user_data=opt)
self.options.sort() self.options.sort()
# imp_items.sort()
firstopt = self.options[0][0] firstopt = self.options[0][0]
self.imp_lw = self.__gen_imp_listwalker(firstopt) self.imp_lw = self.__gen_imp_listwalker(firstopt)
# self.imp_lw = RadioButtonListWalker([], on_state_change=self.imp_statechange, user_data=firstopt) self.option_lw = OptionListWalker(cf_dat.opt_dict, self.opt_statechange)
self.option_lw = OptionListWalker(cfdat.opt_dict, self.opt_statechange)
self.imp_lb = ImpListBox(self.imp_lw) self.imp_lb = ImpListBox(self.imp_lw)
urwid.connect_signal(self.option_lw, 'focus_change', self.update_imp_lb) urwid.connect_signal(self.option_lw, 'focus_change', self.update_imp_lb)
item_states = [(i,d['enabled']) for i,d in cf_dat.configuration_dict.iteritems()] item_states = [(i,d['enabled']) for i,d in cf_dat.configuration_dict.iteritems()]
item_states.sort() item_states.sort()
self.cfg_lw = RadioButtonListWalker(item_states, on_state_change = self.cf_statechange) self.cfg_lw = RadioButtonListWalker(item_states, on_state_change = self.cf_statechange)
@ -334,10 +319,24 @@ class InstConfigManager:
self.opt_lb.set_focus(0) self.opt_lb.set_focus(0)
return return
def __imp_unavailable(self, imp):
if imp == 'none':
return False
ckopt = self.cf_dat.imp2opt_dict[imp]
if ckopt == 'none':
return False
elif self.cf_dat.opt_dict[ckopt]['enabled']:
return True
else:
return False
def __gen_imp_listwalker(self, opt): def __gen_imp_listwalker(self, opt):
imp_items = [] imp_items = []
dict = self.cfdat.opt_dict[opt] dict = self.cf_dat.opt_dict[opt]
for imp in self.cfdat.imp_dict[dict['imptype']]: for imp in self.cf_dat.imp_dict[dict['imptype']]:
if self.__imp_unavailable(imp):
continue
if imp == dict['selected_imp']: if imp == dict['selected_imp']:
imp_items.append((imp, True)) imp_items.append((imp, True))
else: else:
@ -349,12 +348,12 @@ class InstConfigManager:
def cf_statechange(self, button, new_state, udat=None): def cf_statechange(self, button, new_state, udat=None):
self.cfdat.cf_statechange(button, new_state, udat) self.cf_dat.cf_statechange(button, new_state, udat)
b = button.get_label() b = button.get_label()
cascade = self.cfdat.configuration_dict[b]['cascade_list'] cascade = self.cf_dat.configuration_dict[b]['cascade_list']
if new_state == True: if new_state == True:
for opt in self.cfdat.opt_dict.keys(): for opt in self.cf_dat.opt_dict.keys():
if self.cfdat.opt_dict[opt]['permanent'] == False: if self.cf_dat.opt_dict[opt]['permanent'] == False:
self.option_lw.button_dict[opt].set_state(False) self.option_lw.button_dict[opt].set_state(False)
for opt,imp in cascade: for opt,imp in cascade:
self.option_lw.button_dict[opt].set_state(True) self.option_lw.button_dict[opt].set_state(True)
@ -368,11 +367,23 @@ class InstConfigManager:
return return
def opt_statechange(self, button, new_state, udat=None): def opt_statechange(self, button, new_state, udat=None):
self.cfdat.opt_statechange(button, new_state, udat) opt = button.get_label()
imp = self.cf_dat.opt_dict[opt]['selected_imp']
if new_state == True:
if self.__imp_unavailable(imp):
self.cf_dat.opt_dict[opt]['selected_imp'] = 'none'
else:
self.cf_dat.imp2opt_dict[imp] = opt
self.cf_dat.opt_statechange(button, new_state, udat)
return return
def imp_statechange(self, button, new_state, udat=None): def imp_statechange(self, button, new_state, opt):
self.cfdat.imp_statechange(button, new_state, udat) if new_state == True:
imp = button.get_label()
self.cf_dat.imp2opt_dict[imp] = opt
self.cf_dat.imp_statechange(button, new_state, opt)
return return
def update_imp_lb(self, pos): def update_imp_lb(self, pos):