Refactor SelectPerson so that it inherits from BaseSelector like all the other selectors

svn: r11966
This commit is contained in:
Gary Burton 2009-02-11 20:13:46 +00:00
parent ae3a2b7542
commit e5db28ee6d
2 changed files with 113 additions and 145 deletions

View File

@ -2,6 +2,7 @@
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003-2006 Donald N. Allingham
# 2009 Gary Burton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -37,6 +38,7 @@ from gtk import glade
import const
import ManagedWindow
from Filters import SearchBar
from DisplayModels import PeopleModel
#-------------------------------------------------------------------------
#
@ -60,6 +62,12 @@ class BaseSelector(ManagedWindow.ManagedWindow):
set of handles to skip in the view, and search_bar to show the
SearchBar at the top or not.
"""
self.filter = filter
# Set window title, some selectors may set self.title in their __init__
try:
assert self.title
except AttributeError:
self.title = self.get_window_title()
ManagedWindow.ManagedWindow.__init__(self, uistate, track, self)
@ -70,6 +78,7 @@ class BaseSelector(ManagedWindow.ManagedWindow):
self.db = dbstate.db
self.glade = glade.XML(const.GLADE_FILE,"select_person","gramps")
window = self.glade.get_widget('select_person')
self.showall = self.glade.get_widget('showall')
title_label = self.glade.get_widget('title')
vbox = self.glade.get_widget('select_person_vbox')
self.tree = self.glade.get_widget('plist')
@ -98,7 +107,6 @@ class BaseSelector(ManagedWindow.ManagedWindow):
self.build_tree()
self.selection = self.tree.get_selection()
self._local_init()
self._set_size()
@ -106,8 +114,10 @@ class BaseSelector(ManagedWindow.ManagedWindow):
#show or hide search bar?
self.set_show_search_bar(show_search_bar)
#Hide showall always (used in person selector only)
showbox = self.glade.get_widget('showall')
showbox.hide()
if self.filter is not None:
self.showall.show()
else:
self.showall.hide()
def add_columns(self,tree):
tree.set_fixed_height_mode(True)
@ -243,6 +253,11 @@ class BaseSelector(ManagedWindow.ManagedWindow):
self.add_columns(self.tree)
#reset the model with correct sorting
if self.get_model_class() is PeopleModel:
self.model = PeopleModel(self.db,
(PeopleModel.FAST, self.filter),
skip=self.skip_list)
else:
self.model = self.get_model_class()(self.db, self.sort_col,
self.sortorder,
sort_map=self.column_order(),
@ -259,6 +274,9 @@ class BaseSelector(ManagedWindow.ManagedWindow):
self.columns[self.sort_col].set_sort_order(self.sortorder)
# set the search column to be the sorted column
if self.get_model_class() is PeopleModel:
search_col = 0
else:
search_col = self.column_order()[self.sort_col][1]
self.tree.set_search_column(search_col)
@ -285,3 +303,14 @@ class BaseSelector(ManagedWindow.ManagedWindow):
self.tree.scroll_to_cell(path, None, 1, 0.5, 0)
return True
def show_toggle(self, obj):
if obj.get_active():
filter = None
else:
filter = self.filter
self.model = PeopleModel(self.db, (PeopleModel.FAST, filter),
skip=self.skip_list)
self.tree.set_model(self.model)
self.tree.grab_focus()

View File

@ -1,7 +1,8 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2003-2004 Donald N. Allingham
# Copyright (C) 2003-2006 Donald N. Allingham
# 2009 Gary Burton
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -26,26 +27,80 @@
#
#-------------------------------------------------------------------------
from gettext import gettext as _
#-------------------------------------------------------------------------
#
# GTK/Gnome modules
#
#-------------------------------------------------------------------------
import gtk
from gtk import glade
import pango
#-------------------------------------------------------------------------
#
# gramps modules
#
#-------------------------------------------------------------------------
import const
from DisplayModels import PeopleModel
import ManagedWindow
from _BaseSelector import BaseSelector
import Config
column_names = [
#-------------------------------------------------------------------------
#
# SelectEvent
#
#-------------------------------------------------------------------------
class SelectPerson(BaseSelector):
def __init__(self, dbstate, uistate, track=[], title = None, filter = None,
skip=set(), show_search_bar = False):
# SelectPerson may have a title passed to it which should be used
# instead of the default defined for get_window_title()
if title is not None:
self.title = title
BaseSelector.__init__(self, dbstate, uistate, track, filter,
skip, show_search_bar)
def _local_init(self):
"""
Perform local initialisation for this class
"""
self.width_key = Config.PERSON_SEL_WIDTH
self.height_key = Config.PERSON_SEL_HEIGHT
self.tree.connect('key-press-event', self._key_press)
self.showall.connect('toggled',self.show_toggle)
def get_window_title(self):
return _("Select Person")
def get_model_class(self):
return PeopleModel
def get_column_titles(self):
return [
(_('Name'), 250, BaseSelector.TEXT),
(_('ID'), 75, BaseSelector.TEXT),
(_('Gender'), 75, BaseSelector.TEXT),
(_('Birth Date'), 150, BaseSelector.TEXT),
(_('Birth Place'), 150, BaseSelector.TEXT),
(_('Death Date'), 150, BaseSelector.TEXT),
(_('Death Place'), 150, BaseSelector.TEXT),
(_('Spouse'), 150, BaseSelector.TEXT),
(_('Last Change'), 150, BaseSelector.TEXT)
]
def get_from_handle_func(self):
return self.db.get_person_from_handle
def get_handle_column(self):
return PeopleModel.COLUMN_INT_ID
def column_order(self):
"""
returns a tuple indicating the column order of the model
"""
return self.db.get_person_column_order()
def column_view_names(self):
"""
Get correct column view names on which model is based
"""
column_names = [
_('Name'),
_('ID') ,
_('Gender'),
@ -56,137 +111,21 @@ column_names = [
_('Spouse'),
_('Last Change'),
]
return column_names
#-------------------------------------------------------------------------
#
# SelectPerson
#
#-------------------------------------------------------------------------
class SelectPerson(ManagedWindow.ManagedWindow):
def __init__(self, dbstate, uistate, track=[], title='',
filter=None, skip=[]):
if title:
self.title = title
else:
self.title = _("Select Person")
ManagedWindow.ManagedWindow.__init__(self, uistate, track, self)
self.renderer = gtk.CellRendererText()
self.renderer.set_property('ellipsize',pango.ELLIPSIZE_END)
self.dbstate = dbstate
self.glade = glade.XML(const.GLADE_FILE,"select_person","gramps")
self.plist = self.glade.get_widget('plist')
self.showall = self.glade.get_widget('showall')
self.notebook = self.glade.get_widget('notebook')
self.plist.connect('row-activated', self._on_row_activated)
self.plist.connect('key-press-event', self._key_press)
self.selection = self.plist.get_selection()
self.selection.set_mode(gtk.SELECTION_SINGLE)
window = self.glade.get_widget('select_person')
title_label = self.glade.get_widget('title')
self.set_window(window,title_label,self.title)
self.filter = filter
if self.filter:
self.showall.show()
self.skip = skip
self.model = PeopleModel(self.dbstate.db,
(PeopleModel.FAST, filter),
skip=skip)
self.add_columns(self.plist)
self.plist.set_model(self.model)
self.showall.connect('toggled',self.show_toggle)
self.show()
def show_toggle(self, obj):
if obj.get_active():
filt = None
else:
filt = self.filter
self.model = PeopleModel(self.dbstate.db,
(PeopleModel.FAST, filt),
skip=self.skip)
self.plist.set_model(self.model)
def build_menu_names(self, obj):
return (self.title, None)
def add_columns(self, tree):
try:
column = gtk.TreeViewColumn(
_('Name'),
self.renderer,
text=0,
foreground=self.model.marker_color_column)
except AttributeError:
column = gtk.TreeViewColumn(_('Name'), self.renderer, text=0)
column.set_resizable(True)
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
column.set_fixed_width(225)
tree.append_column(column)
for pair in self.dbstate.db.get_person_column_order():
if not pair[0]:
continue
name = column_names[pair[1]]
try:
column = gtk.TreeViewColumn(
name, self.renderer, markup=pair[1],
foreground=self.model.marker_color_column)
except AttributeError:
column = gtk.TreeViewColumn(
name, self.renderer, markup=pair[1])
column.set_resizable(True)
column.set_fixed_width(pair[2])
column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
tree.append_column(column)
def select_function(self,store,path,iter,id_list):
id_list.append(self.model.get_value(iter,PeopleModel.COLUMN_INT_ID))
def get_selected_ids(self):
mlist = []
self.plist.get_selection().selected_foreach(self.select_function,mlist)
return mlist
def run(self):
val = self.window.run()
if val == gtk.RESPONSE_OK:
idlist = self.get_selected_ids()
self.close()
if idlist and idlist[0]:
return_value = self.dbstate.db.get_person_from_handle(idlist[0])
else:
return_value = None
return return_value
elif val != gtk.RESPONSE_DELETE_EVENT:
self.close()
return None
def _on_row_activated(self, treeview, path, view_col):
store, paths = self.selection.get_selected_rows()
if paths and len(paths[0]) == 2 :
self.window.response(gtk.RESPONSE_OK)
def _key_press(self, obj, event):
if not event.state or event.state in (gtk.gdk.MOD2_MASK, ):
if event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter):
store, paths = self.selection.get_selected_rows()
if paths and len(paths[0]) == 1 :
if self.plist.row_expanded(paths[0]):
self.plist.collapse_row(paths[0])
if self.tree.row_expanded(paths[0]):
self.tree.collapse_row(paths[0])
else:
self.plist.expand_row(paths[0], 0)
self.tree.expand_row(paths[0], 0)
return True
return False
def _on_row_activated(self, treeview, path, view_col):
store, paths = self.selection.get_selected_rows()
if paths and len(paths[0]) == 2 :
self.window.response(gtk.RESPONSE_OK)