Add option to control display format of Lat/Lon

Add an option in the preferences diplay tab for views.
Add the possibility to select a different choice in the reports.

Fixes : #11248
This commit is contained in:
SNoiraud 2023-05-22 14:30:47 +02:00
parent 35f20a8893
commit e5ec6bd7c9
9 changed files with 110 additions and 17 deletions

View File

@ -37,6 +37,7 @@ from ..menu import EnumeratedListOption, BooleanOption, NumberOption
from ...proxy import PrivateProxyDb, LivingProxyDb
from ...utils.grampslocale import GrampsLocale
from ...const import GRAMPS_LOCALE as glocale
from ...utils.place import coord_formats
_ = glocale.translation.sgettext
# _T_ is a gramps-defined keyword -- see po/update_po.py and po/genpot.sh
@ -376,3 +377,15 @@ def add_place_format_option(menu, category):
place_format.set_help(_("Select the format to display places"))
menu.add_option(category, "place_format", place_format)
return place_format
def add_coordinates_format_option(menu, category):
"""
Insert an option for changing the report's coordinates format to a
report-specific format instead of the user's Edit=>Preferences choice
"""
coord_format = EnumeratedListOption(_("Coordinates format"), -1)
for number, fmt in enumerate(coord_formats):
coord_format.add_item(number, fmt)
coord_format.set_help(_("Select the format to display coordinates"))
menu.add_option(category, "coord_format", coord_format)
return coord_format

View File

@ -72,6 +72,32 @@ if 'N' == South or 'S' == North or 'E' == West or 'W' == East:
translate_en_loc['W'] = 'W'
# end localisation part
def _T_(value, context=''): # enable deferred translations
return "%s\x04%s" % (context, value) if context else value
coord_formats = (
# format #0 'DEG' degree, minutes, seconds notation
_T_("DEG"),
# format #1 'DEG-:' degree, minutes, seconds notation with :
_T_("DEG-:"),
# format #2 'D.D4' degree notation, 4 decimals
_T_("D.D4"),
# format #3 'D.D8' degree notation, 8 decimals (precision like ISO-DMS)
_T_("D.D8"),
# format #4 'RT90' Output format for the Swedish coordinate system RT90
_T_("RT90")
# output display not implemented for the following formats:
# 'ISO-D' ISO 6709 degree notation i.e. ±DD.DDDD±DDD.DDDD
# 'ISO-DM' ISO 6709 degree, minutes notation
# 'ISO-DMS' ISO 6709 degree, minutes, seconds notation
)
#------------------
#

View File

@ -57,6 +57,7 @@ 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.place import coord_formats
from gramps.gen.utils.keyword import (get_keywords, get_translations,
get_translation_from_keyword,
get_keyword_from_translation)
@ -1119,6 +1120,23 @@ class GrampsPreferences(ConfigureDialog):
config.set('preferences.place-format', obj.get_active())
self.uistate.emit('placeformat-changed')
def cb_coord_fmt_changed(self, obj):
"""
Called when the coordinates format is changed.
"""
config.set('preferences.coord-format', obj.get_active())
self.uistate.emit('placeformat-changed') # Do we need to add a new signal ?
def cb_coord_fmt_rebuild(self):
"""
Called to rebuild the coordinates format list.
"""
model = Gtk.ListStore(str)
for fmt in coord_formats:
model.append([fmt])
self.cformat.set_model(model)
self.cformat.set_active(0)
def cb_pa_sur_changed(self, *args):
"""
Checkbox patronymic as surname changed, propagate to namedisplayer
@ -1205,6 +1223,27 @@ class GrampsPreferences(ConfigureDialog):
hbox.pack_start(self.fmt_btn, False, False, 0)
grid.attach(hbox, 2, row, 2, 1)
row += 1
# Coordinates display format:
self.cformat = Gtk.ComboBox()
self.cformat.set_hexpand(True)
renderer = Gtk.CellRendererText()
self.cformat.pack_start(renderer, True)
self.cformat.add_attribute(renderer, "text", 0)
self.cb_coord_fmt_rebuild()
if not config.is_set('preferences.coord-format'):
config.register('preferences.coord-format', 0)
active = config.get('preferences.coord-format')
self.cformat.set_active(active)
self.cformat.connect('changed', self.cb_coord_fmt_changed)
hbox = Gtk.Box()
lwidget = BasicLabel(_("%s: ") % _('Coordinates format'))
lwidget.set_use_underline(True)
lwidget.set_mnemonic_widget(self.cformat)
hbox.pack_start(self.cformat, True, True, 0)
grid.attach(lwidget, 1, row, 1, 1)
grid.attach(hbox, 2, row, 2, 1)
row += 1
# Display name:
self.examplename = Name()

View File

@ -46,7 +46,7 @@ from gi.repository import Gtk
#-------------------------------------------------------------------------
from gramps.gen.lib import Place, PlaceType
from gramps.gen.datehandler import format_time
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.utils.place import conv_lat_lon, coord_formats
from gramps.gen.display.place import displayer as place_displayer
from gramps.gen.config import config
from .flatbasemodel import FlatBaseModel
@ -140,7 +140,8 @@ class PlaceBaseModel:
def column_longitude(self, data):
if not data[3]:
return ''
value = conv_lat_lon('0', data[3], format='DEG')[1]
value = conv_lat_lon('0', data[3],
format=coord_formats[config.get('preferences.coord-format')])[1]
if not value:
return _("Error in format")
return ("\u202d" + value + "\u202e") if glocale.rtl_locale else value
@ -148,7 +149,8 @@ class PlaceBaseModel:
def column_latitude(self, data):
if not data[4]:
return ''
value = conv_lat_lon(data[4], '0', format='DEG')[0]
value = conv_lat_lon(data[4], '0',
format=coord_formats[config.get('preferences.coord-format')])[0]
if not value:
return _("Error in format")
return ("\u202d" + value + "\u202e") if glocale.rtl_locale else value

View File

@ -32,10 +32,11 @@ from gi.repository.GLib import markup_escape_text
#-------------------------------------------------------------------------
from gramps.gen.plug import Gramplet
from gramps.gui.widgets import Photo
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.utils.place import conv_lat_lon, coord_formats
from gramps.gen.utils.file import media_path_full
from gramps.gen.display.place import displayer as place_displayer
from gramps.gen.const import COLON, GRAMPS_LOCALE as glocale
from gramps.gen.config import config
_ = glocale.translation.gettext
class PlaceDetails(Gramplet):
@ -129,7 +130,7 @@ class PlaceDetails(Gramplet):
self.display_separator()
lat, lon = conv_lat_lon(place.get_latitude(),
place.get_longitude(),
format='DEG')
format=coord_formats[config.get('preferences.coord-format')])
if lat:
self.add_row(_('Latitude'), lat)
if lon:

View File

@ -80,7 +80,7 @@ from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback
from gramps.gen.datehandler import parser as _dp
from gramps.plugins.lib.libhtml import Html, xml_lang
from gramps.plugins.lib.libhtmlbackend import HtmlBackend, process_spaces
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.utils.place import conv_lat_lon, coord_formats
from gramps.gen.utils.location import get_main_location
from gramps.plugins.webreport.common import (_NAME_STYLE_DEFAULT, HTTP, HTTPS,
add_birthdate, CSS, html_escape,
@ -2961,7 +2961,8 @@ class BasePage:
tbody += trow
data = place.get_latitude()
v_lat, v_lon = conv_lat_lon(data, "0.0", "D.D8")
v_lat, v_lon = conv_lat_lon(data, "0.0",
coord_formats[self.report.options['coord_format']])
if not v_lat:
data += self._(":")
# We use the same message as in:
@ -2975,11 +2976,12 @@ class BasePage:
trow = Html('tr') + (
Html("td", self._("Latitude"), class_="ColumnAttribute",
inline=True),
Html("td", data, class_="ColumnValue", inline=True)
Html("td", v_lat, class_="ColumnValue", inline=True)
)
tbody += trow
data = place.get_longitude()
v_lat, v_lon = conv_lat_lon("0.0", data, "D.D8")
v_lat, v_lon = conv_lat_lon("0.0", data,
coord_formats[self.report.options['coord_format']])
if not v_lon:
data += self._(":")
# We use the same message as in:
@ -2993,7 +2995,7 @@ class BasePage:
trow = Html('tr') + (
Html("td", self._("Longitude"), class_="ColumnAttribute",
inline=True),
Html("td", data, class_="ColumnValue", inline=True)
Html("td", v_lon, class_="ColumnValue", inline=True)
)
tbody += trow

View File

@ -2532,6 +2532,9 @@ class NavWebOptions(MenuReportOptions):
"\nSee OLDER VERSIONS in https://openlayers.org/"))
addopt("ol_version", self.__olv)
coord_format = stdoptions.add_coordinates_format_option(menu,
category_name)
def __add_others_options(self, menu):
"""
Options for the cms tab, web calendar inclusion, PHP ...

View File

@ -63,7 +63,7 @@ from gramps.gen.display.name import displayer as _nd
from gramps.gen.display.place import displayer as _pd
from gramps.gen.utils.db import get_birth_or_fallback, get_death_or_fallback
from gramps.plugins.lib.libhtml import Html
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.utils.place import conv_lat_lon, coord_formats
from gramps.gen.proxy import LivingProxyDb
from gramps.gen.relationship import get_relationship_calculator
@ -794,7 +794,8 @@ class PersonPages(BasePage):
miny, maxy = Decimal(miny), Decimal(maxy)
midy_ = str(Decimal((miny + maxy) /2))
midx_, midy_ = conv_lat_lon(midx_, midy_, "D.D8")
midx_, midy_ = conv_lat_lon(midx_, midy_,
coord_formats[self.report.options['coord_format']])
# get the integer span of latitude and longitude
dummy_spanx = int(maxx - minx)

View File

@ -53,7 +53,7 @@ from gramps.gen.lib import (PlaceType, Place, PlaceName, Media)
from gramps.gen.plug.report import Bibliography
from gramps.gen.mime import is_image_type
from gramps.plugins.lib.libhtml import Html
from gramps.gen.utils.place import conv_lat_lon
from gramps.gen.utils.place import conv_lat_lon, coord_formats
from gramps.gen.utils.location import get_main_location
from gramps.gen.display.place import displayer as _pd
@ -165,7 +165,9 @@ class PlacePages(BasePage):
def __output_place(self, ldatec, tbody, first_place,
pname, sname, cname, place_handle, letter, bucket_link):
place = self.r_db.get_place_from_handle(place_handle)
place = None
if place_handle:
place = self.r_db.get_place_from_handle(place_handle)
if place:
if place.get_change_time() > ldatec:
ldatec = place.get_change_time()
@ -217,7 +219,7 @@ class PlacePages(BasePage):
trow += tcell1, tcell2
if place.lat and place.long:
latitude, longitude = conv_lat_lon(place.lat, place.long,
"DEG")
coord_formats[self.report.options['coord_format']])
tcell1 += latitude
tcell2 += longitude
else:
@ -339,16 +341,20 @@ class PlacePages(BasePage):
continue
val = self.report.obj_dict[PlaceName][pname]
nbelem = len(val)
if nbelem == 4:
if nbelem > 3:
place = self.r_db.get_place_from_handle(
place_handle)
main_location = get_main_location(self.r_db,
place)
sname = main_location.get(PlaceType.STATE, '')
cname = main_location.get(PlaceType.COUNTRY, '')
else:
elif nbelem == 3:
cname = val[3]
sname = val[2]
else:
val = [""]
cname = ""
sname = ""
(ldatec, first_place) \
= self.__output_place(ldatec,
trow, first_place,