Geps044 - Replace deprecated Gtk.UIManager, Gtk.Actions etc.

This commit is contained in:
prculley 2018-06-22 14:29:53 -05:00 committed by Nick Hall
parent 56fa261ef2
commit 824bf7e40f
56 changed files with 5445 additions and 3533 deletions

View File

@ -11,7 +11,7 @@ Requirements
The following packages **MUST** be installed in order for Gramps to work: The following packages **MUST** be installed in order for Gramps to work:
* **Python** 3.2 or greater - The programming language used by Gramps. https://www.python.org/ * **Python** 3.2 or greater - The programming language used by Gramps. https://www.python.org/
* **GTK** 3.10 or greater - A cross-platform widget toolkit for creating graphical user interfaces. http://www.gtk.org/ * **GTK** 3.12 or greater - A cross-platform widget toolkit for creating graphical user interfaces. http://www.gtk.org/
* **pygobject** 3.12 or greater - Python Bindings for GLib/GObject/GIO/GTK+ https://wiki.gnome.org/Projects/PyGObject * **pygobject** 3.12 or greater - Python Bindings for GLib/GObject/GIO/GTK+ https://wiki.gnome.org/Projects/PyGObject
The following three packages with GObject Introspection bindings (the gi packages) The following three packages with GObject Introspection bindings (the gi packages)

View File

@ -459,12 +459,12 @@ def run():
if argpars.need_gui(): if argpars.need_gui():
LOG.debug("A GUI is needed, set it up") LOG.debug("A GUI is needed, set it up")
try: try:
from .gui.grampsgui import startgtkloop from .gui.grampsgui import startgramps
# no DISPLAY is a RuntimeError in an older pygtk (e.g. F14's 2.17) # no DISPLAY is a RuntimeError in an older pygtk (e.g. F14's 2.17)
except RuntimeError as msg: except RuntimeError as msg:
error += [(_("Configuration error:"), str(msg))] error += [(_("Configuration error:"), str(msg))]
return error return error
startgtkloop(error, argpars) startgramps(error, argpars)
else: else:
# CLI use of Gramps # CLI use of Gramps
argpars.print_help() argpars.print_help()

View File

@ -1,45 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2015 Nick Hall
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"""
A replacement ActionGroup that correctly loads named icons from an icon theme.
"""
from gi.repository import Gtk
class ActionGroup(Gtk.ActionGroup):
def add_actions(self, action_list, **kwargs):
Gtk.ActionGroup.add_actions(self, action_list, **kwargs)
self.fix_icon_name(action_list)
def add_toggle_actions(self, action_list, **kwargs):
Gtk.ActionGroup.add_toggle_actions(self, action_list, **kwargs)
self.fix_icon_name(action_list)
def add_radio_actions(self, action_list, **kwargs):
Gtk.ActionGroup.add_radio_actions(self, action_list, **kwargs)
self.fix_icon_name(action_list)
def fix_icon_name(self, action_list):
for action_tuple in action_list:
if action_tuple[1]:
action = self.get_action(action_tuple[0])
action.set_icon_name(action_tuple[1])

View File

@ -28,6 +28,7 @@
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
from io import StringIO from io import StringIO
import html
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -65,6 +66,7 @@ from .glade import Glade
from gramps.gen.utils.db import navigation_label from gramps.gen.utils.db import navigation_label
from .widgets.progressdialog import ProgressMonitor, GtkProgressDialog from .widgets.progressdialog import ProgressMonitor, GtkProgressDialog
from .dialog import ErrorDialog from .dialog import ErrorDialog
from .uimanager import ActionGroup
DISABLED = -1 DISABLED = -1
@ -246,14 +248,34 @@ class History(Callback):
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_RCT_TOP = '<ui><menubar name="MenuBar"><menu action="FileMenu"><menu action="OpenRecent">' _RCT_TOP = '<placeholder id="OpenRecentMenu">'
_RCT_BTM = '</menu></menu></menubar></ui>' _RCT_MENU = '''
<item>
<attribute name="action">win.%s</attribute>
<attribute name="label" translatable="no">%s</attribute>
</item>'''
_RCT_BTM = '\n </placeholder>\n'
_RCT_BAR_TOP = ('<object class="GtkMenu" id="OpenBtnMenu">\n'
'<property name="visible">True</property>\n'
'<property name="can_focus">False</property>')
_RCT_BAR = '''
<child>
<object class="GtkMenuItem">
<property name="action-name">win.%s</property>
<property name="label" translatable="yes">%s</property>
<property name="use_underline">False</property>
<property name="visible">True</property>
</object>
</child>'''
_RCT_BAR_BTM = '\n</object>\n'
from gramps.gen.recentfiles import RecentFiles from gramps.gen.recentfiles import RecentFiles
class RecentDocsMenu: class RecentDocsMenu:
def __init__(self, uistate, state, fileopen): def __init__(self, uistate, state, fileopen):
self.action_group = Gtk.ActionGroup(name='RecentFiles') self.ui_xml = []
self.action_group = ActionGroup('RecentFiles')
self.active = DISABLED self.active = DISABLED
self.uistate = uistate self.uistate = uistate
self.uimanager = uistate.uimanager self.uimanager = uistate.uimanager
@ -268,55 +290,52 @@ class RecentDocsMenu:
ErrorDialog(_('Cannot load database'), str(err), ErrorDialog(_('Cannot load database'), str(err),
parent=self.uistate.window) parent=self.uistate.window)
def build(self): def build(self, update_menu=True):
buf = StringIO()
buf.write(_RCT_TOP)
gramps_rf = RecentFiles() gramps_rf = RecentFiles()
count = 0 count = 0
if self.active != DISABLED: if self.active != DISABLED:
self.uimanager.remove_ui(self.active) self.uimanager.remove_ui(self.ui_xml)
self.uimanager.remove_action_group(self.action_group) self.uimanager.remove_action_group(self.action_group)
self.action_group = Gtk.ActionGroup(name='RecentFiles')
self.active = DISABLED self.active = DISABLED
actions = [] actionlist = []
menu = _RCT_TOP
bar = _RCT_BAR_TOP
rfiles = gramps_rf.gramps_recent_files rfiles = gramps_rf.gramps_recent_files
rfiles.sort(key=lambda x: x.get_time(), reverse=True) rfiles.sort(key=lambda x: x.get_time(), reverse=True)
new_menu = Gtk.Menu() #new_menu = Gtk.Menu()
#new_menu.set_tooltip_text(_("Connect to a recent database"))
for item in rfiles: for item in rfiles:
try: try:
title = item.get_name() title = html.escape(item.get_name())
filename = os.path.basename(item.get_path()) filename = os.path.basename(item.get_path())
action_id = "RecentMenu%d" % count action_id = "RecentMenu%d" % count
buf.write('<menuitem action="%s"/>' % action_id) # add the menuitem for this file
actions.append((action_id, None, title, None, None, menu += _RCT_MENU % (action_id, title)
make_callback(item, self.load))) # add the action for this file
mitem = Gtk.MenuItem(label=title, use_underline=False) actionlist.append((action_id, make_callback(item, self.load)))
mitem.connect('activate', make_callback(item, self.load)) # add the toolbar menuitem
mitem.show() bar += _RCT_BAR % (action_id, title)
new_menu.append(mitem)
except RuntimeError: except RuntimeError:
# ignore no longer existing files # ignore no longer existing files
_LOG.info("Ignoring the RecentItem %s (%s)" % (title, filename)) _LOG.info("Ignoring the RecentItem %s (%s)" % (title, filename))
count += 1 count += 1
buf.write(_RCT_BTM) menu += _RCT_BTM
self.action_group.add_actions(actions) bar += _RCT_BAR_BTM
self.uimanager.insert_action_group(self.action_group, 1) self.ui_xml = [menu, bar]
self.active = self.uimanager.add_ui_from_string(buf.getvalue()) self.action_group.add_actions(actionlist)
self.uimanager.ensure_update() self.uimanager.insert_action_group(self.action_group)
buf.close() self.active = self.uimanager.add_ui_from_string(self.ui_xml)
if update_menu:
if len(rfiles) > 0: self.uimanager.update_menu()
new_menu.show()
self.uistate.set_open_recent_menu(new_menu)
def make_callback(val, func): def make_callback(val, func):
return lambda x: func(val) return lambda x, y: func(val)
from .logger import RotateHandler from .logger import RotateHandler

View File

@ -180,7 +180,6 @@ class EditNote(EditPrimary):
self.set_window(win, None, self.get_menu_title()) self.set_window(win, None, self.get_menu_title())
self.setup_configs('interface.note', 700, 500) self.setup_configs('interface.note', 700, 500)
vboxnote = self.top.get_object('vbox131') vboxnote = self.top.get_object('vbox131')
notebook = self.top.get_object('note_notebook') notebook = self.top.get_object('note_notebook')
#recreate start page as GrampsTab #recreate start page as GrampsTab
@ -271,7 +270,9 @@ class EditNote(EditPrimary):
# create a formatting toolbar # create a formatting toolbar
if not self.dbstate.db.readonly: if not self.dbstate.db.readonly:
vbox = self.top.get_object('container') vbox = self.top.get_object('container')
vbox.pack_start(self.texteditor.get_toolbar(), False, False, 0) toolbar, self.action_group = self.texteditor.create_toolbar(
self.uistate.uimanager, self.window)
vbox.pack_start(toolbar, False, False, 0)
self.texteditor.set_transient_parent(self.window) self.texteditor.set_transient_parent(self.window)
# setup initial values for textview and textbuffer # setup initial values for textview and textbuffer

View File

@ -676,33 +676,33 @@ class EditPerson(EditPrimary):
EditMediaRef(self.dbstate, self.uistate, self.track, EditMediaRef(self.dbstate, self.uistate, self.track,
media_obj, media_ref, self.load_photo) media_obj, media_ref, self.load_photo)
def _top_contextmenu(self): def _top_contextmenu(self, prefix):
""" """
Override from base class, the menuitems and actiongroups for the top Override from base class, the menuitems and actiongroups for the top
of context menu. of context menu.
""" """
self.all_action = Gtk.ActionGroup(name="/PersonAll") if self.added:
self.home_action = Gtk.ActionGroup(name="/PersonHome") # Don't add items if not a real person yet
self.track_ref_for_deletion("all_action") return '', []
self.track_ref_for_deletion("home_action")
self.all_action.add_actions([ _actions = [('ActivePerson', self._make_active),
('ActivePerson', None, _("Make Active Person"), ('HomePerson', self._make_home_person)]
None, None, self._make_active),
])
self.home_action.add_actions([
('HomePerson', 'go-home', _("Make Home Person"),
None, None, self._make_home_person),
])
self.all_action.set_visible(not self.added) ui_top_cm = (
self.home_action.set_visible(not self.added) '''
<item>
<attribute name="action">{prefix}.ActivePerson</attribute>
<attribute name="label" translatable="yes">Make Active Person'''
'''</attribute>
</item>
<item>
<attribute name="action">{prefix}.HomePerson</attribute>
<attribute name="label" translatable="yes">Make Home Person'''
'''</attribute>
</item>
'''.format(prefix=prefix))
ui_top_cm = ''' return ui_top_cm, _actions
<menuitem action="ActivePerson"/>
<menuitem action="HomePerson"/>'''
return ui_top_cm, [self.all_action, self.home_action]
def _top_drag_data_get(self, widget, context, sel_data, info, time): def _top_drag_data_get(self, widget, context, sel_data, info, time):
if info == DdTargets.PERSON_LINK.app_id: if info == DdTargets.PERSON_LINK.app_id:
@ -713,17 +713,21 @@ class EditPerson(EditPrimary):
""" """
Override base class, make inactive home action if not needed. Override base class, make inactive home action if not needed.
""" """
if self.added:
return
home_action = self.uistate.uimanager.get_action(self.action_group,
'HomePerson')
if (self.dbstate.db.get_default_person() and if (self.dbstate.db.get_default_person() and
self.obj.get_handle() == self.obj.get_handle() ==
self.dbstate.db.get_default_person().get_handle()): self.dbstate.db.get_default_person().get_handle()):
self.home_action.set_sensitive(False) home_action.set_enabled(False)
else: else:
self.home_action.set_sensitive(True) home_action.set_enabled(True)
def _make_active(self, obj): def _make_active(self, obj, value):
self.uistate.set_active(self.obj.get_handle(), 'Person') self.uistate.set_active(self.obj.get_handle(), 'Person')
def _make_home_person(self, obj): def _make_home_person(self, obj, value):
handle = self.obj.get_handle() handle = self.obj.get_handle()
if handle: if handle:
self.dbstate.db.set_default_person_handle(handle) self.dbstate.db.set_default_person_handle(handle)

View File

@ -32,6 +32,7 @@ import abc
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gi.repository import Gtk from gi.repository import Gtk
from gi.repository.Gio import SimpleActionGroup
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -49,6 +50,8 @@ from ..display import display_help
from ..dialog import SaveDialog from ..dialog import SaveDialog
from gramps.gen.lib import PrimaryObject from gramps.gen.lib import PrimaryObject
from ..dbguielement import DbGUIElement from ..dbguielement import DbGUIElement
from ..uimanager import ActionGroup
class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta): class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
@ -75,6 +78,7 @@ class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
self.get_from_gramps_id = get_from_gramps_id self.get_from_gramps_id = get_from_gramps_id
self.contexteventbox = None self.contexteventbox = None
self.__tabs = [] self.__tabs = []
self.action_group = None
ManagedWindow.__init__(self, uistate, track, obj) ManagedWindow.__init__(self, uistate, track, obj)
DbGUIElement.__init__(self, self.db) DbGUIElement.__init__(self, self.db)
@ -184,6 +188,8 @@ class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
self.dbstate.disconnect(self.dbstate_connect_key) self.dbstate.disconnect(self.dbstate_connect_key)
self._cleanup_connects() self._cleanup_connects()
self._cleanup_on_exit() self._cleanup_on_exit()
if self.action_group:
self.uistate.uimanager.remove_action_group(self.action_group)
self.get_from_handle = None self.get_from_handle = None
self.get_from_gramps_id = None self.get_from_gramps_id = None
ManagedWindow.close(self) ManagedWindow.close(self)
@ -283,48 +289,62 @@ class EditPrimary(ManagedWindow, DbGUIElement, metaclass=abc.ABCMeta):
return False return False
#build the possible popup menu #build the possible popup menu
self._build_popup_ui() menu_model = self._build_popup_ui()
if not menu_model:
return False
#set or unset sensitivity in popup #set or unset sensitivity in popup
self._post_build_popup_ui() self._post_build_popup_ui()
menu = self.popupmanager.get_widget('/Popup') menu = Gtk.Menu.new_from_model(menu_model)
if menu: menu.attach_to_widget(obj, None)
menu.popup(None, None, None, None, event.button, event.time) menu.show_all()
return True if Gtk.MINOR_VERSION < 22:
# ToDo The following is reported to work poorly with Wayland
menu.popup(None, None, None, None,
event.button, event.time)
else:
menu.popup_at_pointer(event)
return True
return False return False
def _build_popup_ui(self): def _build_popup_ui(self):
""" """
Create actions and ui of context menu Create actions and ui of context menu
If you don't need a popup, override this and return None
""" """
from ..plug.quick import create_quickreport_menu from ..plug.quick import create_quickreport_menu
self.popupmanager = Gtk.UIManager() prefix = str(id(self))
#add custom actions #get custom ui and actions
(ui_top, action_groups) = self._top_contextmenu() (ui_top, actions) = self._top_contextmenu(prefix)
for action in action_groups :
self.popupmanager.insert_action_group(action, -1)
#see which quick reports are available now: #see which quick reports are available now:
ui_qr = '' ui_qr = ''
if self.QR_CATEGORY > -1 : if self.QR_CATEGORY > -1 :
(ui_qr, reportactions) = create_quickreport_menu(self.QR_CATEGORY, (ui_qr, reportactions) = create_quickreport_menu(
self.dbstate, self.uistate, self.QR_CATEGORY, self.dbstate, self.uistate,
self.obj, track=self.track) self.obj, prefix, track=self.track)
self.report_action = Gtk.ActionGroup(name="/PersonReport") actions.extend(reportactions)
self.report_action.add_actions(reportactions)
self.report_action.set_visible(True)
self.popupmanager.insert_action_group(self.report_action, -1)
popupui = ''' popupui = '''<?xml version="1.0" encoding="UTF-8"?>
<ui> <interface>
<popup name="Popup">''' + ui_top + ''' <menu id="Popup">''' + ui_top + '''
<separator/>''' + ui_qr + ''' <section>
</popup> ''' + ui_qr + '''
</ui>''' </section>
</menu>
</interface>'''
self.popupmanager.add_ui_from_string(popupui) builder = Gtk.Builder.new_from_string(popupui, -1)
def _top_contextmenu(self): self.action_group = ActionGroup('EditPopup' + prefix, actions,
prefix)
act_grp = SimpleActionGroup()
self.window.insert_action_group(prefix, act_grp)
self.window.set_application(self.uistate.uimanager.app)
self.uistate.uimanager.insert_action_group(self.action_group, act_grp)
return builder.get_object('Popup')
def _top_contextmenu(self, prefix):
""" """
Derived class can create a ui with menuitems and corresponding list of Derived class can create a ui with menuitems and corresponding list of
actiongroups actiongroups

View File

@ -3,6 +3,7 @@
# #
# Copyright (C) 2000-2006 Donald N. Allingham # Copyright (C) 2000-2006 Donald N. Allingham
# Copyright (C) 2009 Benny Malengier # Copyright (C) 2009 Benny Malengier
# Copyright (C) 2018 Paul Culley
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -50,7 +51,365 @@ _ = glocale.translation.gettext
MIN_PYGOBJECT_VERSION = (3, 12, 0) MIN_PYGOBJECT_VERSION = (3, 12, 0)
PYGOBJ_ERR = False PYGOBJ_ERR = False
MIN_GTK_VERSION = (3, 10) MIN_GTK_VERSION = (3, 12)
UIDEFAULT = (
'''<?xml version="1.0" encoding="UTF-8"?>
<interface>
<menu id="menubar"><section id="menubar-update">
<submenu id='m1'>
<attribute name="label" translatable="yes">_Family Trees</attribute>
<section id="ftree">
<item>
<attribute name="action">win.Open</attribute>
<attribute name="label" translatable="yes">'''
'''_Manage Family Trees</attribute>
</item>
<submenu>
<attribute name="action">win.OpenRecent</attribute>
<attribute name="label" translatable="yes">Open _Recent</attribute>
<placeholder id="OpenRecentMenu">
</placeholder>
</submenu>
<item groups='RO'>
<attribute name="action">win.Close</attribute>
<attribute name="label" translatable="yes">_Close</attribute>
</item>
</section>
<section groups='RO RW'>
<item groups='RW'>
<attribute name="action">win.Import</attribute>
<attribute name="label" translatable="yes">_Import...</attribute>
</item>
<item>
<attribute name="action">win.Export</attribute>
<attribute name="label" translatable="yes">_Export...</attribute>
</item>
<placeholder id="LocalExport">
</placeholder>
<item>
<attribute name="action">win.Backup</attribute>
<attribute name="label" translatable="yes">Make Backup...</attribute>
</item>
</section>
<section>
<item groups='RO'>
<attribute name="action">win.Abandon</attribute>
<attribute name="label" translatable="yes">'''
'''_Abandon Changes and Quit</attribute>
</item>
<item>
<attribute name="action">win.Quit</attribute>
<attribute name="label" translatable="yes">_Quit</attribute>
</item>
</section>
</submenu>
<submenu id='m2' groups='RW'>
<attribute name="label" translatable="yes">_Add</attribute>
<section>
<item>
<attribute name="action">win.PersonAdd</attribute>
<attribute name="label" translatable="yes">Person</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.FamilyAdd</attribute>
<attribute name="label" translatable="yes">Family</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.EventAdd</attribute>
<attribute name="label" translatable="yes">Event</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.PlaceAdd</attribute>
<attribute name="label" translatable="yes">Place</attribute>
</item>
<item>
<attribute name="action">win.SourceAdd</attribute>
<attribute name="label" translatable="yes">Source</attribute>
</item>
<item>
<attribute name="action">win.CitationAdd</attribute>
<attribute name="label" translatable="yes">Citation</attribute>
</item>
<item>
<attribute name="action">win.RepositoryAdd</attribute>
<attribute name="label" translatable="yes">Repository</attribute>
</item>
<item>
<attribute name="action">win.MediaAdd</attribute>
<attribute name="label" translatable="yes">Media</attribute>
</item>
<item>
<attribute name="action">win.NoteAdd</attribute>
<attribute name="label" translatable="yes">Note</attribute>
</item>
</section>
</submenu>
<submenu id='m3'>
<attribute name="label" translatable="yes">_Edit</attribute>
<section groups='RW'>
<placeholder id="undo">
</placeholder>
<placeholder id="redo">
</placeholder>
<item>
<attribute name="action">win.UndoHistory</attribute>
<attribute name="label" translatable="yes">Undo History</attribute>
</item>
</section>
<section id='CommonEdit' groups='RW'>
</section>
<section id='TagMenu' groups='RW'>
</section>
<section groups='RW'>
<item>
<attribute name="action">win.Clipboard</attribute>
<attribute name="label" translatable="yes">Clip_board</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.Preferences</attribute>
<attribute name="label" translatable="yes">'''
'''_Preferences...</attribute>
</item>
<placeholder id='otheredit'>
</placeholder>
</section>
</submenu>
<submenu id='m4'>
<attribute name="label" translatable="yes">_View</attribute>
<section>
<item>
<attribute name="action">win.ConfigView</attribute>
<attribute name="label" translatable="yes">_Configure...</attribute>
</item>
<item>
<attribute name="action">win.Navigator</attribute>
<attribute name="label" translatable="yes">_Navigator</attribute>
</item>
<item>
<attribute name="action">win.Toolbar</attribute>
<attribute name="label" translatable="yes">_Toolbar</attribute>
</item>
<placeholder id='Bars'>
</placeholder>
<item>
<attribute name="action">win.Fullscreen</attribute>
<attribute name="label" translatable="yes">F_ull Screen</attribute>
</item>
</section>
<section id="ViewsInCatagory">
</section>
</submenu>
<submenu id="m5" groups='RO'>
<attribute name="label" translatable="yes">_Go</attribute>
<placeholder id="CommonGo">
</placeholder>
<section id="CommonHistory">
</section>
</submenu>
<submenu id='m6' groups='RW'>
<attribute name="label" translatable="yes">_Bookmarks</attribute>
<section id="AddEditBook">
</section>
<section id="GoToBook">
</section>
</submenu>
<submenu id='m7' groups='RO'>
<attribute name="label" translatable="yes">_Reports</attribute>
<section>
<item>
<attribute name="action">win.Books</attribute>
<attribute name="label" translatable="yes">Books...</attribute>
</item>
</section>
<section id="P_ReportsMenu">
</section>
</submenu>
<submenu id='m8' groups='RW'>
<attribute name="label" translatable="yes">_Tools</attribute>
<section id="P_ToolsMenu">
</section>
</submenu>
<submenu id='m9' groups='RO'>
<attribute name="label" translatable="yes">_Windows</attribute>
<section id="WinMenu">
</section>
</submenu>
<submenu id='m10'>
<attribute name="label" translatable="yes">_Help</attribute>
<section>
<item>
<attribute name="action">win.UserManual</attribute>
<attribute name="label" translatable="yes">_User Manual</attribute>
</item>
<item>
<attribute name="action">win.FAQ</attribute>
<attribute name="label" translatable="yes">_FAQ</attribute>
</item>
<item>
<attribute name="action">win.KeyBindings</attribute>
<attribute name="label" translatable="yes">_Key Bindings</attribute>
</item>
<item>
<attribute name="action">win.TipOfDay</attribute>
<attribute name="label" translatable="yes">Tip of the Day</attribute>
</item>
<item>
<attribute name="action">win.PluginStatus</attribute>
<attribute name="label" translatable="yes">'''
'''_Plugin Manager</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.HomePage</attribute>
<attribute name="label" translatable="yes">'''
'''Gramps _Home Page</attribute>
</item>
<item>
<attribute name="action">win.MailingLists</attribute>
<attribute name="label" translatable="yes">'''
'''Gramps _Mailing Lists</attribute>
</item>
<item>
<attribute name="action">win.ReportBug</attribute>
<attribute name="label" translatable="yes">_Report a Bug</attribute>
</item>
<item>
<attribute name="action">win.ExtraPlugins</attribute>
<attribute name="label" translatable="yes">'''
'''_Extra Reports/Tools</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.About</attribute>
<attribute name="label" translatable="yes">_About</attribute>
</item>
</section>
</submenu>
</section></menu>
<object class="GtkMenu" id="OpenBtnMenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<object class="GtkToolbar" id="ToolBar">
<property name="hexpand">1</property>
<property name="toolbar-style">GTK_TOOLBAR_ICONS</property>
<style>
<class name="primary-toolbar"/>
</style>
<child>
<object class="GtkToolButton">
<property name="icon-name">gramps</property>
<property name="action-name">win.Open</property>
<property name="tooltip_text" translatable="yes">'''
'''Manage databases</property>
<property name="label" translatable="yes">_Family Trees</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<child>
<object class="GtkMenuButton">
<property name="tooltip_text" translatable="yes">'''
'''Connect to a recent database</property>
<property name="popup">OpenBtnMenu</property>
<property name="relief">GTK_RELIEF_NONE</property>
</object>
</child>
</object>
</child>
<placeholder id='CommonNavigation'>
</placeholder>
<placeholder id='BarCommonEdit'>
</placeholder>
<placeholder id='TagTool'>
</placeholder>
<child groups='RW'>
<object class="GtkToolButton" id="Clipboard">
<property name="icon-name">edit-paste</property>
<property name="action-name">win.Clipboard</property>
<property name="tooltip_text" translatable="yes">'''
'''Open the Clipboard dialog</property>
<property name="label" translatable="yes">Clip_board</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkSeparatorToolItem"/>
</child>
<child>
<object class="GtkToolButton" id="ConfigView">
<property name="icon-name">gramps-config</property>
<property name="action-name">win.ConfigView</property>
<property name="tooltip_text" translatable="yes">'''
'''Configure the active view</property>
<property name="label" translatable="yes">_Configure...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<placeholder id='ViewsInCategoryBar'>
</placeholder>
<child>
<object class="GtkSeparatorToolItem" id="sep"/>
</child>
<placeholder id="MoreButtons">
</placeholder>
<child groups='RO'>
<object class="GtkToolButton" id="Reports">
<property name="icon-name">gramps-reports</property>
<property name="action-name">win.Reports</property>
<property name="tooltip_text" translatable="yes">'''
'''Open the reports dialog</property>
<property name="label" translatable="yes">_Reports</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton" id="Tools">
<property name="icon-name">gramps-tools</property>
<property name="action-name">win.Tools</property>
<property name="tooltip_text" translatable="yes">'''
'''Open the tools dialog</property>
<property name="label" translatable="yes">_Tools</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<placeholder id='AfterTools'>
</placeholder>
</object>
<menu id="Popup">
</menu>
</interface>
''')
try: try:
#import gnome introspection, part of pygobject #import gnome introspection, part of pygobject
@ -235,9 +594,8 @@ class Gramps:
process. It may spawn several windows and control several databases. process. It may spawn several windows and control several databases.
""" """
def __init__(self, argparser): def __init__(self, argparser, app):
from gramps.gen.dbstate import DbState from gramps.gen.dbstate import DbState
from . import viewmanager
from .viewmanager import ViewManager from .viewmanager import ViewManager
from gramps.cli.arghandler import ArgHandler from gramps.cli.arghandler import ArgHandler
from .tipofday import TipOfDay from .tipofday import TipOfDay
@ -248,7 +606,7 @@ class Gramps:
theme.append_search_path(IMAGE_DIR) theme.append_search_path(IMAGE_DIR)
dbstate = DbState() dbstate = DbState()
self._vm = ViewManager(dbstate, self._vm = ViewManager(app, dbstate,
config.get("interface.view-categories")) config.get("interface.view-categories"))
if (lin() if (lin()
@ -303,68 +661,18 @@ class Gramps:
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def __startgramps(errors, argparser): def startgramps(errors, argparser):
""" """
Main startup function started via GObject.timeout_add Main startup function started via GObject.timeout_add
First action inside the gtk loop First action inside the gtk loop
""" """
try: app = GrampsApplication(errors, argparser)
from .dialog import ErrorDialog
#handle first existing errors in GUI fashion
if errors:
for error in errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
if argparser.errors:
for error in argparser.errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
# add gui logger
from .logger import RotateHandler, GtkHandler
form = logging.Formatter(
fmt="%(relativeCreated)d: %(levelname)s: "
"%(filename)s: line %(lineno)d: %(message)s")
# Create the log handlers
rot_h = RotateHandler(capacity=20)
rot_h.setFormatter(form)
# Only error and critical log records should
# trigger the GUI handler.
gtkh = GtkHandler(rotate_handler=rot_h)
gtkh.setFormatter(form)
gtkh.setLevel(logging.ERROR)
logger = logging.getLogger()
logger.addHandler(rot_h)
logger.addHandler(gtkh)
except:
#make sure there is a clean exit if there is an error in above steps
quit_now = True
exit_code = 1
LOG.error(_("\nGramps failed to start. "
"Please report a bug about this.\n"
"This could be because of an error "
"in a (third party) View on startup.\n"
"To use another view, don't load a Family Tree, "
"change view, and then load your Family Tree.\n"
"You can also change manually "
"the startup view in the gramps.ini file \n"
"by changing the last-view parameter.\n"
), exc_info=True)
# start Gramps, errors stop the gtk loop
try: try:
quit_now = False quit_now = False
exit_code = 0 exit_code = 0
if has_display(): if app.run():
Gramps(argparser)
else:
print(_("Gramps terminated because of no DISPLAY")) print(_("Gramps terminated because of no DISPLAY"))
quit_now = True
exit_code = 1
except SystemExit as err: except SystemExit as err:
quit_now = True quit_now = True
if err.code: if err.code:
@ -395,18 +703,85 @@ def __startgramps(errors, argparser):
), exc_info=True) ), exc_info=True)
if quit_now: if quit_now:
#stop gtk loop and quit app.quit()
Gtk.main_quit()
sys.exit(exit_code) sys.exit(exit_code)
#function finished, return False to stop the timeout_add function calls
return False return False
def startgtkloop(errors, argparser): # we do the following import here to avoid the Gtk require version warning
""" from .uimanager import UIManager
We start the gtk loop and run the function to start up Gramps
"""
GLib.timeout_add(100, __startgramps, errors, argparser, priority=100) class GrampsApplication(Gtk.Application):
if os.path.exists(os.path.join(DATA_DIR, "gramps.accel")):
Gtk.AccelMap.load(os.path.join(DATA_DIR, "gramps.accel")) def __init__(self, errors, argparser):
Gtk.main() super().__init__(application_id="org.gramps-project.Gramps")
self.window = None
self.errors = errors
self.argparser = argparser
def do_startup(self):
Gtk.Application.do_startup(self)
self.uimanager = UIManager(self, UIDEFAULT)
self.uimanager.update_menu(init=True)
if os.path.exists(os.path.join(DATA_DIR, "gramps.accel")):
self.uimanager.load_accels(os.path.join(DATA_DIR, "gramps.accel"))
try:
from .dialog import ErrorDialog
#handle first existing errors in GUI fashion
if self.errors:
for error in self.errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
if self.argparser.errors:
for error in self.argparser.errors:
ErrorDialog(error[0], error[1]) # TODO no-parent
Gtk.main_quit()
sys.exit(1)
# add gui logger
from .logger import RotateHandler, GtkHandler
form = logging.Formatter(
fmt="%(relativeCreated)d: %(levelname)s: "
"%(filename)s: line %(lineno)d: %(message)s")
# Create the log handlers
rot_h = RotateHandler(capacity=20)
rot_h.setFormatter(form)
# Only error and critical log records should
# trigger the GUI handler.
gtkh = GtkHandler(rotate_handler=rot_h)
gtkh.setFormatter(form)
gtkh.setLevel(logging.ERROR)
logger = logging.getLogger()
logger.addHandler(rot_h)
logger.addHandler(gtkh)
except:
#make sure there is a clean exit if error in above steps
exit_code = 1
LOG.error(_("\nGramps failed to start. "
"Please report a bug about this.\n"
"This could be because of an error "
"in a (third party) View on startup.\n"
"To use another view, don't load a Family Tree, "
"change view, and then load your Family Tree.\n"
"You can also change manually "
"the startup view in the gramps.ini file \n"
"by changing the last-view parameter.\n"
), exc_info=True)
#stop gtk loop and quit
self.quit()
sys.exit(exit_code)
def do_activate(self):
# We only allow a single window and raise any existing ones
if not self.window:
# Windows are associated with the application
# when the last one is closed the application shuts down
Gramps(self.argparser, self)
else:
print('Gramps is already running.')
self.window.present()

View File

@ -31,7 +31,7 @@ the create/deletion of dialog windows.
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
import os import os
from io import StringIO from io import StringIO
import html
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# GNOME/GTK # GNOME/GTK
@ -49,6 +49,7 @@ from gramps.gen.const import GLADE_FILE, ICON
from gramps.gen.errors import WindowActiveError from gramps.gen.errors import WindowActiveError
from gramps.gen.config import config from gramps.gen.config import config
from gramps.gen.constfunc import is_quartz from gramps.gen.constfunc import is_quartz
from .uimanager import ActionGroup
from .glade import Glade from .glade import Glade
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -57,8 +58,8 @@ from .glade import Glade
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_win_top = '<ui><menubar name="MenuBar"><menu action="WindowsMenu">' _win_top = '<section id="WinMenu">\n'
_win_btm = '</menu></menubar></ui>' _win_btm = '</section>\n'
DISABLED = -1 DISABLED = -1
#----------------------------------------------------------------------- #-----------------------------------------------------------------------
@ -108,7 +109,7 @@ class GrampsWindowManager:
self.uimanager = uimanager self.uimanager = uimanager
self.window_tree = [] self.window_tree = []
self.id2item = {} self.id2item = {}
self.action_group = Gtk.ActionGroup(name='WindowManger') self.action_group = ActionGroup(name='WindowManger')
self.active = DISABLED self.active = DISABLED
self.ui = _win_top + _win_btm self.ui = _win_top + _win_btm
@ -125,9 +126,9 @@ class GrampsWindowManager:
""" """
Enables the UI and action groups Enables the UI and action groups
""" """
self.uimanager.insert_action_group(self.action_group, 1) self.uimanager.insert_action_group(self.action_group)
self.active = self.uimanager.add_ui_from_string(self.ui) self.active = self.uimanager.add_ui_from_string([self.ui])
self.uimanager.ensure_update() self.uimanager.update_menu()
def get_item_from_track(self, track): def get_item_from_track(self, track):
# Recursively find an item given track sequence # Recursively find an item given track sequence
@ -270,31 +271,35 @@ class GrampsWindowManager:
def call_back_factory(self, item): def call_back_factory(self, item):
if not isinstance(item, list): if not isinstance(item, list):
def func(obj): def func(*obj):
if item.window_id and self.id2item.get(item.window_id): if item.window_id and self.id2item.get(item.window_id):
self.id2item[item.window_id]._present() self.id2item[item.window_id]._present()
else: else:
def func(obj): def func(*obj):
pass pass
return func return func
def generate_id(self, item): def generate_id(self, item):
return str(item.window_id) return 'wm/' + str(item.window_id)
def display_menu_list(self, data, action_data, mlist): def display_menu_list(self, data, action_data, mlist):
menuitem = ('<item>\n'
'<attribute name="action">win.%s</attribute>\n'
'<attribute name="label" translatable="yes">'
'%s...</attribute>\n'
'</item>\n')
if isinstance(mlist, (list, tuple)): if isinstance(mlist, (list, tuple)):
i = mlist[0] i = mlist[0]
idval = self.generate_id(i) idval = self.generate_id(i)
data.write('<menu action="M:%s">' % idval) data.write('<submenu>\n<attribute name="label"'
action_data.append(("M:"+idval, None, i.submenu_label, ' translatable="yes">%s</attribute>\n' %
None, None, None)) html.escape(i.submenu_label))
else: else:
i = mlist i = mlist
idval = self.generate_id(i) idval = self.generate_id(i)
data.write('<menuitem action="%s"/>' % idval) data.write(menuitem % (idval, html.escape(i.menu_label)))
action_data.append((idval, None, i.menu_label, None, None, action_data.append((idval, self.call_back_factory(i)))
self.call_back_factory(i)))
if isinstance(mlist, (list, tuple)) and (len(mlist) > 1): if isinstance(mlist, (list, tuple)) and (len(mlist) > 1):
for i in mlist[1:]: for i in mlist[1:]:
@ -302,20 +307,17 @@ class GrampsWindowManager:
self.display_menu_list(data, action_data, i) self.display_menu_list(data, action_data, i)
else: else:
idval = self.generate_id(i) idval = self.generate_id(i)
data.write('<menuitem action="%s"/>' data.write(menuitem % (idval, html.escape(i.menu_label)))
% self.generate_id(i)) action_data.append((idval, self.call_back_factory(i)))
action_data.append((idval, None, i.menu_label,
None, None,
self.call_back_factory(i)))
if isinstance(mlist, (list, tuple)): if isinstance(mlist, (list, tuple)):
data.write('</menu>') data.write('</submenu>\n')
def build_windows_menu(self): def build_windows_menu(self):
if self.active != DISABLED: if self.active != DISABLED:
self.uimanager.remove_ui(self.active) self.uimanager.remove_ui(self.active)
self.uimanager.remove_action_group(self.action_group) self.uimanager.remove_action_group(self.action_group)
self.action_group = Gtk.ActionGroup(name='WindowManger') self.action_group = ActionGroup(name='WindowManger')
action_data = [] action_data = []
data = StringIO() data = StringIO()

View File

@ -38,22 +38,21 @@ from gi.repository import Gdk
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.plug import (START, END) from gramps.gen.plug import (START, END)
from .pluginmanager import GuiPluginManager from .pluginmanager import GuiPluginManager
from .actiongroup import ActionGroup from .uimanager import ActionGroup
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Constants # Constants
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
UICATEGORY = '''<ui> UICATEGORY = ''' <section id="ViewsInCatagory">
<menubar name="MenuBar"> %s
<menu action="ViewMenu"> </section>
<placeholder name="ViewsInCategory">%s '''
</placeholder> UICATAGORYBAR = ''' <placeholder id='ViewsInCategoryBar'>
</menu> %s
</menubar> </placeholder>
</ui> '''
'''
CATEGORY_ICON = { CATEGORY_ICON = {
'Dashboard': 'gramps-gramplet', 'Dashboard': 'gramps-gramplet',
@ -88,7 +87,6 @@ class Navigator:
self.active_view = None self.active_view = None
self.ui_category = {} self.ui_category = {}
self.view_toggle_actions = {}
self.cat_view_group = None self.cat_view_group = None
self.merge_ids = [] self.merge_ids = []
@ -139,13 +137,35 @@ class Navigator:
""" """
Load the sidebar plugins. Load the sidebar plugins.
""" """
menuitem = '''
<item>
<attribute name="action">win.ViewInCatagory</attribute>
<attribute name="label" translatable="yes">%s</attribute>
<attribute name="target">%d %d</attribute>
</item>
'''
baritem = '''
<child>
<object class="GtkToggleToolButton" id="bar%d">
<property name="action-name">win.ViewInCatagory</property>
<property name="action-target">'%d %d'</property>
<property name="icon-name">%s</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">%s</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
'''
plugman = GuiPluginManager.get_instance() plugman = GuiPluginManager.get_instance()
categories = [] categories = []
views = {} views = {}
for cat_num, cat_views in enumerate(self.viewmanager.get_views()): for cat_num, cat_views in enumerate(self.viewmanager.get_views()):
uimenuitems = '' uimenuitems = ''
self.view_toggle_actions[cat_num] = [] uibaritems = ''
for view_num, page in enumerate(cat_views): for view_num, page in enumerate(cat_views):
if view_num == 0: if view_num == 0:
@ -156,26 +176,26 @@ class Navigator:
cat_icon = 'gramps-view' cat_icon = 'gramps-view'
categories.append([cat_num, cat_name, cat_icon]) categories.append([cat_num, cat_name, cat_icon])
pageid = 'page_%i_%i' % (cat_num, view_num)
uimenuitems += '\n<menuitem action="%s"/>' % pageid
# id, stock, button text, UI, tooltip, page
if view_num < 9: if view_num < 9:
modifier = "<PRIMARY><ALT>%d" % ((view_num % 9) + 1) accel = "<PRIMARY><ALT>%d" % ((view_num % 9) + 1)
else: self.viewmanager.uimanager.app.set_accels_for_action(
modifier = "" "win.ViewInCatagory('%d %d')" % (cat_num, view_num),
[accel])
uimenuitems += menuitem % (page[0].name, cat_num, view_num)
stock_icon = page[0].stock_icon stock_icon = page[0].stock_icon
if stock_icon is None: if stock_icon is None:
stock_icon = cat_icon stock_icon = cat_icon
self.view_toggle_actions[cat_num].append((pageid, uibaritems += baritem % (view_num, cat_num, view_num,
stock_icon, stock_icon, page[0].name,
page[0].name, modifier, page[0].name, view_num)) page[0].name)
views[cat_num].append((view_num, page[0].name, stock_icon)) views[cat_num].append((view_num, page[0].name, stock_icon))
if len(cat_views) > 1: if len(cat_views) > 1:
#allow for switching views in a category #allow for switching views in a category
self.ui_category[cat_num] = UICATEGORY % uimenuitems self.ui_category[cat_num] = [UICATEGORY % uimenuitems,
UICATAGORYBAR % uibaritems]
for pdata in plugman.get_reg_sidebars(): for pdata in plugman.get_reg_sidebars():
module = plugman.load_plugin(pdata) module = plugman.load_plugin(pdata)
@ -229,12 +249,10 @@ class Navigator:
list(map(uimanager.remove_ui, self.merge_ids)) list(map(uimanager.remove_ui, self.merge_ids))
if cat_num in self.ui_category: if cat_num in self.ui_category:
self.cat_view_group = ActionGroup(name='viewmenu') action = ('ViewInCatagory', self.cb_view_clicked, '',
self.cat_view_group.add_radio_actions( str(cat_num) + ' ' + str(view_num))
self.view_toggle_actions[cat_num], value=view_num, self.cat_view_group = ActionGroup('viewmenu', [action])
on_change=self.cb_view_clicked, user_data=cat_num) uimanager.insert_action_group(self.cat_view_group)
self.cat_view_group.set_sensitive(True)
uimanager.insert_action_group(self.cat_view_group, 1)
mergeid = uimanager.add_ui_from_string(self.ui_category[cat_num]) mergeid = uimanager.add_ui_from_string(self.ui_category[cat_num])
self.merge_ids.append(mergeid) self.merge_ids.append(mergeid)
@ -245,12 +263,12 @@ class Navigator:
return return
sidebar.view_changed(cat_num, view_num) sidebar.view_changed(cat_num, view_num)
def cb_view_clicked(self, radioaction, current, cat_num): def cb_view_clicked(self, radioaction, value):
""" """
Called when a view is selected from the menu. Called when a view is selected from the menu.
""" """
view_num = radioaction.get_current_value() cat_num, view_num = value.get_string().split()
self.viewmanager.goto_page(cat_num, view_num) self.viewmanager.goto_page(int(cat_num), int(view_num))
def __menu_button_pressed(self, button, event): def __menu_button_pressed(self, button, event):
""" """

View File

@ -63,6 +63,12 @@ from gramps.gen.plug import (CATEGORY_QR_PERSON, CATEGORY_QR_FAMILY, CATEGORY_QR
from ._textbufdoc import TextBufDoc from ._textbufdoc import TextBufDoc
from gramps.gen.simple import make_basic_stylesheet from gramps.gen.simple import make_basic_stylesheet
MENUITEM = ('<item>\n'
'<attribute name="action">{prefix}.{action}</attribute>\n'
'<attribute name="label" translatable="yes">'
'{label}</attribute>\n'
'</item>\n')
def flatten(L): def flatten(L):
""" """
Flattens a possibly nested list. Removes None results, too. Flattens a possibly nested list. Removes None results, too.
@ -77,7 +83,7 @@ def flatten(L):
retval.append(L) retval.append(L)
return retval return retval
def create_web_connect_menu(dbstate, uistate, nav_group, handle): def create_web_connect_menu(dbstate, uistate, nav_group, handle, prefix):
""" """
This functions querries the registered web connects. It collects This functions querries the registered web connects. It collects
the connects of the requested category, which must be one of the connects of the requested category, which must be one of
@ -88,12 +94,12 @@ def create_web_connect_menu(dbstate, uistate, nav_group, handle):
handle as input method. A tuple is returned, containing the ui handle as input method. A tuple is returned, containing the ui
string of the menu, and its associated actions. string of the menu, and its associated actions.
""" """
top = ("<placeholder id='WebConnect'><submenu>\n"
'<attribute name="label" translatable="yes">'
'Web Connection</attribute>\n')
actions = [] actions = []
ofile = StringIO() ofile = StringIO()
ofile.write('<menu action="WebConnect">') ofile.write(top)
actions.append(('WebConnect', None, _("Web Connect"), None, None, None))
menu = Gtk.Menu()
menu.show()
#select the web connects to show #select the web connects to show
showlst = [] showlst = []
pmgr = GuiPluginManager.get_instance() pmgr = GuiPluginManager.get_instance()
@ -109,16 +115,17 @@ def create_web_connect_menu(dbstate, uistate, nav_group, handle):
connections.sort(key=lambda plug: plug.name) connections.sort(key=lambda plug: plug.name)
actions = [] actions = []
for connect in connections: for connect in connections:
ofile.write('<menuitem action="%s"/>' % connect.key) action = connect.key.replace(' ', '-')
actions.append((connect.key, None, connect.name, None, None, ofile.write(MENUITEM.format(prefix=prefix, action=action,
connect(dbstate, uistate, nav_group, handle))) label=connect.name))
ofile.write('</menu>') callback = connect(dbstate, uistate, nav_group, handle)
retval = [ofile.getvalue()] actions.append((action,
retval.extend(actions) lambda x, y: callback(x)))
return retval ofile.write('</submenu></placeholder>\n')
return (ofile.getvalue(), actions)
def create_quickreport_menu(category, dbstate, uistate, handle, track=[]): def create_quickreport_menu(category, dbstate, uistate, handle, prefix, track=[]):
""" This functions querries the registered quick reports with """ This functions querries the registered quick reports with
quick_report_list of _PluginMgr.py quick_report_list of _PluginMgr.py
It collects the reports of the requested category, which must be one of It collects the reports of the requested category, which must be one of
@ -132,39 +139,35 @@ def create_quickreport_menu(category, dbstate, uistate, handle, track=[]):
A tuple is returned, containing the ui string of the quick report menu, A tuple is returned, containing the ui string of the quick report menu,
and its associated actions and its associated actions
""" """
top = ("<submenu>\n"
'<attribute name="label" translatable="yes">'
'Quick View</attribute>\n')
actions = [] actions = []
ofile = StringIO() ofile = StringIO()
ofile.write('<menu action="QuickReport">') ofile.write(top)
actions.append(('QuickReport', None, _("Quick View"), None, None, None))
menu = Gtk.Menu()
menu.show()
#select the reports to show #select the reports to show
showlst = [] showlst = []
pmgr = GuiPluginManager.get_instance() pmgr = GuiPluginManager.get_instance()
for pdata in pmgr.get_reg_quick_reports(): for pdata in pmgr.get_reg_quick_reports():
if pdata.supported and pdata.category == category : if pdata.supported and pdata.category == category :
#add tuple function, translated name, name, status
showlst.append(pdata) showlst.append(pdata)
showlst.sort(key=lambda x: x.name) showlst.sort(key=lambda x: x.name)
for pdata in showlst: for pdata in showlst:
new_key = pdata.id.replace(' ', '-') new_key = pdata.id.replace(' ', '-')
ofile.write('<menuitem action="%s"/>' % new_key) ofile.write(MENUITEM.format(prefix=prefix, action=new_key,
actions.append((new_key, None, pdata.name, None, None, label=pdata.name))
make_quick_report_callback(pdata, category, dbstate, actions.append((new_key, make_quick_report_callback(
uistate, handle, track=track))) pdata, category, dbstate, uistate, handle, track=track)))
ofile.write('</menu>') ofile.write('</submenu>\n')
return (ofile.getvalue(), actions) return (ofile.getvalue(), actions)
def make_quick_report_callback(pdata, category, dbstate, uistate, handle, def make_quick_report_callback(pdata, category, dbstate, uistate, handle,
track=[]): track=[]):
return lambda x: run_report(dbstate, uistate, category, handle, pdata, return lambda x, y: run_report(dbstate, uistate, category, handle, pdata,
track=track) track=track)
def get_quick_report_list(qv_category=None): def get_quick_report_list(qv_category=None):
""" """

514
gramps/gui/uimanager.py Normal file
View File

@ -0,0 +1,514 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2018 Paul Culley
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"""
A replacement UIManager and ActionGroup.
"""
import copy
import sys
import logging
import xml.etree.ElementTree as ET
from gi.repository import GLib, Gio, Gtk
from ..gen.config import config
LOG = logging.getLogger('gui.uimanager')
ACTION_NAME = 0 # tuple index for action name
ACTION_CB = 1 # tuple index for action callback
ACTION_ACC = 2 # tuple index for action accelerator
ACTION_ST = 3 # tuple index for action state
class ActionGroup():
""" This class represents a group of actions that con be manipulated
together.
"""
def __init__(self, name, actionlist=None, prefix='win'):
"""
@param name: the action group name, used to match to the 'groups'
attribute in the ui xml.
@type name: string
@type actionlist: list
@param actionlist: the list of actions to add
The list contains tuples with the following contents:
string: Action Name
method: signal callback function.
None if just adding an accelerator
string: accelerator ex: '<Primary>Enter' or '' for no accelerator.
optional for non-stateful actions.
state: initial state for stateful actions.
'True' or 'False': the action is interpreted as a checkbox.
'None': non stateful action (optional)
'string': the action is interpreted as a Radio button
@type prefix: str
@param prefix: the prefix used by this group. If not provided, 'win'
is assumed.
"""
self.name = name
self.actionlist = actionlist if actionlist else []
self.prefix = prefix + '.'
self.act_group = None
self.sensitive = True
def add_actions(self, actionlist):
""" Add a list of actions to the current list
@type actionlist: list
@param actionlist: the list of actions to add
"""
self.actionlist.extend(actionlist)
class UIManager():
"""
This is Gramps UIManager, it is designed to replace the deprecated Gtk
UIManager. The replacement is not exact, but performs similar
functions, in some case with the same method names and parameters.
It is designed to be a singleton. The menu portion of this is responsible
only for Gramps main window menus and toolbar.
This was implemented to extend Gtk.Builder functions to allow editing
(merging) of the original builder XML with additional XML fragments during
operations. This allows changing of the menus and toolbar when the tree is
loaded, views are changed etc.
The ActionGroup portions can also be used by other windows. Other windows
needing menus or toolbars can create them via Gtk.Builder.
"""
def __init__(self, app, initial_xml):
"""
@param app: Gramps Gtk.Application reference
@type app: Gtk.Application
@param initial_xml: Initial (primary) XML string for Gramps menus and
toolbar
@type changexml: string
The xml is basically Gtk Builder xml, in particular the various menu
and toolbar elements. It is possible to add other elements as well.
The xml this supports has been extended in two ways;
1) there is an added "groups=" attribute to elements. This
attribute associates the element with one or more named ActionGroups
for making the element visible or not. If 'groups' is missing, the
element will be shown as long as enclosing elements are shown. The
element will be shown if the group is present and considered visible
by the uimanager. If more than one group is needed, they should be
separated by a space.
2) there is an added <placeholder> tag supported; this is used to mark
a place where merged UI XML can be inserted. During the update_menu
processing, elements enclosed in this tag pair are promoted to the
level of the placeholder tag, and the placeholder tag is removed.
Note that any elements can be merged (replaced) by the
add_ui_from_string method, not just placeholders. This works by
matching the "id=" attribute on the element, and replacing the
original element with the one from the add method.
Note that when added elements are removed by the remove_ui method, they
are replaced by the containing xml (with the 'id=') only, so don't put
anything inside of the containing xml to start with as it will be lost
during editing.
"""
self.app = app # the Gtk.Application of Gramps
self.et_xml = ET.fromstring(initial_xml)
self.builder = None
self.toolbar = None
self.action_groups = [] # current list of action groups
self.show_groups = ['RW', 'RO'] # groups to show at the moment
self.accel_dict = {} # used to store accel overrides from file
def update_menu(self, init=False):
""" This updates the menus and toolbar when there is a change in the
ui; any addition or removal or set_visible operation needs to call
this. It is best to make the call only once, at the end, if multiple
changes are to be made.
It starts with the ET xml stored in self, cleans it up to meet the
Gtk.Builder specifications, and then updates the ui.
@param init: When True, this is first call and we set the builder
toolbar and menu to the application.
When False, we update the menus and toolbar
@type init: bool
"""
def iterator(parents):
""" This recursively goes through the ET xml and deals with the
'groups' attribute and <placeholder> tags, which are not valid for
builder. Empty submenus are also removed.
Groups processing removes elements that are not shown, as well as
the 'groups' attribute itself.
<placeholder> tags are removed and their enclosed elements are
promoted to the level of the placeholder.
@param parents: the current element to recursively process
@type parents: ET element
"""
indx = 0
while indx < len(parents):
child = parents[indx]
if len(child) >= 1:
# Recurse until we have a stand-alone child
iterator(child)
if((len(child) == 1 and child.tag == "submenu") or
(len(child) == 0 and child.tag == "section")):
# remove empty submenus and sections
# print('del', child.tag, child.attrib)
del parents[indx]
continue
# print(child.attrib)
groups = child.get('groups')
if not groups:
indx += 1
continue
del child.attrib['groups']
for group in groups.split(' '):
if group in self.show_groups:
indx += 1
break
else:
#print('del', child.tag, child.attrib, parents.tag,
# parents.attrib)
del parents[indx]
break
# The following looks for 'placeholder' elements and if found,
# promotes any children to the same level as the placeholder.
# this allows the user to insert elements without using a section.
indx = 0
while indx < len(parents):
if parents[indx].tag == "placeholder":
subtree = parents[indx]
#print('placholder del', parents[indx].tag,
# parents[indx].attrib, parents.tag, parents.attrib)
del parents[indx]
for child in subtree:
parents.insert(indx, child)
indx += 1
else:
indx += 1
if self.builder:
toolbar = self.builder.get_object("ToolBar") # previous toolbar
# need to copy the tree so we can preserve original for later edits.
editable = copy.deepcopy(self.et_xml)
iterator(editable) # clean up tree to builder specifications
xml_str = ET.tostring(editable, encoding="unicode")
#print(xml_str)
self.builder = Gtk.Builder.new_from_string(xml_str, -1)
if init:
self.app.menubar = self.builder.get_object("menubar")
self.app.set_menubar(self.app.menubar)
return
# The following is the only way I have found to update the menus.
# app.set_menubar can apparently only be used once, before
# ApplicationWindow creation, further uses do NOT cause the menus to
# update.
self.app.menubar.remove_all()
section = self.builder.get_object('menubar-update')
self.app.menubar.append_section(None, section)
# the following updates the toolbar from the new builder
toolbar_parent = toolbar.get_parent()
tb_show = toolbar.get_visible()
toolbar_parent.remove(toolbar)
toolbar = self.builder.get_object("ToolBar") # new toolbar
toolbar_parent.pack_start(toolbar, False, True, 0)
if tb_show:
toolbar.show_all()
else:
toolbar.hide()
#print('*** Update ui')
def add_ui_from_string(self, changexml):
""" This performs a merge operation on the xml elements that have
matching 'id's between the current ui xml and change xml strings.
The 'changexml' is a list of xml fragment strings used to replace
matching elements in the current xml.
There MUST one and only one matching id in the orig xml.
@param changexml: list of xml fragments to merge into main
@type changexml: list
@return: changexml
"""
try:
for xml in changexml:
if not xml:
# allow an xml fragment to be an empty string
continue
update = ET.fromstring(xml)
el_id = update.attrib['id']
# find the parent of the id'd element in original xml
parent = self.et_xml.find(".//*[@id='%s'].." % el_id)
if parent:
# we found it, now delete original, inset updated
for indx in range(len(parent)):
if parent[indx].get('id') == el_id:
del parent[indx]
parent.insert(indx, update)
else:
# updated item not present in original, just add it
# This allow addition of popups etc.
self.et_xml.append(update)
#results = ET.tostring(self.et_xml, encoding="unicode")
#print(results)
#print ('*** Add ui')
return changexml
except:
# the following is only here to assist debug
print('*****', sys.exc_info())
print(xml)
print(changexml)
assert False
def remove_ui(self, change_xml):
""" This removes the 'change_xml' from the current ui xml. It works on
any element with matching 'id', the actual element remains but any
children are removed.
The 'change_xml' is a list of xml strings originally used to replace
matching elements in the current ui xml.
@param change_xml: list of xml fragments to remove from main
@type change_xml: list
"""
# if not change_xml:
# import pydevd
# pydevd.settrace()
for xml in change_xml:
if not xml:
continue
update = ET.fromstring(xml)
el_id = update.attrib['id']
# find parent of id'd element
element = self.et_xml.find(".//*[@id='%s']" % el_id)
if element: # element may have already been deleted
for dummy in range(len(element)):
del element[0]
#results = ET.tostring(self.et_xml, encoding="unicode")
#print(results)
#print ('*** Remove ui')
return
def get_widget(self, obj):
""" Get the object from the builder.
@param obj: the widget to get
@type obj: string
@return: the object
"""
return self.builder.get_object(obj)
def insert_action_group(self, group, gio_group=None):
"""
This inserts (actually overwrites any matching actions) the action
group's actions to the app.
By default (with no gio_group), the action group is added to the main
Gramps window and the group assumes a 'win' prefix.
If not using the main window, the window MUST have the 'application'
property set for the accels to work. In this case the actiongroups
must be created like the following:
# create Gramps ActionGroup
self.action_group = ActionGroup('name', actions, 'prefix')
# create Gio action group
act_grp = SimpleActionGroup()
# associate window with Gio group and its prefix
window.insert_action_group('prefix', act_grp)
# make the window 'application' aware
window.set_application(uimanager.app)
# tell the uimanager about the groups.
uimanager.insert_action_group(self.action_group, act_grp)
@param group: the action group
@type group: ActionGroup
@param gio_group: the Gio action group associated with a window.
@type gio_group: Gio.SimpleActionGroup
"""
try:
assert isinstance(group.actionlist, list)
if gio_group:
window_group = group.act_group = gio_group
elif group.act_group:
window_group = group.act_group
else:
window_group = group.act_group = self.app.window
for item in group.actionlist:
# deal with accelerator overrides from a file
accel = self.accel_dict.get(group.prefix + item[ACTION_NAME])
if accel:
self.app.set_accels_for_action(
group.prefix + item[ACTION_NAME], [accel])
elif len(item) > 2 and item[ACTION_ACC]:
# deal with accelerators defined in the group
accels = self.app.get_actions_for_accel(item[ACTION_ACC])
if accels:
# diagnostic printout; a duplicate accelerator may be
# a problem if both are valid for the same window at
# the same time. If the actions are for a different
# window, this is not an error. Here we assume a
# different prefix is used for different windows.
for accel in accels:
if group.prefix in accel:
LOG.warning('**Duplicate Accelerator %s',
item[ACTION_ACC])
self.app.set_accels_for_action(
group.prefix + item[ACTION_NAME], [item[ACTION_ACC]])
if len(item) <= 3:
# Normal stateless actions
action = Gio.SimpleAction.new(item[ACTION_NAME], None)
if item[ACTION_CB]: # in case we have only accelerator
action.connect("activate", item[ACTION_CB])
elif isinstance(item[ACTION_ST], str):
# Radio Actions
action = Gio.SimpleAction.new_stateful(
item[ACTION_NAME], GLib.VariantType.new("s"),
GLib.Variant("s", item[ACTION_ST]))
action.connect("change-state", item[ACTION_CB])
elif isinstance(item[ACTION_ST], bool):
# Checkbox actions
action = Gio.SimpleAction.new_stateful(
item[ACTION_NAME], None,
GLib.Variant.new_boolean(item[ACTION_ST]))
action.connect("change-state", item[ACTION_CB])
window_group.add_action(action)
self.action_groups.append(group)
# if action sensitivity was set prior to actually inserting into
# UIManager, we need to do it now that we have the action
if not group.sensitive:
self.set_actions_sensitive(group, False)
except:
# the following is only to assist in debug
print(group.name, item)
assert False
def remove_action_group(self, group):
""" This removes the ActionGroup from the UIManager
@param group: the action group
@type group: ActionGroup
"""
if group.act_group:
window_group = group.act_group
else:
window_group = self.app.window
for item in group.actionlist:
window_group.remove_action(item[ACTION_NAME])
self.app.set_accels_for_action(group.prefix + item[ACTION_NAME],
[])
self.action_groups.remove(group)
def get_action_groups(self):
""" This returns a list of action Groups installed into the UIManager.
@return: list of groups
"""
return self.action_groups
def set_actions_sensitive(self, group, value):
""" This sets an ActionGroup enabled or disabled. A disabled action
will be greyed out in the UI.
@param group: the action group
@type group: ActionGroup
@param value: the state of the group
@type value: bool
"""
if group.act_group:
for item in group.actionlist:
action = group.act_group.lookup_action(item[ACTION_NAME])
if action:
# We check in case the group has not been inserted into
# UIManager yet
action.set_enabled(value)
group.sensitive = value
def get_actions_sensitive(self, group):
""" This gets an ActionGroup sensitive setting. A disabled action
will be greyed out in the UI.
We assume that the first action represents the group.
@param group: the action group
@type group: ActionGroup
@return: the state of the group
"""
item = group.actionlist[0]
action = group.act_group.lookup_action(item[ACTION_NAME])
return action.get_enabled()
def set_actions_visible(self, group, value):
""" This sets an ActionGroup visible and enabled or invisible and
disabled. Make sure that the menuitems or sections and toolbar items
have the 'groups=' xml attribute matching the group name for this to
work correctly.
@param group: the action group
@type group: ActionGroup
@param value: the state of the group
@type value: bool
"""
self.set_actions_sensitive(group, value)
if value:
if group.name not in self.show_groups:
self.show_groups.append(group.name)
else:
if group.name in self.show_groups:
self.show_groups.remove(group.name)
def get_action(self, group, actionname):
""" Return a single action from the group.
@param group: the action group
@type group: ActionGroup
@param actionname: the action name
@type actionname: string
@return: Gio.Action
"""
return group.act_group.lookup_action(actionname)
def dump_all_accels(self):
''' A function used diagnostically to see what accels are present.
This will only dump the current accel set, if other non-open windows
or views have accels, you will need to open them and run this again
and manually merge the result files. The results are in a
'gramps.accel' file located in the current working directory.'''
out_dict = {}
for group in self.action_groups:
for item in group.actionlist:
act = group.prefix + item[ACTION_NAME]
accels = self.app.get_accels_for_action(
group.prefix + item[ACTION_NAME])
out_dict[act] = accels[0] if accels else ''
import json
with open('gramps.accel', 'w', ) as hndl:
accels = json.dumps(out_dict, indent=0).replace('\n"', '\n# "')
hndl.write(accels)
def load_accels(self, filename):
""" This function loads accels from a file such as created by
dump_all_accels. The file contents is basically a Python dict
definition. As such it contains a line for each dict element.
These elements can be commented out with '#' at the beginning of the
line.
If used, this file overrides the accels defined in other Gramps code.
As such it must be loaded before any insert_action_group calls.
"""
import ast
with open(filename, 'r') as hndl:
accels = hndl.read()
self.accel_dict = ast.literal_eval(accels)

File diff suppressed because it is too large Load Diff

View File

@ -28,6 +28,7 @@
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
from io import StringIO from io import StringIO
import html
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -51,6 +52,7 @@ from gi.repository import Gtk
from ..display import display_help from ..display import display_help
from ..listmodel import ListModel from ..listmodel import ListModel
from ..managedwindow import ManagedWindow from ..managedwindow import ManagedWindow
from ..uimanager import ActionGroup
from gramps.gen.utils.db import navigation_label from gramps.gen.utils.db import navigation_label
from gramps.gen.const import URL_MANUAL_PAGE from gramps.gen.const import URL_MANUAL_PAGE
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
@ -71,9 +73,6 @@ WIKI_HELP_SEC = _('manual|Bookmarks')
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
TOP = '''<ui><menubar name="MenuBar"><menu action="BookMenu">'''
BTM = '''</menu></menubar></ui>'''
DISABLED = -1 DISABLED = -1
class Bookmarks(metaclass=ABCMeta): class Bookmarks(metaclass=ABCMeta):
@ -93,7 +92,7 @@ class Bookmarks(metaclass=ABCMeta):
if self.dbstate.is_open(): if self.dbstate.is_open():
self.update_bookmarks() self.update_bookmarks()
self.active = DISABLED self.active = DISABLED
self.action_group = Gtk.ActionGroup(name='Bookmarks') self.action_group = ActionGroup(name='Bookmarks')
if self.dbstate.is_open(): if self.dbstate.is_open():
self.connect_signals() self.connect_signals()
self.dbstate.connect('database-changed', self.db_changed) self.dbstate.connect('database-changed', self.db_changed)
@ -129,7 +128,8 @@ class Bookmarks(metaclass=ABCMeta):
""" """
Redraw the display. Redraw the display.
""" """
self.redraw() # used by navigationview; other updates follow
self.redraw(update_menu=False)
def undisplay(self): def undisplay(self):
""" """
@ -138,8 +138,7 @@ class Bookmarks(metaclass=ABCMeta):
if self.active != DISABLED: if self.active != DISABLED:
self.uistate.uimanager.remove_ui(self.active) self.uistate.uimanager.remove_ui(self.active)
self.uistate.uimanager.remove_action_group(self.action_group) self.uistate.uimanager.remove_action_group(self.action_group)
self.action_group = Gtk.ActionGroup(name='Bookmarks') self.action_group = ActionGroup(name='Bookmarks')
self.uistate.uimanager.ensure_update()
self.active = DISABLED self.active = DISABLED
def redraw_and_report_change(self): def redraw_and_report_change(self):
@ -147,10 +146,14 @@ class Bookmarks(metaclass=ABCMeta):
self.dbstate.db.report_bm_change() self.dbstate.db.report_bm_change()
self.redraw() self.redraw()
def redraw(self): def redraw(self, update_menu=True):
"""Create the pulldown menu.""" """Create the pulldown menu."""
menuitem = ('<item>\n'
'<attribute name="action">win.%s</attribute>\n'
'<attribute name="label" translatable="yes">'
'%s</attribute>\n'
'</item>\n')
text = StringIO() text = StringIO()
text.write(TOP)
self.undisplay() self.undisplay()
@ -158,24 +161,25 @@ class Bookmarks(metaclass=ABCMeta):
count = 0 count = 0
if self.dbstate.is_open() and len(self.bookmarks.get()) > 0: if self.dbstate.is_open() and len(self.bookmarks.get()) > 0:
text.write('<placeholder name="GoToBook">') text.write('<section id="GoToBook">\n')
for item in self.bookmarks.get(): for item in self.bookmarks.get():
try: try:
label, dummy_obj = self.make_label(item) label, dummy_obj = self.make_label(item)
func = self.callback(item) func = self.callback(item)
action_id = "BM:%s" % item action_id = "BM.%s" % item
actions.append((action_id, None, label, None, None, func)) actions.append((action_id, func))
text.write('<menuitem action="%s"/>' % action_id) text.write(menuitem % (action_id, html.escape(label)))
count += 1 count += 1
except AttributeError: except AttributeError:
pass pass
text.write('</placeholder>') text.write('</section>\n')
text.write(BTM)
self.action_group.add_actions(actions) self.action_group.add_actions(actions)
self.uistate.uimanager.insert_action_group(self.action_group, 1) self.uistate.uimanager.insert_action_group(self.action_group)
self.active = self.uistate.uimanager.add_ui_from_string(text.getvalue()) self.active = self.uistate.uimanager.add_ui_from_string(
self.uistate.uimanager.ensure_update() [text.getvalue()])
if update_menu:
self.uistate.uimanager.update_menu()
text.close() text.close()
@abstractmethod @abstractmethod
@ -538,4 +542,4 @@ def make_callback(handle, function):
""" """
Build a unique call to the function with the associated handle. Build a unique call to the function with the associated handle.
""" """
return lambda x: function(handle) return lambda x, y: function(handle)

View File

@ -55,7 +55,7 @@ from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext _ = glocale.translation.sgettext
from .pageview import PageView from .pageview import PageView
from .navigationview import NavigationView from .navigationview import NavigationView
from ..actiongroup import ActionGroup from ..uimanager import ActionGroup
from ..columnorder import ColumnOrder from ..columnorder import ColumnOrder
from gramps.gen.config import config from gramps.gen.config import config
from gramps.gen.errors import WindowActiveError, FilterError, HandleError from gramps.gen.errors import WindowActiveError, FilterError, HandleError
@ -64,6 +64,7 @@ from ..widgets.menuitem import add_menuitem
from gramps.gen.const import CUSTOM_FILTERS from gramps.gen.const import CUSTOM_FILTERS
from gramps.gen.utils.debug import profile from gramps.gen.utils.debug import profile
from gramps.gen.utils.string import data_recover_msg from gramps.gen.utils.string import data_recover_msg
from gramps.gen.plug import CATEGORY_QR_PERSON
from ..dialog import QuestionDialog, QuestionDialog2, ErrorDialog from ..dialog import QuestionDialog, QuestionDialog2, ErrorDialog
from ..editors import FilterEditor from ..editors import FilterEditor
from ..ddtargets import DdTargets from ..ddtargets import DdTargets
@ -122,6 +123,8 @@ class ListView(NavigationView):
self.generic_filter = None self.generic_filter = None
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
self.connect_signals() self.connect_signals()
self.at_popup_action = None
self.at_popup_menu = None
def no_database(self): def no_database(self):
## TODO GTK3: This is never called!! Dbguielement disconnects ## TODO GTK3: This is never called!! Dbguielement disconnects
@ -206,24 +209,19 @@ class ListView(NavigationView):
NavigationView.define_actions(self) NavigationView.define_actions(self)
self.edit_action = ActionGroup(name=self.title + '/ChangeOrder') self.edit_action = ActionGroup(name=self.title + '/Edits')
self.edit_action.add_actions([ self.edit_action.add_actions([
('Add', 'list-add', _("_Add..."), "<PRIMARY>Insert", ('Add', self.add, '<Primary>Insert'),
self.ADD_MSG, self.add), ('Remove', self.remove, '<Primary>Delete'),
('Remove', 'list-remove', _("_Delete"), "<PRIMARY>Delete", ('PRIMARY-BackSpace', self.remove, '<PRIMARY>BackSpace'),
self.DEL_MSG, self.remove), ('Merge', self.merge), ])
('Merge', 'gramps-merge', _('_Merge...'), None,
self.MERGE_MSG, self.merge),
('ExportTab', None, _('Export View...'), None, None,
self.export),
])
self._add_action_group(self.edit_action) self._add_action_group(self.edit_action)
self.action_list.extend([
self._add_action('Edit', 'gtk-edit', _("action|_Edit..."), ('ExportTab', self.export),
accel="<PRIMARY>Return", ('Edit', self.edit, '<Primary>Return'),
tip=self.EDIT_MSG, ('PRIMARY-J', self.jump, '<PRIMARY>J'),
callback=self.edit) ('FilterEdit', self.filter_editor)])
def build_columns(self): def build_columns(self):
list(map(self.list.remove_column, self.columns)) list(map(self.list.remove_column, self.columns))
@ -291,7 +289,7 @@ class ListView(NavigationView):
Called when the page is displayed. Called when the page is displayed.
""" """
NavigationView.set_active(self) NavigationView.set_active(self)
self.uistate.viewmanager.tags.tag_enable() self.uistate.viewmanager.tags.tag_enable(update_menu=False)
self.uistate.show_filter_results(self.dbstate, self.uistate.show_filter_results(self.dbstate,
self.model.displayed(), self.model.displayed(),
self.model.total()) self.model.total())
@ -303,9 +301,6 @@ class ListView(NavigationView):
NavigationView.set_inactive(self) NavigationView.set_inactive(self)
self.uistate.viewmanager.tags.tag_disable() self.uistate.viewmanager.tags.tag_disable()
def __build_tree(self):
profile(self._build_tree)
def build_tree(self, force_sidebar=False): def build_tree(self, force_sidebar=False):
if self.active: if self.active:
cput0 = time.clock() cput0 = time.clock()
@ -372,7 +367,7 @@ class ListView(NavigationView):
""" """
return 'gramps-tree-list' return 'gramps-tree-list'
def filter_editor(self, obj): def filter_editor(self, *obj):
try: try:
FilterEditor(self.FILTER_TYPE , CUSTOM_FILTERS, FilterEditor(self.FILTER_TYPE , CUSTOM_FILTERS,
self.dbstate, self.uistate) self.dbstate, self.uistate)
@ -441,7 +436,7 @@ class ListView(NavigationView):
self.uistate.push_message(self.dbstate, self.uistate.push_message(self.dbstate,
_("Active object not visible")) _("Active object not visible"))
def add_bookmark(self, obj): def add_bookmark(self, *obj):
mlist = [] mlist = []
self.selection.selected_foreach(self.blist, mlist) self.selection.selected_foreach(self.blist, mlist)
@ -851,6 +846,7 @@ class ListView(NavigationView):
""" """
if not self.dbstate.is_open(): if not self.dbstate.is_open():
return False return False
menu = self.uimanager.get_widget('Popup')
if event.type == Gdk.EventType._2BUTTON_PRESS and event.button == 1: if event.type == Gdk.EventType._2BUTTON_PRESS and event.button == 1:
if self.model.get_flags() & Gtk.TreeModelFlags.LIST_ONLY: if self.model.get_flags() & Gtk.TreeModelFlags.LIST_ONLY:
self.edit(obj) self.edit(obj)
@ -866,49 +862,54 @@ class ListView(NavigationView):
else: else:
self.edit(obj) self.edit(obj)
return True return True
elif is_right_click(event): elif is_right_click(event) and menu:
menu = self.uistate.uimanager.get_widget('/Popup') prefix = 'win'
if menu: self.at_popup_menu = []
# Quick Reports actions = []
qr_menu = self.uistate.uimanager.\ # Quick Reports
get_widget('/Popup/QuickReport') if self.QR_CATEGORY > -1:
if qr_menu and self.QR_CATEGORY > -1 : (qr_ui, qr_actions) = create_quickreport_menu(
(ui, qr_actions) = create_quickreport_menu( self.QR_CATEGORY, self.dbstate, self.uistate,
self.QR_CATEGORY, self.first_selected(), prefix)
self.dbstate, if self.get_active() and qr_actions:
self.uistate, actions.extend(qr_actions)
self.first_selected()) qr_ui = ("<placeholder id='QuickReport'>%s</placeholder>" %
self.__build_menu(qr_menu, qr_actions) qr_ui)
self.at_popup_menu.append(qr_ui)
# Web Connects # Web Connects
web_menu = self.uistate.uimanager.\ if self.QR_CATEGORY == CATEGORY_QR_PERSON:
get_widget('/Popup/WebConnect') (web_ui, web_actions) = create_web_connect_menu(
if web_menu: self.dbstate, self.uistate, self.navigation_type(),
web_actions = create_web_connect_menu( self.first_selected(), prefix)
self.dbstate, if self.get_active() and web_actions:
self.uistate, actions.extend(web_actions)
self.navigation_type(), self.at_popup_menu.append(web_ui)
self.first_selected())
self.__build_menu(web_menu, web_actions)
menu.popup(None, None, None, None, event.button, event.time) if self.at_popup_action:
return True self.uimanager.remove_ui(self.at_popup_menu)
self.uimanager.remove_action_group(self.at_popup_action)
self.at_popup_action = ActionGroup('AtPopupActions',
actions)
self.uimanager.insert_action_group(self.at_popup_action)
self.at_popup_menu = self.uimanager.add_ui_from_string(
self.at_popup_menu)
self.uimanager.update_menu()
menu = self.uimanager.get_widget('Popup')
popup_menu = Gtk.Menu.new_from_model(menu)
popup_menu.attach_to_widget(obj, None)
popup_menu.show_all()
if Gtk.MINOR_VERSION < 22:
# ToDo The following is reported to work poorly with Wayland
popup_menu.popup(None, None, None, None,
event.button, event.time)
else:
popup_menu.popup_at_pointer(event)
return True
return False return False
def __build_menu(self, menu, actions):
"""
Build a submenu for quick reports and web connects
"""
if self.get_active() and len(actions) > 1:
sub_menu = Gtk.Menu()
for action in actions[1:]:
add_menuitem(sub_menu, action[2], None, action[5])
menu.set_submenu(sub_menu)
menu.show()
else:
menu.hide()
def _key_press(self, obj, event): def _key_press(self, obj, event):
""" """
Called when a key is pressed on a listview Called when a key is pressed on a listview
@ -1002,9 +1003,6 @@ class ListView(NavigationView):
return True return True
return False return False
def key_delete(self):
self.remove(None)
def change_page(self): def change_page(self):
""" """
Called when a page is changed. Called when a page is changed.
@ -1014,8 +1012,9 @@ class ListView(NavigationView):
self.uistate.show_filter_results(self.dbstate, self.uistate.show_filter_results(self.dbstate,
self.model.displayed(), self.model.displayed(),
self.model.total()) self.model.total())
self.edit_action.set_visible(True) self.uimanager.set_actions_visible(self.edit_action, True)
self.edit_action.set_sensitive(not self.dbstate.db.readonly) self.uimanager.set_actions_sensitive(self.edit_action,
not self.dbstate.db.readonly)
def on_delete(self): def on_delete(self):
""" """
@ -1038,7 +1037,7 @@ class ListView(NavigationView):
#################################################################### ####################################################################
# Export data # Export data
#################################################################### ####################################################################
def export(self, obj): def export(self, *obj):
chooser = Gtk.FileChooserDialog( chooser = Gtk.FileChooserDialog(
_("Export View as Spreadsheet"), _("Export View as Spreadsheet"),
self.uistate.window, self.uistate.window,
@ -1140,25 +1139,25 @@ class ListView(NavigationView):
# Template functions # Template functions
#################################################################### ####################################################################
@abstractmethod @abstractmethod
def edit(self, obj, data=None): def edit(self, *obj):
""" """
Template function to allow the editing of the selected object Template function to allow the editing of the selected object
""" """
@abstractmethod @abstractmethod
def remove(self, handle, data=None): def remove(self, *obj):
""" """
Template function to allow the removal of an object by its handle Template function to allow the removal of an object by its handle
""" """
@abstractmethod @abstractmethod
def add(self, obj, data=None): def add(self, *obj):
""" """
Template function to allow the adding of a new object Template function to allow the adding of a new object
""" """
@abstractmethod @abstractmethod
def merge(self, obj, data=None): def merge(self, *obj):
""" """
Template function to allow the merger of two objects. Template function to allow the merger of two objects.
""" """
@ -1169,7 +1168,7 @@ class ListView(NavigationView):
Template function to allow the removal of an object by its handle Template function to allow the removal of an object by its handle
""" """
def open_all_nodes(self, obj): def open_all_nodes(self, *obj):
""" """
Method for Treeviews to open all groups Method for Treeviews to open all groups
obj: for use of method in event callback obj: for use of method in event callback
@ -1182,14 +1181,14 @@ class ListView(NavigationView):
self.uistate.set_busy_cursor(False) self.uistate.set_busy_cursor(False)
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
def close_all_nodes(self, obj): def close_all_nodes(self, *obj):
""" """
Method for Treeviews to close all groups Method for Treeviews to close all groups
obj: for use of method in event callback obj: for use of method in event callback
""" """
self.list.collapse_all() self.list.collapse_all()
def open_branch(self, obj): def open_branch(self, *obj):
""" """
Expand the selected branches and all children. Expand the selected branches and all children.
obj: for use of method in event callback obj: for use of method in event callback
@ -1204,7 +1203,7 @@ class ListView(NavigationView):
self.uistate.set_busy_cursor(False) self.uistate.set_busy_cursor(False)
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
def close_branch(self, obj): def close_branch(self, *obj):
""" """
Collapse the selected branches. Collapse the selected branches.
:param obj: not used, present only to allow the use of the method in :param obj: not used, present only to allow the use of the method in

View File

@ -29,6 +29,7 @@ Provide the base classes for GRAMPS' DataView classes
# #
#---------------------------------------------------------------- #----------------------------------------------------------------
from abc import abstractmethod from abc import abstractmethod
import html
import logging import logging
_LOG = logging.getLogger('.navigationview') _LOG = logging.getLogger('.navigationview')
@ -49,7 +50,7 @@ from gi.repository import Gtk
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext _ = glocale.translation.sgettext
from .pageview import PageView from .pageview import PageView
from ..actiongroup import ActionGroup from ..uimanager import ActionGroup
from gramps.gen.utils.db import navigation_label from gramps.gen.utils.db import navigation_label
from gramps.gen.constfunc import mod_key from gramps.gen.constfunc import mod_key
from ..utils import match_primary_mask from ..utils import match_primary_mask
@ -57,19 +58,9 @@ from ..utils import match_primary_mask
DISABLED = -1 DISABLED = -1
MRU_SIZE = 10 MRU_SIZE = 10
MRU_TOP = [ MRU_TOP = '<section id="CommonHistory">'
'<ui>' MRU_BTM = '</section>'
'<menubar name="MenuBar">'
'<menu action="GoMenu">'
'<placeholder name="CommonHistory">'
]
MRU_BTM = [
'</placeholder>'
'</menu>'
'</menubar>'
'</ui>'
]
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# NavigationView # NavigationView
@ -94,6 +85,7 @@ class NavigationView(PageView):
self.mru_signal = None self.mru_signal = None
self.nav_group = nav_group self.nav_group = nav_group
self.mru_active = DISABLED self.mru_active = DISABLED
self.uimanager = uistate.uimanager
self.uistate.register(state, self.navigation_type(), self.nav_group) self.uistate.register(state, self.navigation_type(), self.nav_group)
@ -122,8 +114,8 @@ class NavigationView(PageView):
""" """
PageView.disable_action_group(self) PageView.disable_action_group(self)
self.fwd_action.set_visible(False) self.uimanager.set_actions_visible(self.fwd_action, False)
self.back_action.set_visible(False) self.uimanager.set_actions_visible(self.back_action, False)
def enable_action_group(self, obj): def enable_action_group(self, obj):
""" """
@ -133,20 +125,25 @@ class NavigationView(PageView):
""" """
PageView.enable_action_group(self, obj) PageView.enable_action_group(self, obj)
self.fwd_action.set_visible(True) self.uimanager.set_actions_visible(self.fwd_action, True)
self.back_action.set_visible(True) self.uimanager.set_actions_visible(self.back_action, True)
hobj = self.get_history() hobj = self.get_history()
self.fwd_action.set_sensitive(not hobj.at_end()) self.uimanager.set_actions_sensitive(self.fwd_action,
self.back_action.set_sensitive(not hobj.at_front()) not hobj.at_end())
self.uimanager.set_actions_sensitive(self.back_action,
not hobj.at_front())
def change_page(self): def change_page(self):
""" """
Called when the page changes. Called when the page changes.
""" """
hobj = self.get_history() hobj = self.get_history()
self.fwd_action.set_sensitive(not hobj.at_end()) self.uimanager.set_actions_sensitive(self.fwd_action,
self.back_action.set_sensitive(not hobj.at_front()) not hobj.at_end())
self.other_action.set_sensitive(not self.dbstate.db.readonly) self.uimanager.set_actions_sensitive(self.back_action,
not hobj.at_front())
self.uimanager.set_actions_sensitive(self.other_action,
not self.dbstate.db.readonly)
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
def set_active(self): def set_active(self):
@ -159,7 +156,7 @@ class NavigationView(PageView):
hobj = self.get_history() hobj = self.get_history()
self.active_signal = hobj.connect('active-changed', self.goto_active) self.active_signal = hobj.connect('active-changed', self.goto_active)
self.mru_signal = hobj.connect('mru-changed', self.update_mru_menu) self.mru_signal = hobj.connect('mru-changed', self.update_mru_menu)
self.update_mru_menu(hobj.mru) self.update_mru_menu(hobj.mru, update_menu=False)
self.goto_active(None) self.goto_active(None)
@ -199,8 +196,10 @@ class NavigationView(PageView):
self.goto_handle(active_handle) self.goto_handle(active_handle)
hobj = self.get_history() hobj = self.get_history()
self.fwd_action.set_sensitive(not hobj.at_end()) self.uimanager.set_actions_sensitive(self.fwd_action,
self.back_action.set_sensitive(not hobj.at_front()) not hobj.at_end())
self.uimanager.set_actions_sensitive(self.back_action,
not hobj.at_front())
def get_active(self): def get_active(self):
""" """
@ -238,7 +237,7 @@ class NavigationView(PageView):
#################################################################### ####################################################################
# BOOKMARKS # BOOKMARKS
#################################################################### ####################################################################
def add_bookmark(self, obj): def add_bookmark(self, *obj):
""" """
Add a bookmark to the list. Add a bookmark to the list.
""" """
@ -259,7 +258,7 @@ class NavigationView(PageView):
"no one was selected."), "no one was selected."),
parent=self.uistate.window) parent=self.uistate.window)
def edit_bookmarks(self, obj): def edit_bookmarks(self, *obj):
""" """
Call the bookmark editor. Call the bookmark editor.
""" """
@ -271,12 +270,8 @@ class NavigationView(PageView):
""" """
self.book_action = ActionGroup(name=self.title + '/Bookmark') self.book_action = ActionGroup(name=self.title + '/Bookmark')
self.book_action.add_actions([ self.book_action.add_actions([
('AddBook', 'gramps-bookmark-new', _('_Add Bookmark'), ('AddBook', self.add_bookmark, '<PRIMARY>d'),
'<PRIMARY>d', None, self.add_bookmark), ('EditBook', self.edit_bookmarks, '<shift><PRIMARY>D'),
('EditBook', 'gramps-bookmark-edit',
_("%(title)s...") % {'title': _("Organize Bookmarks")},
'<shift><PRIMARY>D', None,
self.edit_bookmarks),
]) ])
self._add_action_group(self.book_action) self._add_action_group(self.book_action)
@ -290,35 +285,25 @@ class NavigationView(PageView):
""" """
# add the Forward action group to handle the Forward button # add the Forward action group to handle the Forward button
self.fwd_action = ActionGroup(name=self.title + '/Forward') self.fwd_action = ActionGroup(name=self.title + '/Forward')
self.fwd_action.add_actions([ self.fwd_action.add_actions([('Forward', self.fwd_clicked,
('Forward', 'go-next', _("_Forward"), "%sRight" % mod_key())])
"%sRight" % mod_key(), _("Go to the next object in the history"),
self.fwd_clicked)
])
# add the Backward action group to handle the Forward button # add the Backward action group to handle the Forward button
self.back_action = ActionGroup(name=self.title + '/Backward') self.back_action = ActionGroup(name=self.title + '/Backward')
self.back_action.add_actions([ self.back_action.add_actions([('Back', self.back_clicked,
('Back', 'go-previous', _("_Back"), "%sLeft" % mod_key())])
"%sLeft" % mod_key(), _("Go to the previous object in the history"),
self.back_clicked)
])
self._add_action('HomePerson', 'go-home', _("_Home"), self._add_action('HomePerson', self.home, "%sHome" % mod_key())
accel="%sHome" % mod_key(),
tip=_("Go to the default person"), callback=self.home)
self.other_action = ActionGroup(name=self.title + '/PersonOther') self.other_action = ActionGroup(name=self.title + '/PersonOther')
self.other_action.add_actions([ self.other_action.add_actions([
('SetActive', 'go-home', _("Set _Home Person"), None, ('SetActive', self.set_default_person)])
None, self.set_default_person),
])
self._add_action_group(self.back_action) self._add_action_group(self.back_action)
self._add_action_group(self.fwd_action) self._add_action_group(self.fwd_action)
self._add_action_group(self.other_action) self._add_action_group(self.other_action)
def set_default_person(self, obj): def set_default_person(self, *obj):
""" """
Set the default person. Set the default person.
""" """
@ -326,7 +311,7 @@ class NavigationView(PageView):
if active: if active:
self.dbstate.db.set_default_person_handle(active) self.dbstate.db.set_default_person_handle(active)
def home(self, obj): def home(self, *obj):
""" """
Move to the default person. Move to the default person.
""" """
@ -342,7 +327,7 @@ class NavigationView(PageView):
"via the menu Edit ->Set Home Person."), "via the menu Edit ->Set Home Person."),
parent=self.uistate.window) parent=self.uistate.window)
def jump(self): def jump(self, *obj):
""" """
A dialog to move to a Gramps ID entered by the user. A dialog to move to a Gramps ID entered by the user.
""" """
@ -383,7 +368,7 @@ class NavigationView(PageView):
""" """
pass pass
def fwd_clicked(self, obj): def fwd_clicked(self, *obj):
""" """
Move forward one object in the history. Move forward one object in the history.
""" """
@ -392,11 +377,12 @@ class NavigationView(PageView):
if not hobj.at_end(): if not hobj.at_end():
hobj.forward() hobj.forward()
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
self.fwd_action.set_sensitive(not hobj.at_end()) self.uimanager.set_actions_sensitive(self.fwd_action,
self.back_action.set_sensitive(True) not hobj.at_end())
self.uimanager.set_actions_sensitive(self.back_action, True)
hobj.lock = False hobj.lock = False
def back_clicked(self, obj): def back_clicked(self, *obj):
""" """
Move backward one object in the history. Move backward one object in the history.
""" """
@ -405,8 +391,9 @@ class NavigationView(PageView):
if not hobj.at_front(): if not hobj.at_front():
hobj.back() hobj.back()
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
self.back_action.set_sensitive(not hobj.at_front()) self.uimanager.set_actions_sensitive(self.back_action,
self.fwd_action.set_sensitive(True) not hobj.at_front())
self.uimanager.set_actions_sensitive(self.fwd_action, True)
hobj.lock = False hobj.lock = False
#################################################################### ####################################################################
@ -418,44 +405,52 @@ class NavigationView(PageView):
Remove the UI and action groups for the MRU list. Remove the UI and action groups for the MRU list.
""" """
if self.mru_active != DISABLED: if self.mru_active != DISABLED:
self.uistate.uimanager.remove_ui(self.mru_active) self.uimanager.remove_ui(self.mru_active)
self.uistate.uimanager.remove_action_group(self.mru_action) self.uimanager.remove_action_group(self.mru_action)
self.mru_active = DISABLED self.mru_active = DISABLED
def mru_enable(self): def mru_enable(self, update_menu=False):
""" """
Enables the UI and action groups for the MRU list. Enables the UI and action groups for the MRU list.
""" """
if self.mru_active == DISABLED: if self.mru_active == DISABLED:
self.uistate.uimanager.insert_action_group(self.mru_action, 1) self.uimanager.insert_action_group(self.mru_action)
self.mru_active = self.uistate.uimanager.add_ui_from_string(self.mru_ui) self.mru_active = self.uimanager.add_ui_from_string(self.mru_ui)
self.uistate.uimanager.ensure_update() if update_menu:
self.uimanager.update_menu()
def update_mru_menu(self, items): def update_mru_menu(self, items, update_menu=True):
""" """
Builds the UI and action group for the MRU list. Builds the UI and action group for the MRU list.
""" """
menuitem = ''' <item>
<attribute name="action">win.%s%02d</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
'''
menus = ''
self.mru_disable() self.mru_disable()
nav_type = self.navigation_type() nav_type = self.navigation_type()
hobj = self.get_history() hobj = self.get_history()
menu_len = min(len(items) - 1, MRU_SIZE) menu_len = min(len(items) - 1, MRU_SIZE)
entry = '<menuitem action="%s%02d"/>' for index in range(0, menu_len):
data = [entry % (nav_type, index) for index in range(0, menu_len)] name, obj = navigation_label(self.dbstate.db, nav_type,
self.mru_ui = "".join(MRU_TOP) + "".join(data) + "".join(MRU_BTM) items[index])
menus += menuitem % (nav_type, index, html.escape(name))
self.mru_ui = [MRU_TOP + menus + MRU_BTM]
mitems = items[-MRU_SIZE - 1:-1] # Ignore current handle mitems = items[-MRU_SIZE - 1:-1] # Ignore current handle
mitems.reverse() mitems.reverse()
data = [] data = []
for index, handle in enumerate(mitems): for index, handle in enumerate(mitems):
name, obj = navigation_label(self.dbstate.db, nav_type, handle) data.append(('%s%02d'%(nav_type, index),
data.append(('%s%02d'%(nav_type, index), None, name, make_callback(hobj.push, handle),
"%s%d" % (mod_key(), index), None, "%s%d" % (mod_key(), index)))
make_callback(hobj.push, handle)))
self.mru_action = ActionGroup(name=self.title + '/MRU') self.mru_action = ActionGroup(name=self.title + '/MRU')
self.mru_action.add_actions(data) self.mru_action.add_actions(data)
self.mru_enable() self.mru_enable(update_menu)
#################################################################### ####################################################################
# Template functions # Template functions
@ -503,4 +498,4 @@ def make_callback(func, handle):
""" """
Generates a callback function based off the passed arguments Generates a callback function based off the passed arguments
""" """
return lambda x: func(handle) return lambda x, y: func(handle)

View File

@ -51,7 +51,7 @@ from ..dbguielement import DbGUIElement
from ..widgets.grampletbar import GrampletBar from ..widgets.grampletbar import GrampletBar
from ..configure import ConfigureDialog from ..configure import ConfigureDialog
from gramps.gen.config import config from gramps.gen.config import config
from ..actiongroup import ActionGroup from ..uimanager import ActionGroup
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
@ -97,25 +97,24 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
self.uistate = uistate self.uistate = uistate
self.action_list = [] self.action_list = []
self.action_toggle_list = [] self.action_toggle_list = []
self.action_toolmenu_list = []
self.action_toolmenu = {} #easy access to toolmenuaction and proxies
self.action_group = None self.action_group = None
self.additional_action_groups = [] self.additional_action_groups = []
self.additional_uis = [] self.additional_uis = []
self.ui_def = '''<ui> self.ui_def = ['''
<menubar name="MenuBar"> <placeholder id="Bars">
<menu action="ViewMenu"> <item>
<placeholder name="Bars"> <attribute name="action">win.Sidebar</attribute>
<menuitem action="Sidebar"/> <attribute name="label" translatable="yes">_Sidebar</attribute>
<menuitem action="Bottombar"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.Bottombar</attribute>
</menubar> <attribute name="label" translatable="yes">_Bottombar</attribute>
</ui>''' </item>
</placeholder>
''']
self.dirty = True self.dirty = True
self.active = False self.active = False
self._dirty_on_change_inactive = True self._dirty_on_change_inactive = True
self.func_list = {}
if isinstance(self.pdata.category, tuple): if isinstance(self.pdata.category, tuple):
self.category, self.translated_category = self.pdata.category self.category, self.translated_category = self.pdata.category
@ -201,24 +200,24 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
""" """
self._config.set(setting, widget.get_position()) self._config.set(setting, widget.get_position())
def __sidebar_toggled(self, action): def __sidebar_toggled(self, action, value):
""" """
Called when the sidebar is toggled. Called when the sidebar is toggled.
""" """
active = action.get_active() action.set_state(value) # change GUI
if active: if value.get_boolean():
self.sidebar.show() self.sidebar.show()
self.sidebar_toggled(True) self.sidebar_toggled(True)
else: else:
self.sidebar.hide() self.sidebar.hide()
self.sidebar_toggled(False) self.sidebar_toggled(False)
def __bottombar_toggled(self, action): def __bottombar_toggled(self, action, value):
""" """
Called when the bottombar is toggled. Called when the bottombar is toggled.
""" """
active = action.get_active() action.set_state(value) # change GUI
if active: if value.get_boolean():
self.bottombar.show() self.bottombar.show()
else: else:
self.bottombar.hide() self.bottombar.hide()
@ -312,12 +311,6 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
return True return True
return False return False
def call_function(self, key):
"""
Calls the function associated with the key value
"""
self.func_list.get(key)()
def post(self): def post(self):
""" """
Called after a page is created. Called after a page is created.
@ -373,14 +366,15 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
Turns off the visibility of the View's action group, if defined Turns off the visibility of the View's action group, if defined
""" """
if self.action_group: if self.action_group:
self.action_group.set_visible(False) self.uistate.uimanager.set_actions_visible(self.action_group,
False)
def enable_action_group(self, obj): def enable_action_group(self, obj):
""" """
Turns on the visibility of the View's action group, if defined Turns on the visibility of the View's action group, if defined
""" """
if self.action_group: if self.action_group:
self.action_group.set_visible(True) self.uistate.uimanager.set_actions_visible(self.action_group, True)
def get_stock(self): def get_stock(self):
""" """
@ -438,11 +432,9 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
View. The user typically defines self.action_list and View. The user typically defines self.action_list and
self.action_toggle_list in this function. self.action_toggle_list in this function.
""" """
self._add_toggle_action('Sidebar', None, _('_Sidebar'), self._add_toggle_action('Sidebar', self.__sidebar_toggled, '',
"<shift><PRIMARY>R", None, self.__sidebar_toggled,
self.sidebar.get_property('visible')) self.sidebar.get_property('visible'))
self._add_toggle_action('Bottombar', None, _('_Bottombar'), self._add_toggle_action('Bottombar', self.__bottombar_toggled, '',
"<shift><PRIMARY>B", None, self.__bottombar_toggled,
self.bottombar.get_property('visible')) self.bottombar.get_property('visible'))
def __build_action_group(self): def __build_action_group(self):
@ -455,31 +447,19 @@ class PageView(DbGUIElement, metaclass=ABCMeta):
if len(self.action_list) > 0: if len(self.action_list) > 0:
self.action_group.add_actions(self.action_list) self.action_group.add_actions(self.action_list)
if len(self.action_toggle_list) > 0: if len(self.action_toggle_list) > 0:
self.action_group.add_toggle_actions(self.action_toggle_list) self.action_group.add_actions(self.action_toggle_list)
def _add_action(self, name, icon_name, label, accel=None, tip=None, def _add_action(self, name, callback=None, accel=None):
callback=None):
""" """
Add an action to the action list for the current view. Add an action to the action list for the current view.
""" """
self.action_list.append((name, icon_name, label, accel, tip, self.action_list.append((name, callback, accel))
callback))
def _add_toggle_action(self, name, icon_name, label, accel=None, def _add_toggle_action(self, name, callback=None, accel= None, value=False):
tip=None, callback=None, value=False):
""" """
Add a toggle action to the action list for the current view. Add a toggle action to the action list for the current view.
""" """
self.action_toggle_list.append((name, icon_name, label, accel, self.action_toggle_list.append((name, callback, accel, value))
tip, callback, value))
def _add_toolmenu_action(self, name, label, tooltip, callback,
arrowtooltip):
"""
Add a menu action to the action list for the current view.
"""
self.action_toolmenu_list.append((name, label, tooltip, callback,
arrowtooltip))
def get_actions(self): def get_actions(self):
""" """

View File

@ -50,7 +50,7 @@ from gramps.gen.const import URL_MANUAL_PAGE
from ..display import display_help from ..display import display_help
from ..dialog import ErrorDialog, QuestionDialog2 from ..dialog import ErrorDialog, QuestionDialog2
import gramps.gui.widgets.progressdialog as progressdlg import gramps.gui.widgets.progressdialog as progressdlg
from ..actiongroup import ActionGroup from ..uimanager import ActionGroup
from ..managedwindow import ManagedWindow from ..managedwindow import ManagedWindow
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -58,29 +58,54 @@ from ..managedwindow import ManagedWindow
# Constants # Constants
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
TAG_1 = '''<ui> TAG_1 = '''
<menubar name="MenuBar"> <section id='TagMenu' groups='RW'>
<menu action="EditMenu"> <submenu>
<placeholder name="TagMenu"> <attribute name="label" translatable="yes">Tag</attribute>
<menu action="Tag"> %s
''' </submenu>
</section>
'''
TAG_2 = ''' TAG_2 = (
</menu> ''' <placeholder id='TagTool' groups='RW'>
</placeholder> <child groups='RO'>
</menu> <object class="GtkToolButton" id="TagButton">
</menubar> <property name="icon-name">gramps-tag</property>
<toolbar name="ToolBar"> <property name="action-name">win.TagButton</property>
<placeholder name="TagTool"> <property name="tooltip_text" translatable="yes">'''
<toolitem action="TagButton"/> '''Tag selected rows</property>
<property name="label" translatable="yes">Tag</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder> </placeholder>
</toolbar> ''')
<popup name="TagPopup">
'''
TAG_3 = ''' TAG_3 = '''
</popup> <menu id='TagPopup' groups='RW'>
</ui>''' %s
</menu>'''
TAG_MENU = (
'''<section>
<item>
<attribute name="action">win.NewTag</attribute>
<attribute name="label" translatable="yes">'''
'''New Tag...</attribute>
</item>
<item>
<attribute name="action">win.OrganizeTags</attribute>
<attribute name="label" translatable="yes">'''
'''Organize Tags...</attribute>
</item>
</section>
<section>
%s
</section>
''')
WIKI_HELP_PAGE = '%s_-_Filters' % \ WIKI_HELP_PAGE = '%s_-_Filters' % \
URL_MANUAL_PAGE URL_MANUAL_PAGE
@ -119,13 +144,14 @@ class Tags(DbGUIElement):
self._build_tag_menu() self._build_tag_menu()
def tag_enable(self): def tag_enable(self, update_menu=True):
""" """
Enables the UI and action groups for the tag menu. Enables the UI and action groups for the tag menu.
""" """
self.uistate.uimanager.insert_action_group(self.tag_action, 1) self.uistate.uimanager.insert_action_group(self.tag_action)
self.tag_id = self.uistate.uimanager.add_ui_from_string(self.tag_ui) self.tag_id = self.uistate.uimanager.add_ui_from_string(self.tag_ui)
self.uistate.uimanager.ensure_update() if update_menu:
self.uistate.uimanager.update_menu()
def tag_disable(self): def tag_disable(self):
""" """
@ -134,7 +160,6 @@ class Tags(DbGUIElement):
if self.tag_id is not None: if self.tag_id is not None:
self.uistate.uimanager.remove_ui(self.tag_id) self.uistate.uimanager.remove_ui(self.tag_id)
self.uistate.uimanager.remove_action_group(self.tag_action) self.uistate.uimanager.remove_action_group(self.tag_action)
self.uistate.uimanager.ensure_update()
self.tag_id = None self.tag_id = None
def _db_changed(self, db): def _db_changed(self, db):
@ -209,46 +234,55 @@ class Tags(DbGUIElement):
actions = [] actions = []
if not self.dbstate.is_open(): if not self.dbstate.is_open():
self.tag_ui = '' self.tag_ui = ['']
self.tag_action = ActionGroup(name='Tag') self.tag_action = ActionGroup(name='Tag')
return return
tag_menu = '<menuitem action="NewTag"/>' tag_menu = ''
tag_menu += '<menuitem action="OrganizeTags"/>' menuitem = '''
tag_menu += '<separator/>' <item>
<attribute name="action">win.TAG_%s</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>'''
for tag_name, handle in self.__tag_list: for tag_name, handle in self.__tag_list:
tag_menu += '<menuitem action="TAG_%s"/>' % handle tag_menu += menuitem % (handle, tag_name)
actions.append(('TAG_%s' % handle, None, tag_name, None, None, actions.append(('TAG_%s' % handle,
make_callback(self.tag_selected_rows, handle))) make_callback(self.tag_selected_rows, handle)))
tag_menu = TAG_MENU % tag_menu
self.tag_ui = TAG_1 + tag_menu + TAG_2 + tag_menu + TAG_3 self.tag_ui = [TAG_1 % tag_menu, TAG_2, TAG_3 % tag_menu]
actions.append(('Tag', 'gramps-tag', _('Tag'), None, None, None)) actions.append(('NewTag', self.cb_new_tag))
actions.append(('NewTag', 'gramps-tag-new', _('New Tag...'), None, None, actions.append(('OrganizeTags', self.cb_organize_tags))
self.cb_new_tag)) actions.append(('TagButton', self.cb_tag_button))
actions.append(('OrganizeTags', None, _('Organize Tags...'), None, None,
self.cb_organize_tags))
actions.append(('TagButton', 'gramps-tag', _('Tag'), None,
_('Tag selected rows'), self.cb_tag_button))
self.tag_action = ActionGroup(name='Tag') self.tag_action = ActionGroup(name='Tag')
self.tag_action.add_actions(actions) self.tag_action.add_actions(actions)
def cb_tag_button(self, action): def cb_tag_button(self, *args):
""" """
Display the popup menu when the toolbar button is clicked. Display the popup menu when the toolbar button is clicked.
""" """
menu = self.uistate.uimanager.get_widget('/TagPopup') menu = self.uistate.uimanager.get_widget('TagPopup')
button = self.uistate.uimanager.get_widget('/ToolBar/TagTool/TagButton') button = self.uistate.uimanager.get_widget('TagButton')
menu.popup(None, None, cb_menu_position, button, 0, 0) popup_menu = Gtk.Menu.new_from_model(menu)
popup_menu.attach_to_widget(button, None)
popup_menu.show_all()
if Gtk.MINOR_VERSION < 22:
# ToDo The following is reported to work poorly with Wayland
popup_menu.popup(None, None, cb_menu_position, button, 0, 0)
else:
popup_menu.popup_at_widget(button, Gdk.Gravity.SOUTH,
Gdk.Gravity.NORTH_WEST, None)
def cb_organize_tags(self, action): def cb_organize_tags(self, *action):
""" """
Display the Organize Tags dialog. Display the Organize Tags dialog.
""" """
OrganizeTagsDialog(self.db, self.uistate, []) OrganizeTagsDialog(self.db, self.uistate, [])
def cb_new_tag(self, action): def cb_new_tag(self, *action):
""" """
Create a new tag and tag the selected objects. Create a new tag and tag the selected objects.
""" """
@ -304,7 +338,7 @@ def make_callback(func, tag_handle):
""" """
Generates a callback function based off the passed arguments Generates a callback function based off the passed arguments
""" """
return lambda x: func(tag_handle) return lambda x, y: func(tag_handle)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #

View File

@ -34,16 +34,12 @@ from .monitoredwidgets import *
from .selectionwidget import SelectionWidget, Region from .selectionwidget import SelectionWidget, Region
from .shadebox import * from .shadebox import *
from .shortlistcomboentry import * from .shortlistcomboentry import *
from .springseparator import *
from .statusbar import Statusbar from .statusbar import Statusbar
from .styledtextbuffer import * from .styledtextbuffer import *
from .styledtexteditor import * from .styledtexteditor import *
from .toolcomboentry import *
from .undoablebuffer import * from .undoablebuffer import *
from .undoableentry import * from .undoableentry import *
from .undoablestyledbuffer import * from .undoablestyledbuffer import *
from .validatedcomboentry import * from .validatedcomboentry import *
from .validatedmaskedentry import * from .validatedmaskedentry import *
from .valueaction import *
from .valuetoolitem import *
from .placewithin import * from .placewithin import *

View File

@ -49,7 +49,7 @@ from gramps.gen.const import URL_MANUAL_PAGE, VERSION_DIR, COLON
from ..editors import EditPerson, EditFamily from ..editors import EditPerson, EditFamily
from ..managedwindow import ManagedWindow from ..managedwindow import ManagedWindow
from ..utils import is_right_click, match_primary_mask, get_link_color from ..utils import is_right_click, match_primary_mask, get_link_color
from .menuitem import add_menuitem from ..uimanager import ActionGroup
from ..plug import make_gui_option from ..plug import make_gui_option
from ..plug.quick import run_quick_report_by_name from ..plug.quick import run_quick_report_by_name
from ..display import display_help, display_url from ..display import display_help, display_url
@ -189,6 +189,13 @@ def logical_true(value):
""" """
return value in ["True", True, 1, "1"] return value in ["True", True, 1, "1"]
def make_callback(func, arg):
"""
Generates a callback function based off the passed arguments
"""
return lambda x, y: func(arg)
class LinkTag(Gtk.TextTag): class LinkTag(Gtk.TextTag):
""" """
Class for keeping track of link data. Class for keeping track of link data.
@ -999,6 +1006,8 @@ class GrampletPane(Gtk.ScrolledWindow):
self.pageview = pageview self.pageview = pageview
self.pane = self self.pane = self
self._popup_xy = None self._popup_xy = None
self.at_popup_action = None
self.at_popup_menu = None
user_gramplets = self.load_gramplets() user_gramplets = self.load_gramplets()
# build the GUI: # build the GUI:
msg = _("Right click to add gramplets") msg = _("Right click to add gramplets")
@ -1349,8 +1358,7 @@ class GrampletPane(Gtk.ScrolledWindow):
self.place_gramplets(recolumn=True) self.place_gramplets(recolumn=True)
self.show() self.show()
def restore_gramplet(self, obj): def restore_gramplet(self, name):
name = obj.get_child().get_label()
############### First kind: from current session ############### First kind: from current session
for gramplet in self.closed_gramplets: for gramplet in self.closed_gramplets:
if gramplet.title == name: if gramplet.title == name:
@ -1392,8 +1400,7 @@ class GrampletPane(Gtk.ScrolledWindow):
else: else:
self.drop_widget(self, gramplet, 0, 0, 0) self.drop_widget(self, gramplet, 0, 0, 0)
def add_gramplet(self, obj): def add_gramplet(self, tname):
tname = obj.get_child().get_label()
all_opts = get_gramplet_options_by_tname(tname) all_opts = get_gramplet_options_by_tname(tname)
name = all_opts["name"] name = all_opts["name"]
if all_opts is None: if all_opts is None:
@ -1437,39 +1444,73 @@ class GrampletPane(Gtk.ScrolledWindow):
LOG.warning("Can't make gramplet of type '%s'.", name) LOG.warning("Can't make gramplet of type '%s'.", name)
def _button_press(self, obj, event): def _button_press(self, obj, event):
ui_def = (
''' <menu id="Popup">
<submenu>
<attribute name="action">win.AddGramplet</attribute>
<attribute name="label" translatable="yes">Add a gramplet</attribute>
%s
</submenu>
<submenu>
<attribute name="action">win.RestoreGramplet</attribute>
<attribute name="label" translatable="yes">'''
'''Restore a gramplet</attribute>
%s
</submenu>
</menu>
''')
menuitem = ('<item>\n'
'<attribute name="action">win.%s</attribute>\n'
'<attribute name="label" translatable="yes">'
'%s</attribute>\n'
'</item>\n')
if is_right_click(event): if is_right_click(event):
self._popup_xy = (event.x, event.y) self._popup_xy = (event.x, event.y)
uiman = self.uistate.uimanager uiman = self.uistate.uimanager
ag_menu = uiman.get_widget('/GrampletPopup/AddGramplet') actions = []
if ag_menu: r_menuitems = ''
qr_menu = ag_menu.get_submenu() a_menuitems = ''
qr_menu = Gtk.Menu() names = [gplug.name for gplug in PLUGMAN.get_reg_gramplets()
names = [gplug.name for gplug in PLUGMAN.get_reg_gramplets() if gplug.navtypes == []
if gplug.navtypes == [] or 'Dashboard' in gplug.navtypes]
or 'Dashboard' in gplug.navtypes] names.sort()
names.sort() for name in names:
action_name = name.replace(' ', '-')
a_menuitems += menuitem % (action_name, name)
actions.append((action_name,
make_callback(self.add_gramplet, name)))
names = [gramplet.title for gramplet in self.closed_gramplets]
names.extend(opts["title"] for opts in self.closed_opts)
names.sort()
if len(names) > 0:
for name in names: for name in names:
add_menuitem(qr_menu, name, None, action_name = name.replace(' ', '-')
self.add_gramplet) r_menuitems += menuitem % (action_name, name)
ag_menu.set_submenu(qr_menu) actions.append((action_name,
rg_menu = uiman.get_widget('/GrampletPopup/RestoreGramplet') make_callback(self.restore_gramplet,
if rg_menu: name)))
qr_menu = rg_menu.get_submenu()
if qr_menu is not None: if self.at_popup_action:
rg_menu.set_submenu(None) uiman.remove_ui(self.at_popup_menu)
names = [gramplet.title for gramplet in self.closed_gramplets] uiman.remove_action_group(self.at_popup_action)
names.extend(opts["title"] for opts in self.closed_opts) self.at_popup_action = ActionGroup('AtPopupActions',
names.sort() actions)
if len(names) > 0: uiman.insert_action_group(self.at_popup_action)
qr_menu = Gtk.Menu() self.at_popup_menu = uiman.add_ui_from_string([
for name in names: ui_def % (a_menuitems, r_menuitems)])
add_menuitem(qr_menu, name, None, uiman.update_menu()
self.restore_gramplet)
rg_menu.set_submenu(qr_menu) menu = uiman.get_widget('Popup')
self.menu = uiman.get_widget('/GrampletPopup') popup_menu = Gtk.Menu.new_from_model(menu)
if self.menu: popup_menu.attach_to_widget(obj, None)
#GTK3 does not show the popup, workaround: menu as attribute popup_menu.show_all()
self.menu.popup(None, None, None, None, event.button, event.time) if Gtk.MINOR_VERSION < 22:
# ToDo The following is reported to work poorly with Wayland
popup_menu.popup(None, None, None, None,
event.button, event.time)
else:
popup_menu.popup_at_pointer(event)
return True return True
return False return False

View File

@ -70,7 +70,10 @@ class ShortlistComboEntry(ValidatedComboEntry):
""" """
__gtype_name__ = "ShortlistComboEntry" __gtype_name__ = "ShortlistComboEntry"
def __init__(self, items, shortlist=True, validator=None): def __init__(self):
pass
def init(self, items, shortlist=True, validator=None):
if not items: if not items:
raise ValueError raise ValueError

View File

@ -1,76 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2008 Zsolt Foldvari
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"Separator classes used for Toolbar."
__all__ = ["SpringSeparatorAction", "SpringSeparatorToolItem"]
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
import logging
_LOG = logging.getLogger(".widgets.springseparator")
#-------------------------------------------------------------------------
#
# GTK modules
#
#-------------------------------------------------------------------------
from gi.repository import Gtk
#-------------------------------------------------------------------------
#
# SpringSeparatorToolItem class
#
#-------------------------------------------------------------------------
class SpringSeparatorToolItem(Gtk.SeparatorToolItem):
"""Custom separator toolitem.
Its only purpose is to push following tool items to the right end
of the toolbar.
"""
__gtype_name__ = "SpringSeparatorToolItem"
def __init__(self):
Gtk.SeparatorToolItem.__init__(self)
self.set_draw(False)
self.set_expand(True)
#-------------------------------------------------------------------------
#
# SpringSeparatorAction class
#
#-------------------------------------------------------------------------
class SpringSeparatorAction(Gtk.Action):
"""Custom Action to hold a SpringSeparatorToolItem."""
__gtype_name__ = "SpringSeparatorAction"
def __init__(self, name, label, tooltip, stock_id):
Gtk.Action.__init__(self, name=name, label=label,
tooltip=tooltip, stock_id=stock_id)
## TODO GTK3, How to connect these? Used in styledtexteditor
##SpringSeparatorToolItem.set_related_action(SpringSeparatorAction)
##deprecated: SpringSeparatorAction.set_tool_item_type(SpringSeparatorToolItem)

View File

@ -43,6 +43,8 @@ from gi.repository import GObject
from gi.repository import Gdk from gi.repository import Gdk
from gi.repository import Gtk from gi.repository import Gtk
from gi.repository import Pango from gi.repository import Pango
from gi.repository.Gio import SimpleActionGroup
from gi.repository.GLib import Variant
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -55,15 +57,12 @@ from .styledtextbuffer import (ALLOWED_STYLES,
MATCH_FLAVOR, MATCH_STRING, MATCH_FLAVOR, MATCH_STRING,
LinkTag) LinkTag)
from .undoablestyledbuffer import UndoableStyledBuffer from .undoablestyledbuffer import UndoableStyledBuffer
from .valueaction import ValueAction
from .toolcomboentry import ToolComboEntry
from .springseparator import SpringSeparatorAction
from ..spell import Spell from ..spell import Spell
from ..display import display_url from ..display import display_url
from ..utils import SystemFonts, match_primary_mask, get_link_color from ..utils import SystemFonts, match_primary_mask, get_link_color
from gramps.gen.config import config from gramps.gen.config import config
from gramps.gen.constfunc import has_display, mac from gramps.gen.constfunc import has_display, mac
from ..actiongroup import ActionGroup from ..uimanager import ActionGroup
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -75,33 +74,141 @@ if has_display():
HAND_CURSOR = Gdk.Cursor.new_for_display(display, Gdk.CursorType.HAND2) HAND_CURSOR = Gdk.Cursor.new_for_display(display, Gdk.CursorType.HAND2)
REGULAR_CURSOR = Gdk.Cursor.new_for_display(display, Gdk.CursorType.XTERM) REGULAR_CURSOR = Gdk.Cursor.new_for_display(display, Gdk.CursorType.XTERM)
FORMAT_TOOLBAR = ''' FORMAT_TOOLBAR = (
<ui> '''<?xml version="1.0" encoding="UTF-8"?>
<toolbar name="ToolBar"> <interface>
<toolitem action="%d"/> <object class="GtkToolbar" id="ToolBar">
<toolitem action="%d"/> <property name="hexpand">True</property>
<toolitem action="%d"/> <property name="toolbar-style">GTK_TOOLBAR_ICONS</property>
<toolitem action="%d"/> <style>
<toolitem action="%d"/> <class name="primary-toolbar"/>
<toolitem action="Undo"/> </style>
<toolitem action="Redo"/> <child>
<toolitem action="%d"/> <object class="GtkToggleToolButton">
<toolitem action="%d"/> <property name="icon-name">format-text-italic</property>
<toolitem action="%d"/> <property name="action-name">ste.ITALIC</property>
<toolitem action="spring"/> <property name="tooltip_text" translatable="yes">Italic</property>
<toolitem action="clear"/> </object>
</toolbar> <packing>
</ui> <property name="homogeneous">False</property>
''' % (StyledTextTagType.ITALIC, </packing>
StyledTextTagType.BOLD, </child>
StyledTextTagType.UNDERLINE, <child>
StyledTextTagType.FONTFACE, <object class="GtkToggleToolButton">
StyledTextTagType.FONTSIZE, <property name="icon-name">format-text-bold</property>
StyledTextTagType.FONTCOLOR, <property name="action-name">ste.BOLD</property>
StyledTextTagType.HIGHLIGHT, <property name="tooltip_text" translatable="yes">Bold</property>
StyledTextTagType.LINK, </object>
) <packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToggleToolButton">
<property name="icon-name">format-text-underline</property>
<property name="action-name">ste.UNDERLINE</property>
<property name="tooltip_text" translatable="yes">Underline</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<property name="tooltip_text" translatable="yes">Font family</property>
<child>
<object class="ShortlistComboEntry" id="Fontface"></object>
</child>
</object>
</child>
<child>
<object class="GtkToolItem">
<property name="tooltip_text" translatable="yes">Font size</property>
<child>
<object class="ShortlistComboEntry" id="Fontsize"></object>
</child>
</object>
</child>
<child>
<object class="GtkToolButton">
<property name="icon-name">edit-undo</property>
<property name="action-name">ste.STUndo</property>
<property name="tooltip_text" translatable="yes">Undo</property>
<property name="label" translatable="yes">Undo</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolButton">
<property name="icon-name">edit-redo</property>
<property name="action-name">ste.STRedo</property>
<property name="tooltip_text" translatable="yes">Redo</property>
<property name="label" translatable="yes">Redo</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolButton">
<property name="icon-name">gramps-font-color</property>
<property name="action-name">ste.FONTCOLOR</property>
<property name="tooltip_text" translatable="yes">Font Color</property>
<property name="label" translatable="yes">Font Color</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolButton">
<property name="icon-name">gramps-font-bgcolor</property>
<property name="action-name">ste.HIGHLIGHT</property>
<property name="tooltip_text" translatable="yes">'''
'''Background Color</property>
<property name="label" translatable="yes">Background Color</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolButton">
<property name="icon-name">go-jump</property>
<property name="action-name">ste.LINK</property>
<property name="tooltip_text" translatable="yes">Link</property>
<property name="label" translatable="yes">Link</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkSeparatorToolItem">
<property name="draw">False</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="expand">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton">
<property name="icon-name">edit-clear</property>
<property name="action-name">ste.CLEAR</property>
<property name="tooltip_text" translatable="yes">'''
'''Clear Markup</property>
<property name="label" translatable="yes">Clear Markup</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</object>
</interface>
''')
FONT_SIZES = [8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, FONT_SIZES = [8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22,
24, 26, 28, 32, 36, 40, 48, 56, 64, 72] 24, 26, 28, 32, 36, 40, 48, 56, 64, 72]
@ -182,6 +289,7 @@ class StyledTextEditor(Gtk.TextView):
self.undo_disabled = self.textbuffer.undo_disabled # see bug 7097 self.undo_disabled = self.textbuffer.undo_disabled # see bug 7097
self.textbuffer.connect('style-changed', self._on_buffer_style_changed) self.textbuffer.connect('style-changed', self._on_buffer_style_changed)
self.textbuffer.connect('changed', self._on_buffer_changed) self.textbuffer.connect('changed', self._on_buffer_changed)
self.undo_action = self.redo_action = None
Gtk.TextView.__init__(self) Gtk.TextView.__init__(self)
self.set_buffer(self.textbuffer) self.set_buffer(self.textbuffer)
@ -194,9 +302,9 @@ class StyledTextEditor(Gtk.TextView):
self._init_url_match() self._init_url_match()
self.url_match = None self.url_match = None
self.toolbar = self._create_toolbar()
self.spellcheck = Spell(self) self.spellcheck = Spell(self)
self._internal_style_change = False self._internal_style_change = False
self.uimanager = None
self._connect_signals() self._connect_signals()
@ -236,30 +344,6 @@ class StyledTextEditor(Gtk.TextView):
window.set_cursor(REGULAR_CURSOR) window.set_cursor(REGULAR_CURSOR)
self.url_match = None self.url_match = None
def on_key_press_event(self, widget, event):
"""Signal handler.
Handle formatting shortcuts.
"""
if ((Gdk.keyval_name(event.keyval) == 'Z') and
match_primary_mask(event.get_state(), Gdk.ModifierType.SHIFT_MASK)):
self.redo()
return True
elif ((Gdk.keyval_name(event.keyval) == 'z') and
match_primary_mask(event.get_state())):
self.undo()
return True
else:
for accel, accel_name in self.action_accels.items():
key, mod = Gtk.accelerator_parse(accel)
if ((event.keyval == key) and (event.get_state() & mod)):
action_name = accel_name
action = self.action_group.get_action(action_name)
action.activate()
return True
return False
def on_insert_at_cursor(self, widget, string): def on_insert_at_cursor(self, widget, string):
"""Signal handler. for debugging only.""" """Signal handler. for debugging only."""
_LOG.debug("Textview insert '%s'" % string) _LOG.debug("Textview insert '%s'" % string)
@ -423,14 +507,13 @@ class StyledTextEditor(Gtk.TextView):
Reset the undoable buffer Reset the undoable buffer
""" """
self.textbuffer.reset() self.textbuffer.reset()
self.undo_action.set_sensitive(False) self.undo_action.set_enabled(False)
self.redo_action.set_sensitive(False) self.redo_action.set_enabled(False)
# private methods # private methods
def _connect_signals(self): def _connect_signals(self):
"""Connect to several signals of the super class Gtk.TextView.""" """Connect to several signals of the super class Gtk.TextView."""
self.connect('key-press-event', self.on_key_press_event)
self.connect('insert-at-cursor', self.on_insert_at_cursor) self.connect('insert-at-cursor', self.on_insert_at_cursor)
self.connect('delete-from-cursor', self.on_delete_from_cursor) self.connect('delete-from-cursor', self.on_delete_from_cursor)
self.connect('paste-clipboard', self.on_paste_clipboard) self.connect('paste-clipboard', self.on_paste_clipboard)
@ -439,104 +522,74 @@ class StyledTextEditor(Gtk.TextView):
self.connect('button-release-event', self.on_button_release_event) self.connect('button-release-event', self.on_button_release_event)
self.connect('populate-popup', self.on_populate_popup) self.connect('populate-popup', self.on_populate_popup)
def _create_toolbar(self): def create_toolbar(self, uimanager, window):
""" """
Create a formatting toolbar. Create a formatting toolbar.
:returns: toolbar containing text formatting toolitems. :returns: toolbar containing text formatting toolitems.
:rtype: Gtk.Toolbar :rtype: Gtk.Toolbar
""" """
self.uimanager = uimanager
# build the toolbar
builder = Gtk.Builder.new_from_string(FORMAT_TOOLBAR, -1)
# define the actions... # define the actions...
# ...first the toggle actions, which have a ToggleToolButton as proxy _actions = [
format_toggle_actions = [ ('ITALIC', self._on_toggle_action_activate, '<PRIMARY>i', False),
(str(StyledTextTagType.ITALIC), 'format-text-italic', None, None, ('BOLD', self._on_toggle_action_activate, '<PRIMARY>b', False),
_('Italic'), self._on_toggle_action_activate), ('UNDERLINE', self._on_toggle_action_activate, '<PRIMARY>u',
(str(StyledTextTagType.BOLD), 'format-text-bold', None, None, False),
_('Bold'), self._on_toggle_action_activate), ('FONTCOLOR', self._on_action_activate),
(str(StyledTextTagType.UNDERLINE), 'format-text-underline', None, ('HIGHLIGHT', self._on_action_activate),
None, _('Underline'), self._on_toggle_action_activate), ('LINK', self._on_link_activate),
('CLEAR', self._format_clear_cb),
('STUndo', self.undo, '<primary>z'),
('STRedo', self.redo, '<primary><shift>z'),
] ]
self.toggle_actions = [action[0] for action in format_toggle_actions] # the following are done manually rather than using actions
# ...then the normal actions, which have a ToolButton as proxy
format_actions = [
(str(StyledTextTagType.FONTCOLOR), 'gramps-font-color',
_('Font Color'), None, _('Font Color'), self._on_action_activate),
(str(StyledTextTagType.HIGHLIGHT), 'gramps-font-bgcolor',
_('Background Color'), None, _('Background Color'),
self._on_action_activate),
(str(StyledTextTagType.LINK), 'go-jump', _('Link'), None,
_('Link'), self._on_link_activate),
('clear', 'edit-clear', _('Clear Markup'), None,
_('Clear Markup'), self._format_clear_cb),
]
# ...last the custom actions, which have custom proxies
default = StyledTextTagType.STYLE_DEFAULT[StyledTextTagType.FONTFACE]
fonts = SystemFonts() fonts = SystemFonts()
fontface_action = ValueAction(str(StyledTextTagType.FONTFACE), fontface = builder.get_object('Fontface')
_("Font family"), fontface.init(fonts.get_system_fonts(), shortlist=True, validator=None)
default, fontface.set_entry_editable(False)
ToolComboEntry, fontface.connect('changed', make_cb(
fonts.get_system_fonts(), self._on_valueaction_changed, StyledTextTagType.FONTFACE))
False, #editable # set initial value
True, #shortlist default = StyledTextTagType.STYLE_DEFAULT[StyledTextTagType.FONTFACE]
None) # validator self.fontface = fontface.get_child()
fontface_action.connect('changed', self._on_valueaction_changed) self.fontface.set_text(str(default))
fontface.show()
items = FONT_SIZES items = FONT_SIZES
fontsize = builder.get_object('Fontsize')
fontsize.init(items, shortlist=False, validator=is_valid_fontsize)
fontsize.set_entry_editable(True)
fontsize.connect('changed', make_cb(
self._on_valueaction_changed, StyledTextTagType.FONTSIZE))
# set initial value
default = StyledTextTagType.STYLE_DEFAULT[StyledTextTagType.FONTSIZE] default = StyledTextTagType.STYLE_DEFAULT[StyledTextTagType.FONTSIZE]
fontsize_action = ValueAction(str(StyledTextTagType.FONTSIZE), self.fontsize = fontsize.get_child()
_("Font size"), self.fontsize.set_text(str(default))
default, fontsize.show()
ToolComboEntry,
items,
True, #editable
False, #shortlist
is_valid_fontsize) #validator
fontsize_action.connect('changed', self._on_valueaction_changed)
spring = SpringSeparatorAction("spring", "", "", None)
# action accelerators
self.action_accels = {
'<PRIMARY>i': str(StyledTextTagType.ITALIC),
'<PRIMARY>b': str(StyledTextTagType.BOLD),
'<PRIMARY>u': str(StyledTextTagType.UNDERLINE),
}
# create the action group and insert all the actions # create the action group and insert all the actions
self.action_group = ActionGroup(name='Format') self.action_group = ActionGroup('Format', _actions, 'ste')
self.action_group.add_toggle_actions(format_toggle_actions) act_grp = SimpleActionGroup()
self.undo_action = Gtk.Action(name="Undo", label=_('Undo'), window.insert_action_group('ste', act_grp)
tooltip=_('Undo')) window.set_application(uimanager.app)
self.undo_action.set_icon_name('edit-undo') uimanager.insert_action_group(self.action_group, act_grp)
self.undo_action.connect('activate', self.undo)
self.redo_action = Gtk.Action.new(name="Redo", label=_('Redo'),
tooltip=_('Redo'))
self.redo_action.set_icon_name('edit-redo')
self.redo_action.connect('activate', self.redo)
self.action_group.add_action(self.undo_action)
self.action_group.add_action(self.redo_action)
self.action_group.add_actions(format_actions)
self.action_group.add_action(fontface_action)
self.action_group.add_action(fontsize_action)
self.action_group.add_action(spring)
# define the toolbar and create the proxies via ensure_update() self.undo_action = uimanager.get_action(self.action_group, "STUndo")
uimanager = Gtk.UIManager() self.redo_action = uimanager.get_action(self.action_group, "STRedo")
uimanager.insert_action_group(self.action_group, 0) # allow undo/redo to see actions if editable.
uimanager.add_ui_from_string(FORMAT_TOOLBAR) self.textbuffer.connect('changed', self._on_buffer_changed)
uimanager.ensure_update() # undo/redo are initially greyed out, until something is changed
self.undo_action.set_enabled(False)
self.redo_action.set_enabled(False)
# get the toolbar and set it's style # get the toolbar and set it's style
toolbar = uimanager.get_widget('/ToolBar') toolbar = builder.get_object('ToolBar')
toolbar.set_style(Gtk.ToolbarStyle.ICONS)
self.undo_action.set_sensitive(False)
self.redo_action.set_sensitive(False)
return toolbar return toolbar, self.action_group
def set_transient_parent(self, parent=None): def set_transient_parent(self, parent=None):
self.transient_parent = parent self.transient_parent = parent
@ -582,21 +635,22 @@ class StyledTextEditor(Gtk.TextView):
# Callback functions # Callback functions
def _on_toggle_action_activate(self, action): def _on_toggle_action_activate(self, action, value):
""" """
Toggle a style. Toggle a style.
Toggle styles are e.g. 'bold', 'italic', 'underline'. Toggle styles are e.g. 'bold', 'italic', 'underline'.
""" """
action.set_state(value)
if self._internal_style_change: if self._internal_style_change:
return return
style = int(action.get_name()) style = action.get_name()
value = action.get_active() value = value.get_boolean()
_LOG.debug("applying style '%d' with value '%s'" % (style, str(value))) _LOG.debug("applying style '%s' with value '%s'" % (style, str(value)))
self.textbuffer.apply_style(style, value) self.textbuffer.apply_style(getattr(StyledTextTagType, style), value)
def _on_link_activate(self, action): def _on_link_activate(self, action, value):
""" """
Create a link of a selected region of text. Create a link of a selected region of text.
""" """
@ -633,10 +687,9 @@ class StyledTextEditor(Gtk.TextView):
else: else:
tag.data = uri tag.data = uri
def _on_action_activate(self, action, value):
def _on_action_activate(self, action):
"""Apply a format set from a Gtk.Action type of action.""" """Apply a format set from a Gtk.Action type of action."""
style = int(action.get_name()) style = getattr(StyledTextTagType, action.get_name())
current_value = self.textbuffer.get_style_at_cursor(style) current_value = self.textbuffer.get_style_at_cursor(style)
if style == StyledTextTagType.FONTCOLOR: if style == StyledTextTagType.FONTCOLOR:
@ -668,14 +721,12 @@ class StyledTextEditor(Gtk.TextView):
(style, str(value))) (style, str(value)))
self.textbuffer.apply_style(style, value) self.textbuffer.apply_style(style, value)
def _on_valueaction_changed(self, action): def _on_valueaction_changed(self, obj, style):
"""Apply a format set by a ValueAction type of action.""" """Apply a format set by a ShortListComboEntry."""
if self._internal_style_change: if self._internal_style_change:
return return
style = int(action.get_name()) value = obj.get_active_data()
value = action.get_value()
try: try:
value = StyledTextTagType.STYLE_TYPE[style](value) value = StyledTextTagType.STYLE_TYPE[style](value)
_LOG.debug("applying style '%d' with value '%s'" % _LOG.debug("applying style '%d' with value '%s'" %
@ -685,7 +736,7 @@ class StyledTextEditor(Gtk.TextView):
_LOG.debug("unable to convert '%s' to '%s'" % _LOG.debug("unable to convert '%s' to '%s'" %
(value, StyledTextTagType.STYLE_TYPE[style])) (value, StyledTextTagType.STYLE_TYPE[style]))
def _format_clear_cb(self, action): def _format_clear_cb(self, action, value):
""" """
Remove all formats from the selection or from all. Remove all formats from the selection or from all.
@ -709,24 +760,27 @@ class StyledTextEditor(Gtk.TextView):
def _on_buffer_changed(self, buffer): def _on_buffer_changed(self, buffer):
"""synchronize the undo/redo buttons with what is possible""" """synchronize the undo/redo buttons with what is possible"""
self.undo_action.set_sensitive(self.textbuffer.can_undo) if self.undo_action:
self.redo_action.set_sensitive(self.textbuffer.can_redo) self.undo_action.set_enabled(self.textbuffer.can_undo)
self.redo_action.set_enabled(self.textbuffer.can_redo)
def _on_buffer_style_changed(self, buffer, changed_styles): def _on_buffer_style_changed(self, buffer, changed_styles):
"""Synchronize actions as the format changes at the buffer's cursor.""" """Synchronize actions as the format changes at the buffer's cursor."""
if not self.uimanager:
return # never initialized a toolbar, not editable
types = [StyledTextTagType.ITALIC, StyledTextTagType.BOLD,
StyledTextTagType.UNDERLINE]
self._internal_style_change = True
for style, style_value in changed_styles.items(): for style, style_value in changed_styles.items():
if str(style) in self.toggle_actions: if style in types:
action = self.action_group.get_action(str(style)) action = self.uimanager.get_action(
self._internal_style_change = True self.action_group, str(StyledTextTagType(style)).upper())
action.set_active(style_value) action.change_state(Variant.new_boolean(style_value))
self._internal_style_change = False elif (style == StyledTextTagType.FONTFACE):
self.fontface.set_text(style_value)
if ((style == StyledTextTagType.FONTFACE) or elif style == StyledTextTagType.FONTSIZE:
(style == StyledTextTagType.FONTSIZE)): self.fontsize.set_text(str(style_value))
action = self.action_group.get_action(str(style)) self._internal_style_change = False
self._internal_style_change = True
action.set_value(style_value)
self._internal_style_change = False
def _spell_change_cb(self, menuitem, spellcheck): def _spell_change_cb(self, menuitem, spellcheck):
"""Set spell checker spellcheck according to user selection.""" """Set spell checker spellcheck according to user selection."""
@ -818,20 +872,17 @@ class StyledTextEditor(Gtk.TextView):
start, end = self.textbuffer.get_bounds() start, end = self.textbuffer.get_bounds()
return self.textbuffer.get_text(start, end, True) return self.textbuffer.get_text(start, end, True)
def get_toolbar(self): def undo(self, *obj):
"""
Get the formatting toolbar of the editor.
:returns: toolbar widget to use as formatting GUI.
:rtype: Gtk.Toolbar
"""
return self.toolbar
def undo(self, obj=None):
self.textbuffer.undo() self.textbuffer.undo()
def redo(self, obj=None): def redo(self, *obj):
self.textbuffer.redo() self.textbuffer.redo()
#-------------------------------------------------------------------------
#
# Module functions
#
#-------------------------------------------------------------------------
def uri_dialog(self, uri, callback): def uri_dialog(self, uri, callback):
""" """
@ -851,12 +902,14 @@ def uri_dialog(self, uri, callback):
uri = "gramps://%s/handle/%s" % (object_class, handle) uri = "gramps://%s/handle/%s" % (object_class, handle)
EditLink(obj.dbstate, obj.uistate, obj.track, uri, callback) EditLink(obj.dbstate, obj.uistate, obj.track, uri, callback)
#-------------------------------------------------------------------------
#
# Module functions
#
#-------------------------------------------------------------------------
def is_valid_fontsize(size): def is_valid_fontsize(size):
"""Validator function for font size selector widget.""" """Validator function for font size selector widget."""
return (size > 0) and (size < 73) return (size > 0) and (size < 73)
def make_cb(func, value):
"""
Generates a callback function based off the passed arguments
"""
return lambda x: func(x, value)

View File

@ -1,78 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2008 Zsolt Foldvari
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"ToolComboEntry class."
__all__ = ["ToolComboEntry"]
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
import logging
_LOG = logging.getLogger(".widgets.toolcomboentry")
#-------------------------------------------------------------------------
#
# GTK modules
#
#-------------------------------------------------------------------------
#from gi.repository import GObject
from gi.repository import Gtk
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from .valuetoolitem import ValueToolItem
from .shortlistcomboentry import ShortlistComboEntry
#-------------------------------------------------------------------------
#
# ToolComboEntry class
#
#-------------------------------------------------------------------------
class ToolComboEntry(ValueToolItem):
"""Tool bar item containing a ShortlistComboEntry widget."""
__gtype_name__ = "ToolComboEntry"
def _create_widget(self, items, editable, shortlist=True, validator=None):
self.set_border_width(2)
self.set_homogeneous(False)
self.set_expand(False)
combo = ShortlistComboEntry(items, shortlist, validator)
if (Gtk.MAJOR_VERSION, Gtk.MINOR_VERSION) < (3, 20):
combo.set_focus_on_click(False)
else:
Gtk.Widget.set_focus_on_click(combo, False)
combo.set_entry_editable(editable)
combo.show()
self.add(combo)
combo.connect('changed', self._on_widget_changed)
def set_value(self, value):
self.get_child().set_active_data(value)
def get_value(self):
return self.get_child().get_active_data()

View File

@ -65,7 +65,8 @@ class ValidatedComboEntry(Gtk.ComboBox):
__gtype_name__ = "ValidatedComboEntry" __gtype_name__ = "ValidatedComboEntry"
def __init__(self, datatype, model=None, column=-1, validator=None, width=-1): def __init__(self, datatype, model=None, column=-1, validator=None, width=-1):
Gtk.ComboBox.__init__(self, model=model) Gtk.ComboBox.__init__(self)
self.set_model(model)
self._entry = Gtk.Entry() self._entry = Gtk.Entry()
self._entry.set_width_chars(width) self._entry.set_width_chars(width)
@ -201,6 +202,9 @@ class ValidatedComboEntry(Gtk.ComboBox):
self._internal_change = True self._internal_change = True
new_iter = self._is_in_model(new_data) new_iter = self._is_in_model(new_data)
if new_iter is None: if new_iter is None:
if self.get_active_iter() is None:
# allows response when changing between two non-model values
self.set_active(0)
self.set_active(-1) self.set_active(-1)
else: else:
self.set_active_iter(new_iter) self.set_active_iter(new_iter)

View File

@ -1,169 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2008 Zsolt Foldvari
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"ValueAction class."
__all__ = ["ValueAction"]
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
import logging
_LOG = logging.getLogger(".widgets.valueaction")
#-------------------------------------------------------------------------
#
# GTK modules
#
#-------------------------------------------------------------------------
from gi.repository import GObject
from gi.repository import Gtk
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from .valuetoolitem import ValueToolItem
#-------------------------------------------------------------------------
#
# ValueAction class
#
#-------------------------------------------------------------------------
class ValueAction(Gtk.Action):
"""
Value action class.
(A ValueAction with menu item doesn't make any sense.)
"""
__gtype_name__ = "ValueAction"
__gsignals__ = {
'changed': (GObject.SignalFlags.RUN_FIRST,
None, #return value
()), # arguments
}
def __init__(self, name, tooltip, default, itemtype, *args):
"""
Create a new ValueAction instance.
:param name: the name of the action
:type name: str
:param tooltip: tooltip string
:type tooltip: str
:param default: default value for the action, it will set the type of
the action and thus the type of all the connected
proxies.
:type default: set by itemtype
:param itemtype: default tool item class
:type itemtype: :class:`.ValueToolItem` subclass
:param args: arguments to be passed to the default toolitem class
at creation. see: :meth:`do_create_tool_item`
:type args: list
"""
Gtk.Action.__init__(self, name=name, label='', tooltip=tooltip,
stock_id=None)
self._value = default
self._data_type = type(default)
# have to be remembered, because we can't access
# GtkAction->toolbar_item_type later.
self._default_toolitem_type = itemtype
##TODO GTK3: following is deprecated, must be replaced by
## itemtype.set_related_action(ValueAction) in calling class?
## self.set_tool_item_type(itemtype)
self._args_for_toolitem = args
self._handlers = {}
def do_changed(self):
"""
Default signal handler for 'changed' signal.
Synchronize all the proxies with the active value.
"""
for proxy in self.get_proxies():
proxy.handler_block(self._handlers[proxy])
proxy.set_value(self._value)
proxy.handler_unblock(self._handlers[proxy])
def do_create_tool_item(self):
"""
Create a 'default' toolbar item widget.
Override the default method, to be able to pass the required
parameters to the proxy's constructor.
This method is called from Gtk.UIManager.ensure_update(), when a
'toolitem' is found in the UI definition with a name refering to a
ValueAction. Thus, to use the action via the UIManager a 'default'
toolitem type has to be set with the Gtk.Action.set_tool_item_type()
method, before invoking the Gtk.UIManager.ensure_update() method.
Widgets other than the default type has to be created and added
manually with the Gtk.Action.connect_proxy() method.
:returns: a toolbar item connected to the action.
:rtype: :class:`.ValueToolItem` subclass
"""
proxy = self._default_toolitem_type(self._data_type,
self._args_for_toolitem)
self.connect_proxy(proxy)
return proxy
def _on_proxy_changed(self, proxy):
"""Signal handler for the proxies' 'changed' signal."""
value = proxy.get_value()
if value is not None:
self.set_value(value)
def connect_proxy(self, proxy):
"""
Connect a widget to an action object as a proxy.
:param proxy: widget to be connected
:type proxy: :class:`.ValueToolItem` subclass
"""
if not isinstance(proxy, ValueToolItem):
raise TypeError
# do this before connecting, so that we don't call the handler
proxy.set_value(self._value)
self._handlers[proxy] = proxy.connect('changed', self._on_proxy_changed)
# if this is called the proxy will appear on the proxy list twice. why?
#Gtk.Action.connect_proxy(self, proxy)
def set_value(self, value):
"""Set value to action."""
if not isinstance(value, self._data_type):
raise TypeError
self._value = value
self.emit('changed')
def get_value(self):
"""Get the value from the action."""
return self._value

View File

@ -1,92 +0,0 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2008 Zsolt Foldvari
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
"ValueToolItem class."
__all__ = ["ValueToolItem"]
#-------------------------------------------------------------------------
#
# Python modules
#
#-------------------------------------------------------------------------
import logging
_LOG = logging.getLogger(".widgets.valuetoolitem")
#-------------------------------------------------------------------------
#
# GTK modules
#
#-------------------------------------------------------------------------
from gi.repository import GObject
from gi.repository import Gtk
#-------------------------------------------------------------------------
#
# ValueToolItem class
#
#-------------------------------------------------------------------------
class ValueToolItem(Gtk.ToolItem):
"""ValueToolItem is an abstract toolbar proxy for ValueAction.
For each kind of widget a separete tool item proxy has to be
subclassed from this ValueToolItem.
"""
__gtype_name__ = "ValueToolItem"
__gsignals__ = {
'changed': (GObject.SignalFlags.RUN_FIRST,
None, #return value
()), # arguments
}
def __init__(self, data_type, args):
Gtk.ToolItem.__init__(self)
self._data_type = data_type
self._create_widget(*args)
def _on_widget_changed(self, widget):
self.emit('changed')
def _create_widget(self, args):
"""Create the apropriate widget for the actual proxy."""
raise NotImplementedError
def set_value(self, value):
"""Set new value for the proxied widget.
The method is responsible converting the data type between action and
widget.
"""
raise NotImplementedError
def get_value(self):
"""Get value from the proxied widget.
The method is responsible converting the data type between action and
widget.
"""
raise NotImplementedError

View File

@ -48,7 +48,7 @@ _LOG = logging.getLogger(".gui.personview")
from gramps.gen.lib import Person, Surname from gramps.gen.lib import Person, Surname
from gramps.gen.db import DbTxn from gramps.gen.db import DbTxn
from gramps.gui.views.listview import ListView, TEXT, MARKUP, ICON from gramps.gui.views.listview import ListView, TEXT, MARKUP, ICON
from gramps.gui.actiongroup import ActionGroup from gramps.gui.uimanager import ActionGroup
from gramps.gen.utils.string import data_recover_msg from gramps.gen.utils.string import data_recover_msg
from gramps.gen.display.name import displayer as name_displayer from gramps.gen.display.name import displayer as name_displayer
from gramps.gui.dialog import ErrorDialog, MultiSelectDialog, QuestionDialog from gramps.gui.dialog import ErrorDialog, MultiSelectDialog, QuestionDialog
@ -152,15 +152,10 @@ class BasePersonView(ListView):
multiple=True, multiple=True,
filter_class=PersonSidebarFilter) filter_class=PersonSidebarFilter)
self.func_list.update({
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
uistate.connect('nameformat-changed', self.build_tree) uistate.connect('nameformat-changed', self.build_tree)
uistate.connect('placeformat-changed', self.build_tree) uistate.connect('placeformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui)
def navigation_type(self): def navigation_type(self):
""" """
@ -187,70 +182,226 @@ class BasePersonView(ListView):
""" """
return 'gramps-person' return 'gramps-person'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
""" '''
Defines the UI string for UIManager <placeholder id="LocalExport">
""" <item>
return '''<ui> <attribute name="action">win.ExportTab</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">Export View...</attribute>
<menu action="FileMenu"> </item>
<placeholder name="LocalExport"> </placeholder>
<menuitem action="ExportTab"/> ''',
</placeholder> '''
</menu> <section id="AddEditBook">
<menu action="BookMenu"> <item>
<placeholder name="AddEditBook"> <attribute name="action">win.AddBook</attribute>
<menuitem action="AddBook"/> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menuitem action="EditBook"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.EditBook</attribute>
<menu action="GoMenu"> <attribute name="label" translatable="no">%s...</attribute>
<placeholder name="CommonGo"> </item>
<menuitem action="Back"/> </section>
<menuitem action="Forward"/> ''' % _('Organize Bookmarks'),
<separator/> '''
<menuitem action="HomePerson"/> <placeholder id="CommonGo">
<separator/> <section>
</placeholder> <item>
</menu> <attribute name="action">win.Back</attribute>
<menu action="EditMenu"> <attribute name="label" translatable="yes">_Back</attribute>
<placeholder name="CommonEdit"> </item>
<menuitem action="Add"/> <item>
<menuitem action="Edit"/> <attribute name="action">win.Forward</attribute>
<menuitem action="Remove"/> <attribute name="label" translatable="yes">_Forward</attribute>
<menuitem action="Merge"/> </item>
</placeholder> </section>
<menuitem action="SetActive"/> <section>
<menuitem action="FilterEdit"/> <item>
</menu> <attribute name="action">win.HomePerson</attribute>
</menubar> <attribute name="label" translatable="yes">_Home</attribute>
<toolbar name="ToolBar"> </item>
<placeholder name="CommonNavigation"> </section>
<toolitem action="Back"/> </placeholder>
<toolitem action="Forward"/> ''',
<toolitem action="HomePerson"/> '''
</placeholder> <section id='CommonEdit' groups='RW'>
<placeholder name="CommonEdit"> <item>
<toolitem action="Add"/> <attribute name="action">win.Add</attribute>
<toolitem action="Edit"/> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Remove"/> </item>
<toolitem action="Merge"/> <item>
</placeholder> <attribute name="action">win.Edit</attribute>
</toolbar> <attribute name="label" translatable="yes">%s</attribute>
<popup name="Popup"> </item>
<menuitem action="Back"/> <item>
<menuitem action="Forward"/> <attribute name="action">win.Remove</attribute>
<menuitem action="HomePerson"/> <attribute name="label" translatable="yes">_Delete</attribute>
<separator/> </item>
<menuitem action="Add"/> <item>
<menuitem action="Edit"/> <attribute name="action">win.Merge</attribute>
<menuitem action="Remove"/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="Merge"/> </item>
<separator/> </section>
<menu name="QuickReport" action="QuickReport"/> ''' % _("action|_Edit..."), # to use sgettext()
<menu name="WebConnect" action="WebConnect"/> '''
</popup> <placeholder id='otheredit'>
</ui>''' <item>
<attribute name="action">win.SetActive</attribute>
<attribute name="label" translatable="yes">'''
'''Set _Home Person</attribute>
</item>
<item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Person Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
<item>
<attribute name="action">win.HomePerson</attribute>
<attribute name="label" translatable="yes">_Home</attribute>
</item>
<item>
<attribute name="action">win.SetActive</attribute>
<attribute name="label" translatable="yes">'''
'''Set _Home Person</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
<placeholder id='WebConnect'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def get_handle_from_gramps_id(self, gid): def get_handle_from_gramps_id(self, gid):
""" """
@ -262,7 +413,7 @@ class BasePersonView(ListView):
else: else:
return None return None
def add(self, obj): def add(self, *obj):
""" """
Add a new person to the database. Add a new person to the database.
""" """
@ -276,7 +427,7 @@ class BasePersonView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def edit(self, obj): def edit(self, *obj):
""" """
Edit an existing person in the database. Edit an existing person in the database.
""" """
@ -287,7 +438,7 @@ class BasePersonView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
""" """
Remove a person from the database. Remove a person from the database.
""" """
@ -373,53 +524,7 @@ class BasePersonView(ListView):
ListView.define_actions(self) ListView.define_actions(self)
self.all_action = ActionGroup(name=self.title + "/PersonAll") def merge(self, *obj):
self.edit_action = ActionGroup(name=self.title + "/PersonEdit")
self.all_action.add_actions([
('FilterEdit', None, _('Person Filter Editor'), None, None,
self.filter_editor),
('Edit', 'gtk-edit', _("action|_Edit..."),
"<PRIMARY>Return", self.EDIT_MSG, self.edit),
('QuickReport', None, _("Quick View"), None, None, None),
('WebConnect', None, _("Web Connection"), None, None, None),
])
self.edit_action.add_actions(
[
('Add', 'list-add', _("_Add..."), "<PRIMARY>Insert",
self.ADD_MSG, self.add),
('Remove', 'list-remove', _("_Delete"), "<PRIMARY>Delete",
self.DEL_MSG, self.remove),
('Merge', 'gramps-merge', _('_Merge...'), None,
self.MERGE_MSG, self.merge),
('ExportTab', None, _('Export View...'), None, None,
self.export),
])
self._add_action_group(self.edit_action)
self._add_action_group(self.all_action)
def enable_action_group(self, obj):
"""
Turns on the visibility of the View's action group.
"""
ListView.enable_action_group(self, obj)
self.all_action.set_visible(True)
self.edit_action.set_visible(True)
self.edit_action.set_sensitive(not self.dbstate.db.readonly)
def disable_action_group(self):
"""
Turns off the visibility of the View's action group.
"""
ListView.disable_action_group(self)
self.all_action.set_visible(False)
self.edit_action.set_visible(False)
def merge(self, obj):
""" """
Merge the selected people. Merge the selected people.
""" """

View File

@ -39,7 +39,6 @@ from gi.repository import Gtk
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.lib import Place from gramps.gen.lib import Place
from gramps.gui.views.listview import ListView, TEXT, ICON from gramps.gui.views.listview import ListView, TEXT, ICON
from gramps.gui.widgets.menuitem import add_menuitem
from gramps.gen.errors import WindowActiveError from gramps.gen.errors import WindowActiveError
from gramps.gui.views.bookmarks import PlaceBookmarks from gramps.gui.views.bookmarks import PlaceBookmarks
from gramps.gen.config import config from gramps.gen.config import config
@ -51,6 +50,7 @@ from gramps.gui.filters.sidebar import PlaceSidebarFilter
from gramps.gui.merge import MergePlace from gramps.gui.merge import MergePlace
from gramps.gen.plug import CATEGORY_QR_PLACE from gramps.gen.plug import CATEGORY_QR_PLACE
from gramps.gen.utils.location import located_in from gramps.gen.utils.location import located_in
from gramps.gui.uimanager import ActionGroup
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -58,7 +58,7 @@ from gramps.gen.utils.location import located_in
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -117,6 +117,7 @@ class PlaceBaseView(ListView):
self.mapservice = config.get('interface.mapservice') self.mapservice = config.get('interface.mapservice')
self.mapservicedata = {} self.mapservicedata = {}
self.map_action_group = None
ListView.__init__( ListView.__init__(
self, title, pdata, dbstate, uistate, self, title, pdata, dbstate, uistate,
@ -125,42 +126,17 @@ class PlaceBaseView(ListView):
multiple=True, multiple=True,
filter_class=PlaceSidebarFilter) filter_class=PlaceSidebarFilter)
self.func_list.update({
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.maptoolbtn = None
uistate.connect('placeformat-changed', self.build_tree) uistate.connect('placeformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui()) _ui = self.__create_maps_menu_actions()
self.additional_uis.append(_ui)
def navigation_type(self): def navigation_type(self):
return 'Place' return 'Place'
def define_actions(self): def define_actions(self):
ListView.define_actions(self) ListView.define_actions(self)
self._add_toolmenu_action('MapsList', _('Loading...'), self._add_action('GotoMap', self.gotomap)
_("Attempt to see selected locations with a Map "
"Service (OpenstreetMap, Google Maps, ...)"),
self.gotomap,
_('Select a Map Service'))
self._add_action('GotoMap', 'go-jump',
_('_Look up with Map Service'),
callback=self.gotomap,
tip=_("Attempt to see this location with a Map "
"Service (OpenstreetMap, Google Maps, ...)"))
self._add_action('FilterEdit', None, _('Place Filter Editor'),
callback=self.filter_editor)
self._add_action('QuickReport', None, _("Quick View"), None, None, None)
def set_inactive(self):
"""called by viewmanager when moving away from the page
Here we need to remove the menutoolbutton from the menu
"""
tb = self.uistate.viewmanager.uimanager.get_widget('/ToolBar')
tb.remove(self.maptoolbtn)
ListView.set_inactive(self)
def change_page(self): def change_page(self):
""" """
@ -173,39 +149,6 @@ class PlaceBaseView(ListView):
5. store label so it can be changed when selection changes 5. store label so it can be changed when selection changes
""" """
ListView.change_page(self) ListView.change_page(self)
#menutoolbutton has to be made and added in correct place on toolbar
if not self.maptoolbtn:
self.maptoolbtn = Gtk.MenuToolButton()
self.maptoolbtn.set_icon_name('go-jump')
self.maptoolbtn.connect('clicked', self.gotomap)
self.mmenu = self.__create_maps_menu_actions()
self.maptoolbtn.set_menu(self.mmenu)
self.maptoolbtn.show()
tb = self.uistate.viewmanager.uimanager.get_widget('/ToolBar')
ind = tb.get_item_index(self.uistate.viewmanager.uimanager.get_widget(
'/ToolBar/CommonEdit/Merge'))
tb.insert(self.maptoolbtn, ind+1)
widget = self.maptoolbtn
if not self.mapservicedata:
return
self.mapslistlabel = []
if not self.mapservice in self.mapservicedata:
#stored val no longer exists, use the first key instead
self.set_mapservice(list(self.mapservicedata.keys())[0])
#store all gtk labels to be able to update label on selection change_('Loading...'),
widget.set_menu(self.mmenu)
widget.set_arrow_tooltip_text(_('Select a Map Service'))
widget.set_tooltip_text(
_("Attempt to see selected locations with a Map "
"Service (OpenstreetMap, Google Maps, ...)"))
lbl = Gtk.Label(label=self.mapservice_label())
lbl.show()
self.mapslistlabel.append(lbl)
widget.set_label_widget(self.mapslistlabel[-1])
widget.set_icon_name('go-jump')
if self.drag_info(): if self.drag_info():
self.list.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, self.list.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK,
[], [],
@ -222,30 +165,52 @@ class PlaceBaseView(ListView):
Function creating a menu and actions that are used as dropdown menu Function creating a menu and actions that are used as dropdown menu
from the menutoolbutton from the menutoolbutton
""" """
menu = Gtk.Menu() _bar = '''
<item>
<attribute name="action">win.MapChoice</attribute>
<attribute name="target">%s</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
'''
menu = ''
#select the map services to show #select the map services to show
self.mapservicedata = {} self.mapservicedata = {}
servlist = GuiPluginManager.get_instance().get_reg_mapservices() servlist = GuiPluginManager.get_instance().get_reg_mapservices()
for i, pdata in enumerate(servlist): for pdata in servlist:
key = pdata.id.replace(' ', '-') key = pdata.id.replace(' ', '-')
add_menuitem(menu, pdata.name, None, menu += _bar % (key, pdata.name)
make_callback(self.set_mapservice, key))
self.mapservicedata[key] = pdata self.mapservicedata[key] = pdata
return menu if not self.mapservicedata:
return self.additional_ui
if self.mapservice not in self.mapservicedata:
#stored val no longer exists, use the most recent key instead
self.set_mapservice(None, key)
def set_mapservice(self, mapkey): self._add_toggle_action('MapChoice', self.set_mapservice, '',
self.mapservice)
label = self.mapservice_label()
_ui = self.additional_ui[:]
_ui.append(self.map_ui_menu % menu)
_ui.append(self.map_ui % label)
return _ui
def set_mapservice(self, action, value):
""" """
change the service that runs on click of the menutoolbutton change the service that runs on click of the menutoolbutton
used as callback menu on menu clicks used as callback menu on menu clicks
""" """
self.mapservice = mapkey if action:
for label in self.mapslistlabel: action.set_state(value)
label.set_label(self.mapservice_label()) self.mapservice = mapkey = value.get_string()
label.show()
config.set('interface.mapservice', mapkey) config.set('interface.mapservice', mapkey)
config.save() config.save()
_ui = self.__create_maps_menu_actions()
self.uimanager.add_ui_from_string(_ui)
self.uimanager.update_menu()
return False
def mapservice_label(self): def mapservice_label(self):
""" """
@ -253,7 +218,7 @@ class PlaceBaseView(ListView):
""" """
return self.mapservicedata[self.mapservice].name return self.mapservicedata[self.mapservice].name
def gotomap(self, obj): def gotomap(self, *obj):
""" """
Run the map service Run the map service
""" """
@ -295,72 +260,245 @@ class PlaceBaseView(ListView):
def get_stock(self): def get_stock(self):
return 'gramps-place' return 'gramps-place'
def additional_ui(self): #
return '''<ui> # Defines the UI string for UIManager
<menubar name="MenuBar"> #
<menu action="FileMenu"> additional_ui = [
<placeholder name="LocalExport"> '''
<menuitem action="ExportTab"/> <placeholder id="LocalExport">
</placeholder> <item>
</menu> <attribute name="action">win.ExportTab</attribute>
<menu action="BookMenu"> <attribute name="label" translatable="yes">Export View...</attribute>
<placeholder name="AddEditBook"> </item>
<menuitem action="AddBook"/> </placeholder>
<menuitem action="EditBook"/> ''',
</placeholder> '''
</menu> <section id="AddEditBook">
<menu action="GoMenu"> <item>
<placeholder name="CommonGo"> <attribute name="action">win.AddBook</attribute>
<menuitem action="Back"/> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menuitem action="Forward"/> </item>
<separator/> <item>
</placeholder> <attribute name="action">win.EditBook</attribute>
</menu> <attribute name="label" translatable="no">%s...</attribute>
<menu action="EditMenu"> </item>
<placeholder name="CommonEdit"> </section>
<menuitem action="Add"/> ''' % _('Organize Bookmarks'),
<menuitem action="Edit"/> '''
<menuitem action="Remove"/> <placeholder id="CommonGo">
<menuitem action="Merge"/> <section>
</placeholder> <item>
<menuitem action="FilterEdit"/> <attribute name="action">win.Back</attribute>
</menu> <attribute name="label" translatable="yes">_Back</attribute>
</menubar> </item>
<toolbar name="ToolBar"> <item>
<placeholder name="CommonNavigation"> <attribute name="action">win.Forward</attribute>
<toolitem action="Back"/> <attribute name="label" translatable="yes">_Forward</attribute>
<toolitem action="Forward"/> </item>
</placeholder> </section>
<placeholder name="CommonEdit"> </placeholder>
<toolitem action="Add"/> ''',
<toolitem action="Edit"/> '''
<toolitem action="Remove"/> <section id='CommonEdit' groups='RW'>
<toolitem action="Merge"/> <item>
<separator/> <attribute name="action">win.Add</attribute>
</placeholder> <attribute name="label" translatable="yes">_Add...</attribute>
</toolbar> </item>
<popup name="Popup"> <item>
<menuitem action="Back"/> <attribute name="action">win.Edit</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">%s</attribute>
<separator/> </item>
<menuitem action="Add"/> <item>
<menuitem action="Edit"/> <attribute name="action">win.Remove</attribute>
<menuitem action="Remove"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Merge"/> </item>
<separator/> <item>
<menu name="QuickReport" action="QuickReport"/> <attribute name="action">win.Merge</attribute>
<separator/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="GotoMap"/> </item>
</popup> </section>
</ui>''' ''' % _("action|_Edit..."), # to use sgettext()
'''
<placeholder id='otheredit'>
<item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Place Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<placeholder id="PlaceMapUi"> </placeholder>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section id="PopUpTree">
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
<section>
<item>
<attribute name="action">win.GotoMap</attribute>
<attribute name="label" translatable="yes">'''
'''_Look up with Map Service</attribute>
</item>
</section>
</menu>
''' % _('action|_Edit...')] # to use sgettext()
def add(self, obj): map_ui_menu = '''
<menu id="MapBtnMenu">
%s
</menu>
'''
map_ui = (
'''<placeholder id="PlaceMapUi">
<child>
<object class="GtkToolButton" id="GotoMap">
<property name="icon-name">go-jump</property>
<property name="action-name">win.GotoMap</property>
<property name="tooltip_text" translatable="yes">'''
'''Attempt to see selected locations with a Map Service '''
'''(OpenstreetMap, Google Maps, ...)</property>
<property name="label" translatable="yes">%s</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolItem">
<child>
<object class="GtkMenuButton">
<property name="tooltip_text" translatable="yes">'''
'''Select a Map Service</property>
<property name="menu-model">MapBtnMenu</property>
<property name="relief">GTK_RELIEF_NONE</property>
<property name="use-popover">False</property>
</object>
</child>
</object>
</child>
</placeholder>
''')
def add(self, *obj):
try: try:
EditPlace(self.dbstate, self.uistate, [], Place()) EditPlace(self.dbstate, self.uistate, [], Place())
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
for link in self.dbstate.db.find_backlink_handles(handle,['Place']): for link in self.dbstate.db.find_backlink_handles(handle,['Place']):
msg = _("Cannot delete place.") msg = _("Cannot delete place.")
@ -390,7 +528,7 @@ class PlaceBaseView(ListView):
is_used = len(person_list) + len(family_list) + len(event_list) > 0 is_used = len(person_list) + len(family_list) + len(event_list) > 0
return (query, is_used, object) return (query, is_used, object)
def edit(self, obj): def edit(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
place = self.dbstate.db.get_place_from_handle(handle) place = self.dbstate.db.get_place_from_handle(handle)
try: try:
@ -398,7 +536,7 @@ class PlaceBaseView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected places. Merge the selected places.
""" """
@ -468,5 +606,6 @@ class PlaceBaseView(ListView):
"Place Notes", "Place Notes",
"Place Backlinks")) "Place Backlinks"))
def make_callback(func, val): def make_callback(func, val):
return lambda x: func(val) return lambda x, y: func(val)

View File

@ -191,7 +191,7 @@ class GeoGraphyView(OsmGps, NavigationView):
self.clearmap = None self.clearmap = None
self.nbplaces = 0 self.nbplaces = 0
def add_bookmark(self, menu): def add_bookmark(self, *menu):
""" """
Add the place to the bookmark Add the place to the bookmark
""" """
@ -300,16 +300,7 @@ class GeoGraphyView(OsmGps, NavigationView):
another method. another method.
""" """
NavigationView.define_actions(self) NavigationView.define_actions(self)
self.define_print_actions() self._add_action('PrintView', self.printview, '<Primary>P')
def define_print_actions(self):
"""
Associate the print button to the PrintView action.
"""
self._add_action('PrintView', 'document-print', _("_Print..."),
accel="<PRIMARY>P",
tip=_("Print or save the Map"),
callback=self.printview)
def config_connect(self): def config_connect(self):
""" """
@ -345,7 +336,6 @@ class GeoGraphyView(OsmGps, NavigationView):
""" """
self.menu = Gtk.Menu() self.menu = Gtk.Menu()
menu = self.menu menu = self.menu
menu.set_title(_('Map Menu'))
if config.get("geography.show_cross"): if config.get("geography.show_cross"):
title = _('Remove cross hair') title = _('Remove cross hair')
@ -876,7 +866,7 @@ class GeoGraphyView(OsmGps, NavigationView):
# Printing functionalities # Printing functionalities
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
def printview(self, obj): def printview(self, *obj):
""" """
Print or save the view that is currently shown Print or save the view that is currently shown
""" """

View File

@ -88,14 +88,6 @@ class CategorySidebar(BaseSidebar):
button.drag_dest_set(0, [], 0) button.drag_dest_set(0, [], 0)
button.connect('drag_motion', self.cb_switch_page_on_dnd, cat_num) button.connect('drag_motion', self.cb_switch_page_on_dnd, cat_num)
# toollbar buttons for switching views in a category
uitoolitems = ''
for view_num, view_name, view_icon in views[cat_num]:
pageid = 'page_%i_%i' % (cat_num, view_num)
uitoolitems += '\n<toolitem action="%s"/>' % pageid
if len(views[cat_num]) > 1:
self.ui_category[cat_num] = UICATEGORY % uitoolitems
vbox.show_all() vbox.show_all()
def get_top(self): def get_top(self):

View File

@ -62,7 +62,7 @@ from gramps.gui.merge import MergeCitation
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -146,12 +146,7 @@ class CitationListView(ListView):
multiple=True, multiple=True,
filter_class=CitationSidebarFilter) filter_class=CitationSidebarFilter)
self.func_list.update({ self.additional_uis.append(self.additional_ui)
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.additional_uis.append(self.additional_ui())
def navigation_type(self): def navigation_type(self):
return 'Citation' return 'Citation'
@ -159,94 +154,196 @@ class CitationListView(ListView):
def drag_info(self): def drag_info(self):
return DdTargets.CITATION_LINK return DdTargets.CITATION_LINK
def define_actions(self):
"""
This defines the possible actions for the citation views.
Possible actions are:
add: Add a new citation and a new source (this can also be done
by source view add a source, then citation view add a new
citation to an existing source)
edit: Edit a citation.
merge: Merge the selected citations.
remove: Delete the selected citations.
"""
ListView.define_actions(self)
self.all_action = Gtk.ActionGroup(name=self.title + "/CitationAll")
self.edit_action = Gtk.ActionGroup(name=self.title + "/CitationEdit")
self._add_action('FilterEdit', None, _('Citation Filter Editor'),
callback=self.filter_editor,)
self._add_action('QuickReport', None, _("Quick View"), None, None, None)
self._add_action_group(self.edit_action)
self._add_action_group(self.all_action)
def get_stock(self): def get_stock(self):
return 'gramps-citation' return 'gramps-citation'
def additional_ui(self): additional_ui = [
""" '''
Defines the UI string for UIManager <placeholder id="LocalExport">
""" <item>
return '''<ui> <attribute name="action">win.ExportTab</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">Export View...</attribute>
<menu action="FileMenu"> </item>
<placeholder name="LocalExport"> </placeholder>
<menuitem action="ExportTab"/> ''',
</placeholder> '''
</menu> <section id="AddEditBook">
<menu action="BookMenu"> <item>
<placeholder name="AddEditBook"> <attribute name="action">win.AddBook</attribute>
<menuitem action="AddBook"/> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menuitem action="EditBook"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.EditBook</attribute>
<menu action="GoMenu"> <attribute name="label" translatable="no">%s...</attribute>
<placeholder name="CommonGo"> </item>
<menuitem action="Back"/> </section>
<menuitem action="Forward"/> ''' % _('Organize Bookmarks'),
<separator/> '''
</placeholder> <placeholder id="CommonGo">
</menu> <section>
<menu action="EditMenu"> <item>
<placeholder name="CommonEdit"> <attribute name="action">win.Back</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Back</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
<menuitem action="FilterEdit"/> </item>
</menu> </section>
</menubar> </placeholder>
<toolbar name="ToolBar"> ''',
<placeholder name="CommonNavigation"> '''
<toolitem action="Back"/> <section id='CommonEdit' groups='RW'>
<toolitem action="Forward"/> <item>
</placeholder> <attribute name="action">win.Add</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Add"/> </item>
<toolitem action="Edit"/> <item>
<toolitem action="Remove"/> <attribute name="action">win.Edit</attribute>
<toolitem action="Merge"/> <attribute name="label" translatable="yes">%s</attribute>
</placeholder> </item>
</toolbar> <item>
<popup name="Popup"> <attribute name="action">win.Remove</attribute>
<menuitem action="Back"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Forward"/> </item>
<separator/> <item>
<menuitem action="Add"/> <attribute name="action">win.Merge</attribute>
<menuitem action="Edit"/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="Remove"/> </item>
<menuitem action="Merge"/> </section>
<separator/> ''' % _("action|_Edit..."), # to use sgettext()
<menu name="QuickReport" action="QuickReport"/> '''
</popup> <placeholder id='otheredit'>
</ui>''' <item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Citation Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def add(self, obj): def add(self, *obj):
""" """
add: Add a new citation and a new source (this can also be done add: Add a new citation and a new source (this can also be done
by source view add a source, then citation view add a new by source view add a source, then citation view add a new
@ -269,7 +366,7 @@ class CitationListView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
@ -280,7 +377,7 @@ class CitationListView(ListView):
is_used = any(the_lists) is_used = any(the_lists)
return (query, is_used, object) return (query, is_used, object)
def edit(self, obj): def edit(self, *obj):
""" """
Edit a Citation Edit a Citation
""" """
@ -301,7 +398,7 @@ class CitationListView(ListView):
"the same citation is being edited.\n\nTo edit this " "the same citation is being edited.\n\nTo edit this "
"citation, you need to close the object.") "citation, you need to close the object.")
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected citations. Merge the selected citations.
""" """

View File

@ -65,7 +65,7 @@ from gramps.gui.merge import MergeCitation, MergeSource
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -147,12 +147,7 @@ class CitationTreeView(ListView):
multiple=True, multiple=True,
filter_class=SourceSidebarFilter) filter_class=SourceSidebarFilter)
self.func_list.update({ self.additional_uis.append(self.additional_ui)
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.additional_uis.append(self.additional_ui())
# Override change_active from NavigationView, so that only Citations can be # Override change_active from NavigationView, so that only Citations can be
# put in the history list for the CitationTreeView # put in the history list for the CitationTreeView
@ -298,100 +293,241 @@ class CitationTreeView(ListView):
""" """
ListView.define_actions(self) ListView.define_actions(self)
self._add_action('Add source', 'gramps-source', _("Add source..."), self.action_list.extend([
accel=None, ('AddSource', self.add_source),
tip=self.ADD_SOURCE_MSG, ('AddCitation', self.share),
callback=self.add_source) ('OpenAllNodes', self.open_all_nodes),
self._add_action('Add citation', 'gramps-citation', ('CloseAllNodes', self.close_all_nodes), ])
_("Add citation..."),
accel=None,
tip=self.ADD_CITATION_MSG,
callback=self.share)
self.all_action = Gtk.ActionGroup(name=self.title + "/CitationAll") additional_ui = [ # Defines the UI string for UIManager
self.edit_action = Gtk.ActionGroup(name=self.title + "/CitationEdit") '''
<placeholder id="LocalExport">
<item>
<attribute name="action">win.ExportTab</attribute>
<attribute name="label" translatable="yes">Export View...</attribute>
</item>
</placeholder>
''',
'''
<section id="AddEditBook">
<item>
<attribute name="action">win.AddBook</attribute>
<attribute name="label" translatable="yes">_Add Bookmark</attribute>
</item>
<item>
<attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'),
'''
<placeholder id="CommonGo">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">_Forward</attribute>
</item>
</section>
</placeholder>
''',
'''
<section id='CommonEdit' groups='RW'>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.AddSource</attribute>
<attribute name="label" translatable="yes">Add source...</attribute>
</item>
<item>
<attribute name="action">win.AddCitation</attribute>
<attribute name="label" translatable="yes">Add citation...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
''' % _("action|_Edit..."), # to use sgettext()
'''
<placeholder id='otheredit'>
<item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Citation Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-source</property>
<property name="action-name">win.AddSource</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Add source...</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-citation</property>
<property name="action-name">win.AddCitation</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Add citation...</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, ADD_SOURCE_MSG, ADD_CITATION_MSG, EDIT_MSG, DEL_MSG,
MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
<item>
<attribute name="action">win.OpenAllNodes</attribute>
<attribute name="label" translatable="yes">'''
'''Expand all Nodes</attribute>
</item>
<item>
<attribute name="action">win.CloseAllNodes</attribute>
<attribute name="label" translatable="yes">'''
'''Collapse all Nodes</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.AddCitation</attribute>
<attribute name="label" translatable="yes">'''
'''Add citation...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
self._add_action('FilterEdit', None, _('Citation Filter Editor'), def add_source(self, *obj):
callback=self.filter_editor,)
self._add_action('QuickReport', None, _("Quick View"), None, None, None)
self._add_action_group(self.edit_action)
self._add_action_group(self.all_action)
self.all_action.add_actions([
('OpenAllNodes', None, _("Expand all Nodes"), None, None,
self.open_all_nodes),
('CloseAllNodes', None, _("Collapse all Nodes"), None, None,
self.close_all_nodes),
])
def additional_ui(self):
"""
Defines the UI string for UIManager
"""
return '''<ui>
<menubar name="MenuBar">
<menu action="FileMenu">
<placeholder name="LocalExport">
<menuitem action="ExportTab"/>
</placeholder>
</menu>
<menu action="BookMenu">
<placeholder name="AddEditBook">
<menuitem action="AddBook"/>
<menuitem action="EditBook"/>
</placeholder>
</menu>
<menu action="GoMenu">
<placeholder name="CommonGo">
<menuitem action="Back"/>
<menuitem action="Forward"/>
</placeholder>
</menu>
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="Add"/>
<menuitem action="Add source"/>
<menuitem action="Add citation"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
</placeholder>
<menuitem action="FilterEdit"/>
</menu>
</menubar>
<toolbar name="ToolBar">
<placeholder name="CommonNavigation">
<toolitem action="Back"/>
<toolitem action="Forward"/>
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="Add"/>
<toolitem action="Add source"/>
<toolitem action="Add citation"/>
<toolitem action="Edit"/>
<toolitem action="Remove"/>
<toolitem action="Merge"/>
</placeholder>
</toolbar>
<popup name="Popup">
<menuitem action="Back"/>
<menuitem action="Forward"/>
<separator/>
<menuitem action="OpenAllNodes"/>
<menuitem action="CloseAllNodes"/>
<separator/>
<menuitem action="Add"/>
<menuitem action="Add citation"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
<separator/>
<menu name="QuickReport" action="QuickReport"/>
</popup>
</ui>'''
def add_source(self, obj):
""" """
add_source: Add a new source (this is also available from the add_source: Add a new source (this is also available from the
source view) source view)
@ -412,7 +548,7 @@ class CitationTreeView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def add(self, obj): def add(self, *obj):
""" """
add: Add a new citation and a new source (this can also be done add: Add a new citation and a new source (this can also be done
by source view add a source, then citation view add a new by source view add a source, then citation view add a new
@ -435,7 +571,7 @@ class CitationTreeView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def share(self, obj): def share(self, *obj):
""" """
share: Add a new citation to an existing source (when a source is share: Add a new citation to an existing source (when a source is
selected) selected)
@ -455,7 +591,7 @@ class CitationTreeView(ListView):
self.__blocked_text(), self.__blocked_text(),
parent=self.uistate.window) parent=self.uistate.window)
# #
def remove(self, obj): def remove(self, *obj):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
@ -477,7 +613,7 @@ class CitationTreeView(ListView):
is_used = any(the_lists) is_used = any(the_lists)
return (query, is_used, source) return (query, is_used, source)
def edit(self, obj): def edit(self, *obj):
""" """
Edit either a Source or a Citation, depending on user selection Edit either a Source or a Citation, depending on user selection
""" """
@ -518,7 +654,7 @@ class CitationTreeView(ListView):
"source is being edited.\n\nTo edit this " "source is being edited.\n\nTo edit this "
"source, you need to close the object.") "source, you need to close the object.")
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected citations. Merge the selected citations.
""" """

View File

@ -49,12 +49,7 @@ class DashboardView(PageView):
Create a DashboardView, with the current dbstate and uistate Create a DashboardView, with the current dbstate and uistate
""" """
PageView.__init__(self, _('Dashboard'), pdata, dbstate, uistate) PageView.__init__(self, _('Dashboard'), pdata, dbstate, uistate)
self.ui_def = '''<ui> self.ui_def = [] # No special menu for Dashboard, Popup in GrampletPane
<popup name="GrampletPopup">
<menuitem action="AddGramplet"/>
<menuitem action="RestoreGramplet"/>
</popup>
</ui>'''
def build_interface(self): def build_interface(self):
""" """
@ -101,10 +96,11 @@ class DashboardView(PageView):
def define_actions(self): def define_actions(self):
""" """
Defines the UIManager actions. Defines the UIManager actions. Called by the ViewManager to set up the
View. The user typically defines self.action_list and
self.action_toggle_list in this function.
""" """
self._add_action("AddGramplet", 'list-add', _("Add a gramplet")) pass
self._add_action("RestoreGramplet", None, _("Restore a gramplet"))
def set_inactive(self): def set_inactive(self):
self.active = False self.active = False

View File

@ -38,7 +38,7 @@ _LOG = logging.getLogger(".plugins.eventview")
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
from gramps.gui.dialog import ErrorDialog, MultiSelectDialog, QuestionDialog from gramps.gui.dialog import ErrorDialog, MultiSelectDialog, QuestionDialog
from gramps.gen.errors import WindowActiveError from gramps.gen.errors import WindowActiveError
@ -126,15 +126,10 @@ class EventView(ListView):
multiple=True, multiple=True,
filter_class=EventSidebarFilter) filter_class=EventSidebarFilter)
self.func_list.update({
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
uistate.connect('nameformat-changed', self.build_tree) uistate.connect('nameformat-changed', self.build_tree)
uistate.connect('placeformat-changed', self.build_tree) uistate.connect('placeformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui)
def person_update(self, hndl_list): def person_update(self, hndl_list):
""" Deal with person updates thay may effect the Main Participants """ Deal with person updates thay may effect the Main Participants
@ -176,71 +171,191 @@ class EventView(ListView):
""" """
return 'gramps-event' return 'gramps-event'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
""" '''
Defines the UI string for UIManager <placeholder id="LocalExport">
""" <item>
return '''<ui> <attribute name="action">win.ExportTab</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">Export View...</attribute>
<menu action="BookMenu"> </item>
<placeholder name="AddEditBook"> </placeholder>
<menuitem action="AddBook"/> ''',
<menuitem action="EditBook"/> '''
</placeholder> <section id="AddEditBook">
</menu> <item>
<menu action="GoMenu"> <attribute name="action">win.AddBook</attribute>
<placeholder name="CommonGo"> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menuitem action="Back"/> </item>
<menuitem action="Forward"/> <item>
<separator/> <attribute name="action">win.EditBook</attribute>
</placeholder> <attribute name="label" translatable="no">%s...</attribute>
</menu> </item>
<menu action="FileMenu"> </section>
<placeholder name="LocalExport"> ''' % _('Organize Bookmarks'),
<menuitem action="ExportTab"/> '''
</placeholder> <placeholder id="CommonGo">
</menu> <section>
<menu action="EditMenu"> <item>
<placeholder name="CommonEdit"> <attribute name="action">win.Back</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Back</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
<menuitem action="FilterEdit"/> </item>
</menu> </section>
</menubar> </placeholder>
<toolbar name="ToolBar"> ''',
<placeholder name="CommonNavigation"> '''
<toolitem action="Back"/> <section id='CommonEdit' groups='RW'>
<toolitem action="Forward"/> <item>
</placeholder> <attribute name="action">win.Add</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Add"/> </item>
<toolitem action="Edit"/> <item>
<toolitem action="Remove"/> <attribute name="action">win.Edit</attribute>
<toolitem action="Merge"/> <attribute name="label" translatable="yes">%s</attribute>
</placeholder> </item>
</toolbar> <item>
<popup name="Popup"> <attribute name="action">win.Remove</attribute>
<menuitem action="Back"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Forward"/> </item>
<separator/> <item>
<menuitem action="Add"/> <attribute name="action">win.Merge</attribute>
<menuitem action="Edit"/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="Remove"/> </item>
<menuitem action="Merge"/> </section>
<separator/> ''' % _("action|_Edit..."), # to use sgettext()
<menu name="QuickReport" action="QuickReport"/> '''
</popup> <placeholder id='otheredit'>
</ui>''' <item>
<attribute name="action">win.FilterEdit</attribute>
def define_actions(self): <attribute name="label" translatable="yes">'''
ListView.define_actions(self) '''Event Filter Editor</attribute>
self._add_action('FilterEdit', None, </item>
_('Event Filter Editor'), callback=self.filter_editor) </placeholder>
self._add_action('QuickReport', None, ''', # Following are the Toolbar items
_("Quick View"), None, None, None) '''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def get_handle_from_gramps_id(self, gid): def get_handle_from_gramps_id(self, gid):
obj = self.dbstate.db.get_event_from_gramps_id(gid) obj = self.dbstate.db.get_event_from_gramps_id(gid)
@ -249,13 +364,13 @@ class EventView(ListView):
else: else:
return None return None
def add(self, obj): def add(self, *obj):
try: try:
EditEvent(self.dbstate, self.uistate, [], Event()) EditEvent(self.dbstate, self.uistate, [], Event())
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
""" """
Method called when deleting event(s) from the event view. Method called when deleting event(s) from the event view.
""" """
@ -310,7 +425,7 @@ class EventView(ListView):
""" """
pass pass
def edit(self, obj): def edit(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
event = self.dbstate.db.get_event_from_handle(handle) event = self.dbstate.db.get_event_from_handle(handle)
try: try:
@ -318,7 +433,7 @@ class EventView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected events. Merge the selected events.
""" """

View File

@ -29,7 +29,7 @@ Family View.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
import logging import logging
_LOG = logging.getLogger(".plugins.eventview") _LOG = logging.getLogger(".plugins.eventview")
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -120,14 +120,9 @@ class FamilyView(ListView):
multiple=True, multiple=True,
filter_class=FamilySidebarFilter) filter_class=FamilySidebarFilter)
self.func_list.update({
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
uistate.connect('nameformat-changed', self.build_tree) uistate.connect('nameformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui)
def navigation_type(self): def navigation_type(self):
return 'Family' return 'Family'
@ -135,84 +130,214 @@ class FamilyView(ListView):
def get_stock(self): def get_stock(self):
return 'gramps-family' return 'gramps-family'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
return '''<ui> '''
<menubar name="MenuBar"> <placeholder id="LocalExport">
<menu action="FileMenu"> <item>
<placeholder name="LocalExport"> <attribute name="action">win.ExportTab</attribute>
<menuitem action="ExportTab"/> <attribute name="label" translatable="yes">Export View...</attribute>
</placeholder> </item>
</menu> </placeholder>
<menu action="GoMenu"> ''',
<placeholder name="CommonGo"> '''
<menuitem action="Back"/> <section id="AddEditBook">
<menuitem action="Forward"/> <item>
<separator/> <attribute name="action">win.AddBook</attribute>
</placeholder> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
</menu> </item>
<menu action="EditMenu"> <item>
<placeholder name="CommonEdit"> <attribute name="action">win.EditBook</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="no">%s...</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> </section>
<menuitem action="Merge"/> ''' % _('Organize Bookmarks'),
</placeholder> '''
<menuitem action="FilterEdit"/> <placeholder id="CommonGo">
</menu> <section>
<menu action="BookMenu"> <item>
<placeholder name="AddEditBook"> <attribute name="action">win.Back</attribute>
<menuitem action="AddBook"/> <attribute name="label" translatable="yes">_Back</attribute>
<menuitem action="EditBook"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.Forward</attribute>
</menubar> <attribute name="label" translatable="yes">_Forward</attribute>
<toolbar name="ToolBar"> </item>
<placeholder name="CommonNavigation"> </section>
<toolitem action="Back"/> </placeholder>
<toolitem action="Forward"/> ''',
</placeholder> '''
<placeholder name="CommonEdit"> <section id='CommonEdit' groups='RW'>
<toolitem action="Add"/> <item>
<toolitem action="Edit"/> <attribute name="action">win.Add</attribute>
<toolitem action="Remove"/> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Merge"/> </item>
</placeholder> <item>
</toolbar> <attribute name="action">win.Edit</attribute>
<popup name="Popup"> <attribute name="label" translatable="yes">%s</attribute>
<menuitem action="Back"/> </item>
<menuitem action="Forward"/> <item>
<separator/> <attribute name="action">win.Remove</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.Merge</attribute>
<separator/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="MakeFatherActive"/> </item>
<menuitem action="MakeMotherActive"/> </section>
<separator/> ''' % _("action|_Edit..."), # to use sgettext()
<menu name="QuickReport" action="QuickReport"/> '''
</popup> <placeholder id='otheredit'>
</ui>''' <item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Family Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.MakeFatherActive</attribute>
<attribute name="label" translatable="yes">'''
'''Make Father Active Person</attribute>
</item>
<item>
<attribute name="action">win.MakeMotherActive</attribute>
<attribute name="label" translatable="yes">'''
'''Make Mother Active Person</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def define_actions(self): def define_actions(self):
"""Add the Forward action group to handle the Forward button.""" """Add the Forward action group to handle the Forward button."""
ListView.define_actions(self) ListView.define_actions(self)
self._add_action('FilterEdit', None, _('Family Filter Editor'), self.action_list.extend([
callback=self.filter_editor,) ('MakeFatherActive', self._make_father_active),
('MakeMotherActive', self._make_mother_active), ])
self.all_action = Gtk.ActionGroup(name=self.title + "/FamilyAll") def add_bookmark(self, *obj):
self.all_action.add_actions([
('MakeFatherActive', None, _("Make Father Active Person"),
None, None, self._make_father_active),
('MakeMotherActive', None, _("Make Mother Active Person"),
None, None, self._make_mother_active),
('QuickReport', None, _("Quick View"), None, None, None),
])
self._add_action_group(self.all_action)
def add_bookmark(self, obj):
mlist = self.selected_handles() mlist = self.selected_handles()
if mlist: if mlist:
self.bookmarks.add(mlist[0]) self.bookmarks.add(mlist[0])
@ -223,14 +348,14 @@ class FamilyView(ListView):
_("A bookmark could not be set because " _("A bookmark could not be set because "
"no one was selected."), parent=self.uistate.window) "no one was selected."), parent=self.uistate.window)
def add(self, obj): def add(self, *obj):
family = Family() family = Family()
try: try:
EditFamily(self.dbstate, self.uistate, [], family) EditFamily(self.dbstate, self.uistate, [], family)
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
""" """
Method called when deleting a family from a family view. Method called when deleting a family from a family view.
""" """
@ -289,7 +414,7 @@ class FamilyView(ListView):
""" """
pass pass
def edit(self, obj): def edit(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
family = self.dbstate.db.get_family_from_handle(handle) family = self.dbstate.db.get_family_from_handle(handle)
try: try:
@ -297,7 +422,7 @@ class FamilyView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected families. Merge the selected families.
""" """
@ -312,7 +437,7 @@ class FamilyView(ListView):
else: else:
MergeFamily(self.dbstate, self.uistate, [], mlist[0], mlist[1]) MergeFamily(self.dbstate, self.uistate, [], mlist[0], mlist[1])
def _make_father_active(self, obj): def _make_father_active(self, *obj):
""" """
Make the father of the family the active person. Make the father of the family the active person.
""" """
@ -322,7 +447,7 @@ class FamilyView(ListView):
if family: if family:
self.uistate.set_active(family.father_handle, 'Person') self.uistate.set_active(family.father_handle, 'Person')
def _make_mother_active(self, obj): def _make_mother_active(self, *obj):
""" """
Make the mother of the family the active person. Make the mother of the family the active person.
""" """

View File

@ -47,6 +47,7 @@ import gramps.gui.widgets.fanchart2way as fanchart2way
from gramps.gui.views.navigationview import NavigationView from gramps.gui.views.navigationview import NavigationView
from gramps.gui.views.bookmarks import PersonBookmarks from gramps.gui.views.bookmarks import PersonBookmarks
from gramps.gui.utils import SystemFonts from gramps.gui.utils import SystemFonts
from gramps.plugins.view.fanchartview import FanChartView
# the print settings to remember between print sessions # the print settings to remember between print sessions
PRINT_SETTINGS = None PRINT_SETTINGS = None
@ -101,13 +102,9 @@ class FanChart2WayView(fanchart2way.FanChart2WayGrampsGUI, NavigationView):
dbstate.connect('active-changed', self.active_changed) dbstate.connect('active-changed', self.active_changed)
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(FanChartView.additional_ui)
self.allfonts = [x for x in enumerate(SystemFonts().get_system_fonts())] self.allfonts = [x for x in enumerate(SystemFonts().get_system_fonts())]
self.func_list.update({
'<PRIMARY>J' : self.jump,
})
def navigation_type(self): def navigation_type(self):
return 'Person' return 'Person'
@ -144,43 +141,6 @@ class FanChart2WayView(fanchart2way.FanChart2WayGrampsGUI, NavigationView):
""" """
return 'gramps-fanchart' return 'gramps-fanchart'
def additional_ui(self):
return '''<ui>
<menubar name="MenuBar">
<menu action="GoMenu">
<placeholder name="CommonGo">
<menuitem action="Back"/>
<menuitem action="Forward"/>
<separator/>
<menuitem action="HomePerson"/>
<separator/>
</placeholder>
</menu>
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="PrintView"/>
</placeholder>
</menu>
<menu action="BookMenu">
<placeholder name="AddEditBook">
<menuitem action="AddBook"/>
<menuitem action="EditBook"/>
</placeholder>
</menu>
</menubar>
<toolbar name="ToolBar">
<placeholder name="CommonNavigation">
<toolitem action="Back"/>
<toolitem action="Forward"/>
<toolitem action="HomePerson"/>
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="PrintView"/>
</placeholder>
</toolbar>
</ui>
'''
def define_actions(self): def define_actions(self):
""" """
Required define_actions function for PageView. Builds the action Required define_actions function for PageView. Builds the action
@ -188,10 +148,9 @@ class FanChart2WayView(fanchart2way.FanChart2WayGrampsGUI, NavigationView):
""" """
NavigationView.define_actions(self) NavigationView.define_actions(self)
self._add_action('PrintView', Gtk.STOCK_PRINT, _("_Print..."), self._add_action('PrintView', self.printview, "<PRIMARY>P")
accel="<PRIMARY>P", self._add_action('PRIMARY-J', self.jump, '<PRIMARY>J')
tip=_("Print or save the Fan Chart View"),
callback=self.printview)
def build_tree(self): def build_tree(self):
""" """
Generic method called by PageView to construct the view. Generic method called by PageView to construct the view.
@ -249,7 +208,7 @@ class FanChart2WayView(fanchart2way.FanChart2WayGrampsGUI, NavigationView):
if self.active: if self.active:
self.bookmarks.redraw() self.bookmarks.redraw()
def printview(self, obj): def printview(self, *obj):
""" """
Print or save the view that is currently shown Print or save the view that is currently shown
""" """

View File

@ -46,6 +46,7 @@ import gramps.gui.widgets.fanchartdesc as fanchartdesc
from gramps.gui.views.navigationview import NavigationView from gramps.gui.views.navigationview import NavigationView
from gramps.gui.views.bookmarks import PersonBookmarks from gramps.gui.views.bookmarks import PersonBookmarks
from gramps.gui.utils import SystemFonts from gramps.gui.utils import SystemFonts
from gramps.plugins.view.fanchartview import FanChartView
# the print settings to remember between print sessions # the print settings to remember between print sessions
PRINT_SETTINGS = None PRINT_SETTINGS = None
@ -96,13 +97,9 @@ class FanChartDescView(fanchartdesc.FanChartDescGrampsGUI, NavigationView):
dbstate.connect('active-changed', self.active_changed) dbstate.connect('active-changed', self.active_changed)
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(FanChartView.additional_ui)
self.allfonts = [x for x in enumerate(SystemFonts().get_system_fonts())] self.allfonts = [x for x in enumerate(SystemFonts().get_system_fonts())]
self.func_list.update({
'<PRIMARY>J' : self.jump,
})
def navigation_type(self): def navigation_type(self):
return 'Person' return 'Person'
@ -139,43 +136,6 @@ class FanChartDescView(fanchartdesc.FanChartDescGrampsGUI, NavigationView):
""" """
return 'gramps-fanchart' return 'gramps-fanchart'
def additional_ui(self):
return '''<ui>
<menubar name="MenuBar">
<menu action="GoMenu">
<placeholder name="CommonGo">
<menuitem action="Back"/>
<menuitem action="Forward"/>
<separator/>
<menuitem action="HomePerson"/>
<separator/>
</placeholder>
</menu>
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="PrintView"/>
</placeholder>
</menu>
<menu action="BookMenu">
<placeholder name="AddEditBook">
<menuitem action="AddBook"/>
<menuitem action="EditBook"/>
</placeholder>
</menu>
</menubar>
<toolbar name="ToolBar">
<placeholder name="CommonNavigation">
<toolitem action="Back"/>
<toolitem action="Forward"/>
<toolitem action="HomePerson"/>
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="PrintView"/>
</placeholder>
</toolbar>
</ui>
'''
def define_actions(self): def define_actions(self):
""" """
Required define_actions function for PageView. Builds the action Required define_actions function for PageView. Builds the action
@ -183,10 +143,9 @@ class FanChartDescView(fanchartdesc.FanChartDescGrampsGUI, NavigationView):
""" """
NavigationView.define_actions(self) NavigationView.define_actions(self)
self._add_action('PrintView', 'document-print', _("_Print..."), self._add_action('PrintView', self.printview, "<PRIMARY>P")
accel="<PRIMARY>P", self._add_action('PRIMARY-J', self.jump, '<PRIMARY>J')
tip=_("Print or save the Fan Chart View"),
callback=self.printview)
def build_tree(self): def build_tree(self):
""" """
Generic method called by PageView to construct the view. Generic method called by PageView to construct the view.
@ -244,7 +203,7 @@ class FanChartDescView(fanchartdesc.FanChartDescGrampsGUI, NavigationView):
if self.active: if self.active:
self.bookmarks.redraw() self.bookmarks.redraw()
def printview(self, obj): def printview(self, *obj):
""" """
Print or save the view that is currently shown Print or save the view that is currently shown
""" """

View File

@ -34,7 +34,7 @@ from gi.repository import Gdk
from gi.repository import Gtk from gi.repository import Gtk
import cairo import cairo
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -93,13 +93,9 @@ class FanChartView(fanchart.FanChartGrampsGUI, NavigationView):
dbstate.connect('active-changed', self.active_changed) dbstate.connect('active-changed', self.active_changed)
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui)
self.allfonts = [x for x in enumerate(SystemFonts().get_system_fonts())] self.allfonts = [x for x in enumerate(SystemFonts().get_system_fonts())]
self.func_list.update({
'<PRIMARY>J' : self.jump,
})
def navigation_type(self): def navigation_type(self):
return 'Person' return 'Person'
@ -135,42 +131,107 @@ class FanChartView(fanchart.FanChartGrampsGUI, NavigationView):
""" """
return 'gramps-fanchart' return 'gramps-fanchart'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
return '''<ui>
<menubar name="MenuBar">
<menu action="GoMenu">
<placeholder name="CommonGo">
<menuitem action="Back"/>
<menuitem action="Forward"/>
<separator/>
<menuitem action="HomePerson"/>
<separator/>
</placeholder>
</menu>
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="PrintView"/>
</placeholder>
</menu>
<menu action="BookMenu">
<placeholder name="AddEditBook">
<menuitem action="AddBook"/>
<menuitem action="EditBook"/>
</placeholder>
</menu>
</menubar>
<toolbar name="ToolBar">
<placeholder name="CommonNavigation">
<toolitem action="Back"/>
<toolitem action="Forward"/>
<toolitem action="HomePerson"/>
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="PrintView"/>
</placeholder>
</toolbar>
</ui>
''' '''
<placeholder id="CommonGo">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">_Forward</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.HomePerson</attribute>
<attribute name="label" translatable="yes">_Home</attribute>
</item>
</section>
</placeholder>
''',
'''
<section id='CommonEdit' groups='RW'>
<item>
<attribute name="action">win.PrintView</attribute>
<attribute name="label" translatable="yes">_Print...</attribute>
</item>
</section>
''',
'''
<section id="AddEditBook">
<item>
<attribute name="action">win.AddBook</attribute>
<attribute name="label" translatable="yes">_Add Bookmark</attribute>
</item>
<item>
<attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Fan Chart View</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
def define_actions(self): def define_actions(self):
""" """
@ -179,10 +240,9 @@ class FanChartView(fanchart.FanChartGrampsGUI, NavigationView):
""" """
NavigationView.define_actions(self) NavigationView.define_actions(self)
self._add_action('PrintView', 'document-print', _("_Print..."), self._add_action('PrintView', self.printview, "<PRIMARY>P")
accel="<PRIMARY>P", self._add_action('PRIMARY-J', self.jump, '<PRIMARY>J')
tip=_("Print or save the Fan Chart View"),
callback=self.printview)
def build_tree(self): def build_tree(self):
""" """
Generic method called by PageView to construct the view. Generic method called by PageView to construct the view.
@ -240,7 +300,7 @@ class FanChartView(fanchart.FanChartGrampsGUI, NavigationView):
if self.active: if self.active:
self.bookmarks.redraw() self.bookmarks.redraw()
def printview(self, obj): def printview(self, *obj):
""" """
Print or save the view that is currently shown Print or save the view that is currently shown
""" """

View File

@ -54,12 +54,12 @@ from gramps.gen.datehandler import displayer, get_date
from gramps.gen.display.name import displayer as _nd from gramps.gen.display.name import displayer as _nd
from gramps.gen.display.place import displayer as _pd from gramps.gen.display.place import displayer as _pd
from gramps.gen.utils.place import conv_lat_lon from gramps.gen.utils.place import conv_lat_lon
from gramps.gui.views.navigationview import NavigationView
from gramps.gui.views.bookmarks import PersonBookmarks from gramps.gui.views.bookmarks import PersonBookmarks
from gramps.plugins.lib.maps import constants from gramps.plugins.lib.maps import constants
from gramps.plugins.lib.maps.geography import GeoGraphyView from gramps.plugins.lib.maps.geography import GeoGraphyView
from gramps.gui.selectors import SelectorFactory from gramps.gui.selectors import SelectorFactory
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.uimanager import ActionGroup
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -67,43 +67,120 @@ from gramps.gen.utils.db import (get_birth_or_fallback, get_death_or_fallback)
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = [
<ui> '''
<menubar name="MenuBar"> <placeholder id="CommonGo">
<menu action="GoMenu"> <section>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Back</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Back</attribute>
<separator/> </item>
<menuitem action="HomePerson"/> <item>
<separator/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
</menu> </item>
<menu action="EditMenu"> </section>
<placeholder name="CommonEdit"> <section>
<menuitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.HomePerson</attribute>
</menu> <attribute name="label" translatable="yes">_Home</attribute>
<menu action="BookMenu"> </item>
<placeholder name="AddEditBook"> </section>
<menuitem action="AddBook"/> </placeholder>
<menuitem action="EditBook"/> ''',
</placeholder> '''
</menu> <section id='CommonEdit' groups='RW'>
</menubar> <item>
<toolbar name="ToolBar"> <attribute name="action">win.PrintView</attribute>
<placeholder name="CommonNavigation"> <attribute name="label" translatable="yes">_Print...</attribute>
<toolitem action="Back"/> </item>
<toolitem action="Forward"/> </section>
<toolitem action="HomePerson"/> ''',
<toolitem action="RefPerson"/> '''
</placeholder> <section id="AddEditBook">
<placeholder name="CommonEdit"> <item>
<toolitem action="PrintView"/> <attribute name="action">win.AddBook</attribute>
</placeholder> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
</toolbar> </item>
</ui> <item>
''' <attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">gramps-person</property>
<property name="action-name">win.RefPerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Select the person which is the reference for life ways</property>
<property name="label" translatable="yes">reference _Person</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Map</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=unused-argument # pylint: disable=unused-argument
@ -291,18 +368,10 @@ class GeoClose(GeoGraphyView):
""" """
Define action for the reference person button. Define action for the reference person button.
""" """
NavigationView.define_actions(self) GeoGraphyView.define_actions(self)
self._add_action('RefPerson', self.select_person)
self.define_print_actions() def select_person(self, *obj):
self.ref_person = Gtk.ActionGroup(name=self.title + '/Selection')
self.ref_person.add_actions([
('RefPerson', 'gramps-person', _('reference _Person'), None,
_("Select the person which is the reference for life ways"),
self.select_person),
])
self._add_action_group(self.ref_person)
def select_person(self, obj):
""" """
Open a selection box to choose the ref person. Open a selection box to choose the ref person.
""" """

View File

@ -64,39 +64,84 @@ from gramps.gui.utils import ProgressMeter
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = ['''
<ui> <placeholder id="CommonGo">
<menubar name="MenuBar"> <section>
<menu action="GoMenu"> <item>
<placeholder name="CommonGo"> <attribute name="action">win.Back</attribute>
<menuitem action="Back"/> <attribute name="label" translatable="yes">_Back</attribute>
<menuitem action="Forward"/> </item>
<separator/> <item>
</placeholder> <attribute name="action">win.Forward</attribute>
</menu> <attribute name="label" translatable="yes">_Forward</attribute>
<menu action="EditMenu"> </item>
<placeholder name="CommonEdit"> </section>
<menuitem action="PrintView"/> </placeholder>
</placeholder> ''',
</menu> '''
<menu action="BookMenu"> <section id='CommonEdit' groups='RW'>
<placeholder name="AddEditBook"> <item>
<menuitem action="AddBook"/> <attribute name="action">win.PrintView</attribute>
<menuitem action="EditBook"/> <attribute name="label" translatable="yes">_Print...</attribute>
</placeholder> </item>
</menu> </section>
</menubar> ''',
<toolbar name="ToolBar"> '''
<placeholder name="CommonNavigation"> <section id="AddEditBook">
<toolitem action="Back"/> <item>
<toolitem action="Forward"/> <attribute name="action">win.AddBook</attribute>
</placeholder> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<placeholder name="CommonEdit"> </item>
<toolitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.EditBook</attribute>
</toolbar> <attribute name="label" translatable="no">%s...</attribute>
</ui> </item>
''' </section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">Print or save the Map</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=unused-argument # pylint: disable=unused-argument
# pylint: disable=no-member # pylint: disable=no-member

View File

@ -65,43 +65,120 @@ from gramps.gui.selectors import SelectorFactory
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = [
<ui> '''
<menubar name="MenuBar"> <placeholder id="CommonGo">
<menu action="GoMenu"> <section>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Back</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Back</attribute>
<separator/> </item>
<menuitem action="HomePerson"/> <item>
<separator/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
</menu> </item>
<menu action="EditMenu"> </section>
<placeholder name="CommonEdit"> <section>
<menuitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.HomePerson</attribute>
</menu> <attribute name="label" translatable="yes">_Home</attribute>
<menu action="BookMenu"> </item>
<placeholder name="AddEditBook"> </section>
<menuitem action="AddBook"/> </placeholder>
<menuitem action="EditBook"/> ''',
</placeholder> '''
</menu> <section id='CommonEdit' groups='RW'>
</menubar> <item>
<toolbar name="ToolBar"> <attribute name="action">win.PrintView</attribute>
<placeholder name="CommonNavigation"> <attribute name="label" translatable="yes">_Print...</attribute>
<toolitem action="Back"/> </item>
<toolitem action="Forward"/> </section>
<toolitem action="HomePerson"/> ''',
<toolitem action="RefFamily"/> '''
</placeholder> <section id="AddEditBook">
<placeholder name="CommonEdit"> <item>
<toolitem action="PrintView"/> <attribute name="action">win.AddBook</attribute>
</placeholder> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
</toolbar> </item>
</ui> <item>
''' <attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">gramps-family</property>
<property name="action-name">win.RefFamily</property>
<property name="tooltip_text" translatable="yes">'''
'''Select the family which is the reference for life ways</property>
<property name="label" translatable="yes">reference _Family</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Map</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=unused-variable # pylint: disable=unused-variable
@ -287,18 +364,10 @@ class GeoFamClose(GeoGraphyView):
""" """
Define action for the reference family button. Define action for the reference family button.
""" """
NavigationView.define_actions(self) GeoGraphyView.define_actions(self)
self._add_action('RefFamily', self.select_family)
self.define_print_actions() def select_family(self, *obj):
self.ref_family = Gtk.ActionGroup(self.title + '/Selection')
self.ref_family.add_actions([
('RefFamily', 'gramps-family', _('reference _Family'), None,
_("Select the family which is the reference for life ways"),
self.select_family),
])
self._add_action_group(self.ref_family)
def select_family(self, obj):
""" """
Open a selection box to choose the ref family. Open a selection box to choose the ref family.
""" """

View File

@ -63,39 +63,88 @@ from gramps.plugins.lib.maps.geography import GeoGraphyView
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = [
<ui> '''
<menubar name="MenuBar"> <placeholder id="CommonGo">
<menu action="GoMenu"> <section>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Back</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Back</attribute>
<separator/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.Forward</attribute>
<menu action="EditMenu"> <attribute name="label" translatable="yes">_Forward</attribute>
<placeholder name="CommonEdit"> </item>
<menuitem action="PrintView"/> </section>
</placeholder> </placeholder>
</menu> ''',
<menu action="BookMenu"> '''
<placeholder name="AddEditBook"> <section id='CommonEdit' groups='RW'>
<menuitem action="AddBook"/> <item>
<menuitem action="EditBook"/> <attribute name="action">win.PrintView</attribute>
</placeholder> <attribute name="label" translatable="yes">_Print...</attribute>
</menu> </item>
</menubar> </section>
<toolbar name="ToolBar"> ''',
<placeholder name="CommonNavigation"> '''
<toolitem action="Back"/> <section id="AddEditBook">
<toolitem action="Forward"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<toolitem action="PrintView"/> </item>
</placeholder> <item>
</toolbar> <attribute name="action">win.EditBook</attribute>
</ui> <attribute name="label" translatable="no">%s...</attribute>
''' </item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">...
...Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Map</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=unused-variable # pylint: disable=unused-variable

View File

@ -64,42 +64,107 @@ from gramps.plugins.lib.maps.geography import GeoGraphyView
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = [
<ui> '''
<menubar name="MenuBar"> <placeholder id="CommonGo">
<menu action="GoMenu"> <section>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Back</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Back</attribute>
<separator/> </item>
<menuitem action="HomePerson"/> <item>
<separator/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
</menu> </item>
<menu action="EditMenu"> </section>
<placeholder name="CommonEdit"> <section>
<menuitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.HomePerson</attribute>
</menu> <attribute name="label" translatable="yes">_Home</attribute>
<menu action="BookMenu"> </item>
<placeholder name="AddEditBook"> </section>
<menuitem action="AddBook"/> </placeholder>
<menuitem action="EditBook"/> ''',
</placeholder> '''
</menu> <section id='CommonEdit' groups='RW'>
</menubar> <item>
<toolbar name="ToolBar"> <attribute name="action">win.PrintView</attribute>
<placeholder name="CommonNavigation"> <attribute name="label" translatable="yes">_Print...</attribute>
<toolitem action="Back"/> </item>
<toolitem action="Forward"/> </section>
<toolitem action="HomePerson"/> ''',
</placeholder> '''
<placeholder name="CommonEdit"> <section id="AddEditBook">
<toolitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
</toolbar> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
</ui> </item>
''' <item>
<attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Map</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=unused-variable # pylint: disable=unused-variable

View File

@ -65,42 +65,107 @@ from gramps.plugins.lib.maps.geography import GeoGraphyView
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = [
<ui> '''
<menubar name="MenuBar"> <placeholder id="CommonGo">
<menu action="GoMenu"> <section>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Back</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Back</attribute>
<separator/> </item>
<menuitem action="HomePerson"/> <item>
<separator/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
</menu> </item>
<menu action="EditMenu"> </section>
<placeholder name="CommonEdit"> <section>
<menuitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.HomePerson</attribute>
</menu> <attribute name="label" translatable="yes">_Home</attribute>
<menu action="BookMenu"> </item>
<placeholder name="AddEditBook"> </section>
<menuitem action="AddBook"/> </placeholder>
<menuitem action="EditBook"/> ''',
</placeholder> '''
</menu> <section id='CommonEdit' groups='RW'>
</menubar> <item>
<toolbar name="ToolBar"> <attribute name="action">win.PrintView</attribute>
<placeholder name="CommonNavigation"> <attribute name="label" translatable="yes">_Print...</attribute>
<toolitem action="Back"/> </item>
<toolitem action="Forward"/> </section>
<toolitem action="HomePerson"/> ''',
</placeholder> '''
<placeholder name="CommonEdit"> <section id="AddEditBook">
<toolitem action="PrintView"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
</toolbar> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
</ui> </item>
''' <item>
<attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Map</property>
<property name="label" translatable="yes">reference _Family</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=maybe-no-member # pylint: disable=maybe-no-member

View File

@ -65,39 +65,88 @@ from gramps.gui.utils import ProgressMeter
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
_UI_DEF = '''\ _UI_DEF = [
<ui> '''
<menubar name="MenuBar"> <placeholder id="CommonGo">
<menu action="GoMenu"> <section>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Back</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Back</attribute>
<separator/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.Forward</attribute>
<menu action="EditMenu"> <attribute name="label" translatable="yes">_Forward</attribute>
<placeholder name="CommonEdit"> </item>
<menuitem action="PrintView"/> </section>
</placeholder> </placeholder>
</menu> ''',
<menu action="BookMenu"> '''
<placeholder name="AddEditBook"> <section id='CommonEdit' groups='RW'>
<menuitem action="AddBook"/> <item>
<menuitem action="EditBook"/> <attribute name="action">win.PrintView</attribute>
</placeholder> <attribute name="label" translatable="yes">_Print...</attribute>
</menu> </item>
</menubar> </section>
<toolbar name="ToolBar"> ''',
<placeholder name="CommonNavigation"> '''
<toolitem action="Back"/> <section id="AddEditBook">
<toolitem action="Forward"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<toolitem action="PrintView"/> </item>
</placeholder> <item>
</toolbar> <attribute name="action">win.EditBook</attribute>
</ui> <attribute name="label" translatable="no">%s...</attribute>
''' </item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">document-print</property>
<property name="action-name">win.PrintView</property>
<property name="tooltip_text" translatable="yes">'''
'''Print or save the Map</property>
<property name="label" translatable="yes">_Print...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
# pylint: disable=no-member # pylint: disable=no-member
# pylint: disable=maybe-no-member # pylint: disable=maybe-no-member

View File

@ -30,7 +30,7 @@ Media View.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
import os import os
from urllib.parse import urlparse from urllib.parse import urlparse
from urllib.request import url2pathname from urllib.request import url2pathname
@ -133,12 +133,7 @@ class MediaView(ListView):
filter_class=MediaSidebarFilter, filter_class=MediaSidebarFilter,
multiple=True) multiple=True)
self.func_list.update({ self.additional_uis.append(self.additional_ui)
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.additional_uis.append(self.additional_ui())
self.uistate = uistate self.uistate = uistate
def navigation_type(self): def navigation_type(self):
@ -206,19 +201,10 @@ class MediaView(ListView):
""" """
ListView.define_actions(self) ListView.define_actions(self)
self._add_action('FilterEdit', None, _('Media Filter Editor'), self._add_action('OpenMedia', self.view_media)
callback=self.filter_editor) self._add_action('OpenContainingFolder', self.open_containing_folder)
self._add_action('OpenMedia', 'gramps-viewmedia', _('View'),
tip=_("View in the default viewer"),
callback=self.view_media)
self._add_action('OpenContainingFolder', None,
_('Open Containing _Folder'),
tip=_("Open the folder containing the media file"),
callback=self.open_containing_folder)
self._add_action('QuickReport', None, _("Quick View"), None, None, None) def view_media(self, *obj):
def view_media(self, obj):
""" """
Launch external viewers for the selected objects. Launch external viewers for the selected objects.
""" """
@ -227,7 +213,7 @@ class MediaView(ListView):
mpath = media_path_full(self.dbstate.db, ref_obj.get_path()) mpath = media_path_full(self.dbstate.db, ref_obj.get_path())
open_file_with_default_application(mpath, self.uistate) open_file_with_default_application(mpath, self.uistate)
def open_containing_folder(self, obj): def open_containing_folder(self, *obj):
""" """
Launch external viewers for the selected objects. Launch external viewers for the selected objects.
""" """
@ -244,78 +230,225 @@ class MediaView(ListView):
""" """
return 'gramps-media' return 'gramps-media'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
""" '''
Return the UIManager XML description of the menus <placeholder id="LocalExport">
""" <item>
return '''<ui> <attribute name="action">win.ExportTab</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">Export View...</attribute>
<menu action="FileMenu"> </item>
<placeholder name="LocalExport"> </placeholder>
<menuitem action="ExportTab"/> ''',
</placeholder> '''
</menu> <section id="AddEditBook">
<menu action="EditMenu"> <item>
<placeholder name="CommonEdit"> <attribute name="action">win.AddBook</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.EditBook</attribute>
</placeholder> <attribute name="label" translatable="no">%s...</attribute>
<menuitem action="FilterEdit"/> </item>
</menu> </section>
<menu action="BookMenu"> ''' % _('Organize Bookmarks'),
<placeholder name="AddEditBook"> '''
<menuitem action="AddBook"/> <placeholder id="CommonGo">
<menuitem action="EditBook"/> <section>
</placeholder> <item>
</menu> <attribute name="action">win.Back</attribute>
<menu action="GoMenu"> <attribute name="label" translatable="yes">_Back</attribute>
<placeholder name="CommonGo"> </item>
<menuitem action="Back"/> <item>
<menuitem action="Forward"/> <attribute name="action">win.Forward</attribute>
<separator/> <attribute name="label" translatable="yes">_Forward</attribute>
</placeholder> </item>
</menu> </section>
</menubar> </placeholder>
<toolbar name="ToolBar"> ''',
<placeholder name="CommonNavigation"> '''
<toolitem action="Back"/> <section id='CommonEdit' groups='RW'>
<toolitem action="Forward"/> <item>
</placeholder> <attribute name="action">win.Add</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Add"/> </item>
<toolitem action="Edit"/> <item>
<toolitem action="Remove"/> <attribute name="action">win.Edit</attribute>
<toolitem action="Merge"/> <attribute name="label" translatable="yes">%s</attribute>
</placeholder> </item>
<separator/> <item>
<toolitem action="OpenMedia"/> <attribute name="action">win.Remove</attribute>
</toolbar> <attribute name="label" translatable="yes">_Delete</attribute>
<popup name="Popup"> </item>
<menuitem action="Back"/> <item>
<menuitem action="Forward"/> <attribute name="action">win.Merge</attribute>
<separator/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="OpenMedia"/> </item>
<menuitem action="OpenContainingFolder"/> </section>
<separator/> ''' % _("action|_Edit..."), # to use sgettext()
<menuitem action="Add"/> '''
<menuitem action="Edit"/> <placeholder id='otheredit'>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.FilterEdit</attribute>
<separator/> <attribute name="label" translatable="yes">'''
<menu name="QuickReport" action="QuickReport"/> '''Media Filter Editor</attribute>
</popup> </item>
</ui>''' </placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<placeholder id='AfterTools'>
<child>
<object class="GtkToolButton">
<property name="icon-name">gramps-viewmedia</property>
<property name="action-name">win.OpenMedia</property>
<property name="tooltip_text" translatable="yes">'''
'''View in the default viewer</property>
<property name="label" translatable="yes">View</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
<item>
<attribute name="action">win.OpenMedia</attribute>
<attribute name="label" translatable="yes">View</attribute>
</item>
<item>
<attribute name="action">win.OpenContainingFolder</attribute>
<attribute name="label" translatable="yes">'''
'''Open Containing _Folder</attribute>
</item>
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def add(self, obj): def add(self, *obj):
"""Add a new media object to the media list""" """Add a new media object to the media list"""
try: try:
EditMedia(self.dbstate, self.uistate, [], Media()) EditMedia(self.dbstate, self.uistate, [], Media())
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
@ -329,7 +462,7 @@ class MediaView(ListView):
is_used = any(the_lists) is_used = any(the_lists)
return (query, is_used, object) return (query, is_used, object)
def edit(self, obj): def edit(self, *obj):
""" """
Edit the selected objects in the EditMedia dialog Edit the selected objects in the EditMedia dialog
""" """
@ -340,7 +473,7 @@ class MediaView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected objects. Merge the selected objects.
""" """

View File

@ -28,7 +28,7 @@ Note View.
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
import logging import logging
_LOG = logging.getLogger(".plugins.noteview") _LOG = logging.getLogger(".plugins.noteview")
@ -113,12 +113,7 @@ class NoteView(ListView):
filter_class=NoteSidebarFilter, filter_class=NoteSidebarFilter,
multiple=True) multiple=True)
self.func_list.update({ self.additional_uis.append(self.additional_ui)
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.additional_uis.append(self.additional_ui())
def navigation_type(self): def navigation_type(self):
return 'Note' return 'Note'
@ -135,70 +130,191 @@ class NoteView(ListView):
""" """
return 'gramps-notes' return 'gramps-notes'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
""" '''
Defines the UI string for UIManager <placeholder id="LocalExport">
""" <item>
return '''<ui> <attribute name="action">win.ExportTab</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">Export View...</attribute>
<menu action="FileMenu"> </item>
<placeholder name="LocalExport"> </placeholder>
<menuitem action="ExportTab"/> ''',
</placeholder> '''
</menu> <section id="AddEditBook">
<menu action="BookMenu"> <item>
<placeholder name="AddEditBook"> <attribute name="action">win.AddBook</attribute>
<menuitem action="AddBook"/> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menuitem action="EditBook"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.EditBook</attribute>
<menu action="GoMenu"> <attribute name="label" translatable="no">%s...</attribute>
<placeholder name="CommonGo"> </item>
<menuitem action="Back"/> </section>
<menuitem action="Forward"/> ''' % _('Organize Bookmarks'),
<separator/> '''
</placeholder> <placeholder id="CommonGo">
</menu> <section>
<menu action="EditMenu"> <item>
<placeholder name="CommonEdit"> <attribute name="action">win.Back</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Back</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.Forward</attribute>
</placeholder> <attribute name="label" translatable="yes">_Forward</attribute>
<menuitem action="FilterEdit"/> </item>
</menu> </section>
</menubar> </placeholder>
<toolbar name="ToolBar"> ''',
<placeholder name="CommonNavigation"> '''
<toolitem action="Back"/> <section id='CommonEdit' groups='RW'>
<toolitem action="Forward"/> <item>
</placeholder> <attribute name="action">win.Add</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Add"/> </item>
<toolitem action="Edit"/> <item>
<toolitem action="Remove"/> <attribute name="action">win.Edit</attribute>
<toolitem action="Merge"/> <attribute name="label" translatable="yes">%s</attribute>
</placeholder> </item>
</toolbar> <item>
<popup name="Popup"> <attribute name="action">win.Remove</attribute>
<menuitem action="Back"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Forward"/> </item>
<separator/> <item>
<menuitem action="Add"/> <attribute name="action">win.Merge</attribute>
<menuitem action="Edit"/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menuitem action="Remove"/> </item>
<menuitem action="Merge"/> </section>
<separator/> ''' % _("action|_Edit..."), # to use sgettext()
<menu name="QuickReport" action="QuickReport"/> '''
</popup> <placeholder id='otheredit'>
</ui>''' <item>
<attribute name="action">win.FilterEdit</attribute>
def define_actions(self): <attribute name="label" translatable="yes">'''
ListView.define_actions(self) '''Note Filter Editor</attribute>
self._add_action('FilterEdit', None, _('Note Filter Editor'), </item>
callback=self.filter_editor,) </placeholder>
self._add_action('QuickReport', None, _("Quick View"), None, None, None) ''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def get_handle_from_gramps_id(self, gid): def get_handle_from_gramps_id(self, gid):
obj = self.dbstate.db.get_note_from_gramps_id(gid) obj = self.dbstate.db.get_note_from_gramps_id(gid)
@ -207,13 +323,13 @@ class NoteView(ListView):
else: else:
return None return None
def add(self, obj): def add(self, *obj):
try: try:
EditNote(self.dbstate, self.uistate, [], Note()) EditNote(self.dbstate, self.uistate, [], Note())
except WindowActiveError: except WindowActiveError:
pass pass
def remove(self, obj): def remove(self, *obj):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
@ -223,7 +339,7 @@ class NoteView(ListView):
is_used = any(the_lists) is_used = any(the_lists)
return (query, is_used, object) return (query, is_used, object)
def edit(self, obj): def edit(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
note = self.dbstate.db.get_note_from_handle(handle) note = self.dbstate.db.get_note_from_handle(handle)
try: try:
@ -231,7 +347,7 @@ class NoteView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected notes. Merge the selected notes.
""" """

View File

@ -63,7 +63,6 @@ from gramps.gui.ddtargets import DdTargets
from gramps.gen.config import config from gramps.gen.config import config
from gramps.gui.views.bookmarks import PersonBookmarks from gramps.gui.views.bookmarks import PersonBookmarks
from gramps.gen.const import CUSTOM_FILTERS from gramps.gen.const import CUSTOM_FILTERS
from gramps.gen.constfunc import is_quartz, win
from gramps.gui.dialog import RunDatabaseRepair, ErrorDialog from gramps.gui.dialog import RunDatabaseRepair, ErrorDialog
from gramps.gui.utils import color_graph_box, hex_to_rgb_float, is_right_click from gramps.gui.utils import color_graph_box, hex_to_rgb_float, is_right_click
from gramps.gen.constfunc import lin from gramps.gen.constfunc import lin
@ -528,11 +527,6 @@ class PedigreeView(NavigationView):
NavigationView.__init__(self, _('Pedigree'), pdata, dbstate, uistate, NavigationView.__init__(self, _('Pedigree'), pdata, dbstate, uistate,
PersonBookmarks, nav_group) PersonBookmarks, nav_group)
self.func_list.update({
'F2' : self.kb_goto_home,
'<PRIMARY>J' : self.jump,
})
self.dbstate = dbstate self.dbstate = dbstate
self.dbstate.connect('database-changed', self.change_db) self.dbstate.connect('database-changed', self.change_db)
uistate.connect('nameformat-changed', self.person_rebuild) uistate.connect('nameformat-changed', self.person_rebuild)
@ -551,7 +545,7 @@ class PedigreeView(NavigationView):
self.scrolledwindow = None self.scrolledwindow = None
self.table = None self.table = None
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui)
# Automatic resize # Automatic resize
self.force_size = self._config.get('interface.pedview-tree-size') self.force_size = self._config.get('interface.pedview-tree-size')
@ -572,10 +566,6 @@ class PedigreeView(NavigationView):
self.show_unknown_people = self._config.get( self.show_unknown_people = self._config.get(
'interface.pedview-show-unknown-people') 'interface.pedview-show-unknown-people')
self.func_list.update({
'<PRIMARY>J' : self.jump,
})
def get_handle_from_gramps_id(self, gid): def get_handle_from_gramps_id(self, gid):
""" """
returns the handle of the specified object returns the handle of the specified object
@ -642,41 +632,91 @@ class PedigreeView(NavigationView):
return self.scrolledwindow return self.scrolledwindow
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
""" '''
Specifies the UIManager XML code that defines the menus and buttons <placeholder id="CommonGo">
associated with the interface. <section>
""" <item>
return '''<ui> <attribute name="action">win.Back</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">_Back</attribute>
<menu action="GoMenu"> </item>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Forward</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">_Forward</attribute>
<separator/> </item>
<menuitem action="HomePerson"/> </section>
<separator/> <section>
</placeholder> <item>
</menu> <attribute name="action">win.HomePerson</attribute>
<menu action="EditMenu"> <attribute name="label" translatable="yes">_Home</attribute>
<menuitem action="SetActive"/> </item>
<menuitem action="FilterEdit"/> </section>
</menu> </placeholder>
<menu action="BookMenu"> ''',
<placeholder name="AddEditBook"> '''
<menuitem action="AddBook"/> <section id="AddEditBook">
<menuitem action="EditBook"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
</menu> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
</menubar> </item>
<toolbar name="ToolBar"> <item>
<placeholder name="CommonNavigation"> <attribute name="action">win.EditBook</attribute>
<toolitem action="Back"/> <attribute name="label" translatable="no">%s...</attribute>
<toolitem action="Forward"/> </item>
<toolitem action="HomePerson"/> </section>
</placeholder> ''' % _('Organize Bookmarks'),
</toolbar> '''
</ui>''' <placeholder id='otheredit'>
<item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Person Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
def define_actions(self): def define_actions(self):
""" """
@ -693,10 +733,11 @@ class PedigreeView(NavigationView):
""" """
NavigationView.define_actions(self) NavigationView.define_actions(self)
self._add_action('FilterEdit', None, _('Person Filter Editor'), self._add_action('FilterEdit', self.cb_filter_editor)
callback=self.cb_filter_editor) self._add_action('F2', self.kb_goto_home, 'F2')
self._add_action('PRIMARY-J', self.jump, '<PRIMARY>J')
def cb_filter_editor(self, obj): def cb_filter_editor(self, *obj):
""" """
Display the person filter editor. Display the person filter editor.
""" """
@ -1520,7 +1561,7 @@ class PedigreeView(NavigationView):
else: else:
self.scroll_direction = False self.scroll_direction = False
def kb_goto_home(self): def kb_goto_home(self, *obj):
"""Goto home person from keyboard.""" """Goto home person from keyboard."""
self.cb_home(None) self.cb_home(None)

View File

@ -78,82 +78,28 @@ class PersonTreeView(BasePersonView):
""" """
BasePersonView.define_actions(self) BasePersonView.define_actions(self)
self.all_action.add_actions([ self.action_list.extend([
('OpenAllNodes', None, _("Expand all Nodes"), None, None, ('OpenAllNodes', self.open_all_nodes),
self.open_all_nodes), ('CloseAllNodes', self.close_all_nodes)])
('CloseAllNodes', None, _("Collapse all Nodes"), None, None,
self.close_all_nodes),
])
def additional_ui(self): additional_ui = BasePersonView.additional_ui[:]
""" additional_ui.append( # Defines the UI string for UIManager
Defines the UI string for UIManager '''
""" <section id="PopUpTree">
return '''<ui> <item>
<menubar name="MenuBar"> <attribute name="action">win.OpenAllNodes</attribute>
<menu action="FileMenu"> <attribute name="label" translatable="yes">'''
<placeholder name="LocalExport"> '''Expand all Nodes</attribute>
<menuitem action="ExportTab"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.CloseAllNodes</attribute>
<menu action="BookMenu"> <attribute name="label" translatable="yes">'''
<placeholder name="AddEditBook"> '''Collapse all Nodes</attribute>
<menuitem action="AddBook"/> </item>
<menuitem action="EditBook"/> </section>
</placeholder> ''')
</menu>
<menu action="GoMenu">
<placeholder name="CommonGo">
<menuitem action="Back"/>
<menuitem action="Forward"/>
<separator/>
<menuitem action="HomePerson"/>
<separator/>
</placeholder>
</menu>
<menu action="EditMenu">
<placeholder name="CommonEdit">
<menuitem action="Add"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
</placeholder>
<menuitem action="SetActive"/>
<menuitem action="FilterEdit"/>
</menu>
</menubar>
<toolbar name="ToolBar">
<placeholder name="CommonNavigation">
<toolitem action="Back"/>
<toolitem action="Forward"/>
<toolitem action="HomePerson"/>
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="Add"/>
<toolitem action="Edit"/>
<toolitem action="Remove"/>
<toolitem action="Merge"/>
</placeholder>
</toolbar>
<popup name="Popup">
<menuitem action="Back"/>
<menuitem action="Forward"/>
<menuitem action="HomePerson"/>
<separator/>
<menuitem action="OpenAllNodes"/>
<menuitem action="CloseAllNodes"/>
<separator/>
<menuitem action="Add"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
<separator/>
<menu name="QuickReport" action="QuickReport"/>
<menu name="WebConnect" action="WebConnect"/>
</popup>
</ui>'''
def add(self, obj): def add(self, *obj):
person = Person() person = Person()
# attempt to get the current surname # attempt to get the current surname

View File

@ -67,80 +67,39 @@ class PlaceTreeView(PlaceBaseView):
""" """
PlaceBaseView.define_actions(self) PlaceBaseView.define_actions(self)
self._add_action('OpenBranch', None, _("Expand this Entire Group"), self._add_action('OpenBranch', self.open_branch)
callback=self.open_branch) self._add_action('CloseBranch', self.close_branch)
self._add_action('CloseBranch', None, _("Collapse this Entire Group"), self._add_action('OpenAllNodes', self.open_all_nodes)
callback=self.close_branch) self._add_action('CloseAllNodes', self.close_all_nodes)
self._add_action('OpenAllNodes', None, _("Expand all Nodes"),
callback=self.open_all_nodes)
self._add_action('CloseAllNodes', None, _("Collapse all Nodes"),
callback=self.close_all_nodes)
def additional_ui(self): additional_ui = PlaceBaseView.additional_ui[:]
""" additional_ui.append(
A user interface definition including tree specific actions. '''
""" <section id="PopUpTree">
return '''<ui> <item>
<menubar name="MenuBar"> <attribute name="action">win.OpenBranch</attribute>
<menu action="FileMenu"> <attribute name="label" translatable="yes">'''
<placeholder name="LocalExport"> '''Expand this Entire Group</attribute>
<menuitem action="ExportTab"/> </item>
</placeholder> <item>
</menu> <attribute name="action">win.CloseBranch</attribute>
<menu action="BookMenu"> <attribute name="label" translatable="yes">'''
<placeholder name="AddEditBook"> '''Collapse this Entire Group</attribute>
<menuitem action="AddBook"/> </item>
<menuitem action="EditBook"/> <item>
</placeholder> <attribute name="action">win.OpenAllNodes</attribute>
</menu> <attribute name="label" translatable="yes">'''
<menu action="GoMenu"> '''Expand all Nodes</attribute>
<placeholder name="CommonGo"> </item>
<menuitem action="Back"/> <item>
<menuitem action="Forward"/> <attribute name="action">win.CloseAllNodes</attribute>
<separator/> <attribute name="label" translatable="yes">'''
</placeholder> '''Collapse all Nodes</attribute>
</menu> </item>
<menu action="EditMenu"> </section>
<placeholder name="CommonEdit"> ''')
<menuitem action="Add"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
</placeholder>
<menuitem action="FilterEdit"/>
</menu>
</menubar>
<toolbar name="ToolBar">
<placeholder name="CommonNavigation">
<toolitem action="Back"/>
<toolitem action="Forward"/>
</placeholder>
<placeholder name="CommonEdit">
<toolitem action="Add"/>
<toolitem action="Edit"/>
<toolitem action="Remove"/>
<toolitem action="Merge"/>
<separator/>
</placeholder>
</toolbar>
<popup name="Popup">
<menuitem action="OpenBranch"/>
<menuitem action="CloseBranch"/>
<menuitem action="OpenAllNodes"/>
<menuitem action="CloseAllNodes"/>
<separator/>
<menuitem action="Add"/>
<menuitem action="Edit"/>
<menuitem action="Remove"/>
<menuitem action="Merge"/>
<separator/>
<menu name="QuickReport" action="QuickReport"/>
<separator/>
<menuitem action="GotoMap"/>
</popup>
</ui>'''
def add(self, obj): def add(self, *obj):
""" """
Add a new place. Use the currently selected rows as parent places. Add a new place. Use the currently selected rows as parent places.
""" """

View File

@ -60,7 +60,7 @@ from gramps.gen.lib import (ChildRef, EventRoleType, EventType, Family,
from gramps.gen.lib.date import Today from gramps.gen.lib.date import Today
from gramps.gen.db import DbTxn from gramps.gen.db import DbTxn
from gramps.gui.views.navigationview import NavigationView from gramps.gui.views.navigationview import NavigationView
from gramps.gui.actiongroup import ActionGroup from gramps.gui.uimanager import ActionGroup
from gramps.gui.editors import EditPerson, EditFamily from gramps.gui.editors import EditPerson, EditFamily
from gramps.gui.editors import FilterEditor from gramps.gui.editors import FilterEditor
from gramps.gen.display.name import displayer as name_displayer from gramps.gen.display.name import displayer as name_displayer
@ -138,10 +138,6 @@ class RelationshipView(NavigationView):
PersonBookmarks, PersonBookmarks,
nav_group) nav_group)
self.func_list.update({
'<PRIMARY>J' : self.jump,
})
dbstate.connect('database-changed', self.change_db) dbstate.connect('database-changed', self.change_db)
uistate.connect('nameformat-changed', self.build_tree) uistate.connect('nameformat-changed', self.build_tree)
uistate.connect('placeformat-changed', self.build_tree) uistate.connect('placeformat-changed', self.build_tree)
@ -153,7 +149,7 @@ class RelationshipView(NavigationView):
self.reorder_sensitive = False self.reorder_sensitive = False
self.collapsed_items = {} self.collapsed_items = {}
self.additional_uis.append(self.additional_ui()) self.additional_uis.append(self.additional_ui)
self.show_siblings = self._config.get('preferences.family-siblings') self.show_siblings = self._config.get('preferences.family-siblings')
self.show_details = self._config.get('preferences.family-details') self.show_details = self._config.get('preferences.family-details')
@ -335,102 +331,205 @@ class RelationshipView(NavigationView):
container.show_all() container.show_all()
return container return container
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
""" '''
Specifies the UIManager XML code that defines the menus and buttons <placeholder id="CommonGo">
associated with the interface. <section>
""" <item>
return '''<ui> <attribute name="action">win.Back</attribute>
<menubar name="MenuBar"> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menu action="GoMenu"> </item>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.Forward</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="yes">'''
<separator/> '''Organize Bookmarks...</attribute>
<menuitem action="HomePerson"/> </item>
<separator/> </section>
</placeholder> <section>
</menu> <item>
<menu action="EditMenu"> <attribute name="action">win.HomePerson</attribute>
<menuitem action="Edit"/> <attribute name="label" translatable="yes">_Home</attribute>
<menuitem action="AddParentsMenu"/> </item>
<menuitem action="ShareFamilyMenu"/> </section>
<menuitem action="AddSpouseMenu"/> </placeholder>
<menuitem action="ChangeOrder"/> ''',
<menuitem action="SetActive"/> '''
<menuitem action="FilterEdit"/> <placeholder id='otheredit'>
</menu> <item>
<menu action="BookMenu"> <attribute name="action">win.Edit</attribute>
<placeholder name="AddEditBook"> <attribute name="label" translatable="yes">Edit...</attribute>
<menuitem action="AddBook"/> </item>
<menuitem action="EditBook"/> <item>
</placeholder> <attribute name="action">win.AddParents</attribute>
</menu> <attribute name="label" translatable="yes">'''
<menu action="ViewMenu"> '''Add New Parents...</attribute>
</menu> </item>
</menubar> <item>
<toolbar name="ToolBar"> <attribute name="action">win.ShareFamily</attribute>
<placeholder name="CommonNavigation"> <attribute name="label" translatable="yes">'''
<toolitem action="Back"/> '''Add Existing Parents...</attribute>
<toolitem action="Forward"/> </item>
<toolitem action="HomePerson"/> <item>
</placeholder> <attribute name="action">win.AddSpouse</attribute>
<placeholder name="CommonEdit"> <attribute name="label" translatable="yes">Add Partner...</attribute>
<toolitem action="Edit"/> </item>
<toolitem action="AddParents"/> <item>
<toolitem action="ShareFamily"/> <attribute name="action">win.ChangeOrder</attribute>
<toolitem action="AddSpouse"/> <attribute name="label" translatable="yes">_Reorder</attribute>
<toolitem action="ChangeOrder"/> </item>
</placeholder> <item>
</toolbar> <attribute name="action">win.FilterEdit</attribute>
<popup name="Popup"> <attribute name="label" translatable="yes">'''
<menuitem action="Back"/> '''Person Filter Editor</attribute>
<menuitem action="Forward"/> </item>
<menuitem action="HomePerson"/> </placeholder>
<separator/> ''',
</popup> '''
</ui>''' <section id="AddEditBook">
<item>
<attribute name="action">win.AddBook</attribute>
<attribute name="label" translatable="yes">_Add Bookmark</attribute>
</item>
<item>
<attribute name="action">win.EditBook</attribute>
<attribute name="label" translatable="no">%s...</attribute>
</item>
</section>
''' % _('Organize Bookmarks'), # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-home</property>
<property name="action-name">win.HomePerson</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the default person</property>
<property name="label" translatable="yes">_Home</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">'''
'''Edit the active person</property>
<property name="label" translatable="yes">Edit...</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-parents-add</property>
<property name="action-name">win.AddParents</property>
<property name="tooltip_text" translatable="yes">'''
'''Add a new set of parents</property>
<property name="label" translatable="yes">Add</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-parents-open</property>
<property name="action-name">win.ShareFamily</property>
<property name="tooltip_text" translatable="yes">'''
'''Add person as child to an existing family</property>
<property name="label" translatable="yes">Share</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-spouse</property>
<property name="action-name">win.AddSpouse</property>
<property name="tooltip_text" translatable="yes">'''
'''Add a new family with person as parent</property>
<property name="label" translatable="yes">Partner</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">view-sort-ascending</property>
<property name="action-name">win.ChangeOrder</property>
<property name="tooltip_text" translatable="yes">'''
'''Change order of parents and families</property>
<property name="label" translatable="yes">_Reorder</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''']
def define_actions(self): def define_actions(self):
NavigationView.define_actions(self) NavigationView.define_actions(self)
self.order_action = ActionGroup(name=self.title + '/ChangeOrder') self.order_action = ActionGroup(name=self.title + '/ChangeOrder')
self.order_action.add_actions([ self.order_action.add_actions([
('ChangeOrder', 'view-sort-ascending', _('_Reorder'), None , ('ChangeOrder', self.reorder)])
_("Change order of parents and families"), self.reorder),
])
self.family_action = ActionGroup(name=self.title + '/Family') self.family_action = ActionGroup(name=self.title + '/Family')
self.family_action.add_actions([ self.family_action.add_actions([
('Edit', 'gtk-edit', _('Edit...'), "<PRIMARY>Return", ('Edit', self.edit_active, "<PRIMARY>Return"),
_("Edit the active person"), self.edit_active), ('AddSpouse', self.add_spouse),
('AddSpouse', 'gramps-spouse', _('Partner'), None , ('AddParents', self.add_parents),
_("Add a new family with person as parent"), self.add_spouse), ('ShareFamily', self.select_parents)])
('AddSpouseMenu', 'gramps-spouse', _('Add Partner...'), None ,
_("Add a new family with person as parent"), self.add_spouse),
('AddParents', 'gramps-parents-add', _('Add'), None ,
_("Add a new set of parents"), self.add_parents),
('AddParentsMenu', 'gramps-parents-add', _('Add New Parents...'),
None, _("Add a new set of parents"), self.add_parents),
('ShareFamily', 'gramps-parents-open', _('Share'),
None , _("Add person as child to an existing family"),
self.select_parents),
('ShareFamilyMenu', 'gramps-parents-open',
_('Add Existing Parents...'), None ,
_("Add person as child to an existing family"),
self.select_parents),
])
self._add_action('FilterEdit', None, _('Person Filter Editor'), self._add_action('FilterEdit', callback=self.filter_editor)
callback=self.filter_editor) self._add_action('PRIMARY-J', self.jump, '<PRIMARY>J')
self._add_action_group(self.order_action) self._add_action_group(self.order_action)
self._add_action_group(self.family_action) self._add_action_group(self.family_action)
self.order_action.set_sensitive(self.reorder_sensitive) self.uimanager.set_actions_sensitive(self.order_action,
self.family_action.set_sensitive(False) self.reorder_sensitive)
self.uimanager.set_actions_sensitive(self.family_action, False)
def filter_editor(self, obj): def filter_editor(self, *obj):
try: try:
FilterEditor('Person', CUSTOM_FILTERS, FilterEditor('Person', CUSTOM_FILTERS,
self.dbstate, self.uistate) self.dbstate, self.uistate)
@ -505,11 +604,11 @@ class RelationshipView(NavigationView):
if obj: if obj:
person = self.dbstate.db.get_person_from_handle(obj) person = self.dbstate.db.get_person_from_handle(obj)
if not person: if not person:
self.family_action.set_sensitive(False) self.uimanager.set_actions_sensitive(self.family_action, False)
self.order_action.set_sensitive(False) self.uimanager.set_actions_sensitive(self.order_action, False)
self.redrawing = False self.redrawing = False
return return
self.family_action.set_sensitive(True) self.uimanager.set_actions_sensitive(self.family_action, True)
self.write_title(person) self.write_title(person)
@ -549,7 +648,8 @@ class RelationshipView(NavigationView):
self.redrawing = False self.redrawing = False
self.uistate.modify_statusbar(self.dbstate) self.uistate.modify_statusbar(self.dbstate)
self.order_action.set_sensitive(self.reorder_sensitive) self.uimanager.set_actions_sensitive(self.order_action,
self.reorder_sensitive)
self.dirty = False self.dirty = False
return True return True
@ -1488,7 +1588,7 @@ class RelationshipView(NavigationView):
except WindowActiveError: except WindowActiveError:
pass pass
def add_spouse(self, obj): def add_spouse(self, *obj):
family = Family() family = Family()
person = self.dbstate.db.get_person_from_handle(self.get_active()) person = self.dbstate.db.get_person_from_handle(self.get_active())
@ -1505,7 +1605,7 @@ class RelationshipView(NavigationView):
except WindowActiveError: except WindowActiveError:
pass pass
def edit_active(self, obj): def edit_active(self, obj, value):
phandle = self.get_active() phandle = self.get_active()
self.edit_person(obj, phandle) self.edit_person(obj, phandle)
@ -1576,7 +1676,7 @@ class RelationshipView(NavigationView):
self.dbstate.db.add_child_to_family(family, child) self.dbstate.db.add_child_to_family(family, child)
def select_parents(self, obj): def select_parents(self, *obj):
SelectFamily = SelectorFactory('Family') SelectFamily = SelectorFactory('Family')
phandle = self.get_active() phandle = self.get_active()
@ -1592,7 +1692,7 @@ class RelationshipView(NavigationView):
self.dbstate.db.add_child_to_family(family, child) self.dbstate.db.add_child_to_family(family, child)
def add_parents(self, obj): def add_parents(self, *obj):
family = Family() family = Family()
person = self.dbstate.db.get_person_from_handle(self.get_active()) person = self.dbstate.db.get_person_from_handle(self.get_active())
@ -1637,7 +1737,7 @@ class RelationshipView(NavigationView):
if button_activated(event, _LEFT_BUTTON): if button_activated(event, _LEFT_BUTTON):
self.reorder(obj) self.reorder(obj)
def reorder(self, obj, dumm1=None, dummy2=None): def reorder(self, *obj):
if self.get_active(): if self.get_active():
try: try:
Reorder(self.dbstate, self.uistate, [], self.get_active()) Reorder(self.dbstate, self.uistate, [], self.get_active())

View File

@ -53,7 +53,7 @@ from gramps.gen.plug import CATEGORY_QR_REPOSITORY
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -132,12 +132,7 @@ class RepositoryView(ListView):
multiple=True, multiple=True,
filter_class=RepoSidebarFilter) filter_class=RepoSidebarFilter)
self.func_list.update({ self.additional_uis.append(self.additional_ui)
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.additional_uis.append(self.additional_ui())
def navigation_type(self): def navigation_type(self):
return 'Repository' return 'Repository'
@ -145,76 +140,199 @@ class RepositoryView(ListView):
def drag_info(self): def drag_info(self):
return DdTargets.REPO_LINK return DdTargets.REPO_LINK
def define_actions(self):
ListView.define_actions(self)
self._add_action('FilterEdit', None, _('Repository Filter Editor'),
callback=self.filter_editor,)
self._add_action('QuickReport', None,
_("Quick View"), None, None, None)
def get_stock(self): def get_stock(self):
return 'gramps-repository' return 'gramps-repository'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
return '''<ui> '''
<menubar name="MenuBar"> <placeholder id="LocalExport">
<menu action="FileMenu"> <item>
<placeholder name="LocalExport"> <attribute name="action">win.ExportTab</attribute>
<menuitem action="ExportTab"/> <attribute name="label" translatable="yes">Export View...</attribute>
</placeholder> </item>
</menu> </placeholder>
<menu action="BookMenu"> ''',
<placeholder name="AddEditBook"> '''
<menuitem action="AddBook"/> <section id="AddEditBook">
<menuitem action="EditBook"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
</menu> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menu action="GoMenu"> </item>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.EditBook</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="no">%s...</attribute>
<separator/> </item>
</placeholder> </section>
</menu> ''' % _('Organize Bookmarks'),
<menu action="EditMenu"> '''
<placeholder name="CommonEdit"> <placeholder id="CommonGo">
<menuitem action="Add"/> <section>
<menuitem action="Edit"/> <item>
<menuitem action="Remove"/> <attribute name="action">win.Back</attribute>
<menuitem action="Merge"/> <attribute name="label" translatable="yes">_Back</attribute>
</placeholder> </item>
<menuitem action="FilterEdit"/> <item>
</menu> <attribute name="action">win.Forward</attribute>
</menubar> <attribute name="label" translatable="yes">_Forward</attribute>
<toolbar name="ToolBar"> </item>
<placeholder name="CommonNavigation"> </section>
<toolitem action="Back"/> </placeholder>
<toolitem action="Forward"/> ''',
</placeholder> '''
<placeholder name="CommonEdit"> <section id='CommonEdit' groups='RW'>
<toolitem action="Add"/> <item>
<toolitem action="Edit"/> <attribute name="action">win.Add</attribute>
<toolitem action="Remove"/> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Merge"/> </item>
</placeholder> <item>
</toolbar> <attribute name="action">win.Edit</attribute>
<popup name="Popup"> <attribute name="label" translatable="yes">%s</attribute>
<menuitem action="Back"/> </item>
<menuitem action="Forward"/> <item>
<separator/> <attribute name="action">win.Remove</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.Merge</attribute>
<separator/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menu name="QuickReport" action="QuickReport"/> </item>
</popup> </section>
</ui>''' ''' % _("action|_Edit..."), # to use sgettext()
'''
<placeholder id='otheredit'>
<item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Repository Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def add(self, obj): def add(self, *obj):
EditRepository(self.dbstate, self.uistate, [], Repository()) EditRepository(self.dbstate, self.uistate, [], Repository())
def remove(self, obj): def remove(self, *obj):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
@ -227,7 +345,7 @@ class RepositoryView(ListView):
is_used = len(source_list) > 0 is_used = len(source_list) > 0
return (query, is_used, object) return (query, is_used, object)
def edit(self, obj): def edit(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
repos = self.dbstate.db.get_repository_from_handle(handle) repos = self.dbstate.db.get_repository_from_handle(handle)
try: try:
@ -235,7 +353,7 @@ class RepositoryView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected repositories. Merge the selected repositories.
""" """

View File

@ -57,7 +57,7 @@ from gramps.gen.plug import CATEGORY_QR_SOURCE
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext _ = glocale.translation.sgettext
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
@ -118,12 +118,7 @@ class SourceView(ListView):
multiple=True, multiple=True,
filter_class=SourceSidebarFilter) filter_class=SourceSidebarFilter)
self.func_list.update({ self.additional_uis.append(self.additional_ui)
'<PRIMARY>J' : self.jump,
'<PRIMARY>BackSpace' : self.key_delete,
})
self.additional_uis.append(self.additional_ui())
def navigation_type(self): def navigation_type(self):
return 'Source' return 'Source'
@ -131,75 +126,199 @@ class SourceView(ListView):
def drag_info(self): def drag_info(self):
return DdTargets.SOURCE_LINK return DdTargets.SOURCE_LINK
def define_actions(self):
ListView.define_actions(self)
self._add_action('FilterEdit', None, _('Source Filter Editor'),
callback=self.filter_editor,)
self._add_action('QuickReport', None, _("Quick View"), None, None, None)
def get_stock(self): def get_stock(self):
return 'gramps-source' return 'gramps-source'
def additional_ui(self): additional_ui = [ # Defines the UI string for UIManager
return '''<ui> '''
<menubar name="MenuBar"> <placeholder id="LocalExport">
<menu action="FileMenu"> <item>
<placeholder name="LocalExport"> <attribute name="action">win.ExportTab</attribute>
<menuitem action="ExportTab"/> <attribute name="label" translatable="yes">Export View...</attribute>
</placeholder> </item>
</menu> </placeholder>
<menu action="BookMenu"> ''',
<placeholder name="AddEditBook"> '''
<menuitem action="AddBook"/> <section id="AddEditBook">
<menuitem action="EditBook"/> <item>
</placeholder> <attribute name="action">win.AddBook</attribute>
</menu> <attribute name="label" translatable="yes">_Add Bookmark</attribute>
<menu action="GoMenu"> </item>
<placeholder name="CommonGo"> <item>
<menuitem action="Back"/> <attribute name="action">win.EditBook</attribute>
<menuitem action="Forward"/> <attribute name="label" translatable="no">%s...</attribute>
<separator/> </item>
</placeholder> </section>
</menu> ''' % _('Organize Bookmarks'),
<menu action="EditMenu"> '''
<placeholder name="CommonEdit"> <placeholder id="CommonGo">
<menuitem action="Add"/> <section>
<menuitem action="Edit"/> <item>
<menuitem action="Remove"/> <attribute name="action">win.Back</attribute>
<menuitem action="Merge"/> <attribute name="label" translatable="yes">_Back</attribute>
</placeholder> </item>
<menuitem action="FilterEdit"/> <item>
</menu> <attribute name="action">win.Forward</attribute>
</menubar> <attribute name="label" translatable="yes">_Forward</attribute>
<toolbar name="ToolBar"> </item>
<placeholder name="CommonNavigation"> </section>
<toolitem action="Back"/> </placeholder>
<toolitem action="Forward"/> ''',
</placeholder> '''
<placeholder name="CommonEdit"> <section id='CommonEdit' groups='RW'>
<toolitem action="Add"/> <item>
<toolitem action="Edit"/> <attribute name="action">win.Add</attribute>
<toolitem action="Remove"/> <attribute name="label" translatable="yes">_Add...</attribute>
<toolitem action="Merge"/> </item>
</placeholder> <item>
</toolbar> <attribute name="action">win.Edit</attribute>
<popup name="Popup"> <attribute name="label" translatable="yes">%s</attribute>
<menuitem action="Back"/> </item>
<menuitem action="Forward"/> <item>
<separator/> <attribute name="action">win.Remove</attribute>
<menuitem action="Add"/> <attribute name="label" translatable="yes">_Delete</attribute>
<menuitem action="Edit"/> </item>
<menuitem action="Remove"/> <item>
<menuitem action="Merge"/> <attribute name="action">win.Merge</attribute>
<separator/> <attribute name="label" translatable="yes">_Merge...</attribute>
<menu name="QuickReport" action="QuickReport"/> </item>
</popup> </section>
</ui>''' ''' % _("action|_Edit..."), # to use sgettext()
'''
<placeholder id='otheredit'>
<item>
<attribute name="action">win.FilterEdit</attribute>
<attribute name="label" translatable="yes">'''
'''Source Filter Editor</attribute>
</item>
</placeholder>
''', # Following are the Toolbar items
'''
<placeholder id='CommonNavigation'>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-previous</property>
<property name="action-name">win.Back</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the previous object in the history</property>
<property name="label" translatable="yes">_Back</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RO'>
<object class="GtkToolButton">
<property name="icon-name">go-next</property>
<property name="action-name">win.Forward</property>
<property name="tooltip_text" translatable="yes">'''
'''Go to the next object in the history</property>
<property name="label" translatable="yes">_Forward</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''',
'''
<placeholder id='BarCommonEdit'>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-add</property>
<property name="action-name">win.Add</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Add...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gtk-edit</property>
<property name="action-name">win.Edit</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">Edit...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">list-remove</property>
<property name="action-name">win.Remove</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Delete</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
<child groups='RW'>
<object class="GtkToolButton">
<property name="icon-name">gramps-merge</property>
<property name="action-name">win.Merge</property>
<property name="tooltip_text" translatable="yes">%s</property>
<property name="label" translatable="yes">_Merge...</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="homogeneous">False</property>
</packing>
</child>
</placeholder>
''' % (ADD_MSG, EDIT_MSG, DEL_MSG, MERGE_MSG),
'''
<menu id="Popup">
<section>
<item>
<attribute name="action">win.Back</attribute>
<attribute name="label" translatable="yes">_Back</attribute>
</item>
<item>
<attribute name="action">win.Forward</attribute>
<attribute name="label" translatable="yes">Forward</attribute>
</item>
</section>
<section id="PopUpTree">
</section>
<section>
<item>
<attribute name="action">win.Add</attribute>
<attribute name="label" translatable="yes">_Add...</attribute>
</item>
<item>
<attribute name="action">win.Edit</attribute>
<attribute name="label" translatable="yes">%s</attribute>
</item>
<item>
<attribute name="action">win.Remove</attribute>
<attribute name="label" translatable="yes">_Delete</attribute>
</item>
<item>
<attribute name="action">win.Merge</attribute>
<attribute name="label" translatable="yes">_Merge...</attribute>
</item>
</section>
<section>
<placeholder id='QuickReport'>
</placeholder>
</section>
</menu>
''' % _('action|_Edit...') # to use sgettext()
]
def add(self, obj): def add(self, *obj):
EditSource(self.dbstate, self.uistate, [], Source()) EditSource(self.dbstate, self.uistate, [], Source())
def remove(self, obj): def remove(self, *obj):
self.remove_selected_objects() self.remove_selected_objects()
def remove_object_from_handle(self, handle): def remove_object_from_handle(self, handle):
@ -211,7 +330,7 @@ class SourceView(ListView):
is_used = any(the_lists) is_used = any(the_lists)
return (query, is_used, object) return (query, is_used, object)
def edit(self, obj): def edit(self, *obj):
for handle in self.selected_handles(): for handle in self.selected_handles():
source = self.dbstate.db.get_source_from_handle(handle) source = self.dbstate.db.get_source_from_handle(handle)
try: try:
@ -219,7 +338,7 @@ class SourceView(ListView):
except WindowActiveError: except WindowActiveError:
pass pass
def merge(self, obj): def merge(self, *obj):
""" """
Merge the selected sources. Merge the selected sources.
""" """

View File

@ -1,149 +1,85 @@
; Gramps.py GtkAccelMap rc-file -*- scheme -*- {
; this file is an automated accelerator map dump # this file was generated wih UIManager.dump_all_accels and then manually
; # edited to fix up some accels for MAC OSX.
; (gtk_accel_path "<Actions>/ToolWindow/relcalc" "") # "win.Clipboard": "<Primary>b",
; (gtk_accel_path "<Actions>/ReportWindow/place_report" "") "win.PersonAdd": "<Shift><Alt><ctrl>p",
; (gtk_accel_path "<Actions>/ToolWindow/mediaman" "") "win.FamilyAdd": "<Shift><Alt><ctrl>f",
(gtk_accel_path "<Actions>/MainWindow/SourceAdd" "<Shift><ctrl><alt>s") "win.EventAdd": "<Shift><Alt><ctrl>e",
; (gtk_accel_path "<Actions>/ReportWindow/summary" "") "win.PlaceAdd": "<Shift><Alt><ctrl>l",
; (gtk_accel_path "<Actions>/ToolWindow/rebuild_refmap" "") "win.SourceAdd": "<Shift><Alt><ctrl>s",
; (gtk_accel_path "<Actions>/Redo/Redo" "<Primary><Shift>z") "win.CitationAdd": "<Shift><Alt><ctrl>c",
; (gtk_accel_path "<Actions>/ToolWindow/ToolAnExp" "") "win.RepositoryAdd": "<Shift><Alt><ctrl>r",
; (gtk_accel_path "<Actions>/FileWindow/Toolbar" "") "win.MediaAdd": "<Shift><Alt><ctrl>m",
; (gtk_accel_path "<Actions>/ToolWindow/editowner" "") "win.NoteAdd": "<Shift><Alt><ctrl>n",
; (gtk_accel_path "<Actions>/FileWindow/Preferences" "") # "win.UndoHistory": "<Primary>h",
(gtk_accel_path "<Actions>/MainWindow/MediaAdd" "<Shift><ctrl><alt>m") # "win.Import": "<Primary>i",
; (gtk_accel_path "<Actions>/ToolWindow/sortevents" "") # "win.Tools": "",
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>Delete" "<Primary>Delete") # "win.ConfigView": "<Primary><Shift>c",
; (gtk_accel_path "<Actions>/FileWindow/ReportBug" "") # "win.Close": "<Primary>w",
; (gtk_accel_path "<Actions>/ReportWindow/hourglass_graph" "") # "win.Export": "<Primary>e",
; (gtk_accel_path "<Actions>/Undo/Undo" "<Primary>z") # "win.Backup": "",
; (gtk_accel_path "<Actions>/ToolWindow/reorder_ids" "") # "win.Abandon": "",
; (gtk_accel_path "<Actions>/ReportWindow/rel_graph" "") # "win.Reports": "",
; (gtk_accel_path "<Actions>/MainWindow/ConfigView" "<Primary><Shift>c") # "win.Books": "",
; (gtk_accel_path "<Actions>/ReportWindow/descend_report" "") # "win.F3": "F3",
; (gtk_accel_path "<Actions>/ReportWindow/ancestor_chart" "") # "win.F4": "F4",
; (gtk_accel_path "<Actions>/MainWindow/Clipboard" "<Primary>b") # "win.F5": "F5",
; (gtk_accel_path "<Actions>/FileWindow/MailingLists" "") # "win.F6": "F6",
; (gtk_accel_path "<Actions>/AllMainWindow/GoMenu" "") # "win.F7": "F7",
; (gtk_accel_path "<Actions>/ToolWindow/verify" "") # "win.F8": "F8",
; (gtk_accel_path "<Actions>/ToolWindow/mergecitations" "") # "win.F9": "F9",
; (gtk_accel_path "<Actions>/FileWindow/HomePage" "") # "win.F12": "F12",
; (gtk_accel_path "<Actions>/ToolWindow/populatesources" "") # "win.PRIMARY-1": "<Primary>1",
; (gtk_accel_path "<Actions>/FileWindow/Open" "<Primary>o") # "win.PRIMARY-2": "<Primary>2",
; (gtk_accel_path "<Actions>/ReportWindow/endofline_report" "") # "win.PRIMARY-3": "<Primary>3",
(gtk_accel_path "<Actions>/MainWindow/CitationAdd" "<Shift><ctrl><alt>c") # "win.PRIMARY-4": "<Primary>4",
(gtk_accel_path "<Actions>/UndoHistory/UndoHistory" "<shift><Meta>h") # "win.PRIMARY-5": "<Primary>5",
; (gtk_accel_path "<Actions>/ReportWindow/family_descend_chart" "") # "win.PRIMARY-6": "<Primary>6",
(gtk_accel_path "<Actions>/AllMainWindow/Close" "<Primary>w") # "win.PRIMARY-7": "<Primary>7",
; (gtk_accel_path "<Actions>/FileWindow/HelpMenu" "") # "win.PRIMARY-8": "<Primary>8",
; (gtk_accel_path "<Actions>/ToolWindow/loop" "") # "win.PRIMARY-9": "<Primary>9",
; (gtk_accel_path "<Actions>/ReportWindow/descend_chart" "") # "win.PRIMARY-0": "<Primary>0",
(gtk_accel_path "<Actions>/MainWindow/EventAdd" "<Shift><ctrl><alt>e") # "win.PRIMARY-N": "<Primary>n",
; (gtk_accel_path "<Actions>/FileWindow/ExtraPlugins" "") # "win.PRIMARY-P": "<Primary>p",
(gtk_accel_path "<Actions>/MainWindow/RepositoryAdd" "<Shift><ctrl><alt>r") # "win.Open": "<Primary>o",
; (gtk_accel_path "<Actions>/MainWindow/BookMenu" "") # "win.Quit": "<Primary>q",
; (gtk_accel_path "<Actions>/ToolWindow/ToolProc" "") # "win.Navigator": "<Primary>m",
(gtk_accel_path "<Actions>/MainWindow/NoteAdd" "<Shift><ctrl><alt>n") # "win.Toolbar": "",
(gtk_accel_path "<Actions>/MainWindow/PlaceAdd" "<Shift><ctrl><alt>l") # "win.Fullscreen": "F11",
; (gtk_accel_path "<Actions>/ReportWindow/navwebpage" "") # "win.Preferences": "",
; (gtk_accel_path "<Actions>/ReportWindow/birthday_report" "") # "win.HomePage": "",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu8" "") # "win.MailingLists": "",
; (gtk_accel_path "<Actions>/FileWindow/ViewMenu" "") # "win.ReportBug": "",
; (gtk_accel_path "<Actions>/ReportWindow/fan_chart" "") # "win.ExtraPlugins": "",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu7" "") # "win.About": "",
; (gtk_accel_path "<Actions>/ReportWindow/calendar" "") # "win.PluginStatus": "",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu6" "") # "win.FAQ": "",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu5" "") # "win.KeyBindings": "",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu4" "") # "win.UserManual": "F1",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu3" "") # "win.TipOfDay": "",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu2" "") # "win.Undo": "<Primary>z",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu1" "") # "win.Redo": "<Primary><Shift>z",
; (gtk_accel_path "<Actions>/RecentFiles/RecentMenu0" "") # "win.ViewInCatagory": "",
; (gtk_accel_path "<Actions>/ReportWindow/RepWeb" "") # "win.HomePerson": "<Alt>Home",
; (gtk_accel_path "<Actions>/ReportWindow/indiv_complete" "") # "win.ExportTab": "",
; (gtk_accel_path "<Actions>/ToolWindow/rebuild_genstats" "") # "win.Edit": "<Primary>Return",
; (gtk_accel_path "<Actions>/FileWindow/FAQ" "") # "win.PRIMARY-J": "<Primary>j",
; (gtk_accel_path "<Actions>/ReportWindow/det_ancestor_report" "") # "win.FilterEdit": "",
; (gtk_accel_path "<Actions>/ReportWindow/timeline" "") # "win.OpenAllNodes": "",
; (gtk_accel_path "<Actions>/ToolWindow/eventcmp" "") # "win.CloseAllNodes": "",
; (gtk_accel_path "<Actions>/AllMainWindow/ReportsMenu" "") # "win.Sidebar": "",
; (gtk_accel_path "<Actions>/FileWindow/EditMenu" "") # "win.Bottombar": "",
(gtk_accel_path "<Actions>/MainWindow/FamilyAdd" "<Shift><ctrl><alt>f") # "win.AddBook": "<Primary>d",
; (gtk_accel_path "<Actions>/ToolWindow/chname" "") # "win.EditBook": "<Primary><Shift>d",
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>Insert" "<Primary>Insert") # "win.Back": "<Alt>Left",
; (gtk_accel_path "<Actions>/AllMainWindow/F9" "F9") # "win.Forward": "<Alt>Right",
; (gtk_accel_path "<Actions>/AllMainWindow/F8" "F8") # "win.SetActive": "",
; (gtk_accel_path "<Actions>/AllMainWindow/F7" "F7") # "win.Add": "<Primary>Insert",
; (gtk_accel_path "<Actions>/AllMainWindow/F6" "F6") # "win.Remove": "<Primary>Delete",
; (gtk_accel_path "<Actions>/AllMainWindow/F5" "F5") # "win.PRIMARY-BackSpace": "<Primary>BackSpace",
; (gtk_accel_path "<Actions>/AllMainWindow/F4" "F4") # "win.Merge": "",
; (gtk_accel_path "<Actions>/AllMainWindow/F3" "F3") # "win.NewTag": "",
; (gtk_accel_path "<Actions>/AllMainWindow/F2" "F2") # "win.OrganizeTags": "",
; (gtk_accel_path "<Actions>/FileWindow/Navigator" "<Primary>m") # "win.TagButton": "",
; (gtk_accel_path "<Actions>/FileWindow/PluginStatus" "") # "win.Person00": "<Alt>0"
; (gtk_accel_path "<Actions>/AllMainWindow/F12" "F12") }
; (gtk_accel_path "<Actions>/AllMainWindow/F11" "F11")
; (gtk_accel_path "<Actions>/ToolWindow/ToolUtil" "")
; (gtk_accel_path "<Actions>/MainWindow/Import" "<Primary>i")
; (gtk_accel_path "<Actions>/ReportWindow/statistics_chart" "")
; (gtk_accel_path "<Actions>/FileWindow/UserManual" "F1")
; (gtk_accel_path "<Actions>/AllMainWindow/Books" "")
; (gtk_accel_path "<Actions>/FileWindow/OpenRecent" "")
; (gtk_accel_path "<Actions>/Dashboard/RestoreGramplet" "")
; (gtk_accel_path "<Actions>/WindowManger/4722902520" "")
; (gtk_accel_path "<Actions>/ReportWindow/RepGraph" "")
; (gtk_accel_path "<Actions>/ReportWindow/familylines_graph" "")
; (gtk_accel_path "<Actions>/ReportWindow/kinship_report" "")
; (gtk_accel_path "<Actions>/ToolWindow/testcasegenerator" "")
; (gtk_accel_path "<Actions>/FileWindow/KeyBindings" "")
; (gtk_accel_path "<Actions>/ReportWindow/tag_report" "")
; (gtk_accel_path "<Actions>/ToolWindow/dgenstats" "")
; (gtk_accel_path "<Actions>/FileWindow/Quit" "<Primary>q")
; (gtk_accel_path "<Actions>/FileWindow/TipOfDay" "")
; (gtk_accel_path "<Actions>/ReportWindow/ancestor_report" "")
; (gtk_accel_path "<Actions>/ToolWindow/check" "")
; (gtk_accel_path "<Actions>/FileWindow/Fullscreen" "F11")
(gtk_accel_path "<Actions>/MainWindow/PersonAdd" "<Shift><ctrl><alt>p")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>P" "<Primary>p")
; (gtk_accel_path "<Actions>/ToolWindow/remove_unused" "")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>N" "<Primary>n")
; (gtk_accel_path "<Actions>/ReportWindow/WebCal" "")
; (gtk_accel_path "<Actions>/ReportWindow/records" "")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>J" "<Primary>j")
; (gtk_accel_path "<Actions>/ReportWindow/number_of_ancestors" "")
; (gtk_accel_path "<Actions>/ToolWindow/evname" "")
; (gtk_accel_path "<Actions>/Dashboard/AddGramplet" "")
; (gtk_accel_path "<Actions>/ReportWindow/notelinkreport" "")
; (gtk_accel_path "<Actions>/ReportWindow/det_descendant_report" "")
; (gtk_accel_path "<Actions>/MainWindow/AddMenu" "")
; (gtk_accel_path "<Actions>/AllMainWindow/WindowsMenu" "")
; (gtk_accel_path "<Actions>/ToolWindow/test_for_date_parser_and_displayer" "")
; (gtk_accel_path "<Actions>/AllMainWindow/Abandon" "")
; (gtk_accel_path "<Actions>/ReportWindow/family_group" "")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>9" "<Primary>9")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>8" "<Primary>8")
; (gtk_accel_path "<Actions>/ToolWindow/not_related" "")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>7" "<Primary>7")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>6" "<Primary>6")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>5" "<Primary>5")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>4" "<Primary>4")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>3" "<Primary>3")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>2" "<Primary>2")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>1" "<Primary>1")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>0" "<Primary>0")
; (gtk_accel_path "<Actions>/WindowManger/M:4722902520" "")
; (gtk_accel_path "<Actions>/FileWindow/About" "")
; (gtk_accel_path "<Actions>/MainWindow/ToolsMenu" "")
; (gtk_accel_path "<Actions>/FileWindow/FileMenu" "")
; (gtk_accel_path "<Actions>/AllMainWindow/<PRIMARY>BackSpace" "<Primary>BackSpace")
; (gtk_accel_path "<Actions>/AllMainWindow/Export" "<Primary>e")
; (gtk_accel_path "<Actions>/AllMainWindow/Backup" "")
; (gtk_accel_path "<Actions>/ToolWindow/ToolDebug" "")
; (gtk_accel_path "<Actions>/ReportWindow/Graphs" "")
; (gtk_accel_path "<Actions>/ReportWindow/RepText" "")
; (gtk_accel_path "<Actions>/ToolWindow/dupfind" "")
; (gtk_accel_path "<Actions>/ToolWindow/rebuild" "")
; (gtk_accel_path "<Actions>/ToolWindow/patchnames" "")
; (gtk_accel_path "<Actions>/ToolWindow/chtype" "")
; (gtk_accel_path "<Actions>/ToolWindow/ToolRep" "")

View File

@ -298,7 +298,6 @@ gramps/gen/utils/test/place_test.py
# gui - GUI code # gui - GUI code
# #
gramps/gui/__init__.py gramps/gui/__init__.py
gramps/gui/actiongroup.py
gramps/gui/basesidebar.py gramps/gui/basesidebar.py
gramps/gui/dbguielement.py gramps/gui/dbguielement.py
gramps/gui/ddtargets.py gramps/gui/ddtargets.py
@ -308,6 +307,7 @@ gramps/gui/listmodel.py
gramps/gui/managedwindow.py gramps/gui/managedwindow.py
gramps/gui/navigator.py gramps/gui/navigator.py
gramps/gui/pluginmanager.py gramps/gui/pluginmanager.py
gramps/gui/uimanager.py
gramps/gui/user.py gramps/gui/user.py
gramps/gui/utilscairo.py gramps/gui/utilscairo.py
# #
@ -444,15 +444,11 @@ gramps/gui/widgets/placeentry.py
gramps/gui/widgets/selectionwidget.py gramps/gui/widgets/selectionwidget.py
gramps/gui/widgets/shadebox.py gramps/gui/widgets/shadebox.py
gramps/gui/widgets/shortlistcomboentry.py gramps/gui/widgets/shortlistcomboentry.py
gramps/gui/widgets/springseparator.py
gramps/gui/widgets/statusbar.py gramps/gui/widgets/statusbar.py
gramps/gui/widgets/toolcomboentry.py
gramps/gui/widgets/undoablebuffer.py gramps/gui/widgets/undoablebuffer.py
gramps/gui/widgets/undoableentry.py gramps/gui/widgets/undoableentry.py
gramps/gui/widgets/undoablestyledbuffer.py gramps/gui/widgets/undoablestyledbuffer.py
gramps/gui/widgets/validatedcomboentry.py gramps/gui/widgets/validatedcomboentry.py
gramps/gui/widgets/valueaction.py
gramps/gui/widgets/valuetoolitem.py
# #
# plugins # plugins
# #