Enhance event type selector to use sub-menus
This commit is contained in:
parent
6b98ad9319
commit
6618cdcfb2
@ -30,6 +30,7 @@ Provide autocompletion functionality.
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import locale
|
import locale
|
||||||
|
from gen.ggettext import sgettext as _
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -110,7 +111,7 @@ class StandardCustomSelector(object):
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self, mapping, cbe=None, custom_key=None, active_key=None,
|
def __init__(self, mapping, cbe=None, custom_key=None, active_key=None,
|
||||||
additional=None):
|
additional=None, menu=None):
|
||||||
"""
|
"""
|
||||||
Constructor for the StandardCustomSelector class.
|
Constructor for the StandardCustomSelector class.
|
||||||
|
|
||||||
@ -130,57 +131,85 @@ class StandardCustomSelector(object):
|
|||||||
self.active_key = active_key
|
self.active_key = active_key
|
||||||
self.active_index = 0
|
self.active_index = 0
|
||||||
self.additional = additional
|
self.additional = additional
|
||||||
|
self.menu = menu
|
||||||
# make model
|
|
||||||
self.store = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
|
|
||||||
|
|
||||||
# fill it up using mapping
|
|
||||||
self.fill()
|
|
||||||
|
|
||||||
# create combo box entry
|
# create combo box entry
|
||||||
if cbe:
|
if cbe:
|
||||||
self.selector = cbe
|
self.selector = cbe
|
||||||
self.selector.set_model(self.store)
|
|
||||||
self.selector.set_text_column(1)
|
|
||||||
else:
|
else:
|
||||||
self.selector = gtk.ComboBoxEntry(self.store, 1)
|
self.selector = gtk.ComboBoxEntry()
|
||||||
if self.active_key is not None:
|
|
||||||
self.selector.set_active(self.active_index)
|
# create models
|
||||||
|
if menu:
|
||||||
|
self.store = self.create_menu()
|
||||||
|
completion_store = self.create_list()
|
||||||
|
else:
|
||||||
|
self.store = self.create_list()
|
||||||
|
completion_store = self.store
|
||||||
|
|
||||||
|
self.selector.set_model(self.store)
|
||||||
|
self.selector.set_text_column(1)
|
||||||
|
|
||||||
|
if menu:
|
||||||
|
for cell in self.selector.get_cells():
|
||||||
|
self.selector.add_attribute(cell, 'sensitive', 2)
|
||||||
|
|
||||||
|
#if self.active_key is not None:
|
||||||
|
#self.selector.set_active(self.active_index)
|
||||||
|
|
||||||
# make autocompletion work
|
# make autocompletion work
|
||||||
completion = gtk.EntryCompletion()
|
completion = gtk.EntryCompletion()
|
||||||
completion.set_model(self.store)
|
completion.set_model(completion_store)
|
||||||
completion.set_minimum_key_length(1)
|
completion.set_minimum_key_length(1)
|
||||||
completion.set_text_column(1)
|
completion.set_text_column(1)
|
||||||
self.selector.child.set_completion(completion)
|
self.selector.child.set_completion(completion)
|
||||||
|
|
||||||
def fill(self):
|
def create_menu(self):
|
||||||
"""
|
"""
|
||||||
Fill with data
|
Create a model and fill it with a two-level tree corresponding to the
|
||||||
|
menu.
|
||||||
"""
|
"""
|
||||||
|
store = gtk.TreeStore(int, str, bool)
|
||||||
|
for heading, items in self.menu:
|
||||||
|
if self.active_key in items:
|
||||||
|
parent = None
|
||||||
|
else:
|
||||||
|
parent = store.append(None, row=[-999, heading, False])
|
||||||
|
for item in items:
|
||||||
|
store.append(parent, row=[item, self.mapping[item], True])
|
||||||
|
|
||||||
|
if self.additional:
|
||||||
|
parent = store.append(None, row=[-999, _('Custom'), False])
|
||||||
|
for event_type in self.additional:
|
||||||
|
key, value = self.get_key_and_value(event_type)
|
||||||
|
store.append(parent, row=[key, value, True])
|
||||||
|
|
||||||
|
return store
|
||||||
|
|
||||||
|
def create_list(self):
|
||||||
|
"""
|
||||||
|
Create a model and fill it with a sorted flat list.
|
||||||
|
"""
|
||||||
|
store = gtk.ListStore(int, str)
|
||||||
keys = sorted(self.mapping, self.by_value)
|
keys = sorted(self.mapping, self.by_value)
|
||||||
index = 0
|
index = 0
|
||||||
for key in keys:
|
for key in keys:
|
||||||
if key != self.custom_key:
|
if key != self.custom_key:
|
||||||
self.store.append(row=[key, self.mapping[key]])
|
store.append(row=[key, self.mapping[key]])
|
||||||
if key == self.active_key:
|
if key == self.active_key:
|
||||||
self.active_index = index
|
self.active_index = index
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
if self.additional:
|
if self.additional:
|
||||||
for event_type in self.additional:
|
for event_type in self.additional:
|
||||||
if isinstance(event_type, basestring):
|
key, value = self.get_key_and_value(event_type)
|
||||||
if event_type:
|
store.append(row=[key, value])
|
||||||
self.store.append(row=[self.custom_key, event_type])
|
|
||||||
elif isinstance(event_type, tuple):
|
|
||||||
if event_type[1]:
|
|
||||||
self.store.append(row=[event_type[0], event_type[1]])
|
|
||||||
else:
|
|
||||||
self.store.append(row=[int(event_type), str(event_type)])
|
|
||||||
if key == self.active_key:
|
if key == self.active_key:
|
||||||
self.active_index = index
|
self.active_index = index
|
||||||
index += 1
|
index += 1
|
||||||
|
|
||||||
|
return store
|
||||||
|
|
||||||
def by_value(self, first, second):
|
def by_value(self, first, second):
|
||||||
"""
|
"""
|
||||||
Method for sorting keys based on the values.
|
Method for sorting keys based on the values.
|
||||||
@ -235,4 +264,17 @@ class StandardCustomSelector(object):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_key_and_value(self, event_type):
|
||||||
|
"""
|
||||||
|
Return the key and value for the given event type. The event type may be
|
||||||
|
a string representing a custom type, an (int, str) tuple or an EventType
|
||||||
|
instance.
|
||||||
|
"""
|
||||||
|
if isinstance(event_type, basestring):
|
||||||
|
if event_type:
|
||||||
|
return (self.custom_key, event_type)
|
||||||
|
elif isinstance(event_type, tuple):
|
||||||
|
if event_type[1]:
|
||||||
|
return (event_type[0], event_type[1])
|
||||||
|
else:
|
||||||
|
return(int(event_type), str(event_type))
|
||||||
|
@ -136,6 +136,27 @@ class EventType(GrampsType):
|
|||||||
RETIREMENT = 43
|
RETIREMENT = 43
|
||||||
WILL = 44
|
WILL = 44
|
||||||
|
|
||||||
|
_MENU = [[_('Life Events'),
|
||||||
|
[BIRTH, BAPTISM, DEATH, BURIAL, CREMATION, ADOPT]],
|
||||||
|
[_('Family'),
|
||||||
|
[ENGAGEMENT, MARRIAGE, DIVORCE, ANNULMENT, MARR_SETTL, MARR_LIC,
|
||||||
|
MARR_CONTR, MARR_BANNS, DIV_FILING, MARR_ALT]],
|
||||||
|
[_('Religious'),
|
||||||
|
[CHRISTEN, ADULT_CHRISTEN, CONFIRMATION, FIRST_COMMUN, BLESS,
|
||||||
|
BAR_MITZVAH, BAS_MITZVAH, RELIGION]],
|
||||||
|
[_('Vocational'),
|
||||||
|
[OCCUPATION, RETIREMENT, ELECTED, MILITARY_SERV, ORDINATION]],
|
||||||
|
[_('Academic'),
|
||||||
|
[EDUCATION, DEGREE, GRADUATION]],
|
||||||
|
[_('Travel'),
|
||||||
|
[EMIGRATION, IMMIGRATION, NATURALIZATION]],
|
||||||
|
[_('Legal'),
|
||||||
|
[PROBATE, WILL]],
|
||||||
|
[_('Residence'),
|
||||||
|
[RESIDENCE, CENSUS, PROPERTY]],
|
||||||
|
[_('Other'),
|
||||||
|
[CAUSE_DEATH, MED_INFO, NOB_TITLE, NUM_MARRIAGES]]]
|
||||||
|
|
||||||
_CUSTOM = CUSTOM
|
_CUSTOM = CUSTOM
|
||||||
_DEFAULT = BIRTH
|
_DEFAULT = BIRTH
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ class GrampsType(object):
|
|||||||
|
|
||||||
_DATAMAP = []
|
_DATAMAP = []
|
||||||
_BLACKLIST = None
|
_BLACKLIST = None
|
||||||
|
_MENU = None
|
||||||
|
|
||||||
__metaclass__ = GrampsTypeMeta
|
__metaclass__ = GrampsTypeMeta
|
||||||
__slots__ = ('__value', '__string')
|
__slots__ = ('__value', '__string')
|
||||||
@ -236,6 +237,9 @@ class GrampsType(object):
|
|||||||
def get_custom(self):
|
def get_custom(self):
|
||||||
return self._CUSTOM
|
return self._CUSTOM
|
||||||
|
|
||||||
|
def get_menu(self):
|
||||||
|
return self._MENU
|
||||||
|
|
||||||
def __cmp__(self, value):
|
def __cmp__(self, value):
|
||||||
if isinstance(value, int):
|
if isinstance(value, int):
|
||||||
return cmp(self.__value, value)
|
return cmp(self.__value, value)
|
||||||
|
@ -401,7 +401,8 @@ class MySelect(gtk.ComboBoxEntry):
|
|||||||
self.sel = AutoComp.StandardCustomSelector(type_class._I2SMAP, self,
|
self.sel = AutoComp.StandardCustomSelector(type_class._I2SMAP, self,
|
||||||
type_class._CUSTOM,
|
type_class._CUSTOM,
|
||||||
type_class._DEFAULT,
|
type_class._DEFAULT,
|
||||||
additional)
|
additional,
|
||||||
|
type_class._MENU)
|
||||||
self.show()
|
self.show()
|
||||||
|
|
||||||
def get_text(self):
|
def get_text(self):
|
||||||
|
@ -456,7 +456,8 @@ class MonitoredDataType(object):
|
|||||||
obj,
|
obj,
|
||||||
get_val().get_custom(),
|
get_val().get_custom(),
|
||||||
default,
|
default,
|
||||||
additional=custom_values)
|
additional=custom_values,
|
||||||
|
menu=get_val().get_menu())
|
||||||
|
|
||||||
self.sel.set_values((int(get_val()), str(get_val())))
|
self.sel.set_values((int(get_val()), str(get_val())))
|
||||||
self.obj.set_sensitive(not readonly)
|
self.obj.set_sensitive(not readonly)
|
||||||
|
Loading…
Reference in New Issue
Block a user