import gi from gi.repository import GLib, Gtk, Gdk import util class ChatView(Gtk.ScrolledWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.cur_ai_response = None self.listbox = Gtk.ListBox() self.listbox.set_selection_mode(Gtk.SelectionMode.NONE) self.listbox.set_focusable(True) self.set_child(self.listbox) def scroll_to_bottom(self, *args): adj = self.get_vadjustment() adj.set_value(adj.get_upper() - adj.get_page_size()) def start_response(self): self.cur_ai_response = self.add_message(sender=False) return self.cur_ai_response def add_message(self, text="", sender=True): label = Gtk.Label(selectable=True, wrap=True, xalign=1.0 if sender else 0.0) label.set_text(text) util.set_margin_all(label, 8) row = Gtk.ListBoxRow() row.set_child(label) self.listbox.append(row) GLib.idle_add(self.scroll_to_bottom) return label def add_response_part(self, part): if self.cur_ai_response is None: return self.cur_ai_response.set_label(self.cur_ai_response.get_label() + part) GLib.idle_add(self.scroll_to_bottom)