Added right-click "Copy all" to all QuickTables.
This currently copies all data from the TreeView to the clipboard, including non-viewed columns. Refactored rows2text to model_to_text, and moved to gramps.gui.utils Added text_to_clipboard to gramps.gui.utils as well.
This commit is contained in:
parent
f4f83e456e
commit
2ad372bcba
@ -49,6 +49,7 @@ from gramps.gen.const import GRAMPS_LOCALE as glocale
|
|||||||
_ = glocale.translation.sgettext
|
_ = glocale.translation.sgettext
|
||||||
from gramps.gen.simple import SimpleTable
|
from gramps.gen.simple import SimpleTable
|
||||||
from gramps.gen.errors import WindowActiveError
|
from gramps.gen.errors import WindowActiveError
|
||||||
|
from gramps.gui.utils import model_to_text, text_to_clipboard
|
||||||
from ...widgets.multitreeview import MultiTreeView
|
from ...widgets.multitreeview import MultiTreeView
|
||||||
from ...ddtargets import DdTargets
|
from ...ddtargets import DdTargets
|
||||||
from ..quick import run_quick_report_by_name
|
from ..quick import run_quick_report_by_name
|
||||||
@ -118,6 +119,11 @@ class QuickTable(SimpleTable):
|
|||||||
if index is not None:
|
if index is not None:
|
||||||
self.popup = Gtk.Menu()
|
self.popup = Gtk.Menu()
|
||||||
popup = self.popup
|
popup = self.popup
|
||||||
|
menu_item = Gtk.MenuItem(label=_("Copy all"))
|
||||||
|
menu_item.connect("activate", lambda widget: text_to_clipboard(model_to_text(treeview.get_model())))
|
||||||
|
popup.append(menu_item)
|
||||||
|
menu_item.show()
|
||||||
|
# Now add more items to popup menu, if available
|
||||||
if (index is not None and self._link[index]):
|
if (index is not None and self._link[index]):
|
||||||
# See details (edit, etc):
|
# See details (edit, etc):
|
||||||
objclass, handle = self._link[index]
|
objclass, handle = self._link[index]
|
||||||
|
@ -629,3 +629,47 @@ class AvailableUpdates(threading.Thread):
|
|||||||
self.addon_update_list = available_updates()
|
self.addon_update_list = available_updates()
|
||||||
if len(self.addon_update_list) > 0:
|
if len(self.addon_update_list) > 0:
|
||||||
GLib.idle_add(self.emit_update_available)
|
GLib.idle_add(self.emit_update_available)
|
||||||
|
|
||||||
|
def model_to_text(model, cols=None, treeiter=None, indent="",
|
||||||
|
level=None, sep=", "):
|
||||||
|
"""
|
||||||
|
Given a model, return the text from the rows as a string.
|
||||||
|
model - the actual model
|
||||||
|
cols - a list representing the columns to get, or None for all
|
||||||
|
treeiter - (optional), initially, the first iterator
|
||||||
|
ident - the current indent level text
|
||||||
|
level - use None for no level indicator, or number (eg, 1)
|
||||||
|
sep - separating text between columns
|
||||||
|
"""
|
||||||
|
text = ""
|
||||||
|
if treeiter is None:
|
||||||
|
treeiter = model.get_iter_first()
|
||||||
|
while treeiter != None:
|
||||||
|
if cols is None:
|
||||||
|
items = sep.join([str(item) for item in model[treeiter][:]])
|
||||||
|
else:
|
||||||
|
items = sep.join([str(model[treeiter][col]) for col in cols])
|
||||||
|
if level is not None:
|
||||||
|
text += (indent + str(level) + ". " + items + "\n")
|
||||||
|
else:
|
||||||
|
text += (indent + items + "\n")
|
||||||
|
if model.iter_has_child(treeiter):
|
||||||
|
childiter = model.iter_children(treeiter)
|
||||||
|
if level is not None:
|
||||||
|
text += model_to_text(model, cols, childiter, indent + (" " * 4),
|
||||||
|
level + 1, sep)
|
||||||
|
else:
|
||||||
|
text += model_to_text(model, cols, childiter, indent + (" " * 4),
|
||||||
|
sep=sep)
|
||||||
|
treeiter = model.iter_next(treeiter)
|
||||||
|
return text
|
||||||
|
|
||||||
|
def text_to_clipboard(text):
|
||||||
|
"""
|
||||||
|
Put any text into the clipboard
|
||||||
|
"""
|
||||||
|
from gi.repository import Gdk
|
||||||
|
from gi.repository import Gtk
|
||||||
|
clipboard = Gtk.Clipboard.get_for_display(Gdk.Display.get_default(),
|
||||||
|
Gdk.SELECTION_CLIPBOARD)
|
||||||
|
clipboard.set_text(text, -1)
|
||||||
|
@ -48,6 +48,7 @@ from gramps.gen.errors import WindowActiveError
|
|||||||
from gramps.gen.display.name import displayer as name_displayer
|
from gramps.gen.display.name import displayer as name_displayer
|
||||||
from gramps.gen.datehandler import get_date
|
from gramps.gen.datehandler import get_date
|
||||||
from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback
|
from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback
|
||||||
|
from gramps.gui.utils import model_to_text, text_to_clipboard
|
||||||
|
|
||||||
class Descendant(Gramplet):
|
class Descendant(Gramplet):
|
||||||
|
|
||||||
@ -126,23 +127,10 @@ class Descendant(Gramplet):
|
|||||||
self.menu.popup(None, None, None, None, event.button, event.time)
|
self.menu.popup(None, None, None, None, event.button, event.time)
|
||||||
|
|
||||||
def on_copy_all(self, treeview):
|
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()
|
model = treeview.get_model()
|
||||||
rootiter = model.get_iter_first()
|
text = model_to_text(model, [0, 1], level=1)
|
||||||
text = rows2text(model, rootiter, "", 1)
|
text_to_clipboard(text)
|
||||||
clipboard = Gtk.Clipboard.get_for_display(Gdk.Display.get_default(),
|
|
||||||
Gdk.SELECTION_CLIPBOARD)
|
|
||||||
clipboard.set_text(text, -1)
|
|
||||||
|
|
||||||
def db_changed(self):
|
def db_changed(self):
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user