Implement place formats

This commit is contained in:
Nick Hall 2017-03-27 21:57:16 +01:00
parent 3f368b2e02
commit cbac98894b
21 changed files with 650 additions and 95 deletions

View File

@ -247,11 +247,8 @@ register('preferences.hide-ep-msg', False)
register('preferences.invalid-date-format', "<b>%s</b>")
register('preferences.iprefix', 'I%04d')
register('preferences.name-format', 1)
register('preferences.place-format', 0)
register('preferences.place-auto', True)
register('preferences.place-number', False)
register('preferences.place-reverse', False)
register('preferences.place-restrict', 0)
register('preferences.place-lang', '')
register('preferences.patronimic-surname', False)
register('preferences.no-given-text', "[%s]" % _("Missing Given Name"))
register('preferences.no-record-text', "[%s]" % _("Missing Record"))

View File

@ -112,6 +112,7 @@ VERSION_DIR = os.path.join(
CUSTOM_FILTERS = os.path.join(VERSION_DIR, "custom_filters.xml")
REPORT_OPTIONS = os.path.join(HOME_DIR, "report_options.xml")
TOOL_OPTIONS = os.path.join(HOME_DIR, "tool_options.xml")
PLACE_FORMATS = os.path.join(HOME_DIR, "place_formats.xml")
ENV_DIR = os.path.join(HOME_DIR, "env")
TEMP_DIR = os.path.join(HOME_DIR, "temp")

View File

@ -1,7 +1,7 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2014-2015 Nick Hall
# Copyright (C) 2014-2017 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
@ -22,15 +22,43 @@
Class handling displaying of places.
"""
#---------------------------------------------------------------
#
# Python imports
#
#---------------------------------------------------------------
import os
import xml.dom.minidom
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from ..const import PLACE_FORMATS
from ..config import config
from ..utils.location import get_location_list
from ..lib import PlaceType
#-------------------------------------------------------------------------
#
# PlaceFormat class
#
#-------------------------------------------------------------------------
class PlaceFormat:
def __init__(self, name, levels, language, street, reverse):
self.name = name
self.levels = levels
self.language = language
self.street = street
self.reverse = reverse
def to_xml(self):
return (' <format name="%s" levels="%s" language="%s" '
'street="%s" reverse="%s"/>\n' %
(self.name, self.levels, self.language,
self.street, self.reverse))
#-------------------------------------------------------------------------
#
# PlaceDisplay class
@ -38,51 +66,121 @@ from ..lib import PlaceType
#-------------------------------------------------------------------------
class PlaceDisplay:
def display_event(self, db, event):
def __init__(self):
self.place_formats = []
self.default_format = config.get('preferences.place-format')
if os.path.exists(PLACE_FORMATS):
self.load_formats()
else:
pf = PlaceFormat('Full', ':', '', 0, False)
self.place_formats.append(pf)
def display_event(self, db, event, fmt=None):
if not event:
return ""
place_handle = event.get_place_handle()
if place_handle:
place = db.get_place_from_handle(place_handle)
return self.display(db, place, event.get_date_object())
return self.display(db, place, event.get_date_object(), fmt)
else:
return ""
def display(self, db, place, date=None):
def display(self, db, place, date=None, fmt=None):
if not place:
return ""
if not config.get('preferences.place-auto'):
return place.title
else:
lang = config.get('preferences.place-lang')
places = get_location_list(db, place, date, lang)
if fmt is None:
fmt = config.get('preferences.place-format')
pf = self.place_formats[fmt]
lang = pf.language
all_places = get_location_list(db, place, date, lang)
if config.get('preferences.place-restrict') > 0:
index = _find_populated_place(places)
if index is not None:
if config.get('preferences.place-restrict') == 1:
places = places[:index+1]
# Apply format string to place list
index = _find_populated_place(all_places)
places = []
for slice in pf.levels.split(','):
parts = slice.split(':')
if len(parts) == 1:
offset = _get_offset(parts[0], index)
if offset is not None:
places.append(all_places[offset])
elif len(parts) == 2:
start = _get_offset(parts[0], index)
end = _get_offset(parts[1], index)
if start is None:
places.extend(all_places[:end])
elif end is None:
places.extend(all_places[start:])
else:
places = places[index:]
places.extend(all_places[start:end])
if config.get('preferences.place-number'):
if pf.street:
types = [item[1] for item in places]
try:
idx = types.index(PlaceType.NUMBER)
except ValueError:
idx = None
if idx is not None and len(places) > idx+1:
combined = (places[idx][0] + ' ' + places[idx+1][0],
places[idx+1][1])
if pf.street == 1:
combined = (places[idx][0] + ' ' + places[idx+1][0],
places[idx+1][1])
else:
combined = (places[idx+1][0] + ' ' + places[idx][0],
places[idx+1][1])
places = places[:idx] + [combined] + places[idx+2:]
names = [item[0] for item in places]
if config.get('preferences.place-reverse'):
if pf.reverse:
names.reverse()
# TODO for Arabic, should the next line's comma be translated?
return ", ".join(names)
def get_formats(self):
return self.place_formats
def set_formats(self, formats):
self.place_formats = formats
def load_formats(self):
dom = xml.dom.minidom.parse(PLACE_FORMATS)
top = dom.getElementsByTagName('place_formats')
for fmt in top[0].getElementsByTagName('format'):
name = fmt.attributes['name'].value
levels = fmt.attributes['levels'].value
language = fmt.attributes['language'].value
street = int(fmt.attributes['street'].value)
reverse = fmt.attributes['reverse'].value == 'True'
pf = PlaceFormat(name, levels, language, street, reverse)
self.place_formats.append(pf)
dom.unlink()
def save_formats(self):
with open(PLACE_FORMATS, 'w') as fd:
fd.write('<?xml version="1.0" encoding="utf-8"?>\n')
fd.write('<place_formats>\n')
for fmt in self.place_formats:
fd.write(fmt.to_xml())
fd.write('</place_formats>\n')
def _get_offset(value, index):
if index is not None and value.startswith('p'):
try:
offset = int(value[1:])
except ValueError:
offset = 0
offset += index
else:
try:
offset = int(value)
except ValueError:
offset = None
return offset
def _find_populated_place(places):
populated_place = None
for index, item in enumerate(places):

View File

@ -32,6 +32,7 @@ from ...config import config
from ...datehandler import get_date_formats, LANG_TO_DISPLAY, main_locale
from ...display.name import displayer as global_name_display
from ...lib.date import Today
from ...display.place import displayer as _pd
from ..menu import EnumeratedListOption, BooleanOption, NumberOption
from ...proxy import PrivateProxyDb, LivingProxyDb
from ...utils.grampslocale import GrampsLocale
@ -327,3 +328,16 @@ def add_gramps_id_option(menu, category, ownline=False):
include_id.add_item(1, _('Include'))
include_id.set_help(_("Whether to include Gramps IDs"))
menu.add_option(category, 'inc_id', include_id)
def add_place_format_option(menu, category):
"""
Insert an option for changing the report's place format to a
report-specific format instead of the user's Edit=>Preferences choice
"""
place_format = EnumeratedListOption(_("Place format"), None)
place_format.add_item(None, _("Default"))
for number, fmt in enumerate(_pd.get_formats()):
place_format.add_item(number, fmt.name)
place_format.set_help(_("Select the format to display places"))
menu.add_option(category, "place_format", place_format)
return place_format

View File

@ -53,6 +53,7 @@ from gramps.gen.const import HOME_DIR, URL_WIKISTRING
from gramps.gen.datehandler import get_date_formats
from gramps.gen.display.name import displayer as _nd
from gramps.gen.display.name import NameDisplayError
from gramps.gen.display.place import displayer as _pd
from gramps.gen.utils.alive import update_constants
from gramps.gen.utils.file import media_path
from gramps.gen.utils.keyword import (get_keywords, get_translation_from_keyword,
@ -62,6 +63,7 @@ from gramps.gen.lib import Name, Surname, NameOriginType
from .managedwindow import ManagedWindow
from .widgets import MarkupLabel, BasicLabel
from .dialog import ErrorDialog, QuestionDialog2, OkDialog
from .editors.editplaceformat import EditPlaceFormat
from .glade import Glade
from gramps.gen.plug.utils import available_updates
from .plug import PluginWindows
@ -511,7 +513,6 @@ class GrampsPreferences(ConfigureDialog):
self.add_behavior_panel,
self.add_famtree_panel,
self.add_formats_panel,
self.add_places_panel,
self.add_text_panel,
self.add_prefix_panel,
self.add_date_panel,
@ -931,6 +932,13 @@ class GrampsPreferences(ConfigureDialog):
_nd.set_default_format(new_idx)
self.uistate.emit('nameformat-changed')
def cb_place_fmt_changed(self, obj):
"""
Called when the place format is changed.
"""
config.set('preferences.place-format', obj.get_active())
self.uistate.emit('placeformat-changed')
def cb_pa_sur_changed(self,*args):
"""
checkbox patronymic as surname changed, propagate to namedisplayer
@ -1052,6 +1060,34 @@ class GrampsPreferences(ConfigureDialog):
grid.attach(obox, 1, row, 2, 1)
row += 1
# Place format:
self.pformat = Gtk.ComboBox()
renderer = Gtk.CellRendererText()
self.pformat.pack_start(renderer, True)
self.pformat.add_attribute(renderer, "text", 0)
self.cb_place_fmt_rebuild()
active = config.get('preferences.place-format')
self.pformat.set_active(active)
self.pformat.connect('changed', self.cb_place_fmt_changed)
lwidget = BasicLabel(_("%s: ") % _('Place format'))
lwidget.set_use_underline(True)
lwidget.set_mnemonic_widget(obox)
hbox = Gtk.Box()
self.fmt_btn = Gtk.Button(label=("%s..." % _('Edit')))
self.fmt_btn.connect('clicked', self.cb_place_fmt_dialog)
hbox.pack_start(self.pformat, True, True, 0)
hbox.pack_start(self.fmt_btn, False, False, 0)
grid.attach(lwidget, 0, row, 1, 1)
grid.attach(hbox, 1, row, 2, 1)
row += 1
auto = self.add_checkbox(grid,
_("Enable automatic place title generation"),
row, 'preferences.place-auto',
extra_callback=self.auto_title_changed)
self.auto_title_changed(auto)
row += 1
# Age precision:
# precision=1 for "year", 2: "year, month" or 3: "year, month, days"
obox = Gtk.ComboBoxText()
@ -1151,66 +1187,13 @@ class GrampsPreferences(ConfigureDialog):
row += 1
return _('Display'), grid
def add_places_panel(self, configdialog):
grid = Gtk.Grid()
grid.set_border_width(12)
grid.set_column_spacing(6)
grid.set_row_spacing(6)
auto = self.add_checkbox(grid,
_("Enable automatic place title generation"),
0, 'preferences.place-auto',
extra_callback=self.auto_title_changed)
row = 0
grid2 = Gtk.Grid()
grid2.set_border_width(12)
grid2.set_column_spacing(6)
grid2.set_row_spacing(6)
grid.attach(grid2, 1, 1, 1, 1)
self.place_widgets = []
cbox = self.add_checkbox(grid2, _("Suppress comma after house number"),
row, 'preferences.place-number', start=0)
self.place_widgets.append(cbox)
row += 1
cbox = self.add_checkbox(grid2, _("Reverse display order"),
row, 'preferences.place-reverse', start=0)
self.place_widgets.append(cbox)
row += 1
# Place restriction
obox = Gtk.ComboBoxText()
formats = [_("Full place name"),
_("-> Hamlet/Village/Town/City"),
_("Hamlet/Village/Town/City ->")]
list(map(obox.append_text, formats))
active = config.get('preferences.place-restrict')
obox.set_active(active)
obox.connect('changed', self.place_restrict_changed)
lwidget = BasicLabel(_("%s: ") % _('Restrict'))
grid2.attach(lwidget, 0, row, 1, 1)
grid2.attach(obox, 1, row, 2, 1)
self.place_widgets.append(obox)
row += 1
entry = self.add_entry(grid2, _("Language"),
row, 'preferences.place-lang')
self.place_widgets.append(entry)
row += 1
self.auto_title_changed(auto)
return _('Places'), grid
def auto_title_changed(self, obj):
"""
Update sensitivity of place configuration widgets.
Update sensitivity of place format widget.
"""
active = obj.get_active()
for widget in self.place_widgets:
widget.set_sensitive(active)
active = config.get('preferences.place-auto')
self.pformat.set_sensitive(active)
self.fmt_btn.set_sensitive(active)
def add_text_panel(self, configdialog):
row = 0
@ -1258,6 +1241,23 @@ class GrampsPreferences(ConfigureDialog):
Gdk.RGBA.parse(color, hexval)
widget.set_rgba(color)
def cb_place_fmt_dialog(self, button):
"""
Called to invoke the place format editor.
"""
EditPlaceFormat(self.uistate, self.dbstate, self.track,
self.cb_place_fmt_rebuild)
def cb_place_fmt_rebuild(self):
"""
Called to rebuild the place format list.
"""
model = Gtk.ListStore(str)
for fmt in _pd.get_formats():
model.append([fmt.name])
self.pformat.set_model(model)
self.pformat.set_active(0)
def check_for_type_changed(self, obj):
active = obj.get_active()
if active == 0: # update
@ -1281,10 +1281,6 @@ class GrampsPreferences(ConfigureDialog):
active = obj.get_active()
config.set('behavior.check-for-addon-updates', active)
def place_restrict_changed(self, obj):
active = obj.get_active()
config.set('preferences.place-restrict', active)
def date_format_changed(self, obj):
config.set('preferences.date-format', obj.get_active())
OkDialog(_('Change is not immediate'),

View File

@ -372,6 +372,7 @@ class DisplayState(Callback):
'filters-changed' : (str, ),
'filter-name-changed' : (str, str, str),
'nameformat-changed' : None,
'placeformat-changed' : None,
'grampletbar-close-changed' : None,
'update-available' : (list, ),
'autobackup' : None,

View File

@ -0,0 +1,157 @@
#
# Gramps - a GTK+/GNOME based genealogy program
#
# Copyright (C) 2017 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.
#
#-------------------------------------------------------------------------
#
# GTK/Gnome modules
#
#-------------------------------------------------------------------------
from gi.repository import Gtk
#-------------------------------------------------------------------------
#
# Gramps modules
#
#-------------------------------------------------------------------------
from ..managedwindow import ManagedWindow
from ..glade import Glade
from ..listmodel import ListModel
from gramps.gen.errors import ValidationError
from gramps.gen.display.place import displayer as _pd
from gramps.gen.display.place import PlaceFormat
from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.gettext
#-------------------------------------------------------------------------
#
# EditPlaceFormat
#
#-------------------------------------------------------------------------
class EditPlaceFormat(ManagedWindow):
def __init__(self, uistate, dbstate, track, callback):
self.title = _('Place Format Editor')
ManagedWindow.__init__(self, uistate, track, EditPlaceFormat)
self.callback = callback
self.top = Glade()
self.set_window(self.top.toplevel, None, self.title, None)
self.setup_configs('interface.editplaceformat', 600, 400)
self.top.get_object('add').connect('clicked', self.__add)
self.top.get_object('remove').connect('clicked', self.__remove)
self.top.get_object('name').connect('changed', self.__name_changed)
self.top.get_object('levels').connect('validate', self._validate)
self.window.connect('response', self.__close)
self.model = None
self.formats = _pd.get_formats()
self.current_format = None
self.__populate_format_list()
self.show()
def build_menu_names(self, obj):
return (self.title, None)
def __populate_format_list(self):
flist = self.top.get_object('format_list')
self.model = ListModel(flist,
[(_('Format'), -1, 100)],
select_func=self.__format_changed)
for fmt in self.formats:
self.model.add([fmt.name])
self.model.select_row(0)
def __format_changed(self, selection):
if self.current_format is not None:
fmt = self.formats[self.current_format]
self.__save_format(fmt)
row = self.model.get_selected_row()
if row != -1:
fmt = self.formats[row]
self.__load_format(fmt)
self.current_format = row
if row == 0:
self.top.get_object('remove').set_sensitive(False)
self.top.get_object('name').set_sensitive(False)
self.top.get_object('levels').set_sensitive(False)
self.top.get_object('street').set_sensitive(False)
self.top.get_object('language').set_sensitive(False)
self.top.get_object('reverse').set_sensitive(False)
else:
self.top.get_object('remove').set_sensitive(True)
self.top.get_object('name').set_sensitive(True)
self.top.get_object('levels').set_sensitive(True)
self.top.get_object('street').set_sensitive(True)
self.top.get_object('language').set_sensitive(True)
self.top.get_object('reverse').set_sensitive(True)
self.top.get_object('levels').validate(force=True)
def __name_changed(self, entry):
store, iter_ = self.model.get_selected()
self.model.set(iter_, [entry.get_text()])
def _validate(self, widget, text):
for level in text.split(','):
parts = level.split(':')
if len(parts) < 1:
return ValidationError('Empty level')
if len(parts) > 2:
return ValidationError('Invalid slice')
for part in parts:
integer_str = part.replace('p', '')
if integer_str != '':
try:
integer = int(integer_str)
except ValueError:
return ValidationError('Invalid format string')
def __load_format(self, fmt):
self.top.get_object('name').set_text(fmt.name)
self.top.get_object('levels').set_text(fmt.levels)
self.top.get_object('street').set_active(fmt.street)
self.top.get_object('language').set_text(fmt.language)
self.top.get_object('reverse').set_active(fmt.reverse)
def __save_format(self, fmt):
fmt.name = self.top.get_object('name').get_text()
fmt.levels = self.top.get_object('levels').get_text()
fmt.street = self.top.get_object('street').get_active()
fmt.language = self.top.get_object('language').get_text()
fmt.reverse = self.top.get_object('reverse').get_active()
def __add(self, button):
name = _('New')
self.formats.append(PlaceFormat(name, ':', '', 0, False))
self.model.add([name])
self.model.select_row(len(self.formats)-1)
def __remove(self, button):
store, iter_ = self.model.get_selected()
if iter_:
self.current_format = None
del self.formats[self.model.get_selected_row()]
self.model.remove(iter_)
if self.model.get_selected_row() == -1:
self.model.select_row(len(self.formats)-1)
def __close(self, *obj):
row = self.model.get_selected_row()
fmt = self.formats[self.current_format]
self.__save_format(fmt)
_pd.save_formats()
self.callback()
self.close()

View File

@ -0,0 +1,254 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<requires lib="grampswidgets" version="0.0"/>
<object class="GtkDialog" id="editplaceformat">
<property name="can_focus">False</property>
<property name="type_hint">dialog</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">_Close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_underline">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkPaned" id="paned1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkTreeView" id="format_list">
<property name="visible">True</property>
<property name="can_focus">True</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="add">
<property name="label" translatable="yes">Add</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="remove">
<property name="label" translatable="yes">Remove</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="resize">False</property>
<property name="shrink">True</property>
</packing>
</child>
<child>
<object class="GtkGrid">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="border_width">6</property>
<property name="row_spacing">6</property>
<property name="column_spacing">6</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Levels:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Street format:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Language:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="language">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="reverse">
<property name="label" translatable="yes">Reverse display order</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="hexpand">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="street">
<property name="visible">True</property>
<property name="can_focus">False</property>
<items>
<item translatable="yes">None</item>
<item translatable="yes">Number Street</item>
<item translatable="yes">Street Number</item>
</items>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">Name:</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="name">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="ValidatableMaskedEntry" id="levels">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="resize">True</property>
<property name="shrink">True</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-7">button1</action-widget>
</action-widgets>
<child>
<placeholder/>
</child>
</object>
</interface>

View File

@ -50,6 +50,7 @@ class PersonDetails(Gramplet):
self.gui.get_container_widget().remove(self.gui.textview)
self.gui.get_container_widget().add(self.gui.WIDGET)
self.uistate.connect('nameformat-changed', self.update)
self.uistate.connect('placeformat-changed', self.update)
def build_gui(self):
"""

View File

@ -157,6 +157,7 @@ class BasePersonView(ListView):
})
uistate.connect('nameformat-changed', self.build_tree)
uistate.connect('placeformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui())

View File

@ -130,6 +130,9 @@ class PlaceBaseView(ListView):
'<PRIMARY>BackSpace' : self.key_delete,
})
self.maptoolbtn = None
uistate.connect('placeformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui())
def navigation_type(self):

View File

@ -226,7 +226,7 @@ class Printinfo:
This class must first be initialized with set_class_vars
"""
def __init__(self, doc, database, numbering, showmarriage, showdivorce,
name_display, rlocale, want_ids):
name_display, rlocale, want_ids, pformat):
#classes
self._name_display = name_display
self.doc = doc
@ -238,6 +238,7 @@ class Printinfo:
self.want_ids = want_ids
self._ = rlocale.translation.sgettext # needed for English
self._get_date = rlocale.get_date
self.pformat = pformat
def __date_place(self, event):
""" return the date and/or place an event happened """
@ -245,7 +246,7 @@ class Printinfo:
date = self._get_date(event.get_date_object())
place_handle = event.get_place_handle()
if place_handle:
place = _pd.display_event(self.database, event)
place = _pd.display_event(self.database, event, self.pformat)
return("%(event_abbrev)s %(date)s - %(place)s" % {
'event_abbrev': event.type.get_abbreviation(self._),
'date' : date,
@ -474,9 +475,11 @@ class DescendantReport(Report):
stdoptions.run_name_format_option(self, menu)
pformat = menu.get_option_by_name("place_format").get_value()
self.obj_print = Printinfo(self.doc, self.database, obj, marrs, divs,
self._name_display, self._locale,
self.want_ids)
self.want_ids, pformat)
def write_report(self):
self.doc.start_paragraph("DR-Title")
@ -555,6 +558,8 @@ class DescendantOptions(MenuReportOptions):
stdoptions.add_name_format_option(menu, category_name)
stdoptions.add_place_format_option(menu, category_name)
stdoptions.add_private_data_option(menu, category_name)
stdoptions.add_living_people_option(menu, category_name)

View File

@ -168,6 +168,8 @@ class DetAncestorReport(Report):
stdoptions.run_name_format_option(self, menu)
self._nd = self._name_display
self.place_format = menu.get_option_by_name("place_format").get_value()
self.gen_handles = {}
self.prev_gen_handles = {}
@ -440,7 +442,7 @@ class DetAncestorReport(Report):
else:
date = event.get_date_object().get_year()
place = _pd.display_event(self._db, event)
place = _pd.display_event(self._db, event, self.place_format)
self.doc.start_paragraph('DAR-MoreDetails')
if date and place:
@ -848,6 +850,8 @@ class DetAncestorOptions(MenuReportOptions):
stdoptions.add_name_format_option(menu, category)
stdoptions.add_place_format_option(menu, category)
stdoptions.add_private_data_option(menu, category)
stdoptions.add_living_people_option(menu, category)

View File

@ -201,6 +201,8 @@ class DetDescendantReport(Report):
stdoptions.run_name_format_option(self, menu)
self.place_format = menu.get_option_by_name("place_format").get_value()
self.__narrator = Narrator(self._db, self.verbose,
use_call, use_fulldate,
empty_date, empty_place,
@ -474,7 +476,7 @@ class DetDescendantReport(Report):
else:
date = event.get_date_object().get_year()
place = _pd.display_event(self._db, event)
place = _pd.display_event(self._db, event, self.place_format)
self.doc.start_paragraph('DDR-MoreDetails')
event_name = self._get_type(event.get_type())
@ -1039,6 +1041,8 @@ class DetDescendantOptions(MenuReportOptions):
stdoptions.add_name_format_option(menu, category)
stdoptions.add_place_format_option(menu, category)
stdoptions.add_private_data_option(menu, category)
stdoptions.add_living_people_option(menu, category)

View File

@ -117,13 +117,15 @@ class FamilyGroup(Report):
stdoptions.run_name_format_option(self, menu)
self.place_format = menu.get_option_by_name("place_format").get_value()
def dump_parent_event(self, name, event):
place = ""
date = ""
descr = ""
if event:
date = self._get_date(event.get_date_object())
place = _pd.display_event(self.db, event)
place = _pd.display_event(self.db, event, self.place_format)
if place is None:
place = ''
descr = event.get_description()
@ -438,7 +440,7 @@ class FamilyGroup(Report):
date = self._get_date(event.get_date_object())
place_handle = event.get_place_handle()
if place_handle:
place = _pd.display_event(self.db, event)
place = _pd.display_event(self.db, event, self.place_format)
if place is None:
place = ''
@ -736,6 +738,8 @@ class FamilyGroupOptions(MenuReportOptions):
self.__update_filters()
stdoptions.add_place_format_option(menu, category_name)
stdoptions.add_private_data_option(menu, category_name)
stdoptions.add_living_people_option(menu, category_name)

View File

@ -157,6 +157,8 @@ class IndivCompleteReport(Report):
stdoptions.run_name_format_option(self, menu)
self.place_format = menu.get_option_by_name("place_format").get_value()
self.home_person = self._db.get_default_person() # might be None
self.increlname = menu.get_option_by_name('incl_relname').get_value()
if self.increlname and self.home_person:
@ -183,7 +185,7 @@ class IndivCompleteReport(Report):
place_handle = event.get_place_handle()
if place_handle:
place = self._db.get_place_from_handle(place_handle)
place_name = _pd.display_event(self._db, event)
place_name = _pd.display_event(self._db, event, self.place_format)
place_endnote = self._cite_endnote(place)
# make sure it's translated, so it can be used below, in "combine"
ignore = _('%(str1)s in %(str2)s. ') % {'str1' : '', 'str2' : ''}
@ -518,7 +520,8 @@ class IndivCompleteReport(Report):
place_handle = lds_ord.get_place_handle()
if place_handle:
place = self._db.get_place_from_handle(place_handle)
place_name = _pd.display_event(self._db, lds_ord)
place_name = _pd.display_event(self._db, lds_ord,
self.place_format)
place_endnote = self._cite_endnote(place)
endnotes = self._cite_endnote(lds_ord, prior=place_endnote)
self.doc.start_row()
@ -716,7 +719,8 @@ class IndivCompleteReport(Report):
place_handle = lds_ord.get_place_handle()
if place_handle:
place = self._db.get_place_from_handle(place_handle)
place_name = _pd.display_event(self._db, lds_ord)
place_name = _pd.display_event(self._db, lds_ord,
self.place_format)
place_endnote = self._cite_endnote(place)
endnotes = self._cite_endnote(lds_ord, prior=place_endnote)
self.doc.start_row()
@ -1083,6 +1087,8 @@ class IndivCompleteOptions(MenuReportOptions):
self.__update_filters()
stdoptions.add_place_format_option(menu, category_name)
stdoptions.add_private_data_option(menu, category_name)
stdoptions.add_living_people_option(menu, category_name)

View File

@ -105,6 +105,8 @@ class PlaceReport(Report):
stdoptions.run_name_format_option(self, menu)
self._nd = self._name_display
self.place_format = menu.get_option_by_name("place_format").get_value()
filter_option = menu.get_option_by_name('filter')
self.filter = filter_option.get_filter()
@ -196,7 +198,7 @@ class PlaceReport(Report):
place_names += ' (%s)' % place_name.get_language()
place_details += [self._("places|All Names: %s") % place_names,]
self.doc.start_paragraph("PLC-PlaceTitle")
place_title = _pd.display(self._db, place)
place_title = _pd.display(self._db, place, self.place_format)
self.doc.write_text(("%(nbr)s. %(place)s") % {'nbr' : place_nbr,
'place' : place_title})
self.doc.end_paragraph()
@ -425,7 +427,7 @@ class PlaceOptions(MenuReportOptions):
if subject:
subject += " + "
place = self.__db.get_place_from_gramps_id(place_id)
subject += _pd.display(self.__db, place)
subject += _pd.display(self.__db, place, self.place_format)
return subject
def add_menu_options(self, menu):

View File

@ -108,6 +108,8 @@ class TagReport(Report):
stdoptions.run_name_format_option(self, menu)
self.place_format = menu.get_option_by_name("place_format").get_value()
def write_report(self):
self.doc.start_paragraph("TR-Title")
# feature request 2356: avoid genitive form
@ -439,7 +441,7 @@ class TagReport(Report):
for place_handle in place_list:
place = self.database.get_place_from_handle(place_handle)
place_title = _pd.display(self.database, place)
place_title = _pd.display(self.database, place, self.place_format)
self.doc.start_row()
@ -916,6 +918,8 @@ class TagOptions(MenuReportOptions):
stdoptions.add_name_format_option(menu, category_name)
stdoptions.add_place_format_option(menu, category_name)
stdoptions.add_private_data_option(menu, category_name)
stdoptions.add_living_people_option(menu, category_name)

View File

@ -129,6 +129,7 @@ class EventView(ListView):
})
uistate.connect('nameformat-changed', self.build_tree)
uistate.connect('placeformat-changed', self.build_tree)
self.additional_uis.append(self.additional_ui())

View File

@ -536,6 +536,7 @@ class PedigreeView(NavigationView):
self.dbstate = dbstate
self.dbstate.connect('database-changed', self.change_db)
uistate.connect('nameformat-changed', self.person_rebuild)
uistate.connect('placeformat-changed', self.person_rebuild)
self.format_helper = FormattingHelper(self.dbstate)

View File

@ -144,6 +144,7 @@ class RelationshipView(NavigationView):
dbstate.connect('database-changed', self.change_db)
uistate.connect('nameformat-changed', self.build_tree)
uistate.connect('placeformat-changed', self.build_tree)
self.redrawing = False
self.child = None