Added right-click API to ListModel; allow copy all from Descendants
Gramplet.
This commit is contained in:
parent
774855496f
commit
ecac48e5b1
@ -75,10 +75,12 @@ class ListModel(object):
|
||||
event_func: Function called when the user double-clicks on a row.
|
||||
mode: Selection mode for TreeView. See Gtk documentation.
|
||||
list_mode: "list" or "tree"
|
||||
right_click: Function called when the user right-clicks on a row.
|
||||
"""
|
||||
|
||||
def __init__(self, tree, dlist, select_func=None, event_func=None,
|
||||
mode=Gtk.SelectionMode.SINGLE, list_mode="list"):
|
||||
mode=Gtk.SelectionMode.SINGLE, list_mode="list",
|
||||
right_click=None):
|
||||
|
||||
self.tree = tree
|
||||
self.tree.set_fixed_height_mode(True)
|
||||
@ -86,6 +88,8 @@ class ListModel(object):
|
||||
self.data_index = 0
|
||||
self.sel_iter = None
|
||||
self.list_mode = list_mode # "list", or "tree"
|
||||
self.double_click = None
|
||||
self.right_click = None
|
||||
|
||||
for info in dlist:
|
||||
col_type = TEXT
|
||||
@ -124,8 +128,11 @@ class ListModel(object):
|
||||
|
||||
if select_func:
|
||||
self.selection.connect('changed', select_func)
|
||||
if event_func or right_click:
|
||||
if event_func:
|
||||
self.double_click = event_func
|
||||
if right_click:
|
||||
self.right_click = right_click
|
||||
self.tree.connect('button-press-event', self.__button_press)
|
||||
|
||||
def __build_image_column(self, cnum, name, renderer, column):
|
||||
@ -474,9 +481,15 @@ class ListModel(object):
|
||||
"""
|
||||
Called when a button press is executed
|
||||
"""
|
||||
from gramps.gui.utils import is_right_click
|
||||
if event.type == Gdk.EventType._2BUTTON_PRESS and event.button == 1:
|
||||
if self.double_click:
|
||||
self.double_click(obj)
|
||||
return True
|
||||
elif is_right_click(event):
|
||||
if self.right_click:
|
||||
self.right_click(obj, event)
|
||||
return True
|
||||
return False
|
||||
|
||||
def find(self, info):
|
||||
|
@ -34,6 +34,7 @@ _ = glocale.translation.gettext
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gdk
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -68,7 +69,8 @@ class Descendant(Gramplet):
|
||||
('', NOSORT, 1), # tooltip
|
||||
('', NOSORT, 100)] # handle
|
||||
self.model = ListModel(self.view, titles, list_mode="tree",
|
||||
event_func=self.cb_double_click)
|
||||
event_func=self.cb_double_click,
|
||||
right_click=self.cb_right_click)
|
||||
return self.view
|
||||
|
||||
def get_has_data(self, active_handle):
|
||||
@ -100,6 +102,47 @@ class Descendant(Gramplet):
|
||||
except WindowActiveError:
|
||||
pass
|
||||
|
||||
def cb_right_click(self, treeview, event):
|
||||
"""
|
||||
Handle right click on treeview.
|
||||
"""
|
||||
(model, iter_) = treeview.get_selection().get_selected()
|
||||
sensitivity = 1 if iter_ else 0
|
||||
menu = Gtk.Menu()
|
||||
menu.set_title(_('Descendent Menu'))
|
||||
entries = [
|
||||
(_("Edit"), lambda obj: self.cb_double_click(treeview), sensitivity),
|
||||
(None, None, 0),
|
||||
(_("Copy all"), lambda obj: self.on_copy_all(treeview), 1),
|
||||
]
|
||||
for stock_id, callback, sensitivity in entries:
|
||||
item = Gtk.ImageMenuItem(stock_id)
|
||||
if callback:
|
||||
item.connect("activate", callback)
|
||||
item.set_sensitive(sensitivity)
|
||||
item.show()
|
||||
menu.append(item)
|
||||
self.menu = menu
|
||||
self.menu.popup(None, None, None, None, event.button, event.time)
|
||||
|
||||
def on_copy_all(self, treeview):
|
||||
def rows2text(store, treeiter, indent, level):
|
||||
text = ""
|
||||
while treeiter != None:
|
||||
text += (indent + str(level) + ". " + store[treeiter][0] + " " + store[treeiter][1] + "\n")
|
||||
if store.iter_has_child(treeiter):
|
||||
childiter = store.iter_children(treeiter)
|
||||
text += rows2text(store, childiter, indent + (" " * 4), level + 1)
|
||||
treeiter = store.iter_next(treeiter)
|
||||
return text
|
||||
|
||||
model = treeview.get_model()
|
||||
rootiter = model.get_iter_first()
|
||||
text = rows2text(model, rootiter, "", 1)
|
||||
clipboard = Gtk.Clipboard.get_for_display(Gdk.Display.get_default(),
|
||||
Gdk.SELECTION_CLIPBOARD)
|
||||
clipboard.set_text(text, -1)
|
||||
|
||||
def db_changed(self):
|
||||
self.update()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user