44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
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)
|