Add origin type selector with autocompletion to surname table

svn: r16009
This commit is contained in:
Benny Malengier 2010-10-18 15:49:39 +00:00
parent ada8c30955
commit 3cfbd2482d
2 changed files with 82 additions and 13 deletions

View File

@ -45,11 +45,11 @@ class SurnameModel(gtk.ListStore):
def __init__(self, surn_list, db): def __init__(self, surn_list, db):
#setup model for the treeview #setup model for the treeview
gtk.ListStore.__init__(self, str, str, str, gobject.TYPE_PYOBJECT, gtk.ListStore.__init__(self, str, str, str, str,
bool, object) bool, object)
for surn in surn_list: for surn in surn_list:
# fill the liststore # fill the liststore
self.append(row=[surn.get_prefix(), surn.get_surname(), self.append(row=[surn.get_prefix(), surn.get_surname(),
surn.get_connector(), surn.get_origintype(), surn.get_connector(), str(surn.get_origintype()),
surn.get_primary(), surn]) surn.get_primary(), surn])
self.db = db self.db = db

View File

@ -27,6 +27,7 @@
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gen.ggettext import gettext as _ from gen.ggettext import gettext as _
import locale
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -34,6 +35,8 @@ from gen.ggettext import gettext as _
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import gtk import gtk
import gobject
import pango
_TAB = gtk.gdk.keyval_from_name("Tab") _TAB = gtk.gdk.keyval_from_name("Tab")
_ENTER = gtk.gdk.keyval_from_name("Enter") _ENTER = gtk.gdk.keyval_from_name("Enter")
@ -45,6 +48,7 @@ _ENTER = gtk.gdk.keyval_from_name("Enter")
from surnamemodel import SurnameModel from surnamemodel import SurnameModel
from embeddedlist import EmbeddedList from embeddedlist import EmbeddedList
from DdTargets import DdTargets from DdTargets import DdTargets
import AutoComp
from gen.lib import Surname, NameOriginType from gen.lib import Surname, NameOriginType
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -68,10 +72,11 @@ class SurnameTab(EmbeddedList):
#index = column in model. Value = #index = column in model. Value =
# (name, sortcol in model, width, markup/text # (name, sortcol in model, width, markup/text
_column_names = [ _column_names = [
(_('Prefix'), 0, 150, 0, -1), (_('Prefix'), -1, 150, 0, -1),
(_('Surname'), 1, 250, 0, -1), (_('Surname'), -1, 250, 0, -1),
(_('Connector'), 2, 100, 0, -1), (_('Connector'), -1, 100, 0, -1),
] ]
_column_combo = (_('Origin'), -1, 150, 3) # name, sort, width, modelcol
def __init__(self, dbstate, uistate, track, name): def __init__(self, dbstate, uistate, track, name):
self.obj = name self.obj = name
@ -91,14 +96,53 @@ class SurnameTab(EmbeddedList):
for colno in range(len(self.columns)): for colno in range(len(self.columns)):
for renderer in self.columns[colno].get_cell_renderers(): for renderer in self.columns[colno].get_cell_renderers():
renderer.set_property('editable', not self.dbstate.db.readonly) renderer.set_property('editable', not self.dbstate.db.readonly)
renderer.connect('editing_started', self.edit_start, colno) renderer.connect('editing_started', self.on_edit_start, colno)
renderer.connect('edited', self.edit_inline, colno) renderer.connect('edited', self.on_edit_inline, colno)
#no sorting
self.columns[colno].set_sort_column_id(-1)
# now we add the two special columns # now we add the two special columns
# combobox for type
colno = len(self.columns)
name = self._column_combo[0]
renderer = gtk.CellRendererCombo()
renderer.set_property('ellipsize', pango.ELLIPSIZE_END)
# set up the comboentry editable
no = NameOriginType()
self.cmborig = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
self.cmborigmap = no.get_map().copy()
keys = sorted(self.cmborigmap, self.by_value)
for key in keys:
if key != no.get_custom():
self.cmborig.append(row=[key, self.cmborigmap[key]])
additional = self.dbstate.db.get_origin_types()
if additional:
for type in additional:
if type:
self.cmborig.append(row=[no.get_custom(), type])
renderer.set_property("model", self.cmborig)
renderer.set_property("text-column", 1)
renderer.set_property('editable', not self.dbstate.db.readonly)
renderer.connect('editing_started', self.on_edit_start_cmb, colno)
renderer.connect('edited', self.on_orig_edited, colno)
# add to treeview
column = gtk.TreeViewColumn(name, renderer, text=self._column_combo[3])
column.set_resizable(True)
column.set_sort_column_id(self._column_combo[1])
column.set_min_width(self._column_combo[2])
self.columns.append(column)
self.tree.append_column(column)
# toggle box for primary
colno += 1
# TODO # TODO
def by_value(self, first, second):
"""
Method for sorting keys based on the values.
"""
fvalue = self.cmborigmap[first]
svalue = self.cmborigmap[second]
return locale.strcoll(fvalue, svalue)
def get_data(self): def get_data(self):
return self.obj.get_surname_list() return self.obj.get_surname_list()
@ -117,6 +161,7 @@ class SurnameTab(EmbeddedList):
surn.set_prefix(unicode(self.model.get_value(node, 0))) surn.set_prefix(unicode(self.model.get_value(node, 0)))
surn.set_surname(unicode(self.model.get_value(node, 1))) surn.set_surname(unicode(self.model.get_value(node, 1)))
surn.set_connector(unicode(self.model.get_value(node, 2))) surn.set_connector(unicode(self.model.get_value(node, 2)))
surn.get_origintype().set(unicode(self.model.get_value(node, 3)))
surn.set_primary(self.model.get_value(node, 4)) surn.set_primary(self.model.get_value(node, 4))
new_list += [surn] new_list += [surn]
return new_list return new_list
@ -150,16 +195,40 @@ class SurnameTab(EmbeddedList):
self.model.remove(node) self.model.remove(node)
self.update() self.update()
def edit_start(self, cellr, celle, path, colnr): def on_edit_start(self, cellr, celle, path, colnr):
self.curr_col = colnr self.curr_col = colnr
self.curr_cellr = cellr self.curr_cellr = cellr
self.curr_celle = celle self.curr_celle = celle
def edit_inline(self, cell, path, new_text, colnr):
def on_edit_start_cmb(self, cellr, celle, path, colnr):
self.on_edit_start(cellr, celle, path, colnr)
#set up autocomplete
completion = gtk.EntryCompletion()
completion.set_model(self.cmborig)
completion.set_minimum_key_length(1)
completion.set_text_column(1)
celle.child.set_completion(completion)
#
celle.connect('changed', self.on_origcmb_change, path, colnr)
def on_edit_inline(self, cell, path, new_text, colnr):
node = self.model.get_iter(path) node = self.model.get_iter(path)
self.model.set_value(node, colnr, new_text) self.model.set_value(node, colnr, new_text)
self.update() self.update()
def on_orig_edited(self, cellr, path, new_text, colnr):
self.on_edit_inline(cellr, path, new_text, colnr)
def on_origcmb_change(self, cmb, path, colnr):
act = cmb.get_active()
if act == -1:
return
self.on_orig_edited(None, path,
self.cmborig.get_value(
self.cmborig.get_iter((act,)),1),
colnr)
def edit_button_clicked(self, obj): def edit_button_clicked(self, obj):
(model, node) = self.selection.get_selected() (model, node) = self.selection.get_selected()
if node: if node: