Philipp Hörist pushed to branch mainwindow at gajim / gajim
Commits: 9813f847 by lovetox at 2021-04-30T10:45:52+02:00 Add start of MessageLabel impl - - - - - db76bece by lovetox at 2021-04-30T14:05:20+02:00 Add Links to MessageLabel - - - - - 3 changed files: - gajim/common/styling.py - gajim/gtk/conversation/plain_widget.py - gajim/gtk/util.py Changes: ===================================== gajim/common/styling.py ===================================== @@ -3,6 +3,8 @@ from dataclasses import dataclass from dataclasses import field +from gi.repository import GLib + PRE = '`' STRONG = '*' STRIKE = '~' @@ -41,23 +43,28 @@ class StyleObject: text: str +class URIMarkup: + def get_markup_string(self): + return f'<a href="{self.text}">{self.text}</a>' + + @dataclass -class Uri(StyleObject): +class Uri(StyleObject, URIMarkup): name: str = field(default='uri', init=False) @dataclass -class Address(StyleObject): +class Address(StyleObject, URIMarkup): name: str = field(default='address', init=False) @dataclass -class XMPPAddress(StyleObject): +class XMPPAddress(StyleObject, URIMarkup): name: str = field(default='xmppadr', init=False) @dataclass -class MailAddress(StyleObject): +class MailAddress(StyleObject, URIMarkup): name: str = field(default='mailadr', init=False) @@ -135,7 +142,7 @@ def process(text, nested=False): blocks = _parse_blocks(text, nested) for block in blocks: if isinstance(block, PlainBlock): - offset = block.start + offset = 0 for line in block.text.splitlines(keepends=True): block.spans += _parse_line(line, offset) block.uris += _parse_uris(line, offset) ===================================== gajim/gtk/conversation/plain_widget.py ===================================== @@ -29,6 +29,7 @@ from gajim.common.i18n import _ from .util import get_cursor +from .util import make_pango_attribute URI_TAGS = ['uri', 'address', 'xmppadr', 'mailadr'] @@ -42,11 +43,38 @@ def __init__(self, account): self._account = account - self._textview = MessageTextview(self._account) - self.add(self._textview) + # self._text_widget = MessageTextview(self._account) + self._text_widget = MessageLabel(self._account) + self.add(self._text_widget) def add_content(self, block): - self._textview.print_text_with_styling(block) + self._text_widget.print_text_with_styling(block) + + +class MessageLabel(Gtk.Label): + def __init__(self, account): + Gtk.Label.__init__(self) + self.set_hexpand(True) + self.set_selectable(True) + self.set_line_wrap(True) + self.set_xalign(0) + self.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + self.set_track_visited_links(False) + + self._account = account + + def print_text_with_styling(self, block): + text = GLib.markup_escape_text(block.text.strip()) + for uri in block.uris: + text = text.replace(uri.text, uri.get_markup_string()) + + attr_list = Pango.AttrList() + for span in block.spans: + attr = make_pango_attribute(span.name, span.start, span.end) + attr_list.insert(attr) + + self.set_markup(text) + self.set_attributes(attr_list) class MessageTextview(Gtk.TextView): ===================================== gajim/gtk/util.py ===================================== @@ -906,3 +906,21 @@ def refresh(self): account_class = app.css_config.get_dynamic_class(self._account) self.get_style_context().add_class(account_class) self.set_tooltip_text(_('Account: %s') % label) + + +def make_pango_attribute(name, start, end): + if name == 'strong': + attr = Pango.attr_weight_new(Pango.Weight.BOLD) + if name == 'strike': + attr = Pango.attr_strikethrough_new(True) + if name == 'emphasis': + attr = Pango.attr_style_new(Pango.Style.ITALIC) + if name == 'pre': + attr = Pango.attr_family_new('monospace') + + else: + ValueError('unknown attribute %s', name) + + attr.start_index = start + attr.end_index = end + return attr View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/d74e7bf5d74c4dcfd85a27bb1694b3d16c03b271...db76bece42103e48577ca2cd961c1c9299d9c116 -- View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/d74e7bf5d74c4dcfd85a27bb1694b3d16c03b271...db76bece42103e48577ca2cd961c1c9299d9c116 You're receiving this email because of your account on dev.gajim.org.
_______________________________________________ Commits mailing list Commits@gajim.org https://lists.gajim.org/cgi-bin/listinfo/commits