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

Reply via email to