Philipp Hörist pushed to branch master at gajim / gajim
Commits: 4166e403 by Philipp Hörist at 2022-10-09T20:08:35+02:00 refactor: Move MessageIcons into widget module
- - - - - 48f48849 by Philipp Hörist at 2022-10-09T20:14:00+02:00 refactor: Move widget settings into MoreMenuButton
- - - - - fdc424f5 by Philipp Hörist at 2022-10-09T21:50:11+02:00 refactor: Add AvatarBox
Move code related to the avatar image into its own widget
- - - - -
2 changed files:
- gajim/gtk/conversation/rows/message.py - gajim/gtk/conversation/rows/widgets.py
Changes:
===================================== gajim/gtk/conversation/rows/message.py ===================================== @@ -44,22 +44,21 @@ from gajim.common.helpers import to_user_string from gajim.common.i18n import _ from gajim.common.i18n import is_rtl_text -from gajim.common.i18n import Q_ from gajim.common.modules.contacts import GroupchatContact from gajim.common.types import ChatContactT
from .base import BaseRow +from .widgets import AvatarBox from .widgets import DateTimeLabel from .widgets import NicknameLabel +from .widgets import MessageIcons from .widgets import MoreMenuButton from ..message_widget import MessageWidget from ...dialogs import InputDialog from ...dialogs import DialogButton -from ...menus import get_groupchat_participant_menu from ...preview import PreviewWidget -from ...util import GajimPopover from ...util import format_fingerprint -from ...util import get_cursor +
MERGE_TIMEFRAME = timedelta(seconds=120)
@@ -179,19 +178,9 @@ def __init__(self, self.set_receipt()
self._meta_box.pack_start(self._message_icons, False, True, 0) - avatar = self._get_avatar(kind, name) - self._avatar_image = Gtk.Image.new_from_surface(avatar)
- if self._is_groupchat: - avatar_placeholder = Gtk.EventBox() - avatar_placeholder.connect( - 'button-press-event', self._on_avatar_clicked, name) - avatar_placeholder.connect('realize', self._on_realize) - else: - avatar_placeholder = Gtk.Box() - avatar_placeholder.set_size_request(AvatarSize.ROSTER, -1) - avatar_placeholder.set_valign(Gtk.Align.START) - avatar_placeholder.add(self._avatar_image) + avatar = self._get_avatar(kind, name) + self._avatar_box = AvatarBox(self._contact, name, avatar)
self._bottom_box = Gtk.Box(spacing=6) self._bottom_box.add(self._message_widget) @@ -201,11 +190,9 @@ def __init__(self, self._message_widget.set_direction(Gtk.TextDirection.RTL)
more_menu_button = MoreMenuButton(self, self._contact, name) - more_menu_button.set_hexpand(True) - more_menu_button.set_halign(Gtk.Align.END) self._bottom_box.pack_end(more_menu_button, False, True, 0)
- self.grid.attach(avatar_placeholder, 0, 0, 1, 2) + self.grid.attach(self._avatar_box, 0, 0, 1, 2) self.grid.attach(self._meta_box, 1, 0, 1, 1) self.grid.attach(self._bottom_box, 1, 1, 1, 1)
@@ -268,45 +255,6 @@ def _get_avatar(self, kind: str, name: str) -> Optional[cairo.ImageSurface]: assert not isinstance(avatar, GdkPixbuf.Pixbuf) return avatar
- def _on_avatar_clicked(self, - _widget: Gtk.Widget, - event: Gdk.EventButton, - name: str - ) -> int: - if event.type == Gdk.EventType.BUTTON_PRESS: - if event.button == 1: - app.window.activate_action('mention', GLib.Variant('s', name)) - elif event.button == 3: - self._show_participant_menu(name, event) - - return Gdk.EVENT_STOP - - def _show_participant_menu(self, nick: str, event: Gdk.EventButton) -> None: - assert isinstance(self._contact, GroupchatContact) - if not self._contact.is_joined: - return - - self_contact = self._contact.get_self() - assert self_contact is not None - - if nick == self_contact.name: - # Don’t show menu for us - return - - contact = self._contact.get_resource(nick) - menu = get_groupchat_participant_menu(self._contact.account, - self_contact, - contact) - - popover = GajimPopover(menu, relative_to=self, event=event) - popover.popup() - - @staticmethod - def _on_realize(event_box: Gtk.EventBox) -> None: - window = event_box.get_window() - if window is not None: - window.set_cursor(get_cursor('pointer')) - def is_same_sender(self, message: MessageRow) -> bool: return message.name == self.name
@@ -487,63 +435,17 @@ def set_error(self, tooltip: str) -> None:
def update_avatar(self) -> None: avatar = self._get_avatar(self.kind, self.name) - self._avatar_image.set_from_surface(avatar) + self._avatar_box.set_from_surface(avatar)
def set_merged(self, merged: bool) -> None: self._merged = merged if merged: self.get_style_context().add_class('merged') - self._avatar_image.set_no_show_all(True) - self._avatar_image.hide() self._meta_box.set_no_show_all(True) self._meta_box.hide() else: self.get_style_context().remove_class('merged') - self._avatar_image.set_no_show_all(False) - self._avatar_image.show() self._meta_box.set_no_show_all(False) self._meta_box.show()
- -class MessageIcons(Gtk.Box): - def __init__(self) -> None: - Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL) - - self._correction_image = Gtk.Image.new_from_icon_name( - 'document-edit-symbolic', Gtk.IconSize.MENU) - self._correction_image.set_no_show_all(True) - self._correction_image.get_style_context().add_class('dim-label') - - self._marker_image = Gtk.Image() - self._marker_image.set_no_show_all(True) - self._marker_image.get_style_context().add_class('dim-label') - - self._error_image = Gtk.Image.new_from_icon_name( - 'dialog-warning-symbolic', Gtk.IconSize.MENU) - self._error_image.get_style_context().add_class('warning-color') - self._error_image.set_no_show_all(True) - - self.add(self._correction_image) - self.add(self._marker_image) - self.add(self._error_image) - self.show_all() - - def set_receipt_icon_visible(self, visible: bool) -> None: - if not app.settings.get('positive_184_ack'): - return - self._marker_image.set_visible(visible) - self._marker_image.set_from_icon_name( - 'feather-check-symbolic', Gtk.IconSize.MENU) - self._marker_image.set_tooltip_text(Q_('?Message state:Received')) - - def set_correction_icon_visible(self, visible: bool) -> None: - self._correction_image.set_visible(visible) - - def set_correction_tooltip(self, text: str) -> None: - self._correction_image.set_tooltip_markup(text) - - def set_error_icon_visible(self, visible: bool) -> None: - self._error_image.set_visible(visible) - - def set_error_tooltip(self, text: str) -> None: - self._error_image.set_tooltip_markup(text) + self._avatar_box.set_merged(merged)
===================================== gajim/gtk/conversation/rows/widgets.py ===================================== @@ -15,14 +15,18 @@ from __future__ import annotations
from typing import TYPE_CHECKING +from typing import Optional
from datetime import datetime
from gi.repository import Gtk +from gi.repository import Gdk from gi.repository import Pango from gi.repository import GLib +import cairo
from gajim.common import app +from gajim.common.const import AvatarSize from gajim.common.i18n import Q_ from gajim.common.helpers import is_retraction_allowed from gajim.common.modules.contacts import GroupchatContact @@ -31,7 +35,10 @@ if TYPE_CHECKING: from .message import MessageRow
+from ...menus import get_groupchat_participant_menu from ...util import wrap_with_event_box +from ...util import get_cursor +from ...util import GajimPopover
class SimpleLabel(Gtk.Label): @@ -55,6 +62,7 @@ def __init__(self, self.set_valign(Gtk.Align.START) self.set_halign(Gtk.Align.END) self.set_relief(Gtk.ReliefStyle.NONE) + self.set_hexpand(True)
self.get_style_context().add_class('conversation-more-button')
@@ -196,3 +204,118 @@ def __init__(self, name: str, from_us: bool) -> None: css_class = 'gajim-incoming-nickname'
self.get_style_context().add_class(css_class) + + +class MessageIcons(Gtk.Box): + def __init__(self) -> None: + Gtk.Box.__init__(self, orientation=Gtk.Orientation.HORIZONTAL) + + self._correction_image = Gtk.Image.new_from_icon_name( + 'document-edit-symbolic', Gtk.IconSize.MENU) + self._correction_image.set_no_show_all(True) + self._correction_image.get_style_context().add_class('dim-label') + + self._marker_image = Gtk.Image() + self._marker_image.set_no_show_all(True) + self._marker_image.get_style_context().add_class('dim-label') + + self._error_image = Gtk.Image.new_from_icon_name( + 'dialog-warning-symbolic', Gtk.IconSize.MENU) + self._error_image.get_style_context().add_class('warning-color') + self._error_image.set_no_show_all(True) + + self.add(self._correction_image) + self.add(self._marker_image) + self.add(self._error_image) + self.show_all() + + def set_receipt_icon_visible(self, visible: bool) -> None: + if not app.settings.get('positive_184_ack'): + return + self._marker_image.set_visible(visible) + self._marker_image.set_from_icon_name( + 'feather-check-symbolic', Gtk.IconSize.MENU) + self._marker_image.set_tooltip_text(Q_('?Message state:Received')) + + def set_correction_icon_visible(self, visible: bool) -> None: + self._correction_image.set_visible(visible) + + def set_correction_tooltip(self, text: str) -> None: + self._correction_image.set_tooltip_markup(text) + + def set_error_icon_visible(self, visible: bool) -> None: + self._error_image.set_visible(visible) + + def set_error_tooltip(self, text: str) -> None: + self._error_image.set_tooltip_markup(text) + + +class AvatarBox(Gtk.EventBox): + def __init__(self, + contact: ChatContactT, + name: str, + avatar: Optional[cairo.ImageSurface], + ) -> None: + + Gtk.EventBox.__init__(self) + + self.set_size_request(AvatarSize.ROSTER, -1) + self.set_valign(Gtk.Align.START) + + self._contact = contact + + self._image = Gtk.Image.new_from_surface(avatar) + self.add(self._image) + + if self._contact.is_groupchat: + self.connect('realize', self._on_realize) + + self.connect('button-press-event', + self._on_avatar_clicked, name) + + def set_from_surface(self, surface: Optional[cairo.ImageSurface]) -> None: + self._image.set_from_surface(surface) + + def set_merged(self, merged: bool) -> None: + self._image.set_no_show_all(merged) + self._image.set_visible(not merged) + + @staticmethod + def _on_realize(event_box: Gtk.EventBox) -> None: + window = event_box.get_window() + if window is not None: + window.set_cursor(get_cursor('pointer')) + + def _on_avatar_clicked(self, + _widget: Gtk.Widget, + event: Gdk.EventButton, + name: str + ) -> int: + + if event.type == Gdk.EventType.BUTTON_PRESS: + if event.button == 1: + app.window.activate_action('mention', GLib.Variant('s', name)) + elif event.button == 3: + self._show_participant_menu(name, event) + + return Gdk.EVENT_STOP + + def _show_participant_menu(self, nick: str, event: Gdk.EventButton) -> None: + assert isinstance(self._contact, GroupchatContact) + if not self._contact.is_joined: + return + + self_contact = self._contact.get_self() + assert self_contact is not None + + if nick == self_contact.name: + # Don’t show menu for us + return + + contact = self._contact.get_resource(nick) + menu = get_groupchat_participant_menu(self._contact.account, + self_contact, + contact) + + popover = GajimPopover(menu, relative_to=self, event=event) + popover.popup()
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/a1681cd01f923bd0aa20b26848621baa...