Philipp Hörist pushed to branch master at gajim / gajim
Commits: 1965e9e2 by lovetox at 2021-12-29T00:05:59+01:00 Rows: Add type annotations
- Move MoreMenuButton into widget module - Fix import cycles
- - - - - 4ec3783e by lovetox at 2021-12-29T00:06:08+01:00 Update pyrightconfig.json
- - - - -
7 changed files:
- gajim/gtk/conversation/quote_widget.py - gajim/gtk/conversation/rows/base.py - gajim/gtk/conversation/rows/message.py - gajim/gtk/conversation/rows/widgets.py - gajim/gtk/conversation/view.py - gajim/gtk/types.py - pyrightconfig.json
Changes:
===================================== gajim/gtk/conversation/quote_widget.py ===================================== @@ -14,9 +14,12 @@
from __future__ import annotations
+import typing + from gi.repository import Gtk
-from .. import types +if typing.TYPE_CHECKING: + from .message_widget import MessageWidget
class QuoteWidget(Gtk.Box): @@ -34,8 +37,7 @@ def __init__(self, account: str) -> None:
self._message_widget = None
- def attach_message_widget(self, - message_widget: types.MessageWidget) -> None: + def attach_message_widget(self, message_widget: MessageWidget) -> None:
# Purpose of this method is to prevent circular imports if self._message_widget is not None:
===================================== gajim/gtk/conversation/rows/base.py ===================================== @@ -15,7 +15,6 @@ from __future__ import annotations
from typing import Optional -from typing import Union
from datetime import datetime
@@ -24,18 +23,7 @@ from gi.repository import Pango
from gajim.common import app -from gajim.common.i18n import _ from gajim.common.helpers import from_one_line -from gajim.common.helpers import is_retraction_allowed - -from gajim.common.modules.contacts import BareContact -from gajim.common.modules.contacts import GroupchatContact -from gajim.common.modules.contacts import GroupchatParticipant - -from ...util import wrap_with_event_box -from ...types import MessageRowType - -ContactT = Union[BareContact, GroupchatContact, GroupchatParticipant]
class BaseRow(Gtk.ListBoxRow): @@ -102,84 +90,3 @@ def create_name_widget(name: str, is_self: bool) -> Gtk.Label: @staticmethod def __destroy(widget: Gtk.Widget) -> None: app.check_finalize(widget) - - -@wrap_with_event_box -class MoreMenuButton(Gtk.Button): - def __init__(self, - row: MessageRowType, - contact: ContactT, - name: str - ) -> None: - - Gtk.Button.__init__(self) - self.set_valign(Gtk.Align.START) - self.set_halign(Gtk.Align.END) - self.set_relief(Gtk.ReliefStyle.NONE) - - self.get_style_context().add_class('conversation-more-button') - - self._row = row - self._contact = contact - self._name = name - - image = Gtk.Image.new_from_icon_name( - 'feather-more-horizontal-symbolic', Gtk.IconSize.BUTTON) - self.add(image) - self.connect('clicked', self._on_click) - - def _on_click(self, _button: Gtk.Button) -> None: - show_retract = False - if isinstance(self._contact, GroupchatContact): - disco_info = app.storage.cache.get_last_disco_info( - self._contact.jid) - contact = self._contact.get_resource(self._name) - self_contact = self._contact.get_self() - assert self_contact is not None - is_allowed = is_retraction_allowed(self_contact, contact) - if disco_info.has_message_moderation and is_allowed: - show_retract = True - self._create_popover(show_retract) - - def _create_popover(self, show_retract: bool) -> None: - menu_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) - menu_box.get_style_context().add_class('padding-6') - - quote_button = Gtk.ModelButton() - quote_button.set_halign(Gtk.Align.START) - quote_button.connect('clicked', self._row.on_quote_message) - quote_button.set_label(_('Quote…')) - quote_button.set_image(Gtk.Image.new_from_icon_name( - 'mail-reply-sender-symbolic', Gtk.IconSize.MENU)) - menu_box.add(quote_button) - - copy_button = Gtk.ModelButton() - copy_button.set_halign(Gtk.Align.START) - copy_button.connect('clicked', self._row.on_copy_message) - copy_button.set_label(_('Copy')) - copy_button.set_image(Gtk.Image.new_from_icon_name( - 'edit-copy-symbolic', Gtk.IconSize.MENU)) - menu_box.add(copy_button) - - if show_retract: - retract_button = Gtk.ModelButton() - retract_button.set_halign(Gtk.Align.START) - retract_button.connect( - 'clicked', self._row.on_retract_message) - retract_button.set_label(_('Retract')) - retract_button.set_image(Gtk.Image.new_from_icon_name( - 'edit-undo-symbolic', Gtk.IconSize.MENU)) - menu_box.add(retract_button) - - menu_box.show_all() - - popover = Gtk.PopoverMenu() - popover.add(menu_box) - popover.set_relative_to(self) - popover.set_position(Gtk.PositionType.BOTTOM) - popover.connect('closed', self._on_closed) - popover.popup() - - @staticmethod - def _on_closed(popover: Gtk.Popover) -> None: - GLib.idle_add(popover.destroy)
===================================== gajim/gtk/conversation/rows/message.py ===================================== @@ -44,16 +44,15 @@ from gajim.common.i18n import Q_
from .base import BaseRow -from .base import MoreMenuButton +from .widgets import MoreMenuButton from ..message_widget import MessageWidget from ...dialogs import InputDialog from ...dialogs import DialogButton from ...preview import PreviewWidget -from ...types import ConversationRowType -from ...types import MessageRowType from ...util import format_fingerprint from ...util import get_cursor
+ MERGE_TIMEFRAME = timedelta(seconds=120)
@@ -255,10 +254,10 @@ def _on_avatar_clicked(self, def _on_realize(event_box: Gtk.EventBox) -> None: event_box.get_window().set_cursor(get_cursor('pointer'))
- def is_same_sender(self, message: MessageRowType) -> bool: + def is_same_sender(self, message: MessageRow) -> bool: return message.name == self.name
- def is_same_encryption(self, message: MessageRowType) -> bool: + def is_same_encryption(self, message: MessageRow) -> bool: message_details = self._get_encryption_details(message.additional_data) own_details = self._get_encryption_details(self.additional_data) if message_details is None and own_details is None: @@ -271,7 +270,7 @@ def is_same_encryption(self, message: MessageRowType) -> bool: return True return False
- def is_mergeable(self, message: ConversationRowType) -> bool: + def is_mergeable(self, message: BaseRow) -> bool: if message.type != self.type: return False if not self.is_same_sender(message):
===================================== gajim/gtk/conversation/rows/widgets.py ===================================== @@ -12,8 +12,29 @@ # You should have received a copy of the GNU General Public License # along with Gajim. If not, see http://www.gnu.org/licenses/.
+from __future__ import annotations + +import typing +from typing import Union + from gi.repository import Gtk from gi.repository import Pango +from gi.repository import GLib + +from gajim.common import app +from gajim.common.i18n import _ +from gajim.common.helpers import is_retraction_allowed +from gajim.common.modules.contacts import BareContact +from gajim.common.modules.contacts import GroupchatContact +from gajim.common.modules.contacts import GroupchatParticipant + +from ...util import wrap_with_event_box + +if typing.TYPE_CHECKING: + from .message import MessageRow + + +ContactT = Union[BareContact, GroupchatContact, GroupchatParticipant]
class SimpleLabel(Gtk.Label): @@ -23,3 +44,87 @@ def __init__(self) -> None: self.set_line_wrap(True) self.set_xalign(0) self.set_line_wrap_mode(Pango.WrapMode.WORD_CHAR) + + +@wrap_with_event_box +class MoreMenuButton(Gtk.Button): + def __init__(self, + row: MessageRow, + contact: ContactT, + name: str + ) -> None: + + Gtk.Button.__init__(self) + self.set_valign(Gtk.Align.START) + self.set_halign(Gtk.Align.END) + self.set_relief(Gtk.ReliefStyle.NONE) + + self.get_style_context().add_class('conversation-more-button') + + self._row = row + self._contact = contact + self._name = name + + image = Gtk.Image.new_from_icon_name( + 'feather-more-horizontal-symbolic', Gtk.IconSize.BUTTON) + self.add(image) + self.connect('clicked', self._on_click) + + def _on_click(self, _button: Gtk.Button) -> None: + show_retract = False + if isinstance(self._contact, GroupchatContact): + disco_info = app.storage.cache.get_last_disco_info( + self._contact.jid) + assert disco_info is not None + + contact = self._contact.get_resource(self._name) + self_contact = self._contact.get_self() + assert self_contact is not None + + is_allowed = is_retraction_allowed(self_contact, contact) + if disco_info.has_message_moderation and is_allowed: + show_retract = True + self._create_popover(show_retract) + + def _create_popover(self, show_retract: bool) -> None: + menu_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6) + menu_box.get_style_context().add_class('padding-6') + + quote_button = Gtk.ModelButton() + quote_button.set_halign(Gtk.Align.START) + quote_button.connect('clicked', self._row.on_quote_message) + quote_button.set_label(_('Quote…')) + quote_button.set_image(Gtk.Image.new_from_icon_name( + 'mail-reply-sender-symbolic', Gtk.IconSize.MENU)) + menu_box.add(quote_button) + + copy_button = Gtk.ModelButton() + copy_button.set_halign(Gtk.Align.START) + copy_button.connect('clicked', self._row.on_copy_message) + copy_button.set_label(_('Copy')) + copy_button.set_image(Gtk.Image.new_from_icon_name( + 'edit-copy-symbolic', Gtk.IconSize.MENU)) + menu_box.add(copy_button) + + if show_retract: + retract_button = Gtk.ModelButton() + retract_button.set_halign(Gtk.Align.START) + retract_button.connect( + 'clicked', self._row.on_retract_message) + retract_button.set_label(_('Retract')) + retract_button.set_image(Gtk.Image.new_from_icon_name( + 'edit-undo-symbolic', Gtk.IconSize.MENU)) + menu_box.add(retract_button) + + menu_box.show_all() + + popover = Gtk.PopoverMenu() + popover.add(menu_box) + popover.set_relative_to(self) + popover.set_position(Gtk.PositionType.BOTTOM) + popover.connect('closed', self._on_closed) + popover.popup() + + @staticmethod + def _on_closed(popover: Gtk.Popover) -> None: + GLib.idle_add(popover.destroy)
===================================== gajim/gtk/conversation/view.py ===================================== @@ -12,6 +12,8 @@ # You should have received a copy of the GNU General Public License # along with Gajim. If not, see http://www.gnu.org/licenses/.
+from __future__ import annotations + from typing import Dict from typing import Set from typing import Optional @@ -38,6 +40,7 @@ from gajim.common.modules.contacts import GroupchatParticipant from gajim.common.modules.httpupload import HTTPFileTransfer
+from .rows.base import BaseRow from .rows.read_marker import ReadMarkerRow from .rows.scroll_hint import ScrollHintRow from .rows.message import MessageRow @@ -51,7 +54,6 @@ from .rows.muc_join_left import MUCJoinLeft from .rows.muc_user_status import MUCUserStatus
-from ..types import ConversationRowType from ..util import scroll_to_end
log = logging.getLogger('gajim.gui.conversation_view') @@ -300,7 +302,7 @@ def _add_date_row(self, timestamp: datetime) -> None:
row.set_merged(False)
- def _check_for_merge(self, message: ConversationRowType) -> None: + def _check_for_merge(self, message: BaseRow) -> None: if message.type != 'chat': return
@@ -434,7 +436,7 @@ def get_row_by_stanza_id(self, stanza_id: str) -> Optional[MessageRow]: return row return None
- def iter_rows(self) -> Generator[ConversationRowType, None, None]: + def iter_rows(self) -> Generator[BaseRow, None, None]: for row in self.get_children(): yield row
===================================== gajim/gtk/types.py ===================================== @@ -36,22 +36,6 @@ from .conversation.rows.scroll_hint import ScrollHintRow
-ConversationRowType = Union[ - 'CallRow', - 'CommandOutputRow', - 'DateRow', - 'FileTransferJingleRow', - 'FileTransferRow', - 'InfoMessage', - 'MessageRow', - 'MUCJoinLeft', - 'MUCSubject', - 'MUCUserStatus', - 'ReadMarkerRow', - 'ScrollHintRow' -] - -MessageRowType = Union['MessageRow']
ControlType = Union [ 'ChatControl',
===================================== pyrightconfig.json ===================================== @@ -24,6 +24,7 @@ "gajim/gtk/conversation/jump_to_end_button.py", "gajim/gtk/conversation/plain_widget.py", "gajim/gtk/conversation/quote_widget.py", + "gajim/gtk/conversation/rows/base.py", "gajim/gtk/conversation/rows/command_output.py", "gajim/gtk/conversation/rows/date.py", "gajim/gtk/conversation/rows/file_transfer.py",
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/b10fb655512f33759497c1dcb6c59e35...