Philipp Hörist pushed to branch master at gajim / gajim
Commits: fa21ba4d by wurstsalat at 2023-05-14T14:42:34+00:00 new: Archive: Allow to create Archive in memory
- - - - - 5784aa4a by wurstsalat at 2023-05-14T14:42:34+00:00 new: Tests: Add GUI test for ChatControl
- - - - - 16618479 by wurstsalat at 2023-05-14T14:42:34+00:00 fix: ConversationView: Fix loading messages going forward from specific point
Fixes #11201
- - - - -
5 changed files:
- gajim/common/storage/archive.py - gajim/gtk/control.py - gajim/gtk/conversation/view.py - test/dialogs/__init__.py - + test/dialogs/conversation_view.py
Changes:
===================================== gajim/common/storage/archive.py ===================================== @@ -162,10 +162,11 @@ class MessageExportRow(NamedTuple):
class MessageArchiveStorage(SqliteStorage): - def __init__(self): + def __init__(self, in_memory: bool = False): + path = None if in_memory else configpaths.get('LOG_DB') SqliteStorage.__init__(self, log, - configpaths.get('LOG_DB'), + path, ARCHIVE_SQL_STATEMENT)
self._jid_ids: dict[JID, JidsTableRow] = {} @@ -456,7 +457,7 @@ def get_conversation_around(self, jids = [jid] account_id = self.get_account_id(account) kinds = map(str, [KindConstant.ERROR]) - n_lines = 20 + n_lines = 50
sql_before = ''' SELECT contact_name, time, kind, show, message, subject,
===================================== gajim/gtk/control.py ===================================== @@ -161,6 +161,7 @@ def switch_contact(self, contact: Union[BareContact,
self._jump_to_end_button.switch_contact(contact) self._scrolled_view.switch_contact(contact) + self._request_history(None, True) self._groupchat_state.switch_contact(contact) self._roster.switch_contact(contact)
@@ -590,17 +591,18 @@ def scroll_to_message(self, log_line_id: int, timestamp: float) -> None: row = self._scrolled_view.get_row_by_log_line_id(log_line_id) if row is None: # Clear view and reload conversation around timestamp + self._scrolled_view.reset() self._scrolled_view.block_signals(True) - self.reset_view() before, at_after = app.storage.archive.get_conversation_around( self.contact.account, self.contact.jid, timestamp) self.add_messages(before) self.add_messages(at_after) + self._scrolled_view.set_history_complete(False, False)
+ GLib.idle_add(self._scrolled_view.block_signals, False) GLib.idle_add( self._scrolled_view.scroll_to_message_and_highlight, log_line_id) - GLib.idle_add(self._scrolled_view.block_signals, False)
def _request_messages(self, before: bool) -> list[ConversationRow]: if before: @@ -638,7 +640,7 @@ def _request_events(self, before: bool) -> list[events.ApplicationEvent]: REQUEST_LINES_COUNT)
def _request_history(self, - _scrolled: Gtk.ScrolledWindow, + _widget: Any, before: bool ) -> None:
===================================== gajim/gtk/conversation/view.py ===================================== @@ -244,7 +244,6 @@ def switch_contact(self, contact: ChatContactT) -> None:
self._block_signals = False self._enable_signal_handlers(True) - self._emit('request-history', True)
def get_autoscroll(self) -> bool: return self._autoscroll
===================================== test/dialogs/__init__.py ===================================== @@ -3,12 +3,13 @@
def require_versions(): gi.require_versions({'Gdk': '3.0', - 'GLib': '2.0', 'Gio': '2.0', + 'GLib': '2.0', + 'GObject': '2.0', 'Gtk': '3.0', 'GtkSource': '4', - 'GObject': '2.0', - 'Pango': '1.0'}) + 'Pango': '1.0', + 'PangoCairo': '1.0'})
require_versions()
===================================== test/dialogs/conversation_view.py ===================================== @@ -0,0 +1,122 @@ +import tempfile +from unittest.mock import MagicMock + +from gi.repository import Gdk +from gi.repository import Gtk +from nbxmpp.protocol import JID + +from gajim.common import app +from gajim.common import configpaths +from gajim.common.const import AvatarSize +from gajim.common.const import KindConstant +from gajim.common.modules.contacts import BareContact +from gajim.common.modules.contacts import ContactSettings +from gajim.common.preview import PreviewManager +from gajim.common.settings import Settings +from gajim.common.storage.archive import MessageArchiveStorage +from gajim.common.storage.events import EventStorage + +from gajim.gtk.avatar import generate_default_avatar +from gajim.gtk.control import ChatControl + +ACCOUNT = 'me@test.tld' +FROM_JID = 'contact@test.tld' +BASE_TIMESTAMP = 1672531200 + + +class ConversationViewTest(Gtk.ApplicationWindow): + def __init__(self) -> None: + Gtk.ApplicationWindow.__init__(self) + self.set_position(Gtk.WindowPosition.CENTER) + self.set_size_request(800, 800) + self.set_title('Test ConversationView') + + self._chat_control = ChatControl() + app.settings.set('hide_groupchat_occupants_list', True) + + contact = self._get_contact() + self._chat_control.switch_contact(contact) + + jump_to_button = Gtk.Button(label='Jump to 500') + jump_to_button.connect('clicked', self._on_jump_to_clicked) + button_box = Gtk.Box( + spacing=6, + halign=Gtk.Align.CENTER, + margin_bottom=6) + button_box.add(jump_to_button) + + box = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL) + box.add(self._chat_control.widget) + box.add(button_box) + self.add(box) + + self.show_all() + self.connect('key-press-event', self._on_key_press_event) + + def _get_contact(self) -> BareContact: + contact = MagicMock(spec='BareContact') + contact.connect = MagicMock() + contact.account = ACCOUNT + contact.jid = FROM_JID + contact.name = 'Test Contact' + contact.is_groupchat = False + avatar = generate_default_avatar( + 'T', + (0.2, 0.1, 0.7), + AvatarSize.ROSTER, + 1) + contact.get_avatar = MagicMock(return_value=avatar) + contact.settings = ContactSettings(ACCOUNT, JID.from_string(ACCOUNT)) + return contact + + def _on_key_press_event(self, + _widget: Gtk.Widget, + event: Gdk.EventKey + ) -> None: + + if event.keyval == Gdk.KEY_Escape: + self.destroy() + + def _on_jump_to_clicked(self, _button: Gtk.Button) -> None: + self._chat_control.scroll_to_message(500, BASE_TIMESTAMP + 500) + + +def add_archive_messages() -> None: + timestamp = BASE_TIMESTAMP + for num in range(1000): + app.storage.archive.insert_into_logs( + ACCOUNT, + FROM_JID, + timestamp, + KindConstant.CHAT_MSG_RECV, + message=num, + stanza_id=num, + message_id=num) + timestamp += 1 + + +app.get_client = MagicMock() +app.window = MagicMock() + +app.settings = Settings(in_memory=True) +app.settings.init() +app.settings.add_account(ACCOUNT) + +app.storage.events = EventStorage() +app.storage.events.init() + +app.storage.archive = MessageArchiveStorage(in_memory=True) +app.storage.archive.init() +add_archive_messages() + +configpaths.set_separation(True) +configpaths.set_config_root(tempfile.gettempdir()) +configpaths.init() + +app.preview_manager = PreviewManager() + +win = ConversationViewTest() +win.connect('destroy', Gtk.main_quit) +win.show_all() + +Gtk.main()
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/e205b303e1f25da1a5d90072d5c61376...