Fanchart feature: drag and drop person in center or gen 0 to goto this person

svn: r20319
This commit is contained in:
Benny Malengier 2012-09-03 09:01:34 +00:00
parent eebcec8cc2
commit 6de280afb5

View File

@ -121,18 +121,17 @@ class FanChartWidget(Gtk.DrawingArea):
GObject.GObject.__init__(self) GObject.GObject.__init__(self)
self.dbstate = dbstate self.dbstate = dbstate
self.translating = False self.translating = False
self.goto = None
self.on_popup = callback_popup self.on_popup = callback_popup
self.last_x, self.last_y = None, None self.last_x, self.last_y = None, None
self.connect("button_release_event", self.on_mouse_up) self.connect("button_release_event", self.on_mouse_up)
self.connect("motion_notify_event", self.on_mouse_move) self.connect("motion_notify_event", self.on_mouse_move)
self.connect("button-press-event", self.on_mouse_down) self.connect("button-press-event", self.on_mouse_down)
self.connect("draw", self.on_draw) self.connect("draw", self.on_draw)
self.connect("drag_data_get", self.on_drag_data_get)
self.connect("drag_begin", self.on_drag_begin)
self.connect("drag_end", self.on_drag_end)
self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK |
Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK |
Gdk.EventMask.POINTER_MOTION_MASK) Gdk.EventMask.POINTER_MOTION_MASK)
# Enable drag # Enable drag
self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK,
[], [],
@ -144,6 +143,21 @@ class FanChartWidget(Gtk.DrawingArea):
#allow drag to a text document, info on drag_get will be 0L ! #allow drag to a text document, info on drag_get will be 0L !
tglist.add_text_targets(0L) tglist.add_text_targets(0L)
self.drag_source_set_target_list(tglist) self.drag_source_set_target_list(tglist)
self.connect("drag_data_get", self.on_drag_data_get)
self.connect("drag_begin", self.on_drag_begin)
self.connect("drag_end", self.on_drag_end)
# Enable drop
self.drag_dest_set(Gtk.DestDefaults.MOTION |
Gtk.DestDefaults.DROP,
[],
Gdk.DragAction.COPY)
tglist = Gtk.TargetList.new([])
tglist.add(DdTargets.PERSON_LINK.atom_drag_type,
DdTargets.PERSON_LINK.target_flags,
DdTargets.PERSON_LINK.app_id)
self.drag_dest_set_target_list(tglist)
self.connect('drag_data_received', self.on_drag_data_received)
self.pixels_per_generation = 50 # size of radius for generation self.pixels_per_generation = 50 # size of radius for generation
## gotten from experiments with "sans serif 8": ## gotten from experiments with "sans serif 8":
self.degrees_per_radius = .80 self.degrees_per_radius = .80
@ -726,14 +740,34 @@ class FanChartWidget(Gtk.DrawingArea):
Specified for 'person-link', for others return text info about person. Specified for 'person-link', for others return text info about person.
""" """
tgs = [x.name() for x in context.list_targets()] tgs = [x.name() for x in context.list_targets()]
text, person, parents, child = self.data[self._mouse_click_gen][self._mouse_click_sel] if self._mouse_click_gen == -2:
#children
child_handle, child_gender, has_child \
= self.childrenroot[self._mouse_click_sel]
person = self.dbstate.db.get_person_from_handle(child_handle)
else:
text, person, parents, child \
= self.data[self._mouse_click_gen][self._mouse_click_sel]
if info == DdTargets.PERSON_LINK.app_id: if info == DdTargets.PERSON_LINK.app_id:
data = (DdTargets.PERSON_LINK.drag_type, data = (DdTargets.PERSON_LINK.drag_type,
id(self), person.get_handle(), 0) id(self), person.get_handle(), 0)
sel_data.set(sel_data.get_target(), 8, pickle.dumps(data)) sel_data.set(sel_data.get_target(), 8, pickle.dumps(data))
elif ('TEXT' in tgs or 'text/plain' in tgs) and info == 0L: elif ('TEXT' in tgs or 'text/plain' in tgs) and info == 0L:
sel_data.set_text(self.format_helper.format_person(person, 11), -1) sel_data.set_text(self.format_helper.format_person(person, 11), -1)
def on_drag_data_received(self, widget, context, x, y, sel_data, info, time):
"""
Handle the standard gtk interface for drag_data_received.
If the selection data is defined, extract the value from sel_data.data
"""
gen, persatcurs = self.person_under_cursor(x, y)
if gen == -1 or gen == 0:
if sel_data and sel_data.get_data():
(drag_type, idval, handle, val) = pickle.loads(sel_data.get_data())
self.goto(self, handle)
class FanChartGrampsGUI(object): class FanChartGrampsGUI(object):
""" class for functions fanchart GUI elements will need in Gramps """ class for functions fanchart GUI elements will need in Gramps
""" """
@ -741,7 +775,7 @@ class FanChartGrampsGUI(object):
on_childmenu_changed): on_childmenu_changed):
""" """
Common part of GUI that shows Fan Chart, needs to know what to do if Common part of GUI that shows Fan Chart, needs to know what to do if
one moves via Fan Chart to a new person one moves via Fan Ch def set_fan(self, fan):art to a new person
on_childmenu_changed: in popup, function called on moving to a new person on_childmenu_changed: in popup, function called on moving to a new person
""" """
self.fan = None self.fan = None
@ -753,7 +787,7 @@ class FanChartGrampsGUI(object):
self.childring = childring self.childring = childring
def have_parents(self, person): def have_parents(self, person):
""" """on_childmenu_changed
Returns True if a person has parents. Returns True if a person has parents.
""" """
if person: if person:
@ -797,6 +831,7 @@ class FanChartGrampsGUI(object):
""" """
self.fan = fan self.fan = fan
self.fan.format_helper = self.format_helper self.fan.format_helper = self.format_helper
self.fan.goto = self.on_childmenu_changed
def main(self): def main(self):
""" """
@ -877,7 +912,7 @@ class FanChartGrampsGUI(object):
go_image.show() go_image.show()
go_item = Gtk.ImageMenuItem(name_displayer.display(person)) go_item = Gtk.ImageMenuItem(name_displayer.display(person))
go_item.set_image(go_image) go_item.set_image(go_image)
go_item.connect("activate",self.on_childmenu_changed,person_handle) go_item.connect("activate", self.on_childmenu_changed, person_handle)
go_item.show() go_item.show()
menu.append(go_item) menu.append(go_item)
@ -887,7 +922,8 @@ class FanChartGrampsGUI(object):
menu.append(edit_item) menu.append(edit_item)
clipboard_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_COPY, accel_group=None) clipboard_item = Gtk.ImageMenuItem.new_from_stock(stock_id=Gtk.STOCK_COPY, accel_group=None)
clipboard_item.connect("activate",self.copy_person_to_clipboard_cb,person_handle) clipboard_item.connect("activate", self.copy_person_to_clipboard_cb,
person_handle)
clipboard_item.show() clipboard_item.show()
menu.append(clipboard_item) menu.append(clipboard_item)
@ -918,7 +954,7 @@ class FanChartGrampsGUI(object):
sp_item = Gtk.ImageMenuItem(name_displayer.display(spouse)) sp_item = Gtk.ImageMenuItem(name_displayer.display(spouse))
sp_item.set_image(go_image) sp_item.set_image(go_image)
linked_persons.append(sp_id) linked_persons.append(sp_id)
sp_item.connect("activate",self.on_childmenu_changed, sp_id) sp_item.connect("activate", self.on_childmenu_changed, sp_id)
sp_item.show() sp_item.show()
sp_menu.append(sp_item) sp_menu.append(sp_item)