2005-04-06 Richard Taylor <rjt-gramps@thegrindstone.me.uk>

* src/DdTargets.py: added PERSON_LINK_LIST target.
	* src/FamilyView.py: corrected bug when person is droped if there is no current
	family.
	* src/PeopleView.py: enabled dnd of lists of people.
	* src/plugins/ScratchPad.py: support lists of people.


svn: r4308
This commit is contained in:
Richard Taylor 2005-04-06 13:28:51 +00:00
parent 1475a9dfc2
commit 0b6456511e
5 changed files with 90 additions and 24 deletions

View File

@ -1,3 +1,10 @@
2005-04-06 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/DdTargets.py: added PERSON_LINK_LIST target.
* src/FamilyView.py: corrected bug when person is droped if there is no current
family.
* src/PeopleView.py: enabled dnd of lists of people.
* src/plugins/ScratchPad.py: support lists of people.
2005-04-06 Richard Taylor <rjt-gramps@thegrindstone.me.uk> 2005-04-06 Richard Taylor <rjt-gramps@thegrindstone.me.uk>
* src/GrampsDBCallback.py: improved error reporting when there is an error in * src/GrampsDBCallback.py: improved error reporting when there is an error in
a callback function. Added unittest for exception in callback function. a callback function. Added unittest for exception in callback function.

View File

@ -106,6 +106,7 @@ class _DdTargets(object):
self.MEDIAOBJ = _DdType(self,'mediaobj') self.MEDIAOBJ = _DdType(self,'mediaobj')
self.PERSON_LINK = _DdType(self,'person-link') self.PERSON_LINK = _DdType(self,'person-link')
self.PERSON_LINK_LIST = _DdType(self,'person-link-list')
self.FAMILY_EVENT = _DdType(self,'fevent') self.FAMILY_EVENT = _DdType(self,'fevent')
self.FAMILY_ATTRIBUTE = _DdType(self,'fattr') self.FAMILY_ATTRIBUTE = _DdType(self,'fattr')
@ -120,7 +121,8 @@ class _DdTargets(object):
self.SOURCEREF, self.SOURCEREF,
self.NAME, self.NAME,
self.MEDIAOBJ, self.MEDIAOBJ,
self.PERSON_LINK] self.PERSON_LINK,
self.PERSON_LINK_LIST]
self.CHILD = _DdType(self,'child') self.CHILD = _DdType(self,'child')
self.SPOUSE = _DdType(self,'spouce') self.SPOUSE = _DdType(self,'spouce')

View File

@ -1389,17 +1389,13 @@ class FamilyView:
self.load_family() self.load_family()
def drag_data_received(self,widget,context,x,y,sel_data,info,time): def drag_data_received(self,widget,context,x,y,sel_data,info,time):
path = self.child_list.get_path_at_pos(x,y)
if path == None:
row = len(self.family.get_child_handle_list())
else:
row = path[0][0] -1
if DdTargets.PERSON_LINK.drag_type in context.targets: if DdTargets.PERSON_LINK.drag_type in context.targets:
drop_person_handle = sel_data.data drop_person_handle = sel_data.data
# Check child is not already in the family # Check child is not already in the family
if drop_person_handle in self.family.get_child_handle_list(): if self.family and \
drop_person_handle in self.family.get_child_handle_list():
return return
family = self.family family = self.family
@ -1429,6 +1425,13 @@ class FamilyView:
self.display_marriage(family) self.display_marriage(family)
elif sel_data and sel_data.data: elif sel_data and sel_data.data:
path = self.child_list.get_path_at_pos(x,y)
if path == None:
row = len(self.family.get_child_handle_list())
else:
row = path[0][0] -1
exec 'data = %s' % sel_data.data exec 'data = %s' % sel_data.data
exec 'mytype = "%s"' % data[0] exec 'mytype = "%s"' % data[0]
exec 'person = "%s"' % data[1] exec 'person = "%s"' % data[1]

View File

@ -21,6 +21,13 @@
# $Id$ # $Id$
#------------------------------------------------------------------------
#
# standard python modules
#
#------------------------------------------------------------------------
import cPickle as pickle
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# internationalization # internationalization
@ -87,6 +94,7 @@ class PeopleView:
self.person_selection = self.person_tree.get_selection() self.person_selection = self.person_tree.get_selection()
self.person_selection.set_mode(gtk.SELECTION_MULTIPLE) self.person_selection.set_mode(gtk.SELECTION_MULTIPLE)
self.person_selection.connect('changed',self.row_changed) self.person_selection.connect('changed',self.row_changed)
self.person_selection.connect('changed',self.set_dnd_target)
self.person_tree.connect('row_activated', self.alpha_event) self.person_tree.connect('row_activated', self.alpha_event)
self.person_tree.connect('button-press-event', self.person_tree.connect('button-press-event',
self.on_plist_button_press) self.on_plist_button_press)
@ -94,9 +102,6 @@ class PeopleView:
# #
# DnD support # DnD support
# #
self.person_tree.drag_source_set(BUTTON1_MASK,
[DdTargets.PERSON_LINK.target()],
ACTION_COPY)
self.person_tree.connect('drag_data_get', self.person_drag_data_get) self.person_tree.connect('drag_data_get', self.person_drag_data_get)
def person_drag_data_get(self, widget, context, sel_data, info, time): def person_drag_data_get(self, widget, context, sel_data, info, time):
@ -105,8 +110,21 @@ class PeopleView:
if len(selected_ids) == 1: if len(selected_ids) == 1:
sel_data.set(sel_data.target, 8, selected_ids[0]) sel_data.set(sel_data.target, 8, selected_ids[0])
elif len(selected_ids) > 1: elif len(selected_ids) > 1:
# TBD sel_data.set(DdTargets.PERSON_LINK_LIST.drag_type,8,
pass pickle.dumps(selected_ids))
def set_dnd_target(self,obj):
selected_ids = self.get_selected_objects()
if len(selected_ids) == 1:
self.person_tree.drag_source_set(BUTTON1_MASK,
[DdTargets.PERSON_LINK.target()],
ACTION_COPY)
elif len(selected_ids) > 1:
self.person_tree.drag_source_set(BUTTON1_MASK,
[DdTargets.PERSON_LINK_LIST.target()],
ACTION_COPY)
def sort_clicked(self,obj): def sort_clicked(self,obj):

View File

@ -63,7 +63,7 @@ BLANK_PIC = gtk.gdk.Pixbuf(0,0,8,1,1)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# wrapper classes to provide objecy specific listing in the ListView # wrapper classes to provide object specific listing in the ListView
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -469,6 +469,32 @@ class ScratchPersonLink(ScratchPadWrapper):
return s return s
#-------------------------------------------------------------------------
#
# Wrapper classes to deal with lists of objects
#
#-------------------------------------------------------------------------
class ScratchDropList(object):
def __init__(self,db,obj_list):
self._db = db
self._obj_list = pickle.loads(obj_list)
def get_objects(self):
return [self._cls(self._db,obj) for obj in self._obj_list]
class ScratchPersonLinkList(ScratchDropList):
DROP_TARGETS = [DdTargets.PERSON_LINK_LIST]
DRAG_TARGET = None
def __init__(self,db,obj_list):
ScratchDropList.__init__(self,db,obj_list)
self._cls = ScratchPersonLink
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# ScratchPadListModel class # ScratchPadListModel class
@ -562,6 +588,7 @@ class ScratchPadListView:
self.register_wrapper_class(ScratchPadText) self.register_wrapper_class(ScratchPadText)
self.register_wrapper_class(ScratchMediaObj) self.register_wrapper_class(ScratchMediaObj)
self.register_wrapper_class(ScratchPersonLink) self.register_wrapper_class(ScratchPersonLink)
self.register_wrapper_class(ScratchPersonLinkList)
def register_wrapper_class(self,wrapper_class): def register_wrapper_class(self,wrapper_class):
@ -643,17 +670,26 @@ class ScratchPadListView:
o = wrapper_class(self._db,sel_data) o = wrapper_class(self._db,sel_data)
drop_info = widget.get_dest_row_at_pos(x, y) # If the wrapper object is a subclass of ScratchDropList then
if drop_info: # the drag data was a list of objects and we need to decode
path, position = drop_info # all of them.
iter = model.get_iter(path) if isinstance(o,ScratchDropList):
if (position == gtk.TREE_VIEW_DROP_BEFORE o_list = o.get_objects()
or position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE):
model.insert_before(iter,[o.__class__.DRAG_TARGET.drag_type,o,o.tooltip])
else:
model.insert_after(iter,[o.__class__.DRAG_TARGET.drag_type,o,o.tooltip])
else: else:
model.append([o.__class__.DRAG_TARGET.drag_type,o,o.tooltip]) o_list = [o]
for o in o_list:
drop_info = widget.get_dest_row_at_pos(x, y)
if drop_info:
path, position = drop_info
iter = model.get_iter(path)
if (position == gtk.TREE_VIEW_DROP_BEFORE
or position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE):
model.insert_before(iter,[o.__class__.DRAG_TARGET.drag_type,o,o.tooltip])
else:
model.insert_after(iter,[o.__class__.DRAG_TARGET.drag_type,o,o.tooltip])
else:
model.append([o.__class__.DRAG_TARGET.drag_type,o,o.tooltip])
# remember time for double drop workaround. # remember time for double drop workaround.