Philipp Hörist pushed to branch master at gajim / gajim
Commits: a3d7d6a3 by mjk at 2022-11-24T19:43:00+00:00 imprv: Prettify display of geographical locations
- - - - -
5 changed files:
- gajim/common/preview.py - gajim/common/preview_helpers.py - gajim/gtk/chat_list_row.py - gajim/gtk/chat_stack.py - gajim/gtk/preview.py
Changes:
===================================== gajim/common/preview.py ===================================== @@ -282,12 +282,11 @@ def is_previewable(self, if not self._accept_uri(urlparts, uri, additional_data): return False
- if uri.startswith('geo:'): + if urlparts.scheme == 'geo': try: split_geo_uri(uri) except Exception as err: - log.error(uri) - log.error(err) + log.info('Bad geo URI %s: %s', uri, err) return False
return True
===================================== gajim/common/preview_helpers.py ===================================== @@ -47,6 +47,7 @@
from gajim.common.helpers import sanitize_filename from gajim.common.i18n import _ +from gajim.common.i18n import P_
log = logging.getLogger('gajim.c.preview_helpers')
@@ -382,6 +383,26 @@ def split_geo_uri(uri: str) -> Coords: return Coords(location=location, lat=lat, lon=lon)
+def format_geo_coords(lat: float, lon: float) -> str: + def fmt(f: float) -> str: + i = int(round(f * 3600.0)) + seconds = i % 60 + i //= 60 + minutes = i % 60 + i //= 60 + degrees = i + return '%d°%02d′%02d′′' % (degrees, minutes, seconds) + if lat >= 0: + slat = P_('positive latitude', '%sN') % fmt(lat) + else: + slat = P_('negative latitude', '%sS') % fmt(-lat) + if lon >= 0: + slon = P_('positive longitude', '%sE') % fmt(lon) + else: + slon = P_('negative longitude', '%sW') % fmt(-lon) + return '%s %s' % (slat, slon) + + def filename_from_uri(uri: str) -> str: urlparts = urlparse(unquote(uri)) path = Path(urlparts.path) @@ -389,7 +410,7 @@ def filename_from_uri(uri: str) -> str:
def aes_decrypt(key: bytes, iv: bytes, payload: bytes) -> bytes: - # Use AES128 GCM with the given key and iv to decrypt the payload + # Use AES256 GCM with the given key and iv to decrypt the payload data = payload[:-16] tag = payload[-16:] decryptor = Cipher(algorithms.AES(key), @@ -447,8 +468,6 @@ def guess_simple_file_type(file_path: str, if mime_type == 'application/octet-stream': mime_type = '' icon = get_icon_for_mime_type(mime_type) - if file_path.startswith('geo:'): - return icon, _('Location') if mime_type.startswith('audio/'): return icon, _('Audio File') if mime_type.startswith('image/'):
===================================== gajim/gtk/chat_list_row.py ===================================== @@ -18,6 +18,7 @@ from typing import Any
import pickle +from urllib.parse import urlparse
from gi.repository import Gdk from gi.repository import Gio @@ -39,6 +40,8 @@ from gajim.common.helpers import get_uf_relative_time from gajim.common.helpers import message_needs_highlight from gajim.common.helpers import AdditionalDataDict +from gajim.common.preview_helpers import split_geo_uri +from gajim.common.preview_helpers import format_geo_coords from gajim.common.preview_helpers import filename_from_uri from gajim.common.preview_helpers import guess_simple_file_type from gajim.common.types import ChatContactT @@ -252,9 +255,16 @@ def set_message_text(self, icon = Gio.Icon.new_for_string(icon_name) if additional_data is not None: if app.preview_manager.is_previewable(text, additional_data): - file_name = filename_from_uri(text) - icon, file_type = guess_simple_file_type(text) - text = f'{file_type} ({file_name})' + scheme = urlparse(text).scheme + if scheme == 'geo': + location = split_geo_uri(text) + icon = Gio.Icon.new_for_string('mark-location') + text = format_geo_coords( + float(location.lat), float(location.lon)) + else: + file_name = filename_from_uri(text) + icon, file_type = guess_simple_file_type(text) + text = f'{file_type} ({file_name})'
text = GLib.markup_escape_text(text) if text.startswith('/me') and nickname is not None:
===================================== gajim/gtk/chat_stack.py ===================================== @@ -20,6 +20,7 @@ import sys import logging import time +from urllib.parse import urlparse
from gi.repository import Gdk from gi.repository import GLib @@ -40,6 +41,8 @@ from gajim.common.modules.contacts import BareContact from gajim.common.modules.contacts import GroupchatContact from gajim.common.modules.contacts import GroupchatParticipant +from gajim.common.preview_helpers import split_geo_uri +from gajim.common.preview_helpers import format_geo_coords from gajim.common.structs import OutgoingMessage from gajim.common.types import ChatContactT from gajim.gui.dialogs import ErrorDialog @@ -389,8 +392,11 @@ def _issue_notification(self, event: events.MessageReceived) -> None: is_previewable = app.preview_manager.is_previewable( text, additional_data) if is_previewable: - if text.startswith('geo:'): - text = _('Location') + scheme = urlparse(text).scheme + if scheme == 'geo': + location = split_geo_uri(text) + text = format_geo_coords( + float(location.lat), float(location.lon)) else: file_name = preview_helpers.filename_from_uri(text) _icon, file_type = preview_helpers.guess_simple_file_type(text)
===================================== gajim/gtk/preview.py ===================================== @@ -33,6 +33,7 @@ from gajim.common.i18n import _ from gajim.common.preview import Preview from gajim.common.preview_helpers import split_geo_uri +from gajim.common.preview_helpers import format_geo_coords from gajim.common.preview_helpers import contains_audio_streams from gajim.common.preview_helpers import get_icon_for_mime_type from gajim.common.types import GdkPixbufType @@ -136,12 +137,10 @@ def update(self, preview: Preview, data: Optional[GdkPixbufType]) -> None: self._ui.download_button.hide()
location = split_geo_uri(preview.uri) - self._ui.file_size.set_text(_('Lat: %s Lon: %s') % ( - round(float(location.lat), 5), - round(float(location.lon), 5))) + text = format_geo_coords(float(location.lat), float(location.lon)) + self._ui.file_size.set_text(text) self._ui.image_button.set_tooltip_text( - _('Location at Lat: %s Lon: %s') % ( - location.lat, location.lon)) + _('Location at %s') % text) self._ui.preview_box.set_size_request(160, -1) return
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/commit/a3d7d6a37528727a477da9164a5a7814f...