Start with fix up of connects to db in relationview.

Fix calling method of signals to a shorter algorithm based on lambda 
func


svn: r13115
This commit is contained in:
Benny Malengier 2009-08-24 21:44:15 +00:00
parent 3d13046fa0
commit 43663bbee7
4 changed files with 72 additions and 117 deletions

View File

@ -123,7 +123,6 @@ class RelationshipView(PageView.PersonNavView):
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
self.show_siblings = Config.get(Config.FAMILY_SIBLINGS) self.show_siblings = Config.get(Config.FAMILY_SIBLINGS)
self.show_details = Config.get(Config.FAMILY_DETAILS) self.show_details = Config.get(Config.FAMILY_DETAILS)
self.connect_to_db(dbstate.db)
self.redrawing = False self.redrawing = False
self.use_shade = Config.get(Config.RELATION_SHADE) self.use_shade = Config.get(Config.RELATION_SHADE)
self.toolbar_visible = Config.get(Config.TOOLBAR_ON) self.toolbar_visible = Config.get(Config.TOOLBAR_ON)
@ -141,6 +140,23 @@ class RelationshipView(PageView.PersonNavView):
self.reorder_sensitive = False self.reorder_sensitive = False
self.collapsed_items = {} self.collapsed_items = {}
def _connect_db_signals(self):
"""
implement from base class DbGUIElement
Register the callbacks we need.
"""
# Add a signal to pick up event changes, bug #1416
self.callman.add_db_signal('event-update', self.family_update)
self.callman.add_db_signal('person-update', self.person_update)
self.callman.add_db_signal('person-rebuild', self.person_rebuild)
self.callman.add_db_signal('family-update', self.family_update)
self.callman.add_db_signal('family-add', self.family_add)
self.callman.add_db_signal('family-delete', self.family_delete)
self.callman.add_db_signal('family-rebuild', self.family_rebuild)
self.callman.add_db_signal('person-delete', self.redraw)
def set_active(self): def set_active(self):
PageView.PersonNavView.set_active(self) PageView.PersonNavView.set_active(self)
self.key_active_changed = self.dbstate.connect('active-changed', self.key_active_changed = self.dbstate.connect('active-changed',
@ -162,17 +178,6 @@ class RelationshipView(PageView.PersonNavView):
def build_tree(self): def build_tree(self):
self.redraw() self.redraw()
def connect_to_db(self, db):
# Add a signal to pick up event changes, bug #1416
db.connect('event-update', self.family_update)
db.connect('person-update', self.person_update)
db.connect('person-rebuild', self.person_rebuild)
db.connect('family-update', self.family_update)
db.connect('family-add', self.family_add)
db.connect('family-delete', self.family_delete)
db.connect('family-rebuild', self.family_rebuild)
def person_update(self, handle_list): def person_update(self, handle_list):
if self.dbstate.active: if self.dbstate.active:
@ -372,19 +377,14 @@ class RelationshipView(PageView.PersonNavView):
Config.set(Config.FAMILY_DETAILS, self.show_details) Config.set(Config.FAMILY_DETAILS, self.show_details)
def change_db(self, db): def change_db(self, db):
self.connect_to_db(db) #reset the connects
self._change_db(db)
if self.child: if self.child:
for old_child in self.vbox.get_children(): for old_child in self.vbox.get_children():
self.vbox.remove(old_child) self.vbox.remove(old_child)
for old_child in self.header.get_children(): for old_child in self.header.get_children():
self.header.remove(old_child) self.header.remove(old_child)
self.child = None self.child = None
self.dbstate.db.connect('family-update', self.redraw)
self.dbstate.db.connect('family-add', self.redraw)
self.dbstate.db.connect('family-delete', self.redraw)
self.dbstate.db.connect('person-update', self.redraw)
self.dbstate.db.connect('person-add', self.redraw)
self.dbstate.db.connect('person-delete', self.redraw)
self.bookmarks.update_bookmarks(db.get_bookmarks()) self.bookmarks.update_bookmarks(db.get_bookmarks())
if self.active: if self.active:
self.bookmarks.redraw() self.bookmarks.redraw()

View File

@ -55,6 +55,7 @@ import Errors
from Filters import SearchBar from Filters import SearchBar
import Utils import Utils
from gui.utils import add_menuitem from gui.utils import add_menuitem
from gui.dbguielement import DbGUIElement
import const import const
from widgets.menutoolbuttonaction import MenuToolButtonAction from widgets.menutoolbuttonaction import MenuToolButtonAction
@ -69,7 +70,7 @@ NAVIGATION_PERSON = 0
# PageView # PageView
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
class PageView(object): class PageView(DbGUIElement):
""" """
The PageView class is the base class for all Data Views in GRAMPS. All The PageView class is the base class for all Data Views in GRAMPS. All
Views should derive from this class. The ViewManager understands the public Views should derive from this class. The ViewManager understands the public
@ -97,6 +98,7 @@ class PageView(object):
self.handle_col = 0 self.handle_col = 0
self.selection = None self.selection = None
self.func_list = {} self.func_list = {}
DbGUIElement.__init__(self, dbstate.db)
def call_function(self, key): def call_function(self, key):
""" """
@ -1006,8 +1008,9 @@ class ListView(BookMarkView):
return return
def change_db(self, db): def change_db(self, db):
self._cleanup_callbacks()
for sig in self.signal_map: for sig in self.signal_map:
db.connect(sig, self.signal_map[sig]) self.callman.add_db_signal(sig, self.signal_map[sig])
self.bookmarks.update_bookmarks(self.get_bookmarks()) self.bookmarks.update_bookmarks(self.get_bookmarks())
if self.active: if self.active:
#force rebuild of the model on build of tree #force rebuild of the model on build of tree

View File

@ -242,12 +242,19 @@ class CallbackManager(object):
if keys is None: if keys is None:
return return
for key in keys: for key in keys:
for method in METHODS: for method in METHODS_LIST:
signal = key + method signal = key + method
self.__do_unconnect(signal) self.__do_unconnect(signal)
self.__callbacks[signal][1] = self.database.connect( self.__callbacks[signal][1] = self.database.connect(
signal, signal,
self.__callbackcreator(key, signal)) self.__callbackcreator(signal))
for method in METHODS_NONE:
signal = key + method
self.__do_unconnect(signal)
self.__callbacks[signal][1] = self.database.connect(
signal,
self.__callbackcreator(signal,
noarg=True))
def __do_callback(self, signal, *arg): def __do_callback(self, signal, *arg):
""" """
@ -291,107 +298,33 @@ class CallbackManager(object):
""" """
self.custom_signal_keys.append(self.database.connect(name, callback)) self.custom_signal_keys.append(self.database.connect(name, callback))
def __callbackcreator(self, key, signal): def __callbackcreator(self, signal, noarg=False):
""" """
helper function, a lambda function needs a string to be defined helper function, a lambda function needs a string to be defined
explicitly. This function creates the correct lambda function to use explicitly. This function creates the correct lambda function to use
as callback based on the key/signal one needs to connect to. as callback based on the key/signal one needs to connect to.
AttributeError is raised for unknown key or signal. AttributeError is raised for unknown key or signal.
""" """
if key == PERSONKEY: def gen(self, signal):
if signal == 'person-update': """
return lambda arg: self.__do_callback('person-update', *(arg,)) Generate lambda function that does call with an argument
elif signal == 'person-add': """
return lambda arg: self.__do_callback('person-add', *(arg,)) return lambda arg: self.__do_callback(signal, *(arg,))
elif signal == 'person-delete':
return lambda arg: self.__do_callback('person-delete', *(arg,)) def gen_noarg(self, signal):
elif signal == 'person-rebuild': """
return lambda *arg: self.__do_callback('person-rebuild') Generate lambda function that does call without argument
"""
return lambda *arg: self.__do_callback(signal)
if signal in self.__callbacks:
if noarg:
return gen_noarg(self, signal)
else: else:
raise AttributeError, 'Signal ' + signal + 'not supported.' return gen(self, signal)
elif key == FAMILYKEY:
if signal == 'family-update':
return lambda arg: self.__do_callback('family-update', *(arg,))
elif signal == 'family-add':
return lambda arg: self.__do_callback('family-add', *(arg,))
elif signal == 'family-delete':
return lambda arg: self.__do_callback('family-delete', *(arg,))
elif signal == 'family-rebuild':
return lambda *arg: self.__do_callback('family-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
elif key == EVENTKEY:
if signal == 'event-update':
return lambda arg: self.__do_callback('event-update', *(arg,))
elif signal == 'event-add':
return lambda arg: self.__do_callback('event-add', *(arg,))
elif signal == 'event-delete':
return lambda arg: self.__do_callback('event-delete', *(arg,))
elif signal == 'event-rebuild':
return lambda *arg: self.__do_callback('event-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
elif key == PLACEKEY:
if signal == 'place-update':
return lambda arg: self.__do_callback('place-update', *(arg,))
elif signal == 'place-add':
return lambda arg: self.__do_callback('place-add', *(arg,))
elif signal == 'place-delete':
return lambda arg: self.__do_callback('place-delete', *(arg,))
elif signal == 'place-rebuild':
return lambda *arg: self.__do_callback('place-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
elif key == SOURCEKEY:
if signal == 'source-update':
return lambda arg: self.__do_callback('source-update', *(arg,))
elif signal == 'source-add':
return lambda arg: self.__do_callback('source-add', *(arg,))
elif signal == 'source-delete':
return lambda arg: self.__do_callback('source-delete', *(arg,))
elif signal == 'source-rebuild':
return lambda *arg: self.__do_callback('source-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
elif key == REPOKEY:
if signal == 'repository-update':
return lambda arg: self.__do_callback('repository-update',
*(arg,))
elif signal == 'repository-add':
return lambda arg: self.__do_callback('repository-add',
*(arg,))
elif signal == 'repository-delete':
return lambda arg: self.__do_callback('repository-delete',
*(arg,))
elif signal == 'repository-rebuild':
return lambda *arg: self.__do_callback('repository-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
elif key == MEDIAKEY:
if signal == 'media-update':
return lambda arg: self.__do_callback('media-update', *(arg,))
elif signal == 'media-add':
return lambda arg: self.__do_callback('media-add', *(arg,))
elif signal == 'media-delete':
return lambda arg: self.__do_callback('media-delete', *(arg,))
elif signal == 'media-rebuild':
return lambda *arg: self.__do_callback('media-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
elif key == NOTEKEY:
if signal == 'note-update':
return lambda arg: self.__do_callback('note-update', *(arg,))
elif signal == 'note-add':
return lambda arg: self.__do_callback('note-add', *(arg,))
elif signal == 'note-delete':
return lambda arg: self.__do_callback('note-delete', *(arg,))
elif signal == 'note-rebuild':
return lambda *arg: self.__do_callback('note-rebuild')
else:
raise AttributeError, 'Signal ' + signal + 'not supported.'
else: else:
raise AttributeError, 'Signal ' + signal + 'not supported.' raise AttributeError, 'Signal ' + signal + 'not supported.'
def directhandledict(baseobj): def directhandledict(baseobj):
""" """
Build a handledict from baseobj with all directly referenced objects Build a handledict from baseobj with all directly referenced objects

View File

@ -74,7 +74,8 @@ class DbGUIElement(object):
def _connect_db_signals(self): def _connect_db_signals(self):
""" """
Convenience method that is called on initialization of DbGUIElement. Convenience method that is called on initialization of DbGUIElement.
Use this to group setup of the callman attribute Use this to group setup of the callman attribute.
Also called in _change_db method
""" """
pass pass
@ -85,5 +86,23 @@ class DbGUIElement(object):
normally needed earlier, calling this method does so. normally needed earlier, calling this method does so.
""" """
database = self.callman.database database = self.callman.database
self.callman.disconnect_all() if database.is_open():
#a closed database has disconnected all signals
self.callman.disconnect_all()
#set a new callback manager
self.callman = CallbackManager(database) self.callman = CallbackManager(database)
def _change_db(self, database):
"""
Change the database the GUI element works on to database.
This removes all callbacks and all registered handles.
:param database: the new database to connect to
"""
dbold = self.callman.database
if dbold.is_open():
#a closed database has disconnected all signals
self.callman.disconnect_all()
#set a new callback manager on new database
self.callman = CallbackManager(database)
self._connect_db_signals()