diff options
Diffstat (limited to 'gajim/gtk/conversation/view.py')
-rw-r--r-- | gajim/gtk/conversation/view.py | 85 |
1 files changed, 26 insertions, 59 deletions
diff --git a/gajim/gtk/conversation/view.py b/gajim/gtk/conversation/view.py index fdbe85e4b..89808fa67 100644 --- a/gajim/gtk/conversation/view.py +++ b/gajim/gtk/conversation/view.py @@ -19,7 +19,6 @@ from typing import cast from typing import Literal import logging -import time from collections.abc import Generator from datetime import datetime from datetime import timedelta @@ -29,22 +28,20 @@ from gi.repository import Gio from gi.repository import GObject from gi.repository import Gtk from nbxmpp.errors import StanzaError -from nbxmpp.modules.security_labels import Displaymarking from nbxmpp.protocol import JID -from nbxmpp.structs import CommonError from nbxmpp.structs import MucSubject from gajim.common import app from gajim.common import events from gajim.common import types from gajim.common.const import Direction -from gajim.common.helpers import AdditionalDataDict from gajim.common.helpers import get_start_of_day from gajim.common.helpers import to_user_string from gajim.common.modules.contacts import BareContact from gajim.common.modules.contacts import GroupchatContact from gajim.common.modules.httpupload import HTTPFileTransfer -from gajim.common.storage.archive import ConversationRow +from gajim.common.storage.archive.const import ChatDirection +from gajim.common.storage.archive.structs import DbConversationJoinedData from gajim.common.types import ChatContactT from gajim.gtk.conversation.rows.base import BaseRow @@ -384,16 +381,17 @@ class ConversationView(Gtk.ScrolledWindow): assert row is not None return cast(BaseRow, row) - def get_first_message_row(self) -> MessageRow | None: + def get_first_message_row(self + ) -> MessageRow | CallRow | FileTransferJingleRow | None: for row in self._list_box.get_children(): - if isinstance(row, MessageRow): + if isinstance(row, MessageRow | CallRow | FileTransferJingleRow): return row return None - def get_last_message_row(self) -> MessageRow | None: + def get_last_message_row(self) -> MessageRow | CallRow | FileTransferJingleRow | None: children = reversed(self._list_box.get_children()) for row in children: - if isinstance(row, MessageRow): + if isinstance(row, MessageRow | CallRow | FileTransferJingleRow): return row return None @@ -472,7 +470,7 @@ class ConversationView(Gtk.ScrolledWindow): event: (events.FileRequestReceivedEvent | events.FileRequestSent | None) = None, - db_message: ConversationRow | None = None + db_row: DbConversationJoinedData | None = None ) -> None: assert isinstance(self._contact, BareContact) @@ -480,7 +478,7 @@ class ConversationView(Gtk.ScrolledWindow): self._contact.account, self._contact, event=event, - db_message=db_message) + db_row=db_row) self._insert_message(jingle_transfer_row) def add_encryption_info(self, event: events.EncryptionInfo) -> None: @@ -489,14 +487,14 @@ class ConversationView(Gtk.ScrolledWindow): def add_call_message(self, event: events.JingleRequestReceived | None = None, - db_message: ConversationRow | None = None + db_row: DbConversationJoinedData | None = None ) -> None: assert isinstance(self._contact, BareContact) call_row = CallRow( self._contact.account, self._contact, event=event, - db_message=db_message) + db_row=db_row) self._insert_message(call_row) def add_command_output(self, text: str, is_error: bool) -> None: @@ -504,46 +502,21 @@ class ConversationView(Gtk.ScrolledWindow): self.contact.account, text, is_error) self._insert_message(command_output_row) - def add_message(self, - text: str, - kind: str, - name: str, - timestamp: float, - log_line_id: int | None = None, - message_id: str | None = None, - stanza_id: str | None = None, - display_marking: Displaymarking | None = None, - additional_data: AdditionalDataDict | None = None, - marker: str | None = None, - error: CommonError | StanzaError | None = None - ) -> None: - - if not timestamp: - timestamp = time.time() - - message_row = MessageRow( - self.contact.account, - self.contact, - message_id, - stanza_id, - timestamp, - kind, - name, - text, - additional_data=additional_data, - display_marking=display_marking, - marker=marker, - error=error, - log_line_id=log_line_id) + def add_message_from_db(self, db_row: DbConversationJoinedData) -> None: + message_row = MessageRow.from_db_row(self.contact, db_row) + + message_id = db_row.message_id if message_id is not None: self._message_id_row_map[message_id] = message_row - if kind == 'incoming': + if db_row.direction == ChatDirection.INCOMING: assert self._read_marker_row is not None self._read_marker_row.set_last_incoming_timestamp( message_row.timestamp) - if (marker is not None and marker == 'displayed' and + + if (db_row.marker is not None and + db_row.marker.displayed_ts is not None and message_id is not None): self.set_read_marker(message_id) @@ -555,7 +528,7 @@ class ConversationView(Gtk.ScrolledWindow): self._check_for_merge(message) assert self._read_marker_row is not None - if message.kind == 'incoming': + if message.direction == ChatDirection.INCOMING: if message.timestamp > self._read_marker_row.timestamp: self._read_marker_row.hide() @@ -789,7 +762,6 @@ class ConversationView(Gtk.ScrolledWindow): if row is None: return - row.set_displayed() assert self._read_marker_row is not None timestamp = row.timestamp + timedelta(microseconds=1) if self._read_marker_row.timestamp > timestamp: @@ -802,16 +774,11 @@ class ConversationView(Gtk.ScrolledWindow): if isinstance(row, MessageRow): row.update_avatar() - def correct_message(self, - correct_id: str, - text: str, - nickname: str | None - ) -> None: - - message_row = self._get_row_by_message_id(correct_id) + def correct_message(self, db_row: DbConversationJoinedData) -> None: + assert db_row.message_id is not None + message_row = self._get_row_by_message_id(db_row.message_id) if message_row is not None: - message_row.set_correction(text, nickname) - message_row.set_merged(False) + message_row.update_with_content(db_row) def show_message_retraction(self, stanza_id: str, text: str) -> None: message_row = self.get_row_by_stanza_id(stanza_id) @@ -821,12 +788,12 @@ class ConversationView(Gtk.ScrolledWindow): def show_receipt(self, id_: str) -> None: message_row = self._get_row_by_message_id(id_) if message_row is not None: - message_row.set_receipt() + message_row.show_receipt(True) def show_error(self, id_: str, error: StanzaError) -> None: message_row = self._get_row_by_message_id(id_) if message_row is not None: - message_row.set_error(to_user_string(error)) + message_row.show_error(to_user_string(error)) message_row.set_merged(False) def _on_contact_setting_changed(self, |