3275: PageView reworking-pageview3.patch

svn: r13364
This commit is contained in:
Benny Malengier
2009-10-11 06:36:56 +00:00
parent 3dd41b0444
commit 5504df77ba
7 changed files with 147 additions and 71 deletions

View File

@@ -51,7 +51,8 @@ except:
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import gen.lib import gen.lib
import PageView import gui.views.pageview as PageView
from gui.views.navigationview import NavigationView
from BasicUtils import name_displayer from BasicUtils import name_displayer
import Utils import Utils
import DateHandler import DateHandler
@@ -63,6 +64,8 @@ from DdTargets import DdTargets
import cPickle as pickle import cPickle as pickle
import config import config
from QuestionDialog import RunDatabaseRepair, ErrorDialog from QuestionDialog import RunDatabaseRepair, ErrorDialog
import Bookmarks
import const
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@@ -460,11 +463,12 @@ class FormattingHelper(object):
# PedigreeView # PedigreeView
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
class PedigreeView(PageView.PersonNavView): class PedigreeView(NavigationView):
def __init__(self,dbstate,uistate): def __init__(self,dbstate,uistate):
PageView.PersonNavView.__init__(self, _('Pedigree'), dbstate, uistate) NavigationView.__init__(self, _('Pedigree'), dbstate, uistate,
dbstate.db.get_bookmarks(),
Bookmarks.Bookmarks)
self.func_list = { self.func_list = {
'<CONTROL>J' : self.jump, '<CONTROL>J' : self.jump,
} }
@@ -479,6 +483,7 @@ class PedigreeView(PageView.PersonNavView):
self.format_helper = FormattingHelper( self.dbstate) self.format_helper = FormattingHelper( self.dbstate)
def change_page(self): def change_page(self):
NavigationView.change_page(self)
self.uistate.clear_filter_results() self.uistate.clear_filter_results()
def init_parent_signals_cb(self, widget, event): def init_parent_signals_cb(self, widget, event):
@@ -503,16 +508,6 @@ class PedigreeView(PageView.PersonNavView):
# for PyGtk < 2.4 # for PyGtk < 2.4
self.notebook.append_page(frame,gtk.Label("")) self.notebook.append_page(frame,gtk.Label(""))
def set_active(self):
PageView.PersonNavView.set_active(self)
self.key_active_changed = self.dbstate.connect('active-changed',
self.goto_active_person)
self.build_tree()
def set_inactive(self):
PageView.PersonNavView.set_inactive(self)
self.dbstate.disconnect(self.key_active_changed)
def get_stock(self): def get_stock(self):
""" """
Return the name of the stock icon to use for the display. Return the name of the stock icon to use for the display.
@@ -599,7 +594,19 @@ class PedigreeView(PageView.PersonNavView):
at the beginning of the history. at the beginning of the history.
""" """
PageView.PersonNavView.define_actions(self) NavigationView.define_actions(self)
self._add_action('FilterEdit', None, _('Person Filter Editor'),
callback=self.filter_editor)
def filter_editor(self, obj):
from FilterEditor import FilterEditor
try:
FilterEditor('Person', const.CUSTOM_FILTERS,
self.dbstate, self.uistate)
except Errors.WindowActiveError:
return
def build_tree(self): def build_tree(self):
""" """
@@ -637,7 +644,10 @@ class PedigreeView(PageView.PersonNavView):
self.bookmarks.redraw() self.bookmarks.redraw()
self.build_tree() self.build_tree()
def goto_active_person(self, handle=None): def navigation_type(self):
return PageView.NAVIGATION_PERSON
def goto_handle(self, handle=None):
self.dirty = True self.dirty = True
if handle: if handle:
self.rebuild_trees(handle) self.rebuild_trees(handle)

View File

@@ -46,7 +46,8 @@ import pango
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import gen.lib import gen.lib
import PageView import gui.views.pageview as PageView
from gui.views.navigationview import NavigationView
from BasicUtils import name_displayer from BasicUtils import name_displayer
from Utils import media_path_full, probably_alive from Utils import media_path_full, probably_alive
import DateHandler import DateHandler
@@ -55,6 +56,8 @@ import config
import widgets import widgets
import Errors import Errors
import gen.utils import gen.utils
import Bookmarks
import const
from ReportBase import ReportUtils from ReportBase import ReportUtils
@@ -109,13 +112,14 @@ class AttachList(object):
self.max_x = max(self.max_x, x1) self.max_x = max(self.max_x, x1)
self.max_y = max(self.max_y, y1) self.max_y = max(self.max_y, y1)
class RelationshipView(PageView.PersonNavView): class RelationshipView(NavigationView):
def __init__(self, dbstate, uistate): def __init__(self, dbstate, uistate):
NavigationView.__init__(self, _('Relationships'),
PageView.PersonNavView.__init__( dbstate, uistate,
self, _('Relationships'), dbstate, uistate) dbstate.db.get_bookmarks(),
Bookmarks.Bookmarks)
self.func_list = { self.func_list = {
'<CONTROL>J' : self.jump, '<CONTROL>J' : self.jump,
} }
@@ -157,16 +161,12 @@ class RelationshipView(PageView.PersonNavView):
self.callman.add_db_signal('person-delete', self.redraw) self.callman.add_db_signal('person-delete', self.redraw)
def set_active(self): def navigation_type(self):
PageView.PersonNavView.set_active(self) return PageView.NAVIGATION_PERSON
self.key_active_changed = self.dbstate.connect('active-changed',
self.redraw) def goto_handle(self, handle):
self.build_tree() self.redraw()
def set_inactive(self):
PageView.PersonNavView.set_inactive(self)
self.dbstate.disconnect(self.key_active_changed)
def shade_update(self, client, cnxn_id, entry, data): def shade_update(self, client, cnxn_id, entry, data):
self.use_shade = config.get('preferences.relation-shade') self.use_shade = config.get('preferences.relation-shade')
self.toolbar_visible = config.get('interface.toolbar-on') self.toolbar_visible = config.get('interface.toolbar-on')
@@ -225,6 +225,7 @@ class RelationshipView(PageView.PersonNavView):
self.change_person(None) self.change_person(None)
def change_page(self): def change_page(self):
NavigationView.change_page(self)
self.uistate.clear_filter_results() self.uistate.clear_filter_results()
def get_stock(self): def get_stock(self):
@@ -324,7 +325,7 @@ class RelationshipView(PageView.PersonNavView):
</ui>''' </ui>'''
def define_actions(self): def define_actions(self):
PageView.PersonNavView.define_actions(self) NavigationView.define_actions(self)
self.order_action = gtk.ActionGroup(self.title + '/ChangeOrder') self.order_action = gtk.ActionGroup(self.title + '/ChangeOrder')
self.order_action.add_actions([ self.order_action.add_actions([
@@ -352,7 +353,10 @@ class RelationshipView(PageView.PersonNavView):
_("Add person as child to an existing family"), _("Add person as child to an existing family"),
self.select_parents), self.select_parents),
]) ])
self._add_action('FilterEdit', None, _('Person Filter Editor'),
callback=self.filter_editor)
self._add_action_group(self.order_action) self._add_action_group(self.order_action)
self._add_action_group(self.family_action) self._add_action_group(self.family_action)
@@ -366,6 +370,15 @@ class RelationshipView(PageView.PersonNavView):
self.order_action.set_sensitive(self.reorder_sensitive) self.order_action.set_sensitive(self.reorder_sensitive)
self.family_action.set_sensitive(False) self.family_action.set_sensitive(False)
def filter_editor(self, obj):
from FilterEditor import FilterEditor
try:
FilterEditor('Person', const.CUSTOM_FILTERS,
self.dbstate, self.uistate)
except Errors.WindowActiveError:
return
def siblings_toggle(self, obj): def siblings_toggle(self, obj):
self.show_siblings = obj.get_active() self.show_siblings = obj.get_active()
self.change_person(self.dbstate.active.handle) self.change_person(self.dbstate.active.handle)

View File

@@ -67,7 +67,7 @@ import GrampsCfg
import Errors import Errors
from QuestionDialog import (ErrorDialog, WarningDialog, QuestionDialog2, from QuestionDialog import (ErrorDialog, WarningDialog, QuestionDialog2,
InfoDialog) InfoDialog)
import PageView import gui.views.pageview as PageView
import Navigation import Navigation
import RecentFiles import RecentFiles
from BasicUtils import name_displayer from BasicUtils import name_displayer

View File

@@ -19,6 +19,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
# $Id: $
""" """
Provide the base classes for GRAMPS' DataView classes Provide the base classes for GRAMPS' DataView classes
""" """
@@ -77,7 +79,7 @@ class ListView(NavigationView):
def __init__(self, title, dbstate, uistate, columns, handle_col, def __init__(self, title, dbstate, uistate, columns, handle_col,
make_model, signal_map, get_bookmarks, bm_type, make_model, signal_map, get_bookmarks, bm_type,
multiple=False, filter_class=None): multiple=False, filter_class=None, markup=False):
NavigationView.__init__(self, title, dbstate, uistate, NavigationView.__init__(self, title, dbstate, uistate,
get_bookmarks, bm_type) get_bookmarks, bm_type)
@@ -95,6 +97,7 @@ class ListView(NavigationView):
self.signal_map = signal_map self.signal_map = signal_map
self.multiple_selection = multiple self.multiple_selection = multiple
self.generic_filter = None self.generic_filter = None
self.markup_required = markup
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
#################################################################### ####################################################################
@@ -192,15 +195,11 @@ class ListView(NavigationView):
column = gtk.TreeViewColumn(name, self.renderer) column = gtk.TreeViewColumn(name, self.renderer)
if self.model and \ if self.model and self.model.marker_column() is not None:
'marker_color_column' in self.model.__dict__ \ mcol = self.model.marker_column()
and self.model.marker_color_column is not None:
mcol = self.model.marker_color_column
column.add_attribute(self.renderer, 'foreground', mcol) column.add_attribute(self.renderer, 'foreground', mcol)
# TODO: markup is not required for all columns if self.markup_required and pair[1] != 0:
markup_required = True
if markup_required and pair[1] != 0:
column.add_attribute(self.renderer, 'markup', pair[1]) column.add_attribute(self.renderer, 'markup', pair[1])
else: else:
column.add_attribute(self.renderer, 'text', pair[1]) column.add_attribute(self.renderer, 'text', pair[1])
@@ -220,11 +219,12 @@ class ListView(NavigationView):
if config.get('interface.filter'): if config.get('interface.filter'):
filter_info = (True, self.generic_filter) filter_info = (True, self.generic_filter)
else: else:
filter_info = (False, self.search_bar.get_value()) if self.search_bar.get_value()[0] in self.exact_search():
filter_info = (False, self.search_bar.get_value(), True)
else:
filter_info = (False, self.search_bar.get_value(), False)
# TODO: Fix this for both flat and tree if self.dirty or not self.model:
if self.dirty or self.model is None:
# or not self.model.node_map.full_srtkey_hndl_map():
self.model = self.make_model(self.dbstate.db, self.sort_col, self.model = self.make_model(self.dbstate.db, self.sort_col,
search=filter_info, search=filter_info,
sort_map=self.column_order()) sort_map=self.column_order())
@@ -256,6 +256,12 @@ class ListView(NavigationView):
def search_build_tree(self): def search_build_tree(self):
self.build_tree() self.build_tree()
def exact_search(self):
"""
Returns a tuple indicating columns requiring an exact search
"""
return ()
#################################################################### ####################################################################
# Filter # Filter
#################################################################### ####################################################################
@@ -342,7 +348,7 @@ class ListView(NavigationView):
if not handle or handle in self.selected_handles(): if not handle or handle in self.selected_handles():
return return
if self.model.on_get_flags() & gtk.TREE_MODEL_LIST_ONLY: if self.model.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
# Flat # Flat
try: try:
path = self.model.on_get_path(handle) path = self.model.on_get_path(handle)
@@ -387,6 +393,9 @@ class ListView(NavigationView):
def drag_info(self): def drag_info(self):
return None return None
def drag_list_info(self):
return None
def drag_begin(self, widget, context): def drag_begin(self, widget, context):
widget.drag_source_set_icon_stock(self.get_stock()) widget.drag_source_set_icon_stock(self.get_stock())
return True return True
@@ -476,7 +485,7 @@ class ListView(NavigationView):
self.uistate.set_busy_cursor(0) self.uistate.set_busy_cursor(0)
def blist(self, store, path, node, sel_list): def blist(self, store, path, node, sel_list):
if store.on_get_flags() & gtk.TREE_MODEL_LIST_ONLY: if store.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
handle = store.get_value(node, self.handle_col) handle = store.get_value(node, self.handle_col)
else: else:
handle = store.get_handle(store.on_get_iter(path)) handle = store.get_handle(store.on_get_iter(path))
@@ -525,19 +534,19 @@ class ListView(NavigationView):
handle = self.first_selected() handle = self.first_selected()
if config.get('interface.filter'): if config.get('interface.filter'):
search = (True, self.generic_filter) filter_info = (True, self.generic_filter)
else: else:
search = (False, self.search_bar.get_value()) if self.search_bar.get_value()[0] in self.exact_search():
filter_info = (False, self.search_bar.get_value(), True)
else:
filter_info = (False, self.search_bar.get_value(), False)
# TODO: This line is needed but gives a warning
#self.list.set_model(None)
if same_col: if same_col:
self.model.reverse_order() self.model.reverse_order()
else: else:
self.model = self.make_model(self.dbstate.db, self.sort_col, self.model = self.make_model(self.dbstate.db, self.sort_col,
self.sort_order, self.sort_order,
search=search, search=filter_info,
sort_map=self.column_order()) sort_map=self.column_order())
self.list.set_model(self.model) self.list.set_model(self.model)
@@ -587,17 +596,18 @@ class ListView(NavigationView):
selected_ids = self.selected_handles() selected_ids = self.selected_handles()
if len(selected_ids) > 0: if len(selected_ids) > 0:
self.change_active(selected_ids[0]) self.change_active(selected_ids[0])
if self.drag_info():
if len(selected_ids) == 1: if len(selected_ids) == 1:
if self.drag_info():
self.list.drag_source_set(gtk.gdk.BUTTON1_MASK, self.list.drag_source_set(gtk.gdk.BUTTON1_MASK,
[self.drag_info().target()], [self.drag_info().target()],
gtk.gdk.ACTION_COPY) gtk.gdk.ACTION_COPY)
elif len(selected_ids) > 1:
# TODO: This needs putting back again if self.drag_list_info():
#elif len(selected_ids) > 1: self.list.drag_source_set(gtk.gdk.BUTTON1_MASK,
#self.list.drag_source_set(gtk.gdk.BUTTON1_MASK, [self.drag_list_info().target()],
#[DdTargets.PERSON_LINK_LIST.target()], gtk.gdk.ACTION_COPY)
#gtk.gdk.ACTION_COPY)
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
def row_add(self, handle_list): def row_add(self, handle_list):
@@ -777,17 +787,40 @@ class ListView(NavigationView):
ofile.open(name) ofile.open(name)
ofile.start_page() ofile.start_page()
ofile.start_row() ofile.start_row()
# Headings
for name in column_names: for name in column_names:
ofile.write_cell(name) ofile.write_cell(name)
ofile.end_row() ofile.end_row()
for row in self.model: if self.model.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
ofile.start_row() # Flat model
for index in data_cols: for row in self.model:
ofile.write_cell(row[index]) ofile.start_row()
ofile.end_row() for index in data_cols:
ofile.write_cell(row[index])
ofile.end_row()
else:
# Tree model
node = self.model.get_iter_first()
self.write_node(node, 0, ofile, data_cols)
ofile.end_page() ofile.end_page()
ofile.close() ofile.close()
def write_node(self, node, level, ofile, data_cols):
if node is None:
return
while node is not None:
ofile.start_row()
for counter in range(level): # Indentation
ofile.write_cell('')
for index in data_cols:
ofile.write_cell(self.model.get_value(node, index))
ofile.end_row()
first_child = self.model.iter_children(node)
self.write_node(first_child, level + 1, ofile, data_cols)
node = self.model.iter_next(node)
#################################################################### ####################################################################
# Template functions # Template functions

View File

@@ -19,6 +19,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
# $Id: $
""" """
Provide the base classes for GRAMPS' DataView classes Provide the base classes for GRAMPS' DataView classes
""" """

View File

@@ -18,6 +18,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# #
# $Id: $
""" """
Provide the base class for GRAMPS' DataView classes Provide the base class for GRAMPS' DataView classes
""" """

View File

@@ -73,6 +73,7 @@ import gtk
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from Filters import SearchFilter from Filters import SearchFilter
from Filters import ExactSearchFilter
import config import config
from Utils import conv_unicode_tosrtkey_ongtk from Utils import conv_unicode_tosrtkey_ongtk
@@ -392,7 +393,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
self.set_search(search) self.set_search(search)
self._reverse = (order == gtk.SORT_DESCENDING) self._reverse = (order == gtk.SORT_DESCENDING)
self.tooltip_column = tooltip_column self._tooltip_column = tooltip_column
config.connect("preferences.todo-color", config.connect("preferences.todo-color",
self.__update_todo) self.__update_todo)
@@ -429,7 +430,10 @@ class FlatBaseModel(gtk.GenericTreeModel):
text = search[1][1] text = search[1][1]
inv = search[1][2] inv = search[1][2]
func = lambda x: self.on_get_value(x, col) or u"" func = lambda x: self.on_get_value(x, col) or u""
self.search = SearchFilter(func, text, inv) if search[2]:
self.search = ExactSearchFilter(func, text, inv)
else:
self.search = SearchFilter(func, text, inv)
else: else:
self.search = None self.search = None
self.rebuild_data = self._rebuild_search self.rebuild_data = self._rebuild_search
@@ -474,6 +478,18 @@ class FlatBaseModel(gtk.GenericTreeModel):
self._reverse = not self._reverse self._reverse = not self._reverse
self.node_map.reverse_order() self.node_map.reverse_order()
def tooltip_column(self):
"""
Return the column for tooltips.
"""
return self._tooltip_column
def marker_column(self):
"""
Return the column for marker colour.
"""
return None
def sort_keys(self): def sort_keys(self):
""" """
Return the (sort_key, handle) list of all data that can maximally Return the (sort_key, handle) list of all data that can maximally
@@ -606,7 +622,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
""" """
See gtk.TreeModel See gtk.TreeModel
""" """
if index == self.tooltip_column: if index == self._tooltip_column:
return object return object
return str return str