Philipp Hörist pushed to branch master at gajim / gajim


Commits:
f3464d88 by Philipp Hörist at 2024-12-08T22:07:53+01:00
cfix: View: Fix scroll to bottom when loading messages

- - - - -


1 changed file:

- gajim/gtk/conversation/view.py


Changes:

=====================================
gajim/gtk/conversation/view.py
=====================================
@@ -159,7 +159,6 @@ def disable_row_selection(self) -> None:
             row.disable_selection_mode()
 
     def _on_scroll_view(self, action: Gio.SimpleAction, _param: Literal[None]) 
-> None:
-
         action_name = action.get_name()
         if action_name == "scroll-view-down":
             self.emit("scroll-child", Gtk.ScrollType.PAGE_DOWN, False)
@@ -236,7 +235,7 @@ def block_signals(self, value: bool) -> None:
     def _emit(self, signal_name: str, *args: Any) -> None:
         if not self._block_signals:
             log.debug("emit %s, %s", signal_name, args)
-            self.emit(signal_name, *args)
+            GLib.idle_add(self.emit, signal_name, *args)
 
     def _reset_list_box(self) -> None:
         # TODO GTK4
@@ -285,23 +284,29 @@ def set_history_complete(self, before: bool, complete: 
bool) -> None:
     def get_lower_complete(self) -> bool:
         return self._lower_complete
 
+    def _scroll_to_pos_idle(self, adj: Gtk.Adjustment, value: float) -> None:
+        if value == -1:
+            # scroll to end
+            value = adj.get_upper() - adj.get_page_size()
+
+        GLib.idle_add(adj.set_value, value)
+
     def _on_adj_upper_changed(
         self, adj: Gtk.Adjustment, _pspec: GObject.ParamSpec
     ) -> None:
-
         upper = adj.get_upper()
         diff = upper - self._current_upper
 
         if diff != 0:
             self._current_upper = upper
             if self._autoscroll:
-                adj.set_value(adj.get_upper() - adj.get_page_size())
+                self._scroll_to_pos_idle(adj, -1)
             else:
                 # Workaround
                 # https://gitlab.gnome.org/GNOME/gtk/merge_requests/395
                 self.set_kinetic_scrolling(True)
                 if self._requesting == "before":
-                    adj.set_value(adj.get_value() + diff)
+                    self._scroll_to_pos_idle(adj, adj.get_value() + diff)
 
         if upper == adj.get_page_size():
             # There is no scrollbar
@@ -338,7 +343,7 @@ def _on_adj_value_changed(
 
         self._request_history_at_upper = None
 
-        distance = adj.get_page_size() * 2
+        distance = adj.get_page_size()
         if adj.get_value() < distance:
             # Load messages when we are near the top
             if self._upper_complete:
@@ -536,10 +541,6 @@ def _insert_message(self, message: BaseRow) -> None:
             if message.timestamp > self._read_marker_row.timestamp:
                 self._read_marker_row.hide()
 
-        # TODO GTK4:
-        # This is a workaround to make the scrolledwindow aware of new content
-        GLib.idle_add(message.queue_resize)
-
     def _add_date_row(self, timestamp: datetime) -> None:
         start_of_day = get_start_of_day(timestamp.astimezone())
         if start_of_day in self._active_date_rows:
@@ -702,8 +703,7 @@ def _remove_highligh_class(self, highlight_row: BaseRow) -> 
None:
         highlight_row.remove_css_class("conversation-row-highlight")
 
     def scroll_to_end(self) -> None:
-        adj = self.get_vadjustment()
-        adj.set_value(adj.get_upper() - adj.get_page_size())
+        self._scroll_to_pos_idle(self.get_vadjustment(), -1)
 
     def _get_row_by_message_id(self, message_id: str) -> MessageRow | None:
         return self._message_id_row_map.get(message_id)



View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/commit/f3464d88024781a964bf8370b8d68b5321e30a83

-- 
View it on GitLab: 
https://dev.gajim.org/gajim/gajim/-/commit/f3464d88024781a964bf8370b8d68b5321e30a83
You're receiving this email because of your account on dev.gajim.org.


_______________________________________________
Commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to