diff --git a/src/window.py b/src/window.py
index 1eb3bfa..f43babb 100644
--- a/src/window.py
+++ b/src/window.py
@@ -294,6 +294,9 @@ class AlpacaWindow(Adw.ApplicationWindow):
self.bot_message_box = None
def update_bot_message(self, data):
+ if self.bot_message is None:
+ self.save_history()
+ sys.exit()
vadjustment = self.chat_window.get_vadjustment()
if vadjustment.get_value() + 50 >= vadjustment.get_upper() - vadjustment.get_page_size():
GLib.idle_add(vadjustment.set_value, vadjustment.get_upper())
@@ -318,49 +321,69 @@ class AlpacaWindow(Adw.ApplicationWindow):
def run_message(self, messages, model):
response = stream_post(f"{self.ollama_url}/api/chat", data=json.dumps({"model": model, "messages": messages}), callback=self.update_bot_message)
GLib.idle_add(self.add_code_blocks)
- GLib.idle_add(self.send_button.set_sensitive, True)
+ GLib.idle_add(self.send_button.set_css_classes, ["suggested-action"])
+ GLib.idle_add(self.send_button.get_child().set_label, "Send")
+ GLib.idle_add(self.send_button.get_child().set_icon_name, "send-to-symbolic")
GLib.idle_add(self.chat_list_box.set_sensitive, True)
GLib.idle_add(self.add_chat_button.set_sensitive, True)
- GLib.idle_add(self.image_button.set_sensitive, True)
+ if self.verify_if_image_can_be_used(): GLib.idle_add(self.image_button.set_sensitive, True)
GLib.idle_add(self.image_button.set_css_classes, [])
GLib.idle_add(self.image_button.get_child().set_icon_name, "image-x-generic-symbolic")
self.attached_image = {"path": None, "base64": None}
- GLib.idle_add(self.message_text_view.set_sensitive, True)
+ GLib.idle_add(self.message_text_view.set_sensitive, True)
if response['status'] == 'error':
GLib.idle_add(self.show_toast, 'error', 1, self.connection_overlay)
GLib.idle_add(self.show_connection_dialog, True)
def send_message(self, button=None):
- if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return
- current_model = self.model_drop_down.get_selected_item()
- if current_model is None:
- self.show_toast("info", 0, self.main_overlay)
- return
- formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M")
- self.chats["chats"][self.chats["selected_chat"]]["messages"].append({
- "role": "user",
- "model": "User",
- "date": formated_datetime,
- "content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False)
- })
- data = {
- "model": current_model.get_string(),
- "messages": self.chats["chats"][self.chats["selected_chat"]]["messages"]
- }
- if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None:
- data["messages"][-1]["images"] = [self.attached_image["base64"]]
- self.message_text_view.set_sensitive(False)
- self.send_button.set_sensitive(False)
- self.chat_list_box.set_sensitive(False)
- self.add_chat_button.set_sensitive(False)
- self.image_button.set_sensitive(False)
- self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n{formated_datetime}", self.attached_image["base64"])
- self.message_text_view.get_buffer().set_text("", 0)
- self.show_message("", True)
- self.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True)
- self.chat_container.append(self.loading_spinner)
- thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model']))
- thread.start()
+ if button and self.bot_message: #STOP BUTTON
+ if self.loading_spinner: self.chat_container.remove(self.loading_spinner)
+ if self.verify_if_image_can_be_used(): self.image_button.set_sensitive(True)
+ self.image_button.set_css_classes([])
+ self.image_button.get_child().set_icon_name("image-x-generic-symbolic")
+ self.attached_image = {"path": None, "base64": None}
+ self.chat_list_box.set_sensitive(True)
+ self.add_chat_button.set_sensitive(True)
+ self.message_text_view.set_sensitive(True)
+ self.send_button.set_css_classes(["suggested-action"])
+ self.send_button.get_child().set_label("Send")
+ self.send_button.get_child().set_icon_name("send-to-symbolic")
+ self.bot_message = None
+ self.bot_message_box = None
+ self.bot_message_view = None
+ else:
+ if not self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False): return
+ current_model = self.model_drop_down.get_selected_item()
+ if current_model is None:
+ self.show_toast("info", 0, self.main_overlay)
+ return
+ formated_datetime = datetime.now().strftime("%Y/%m/%d %H:%M")
+ self.chats["chats"][self.chats["selected_chat"]]["messages"].append({
+ "role": "user",
+ "model": "User",
+ "date": formated_datetime,
+ "content": self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False)
+ })
+ data = {
+ "model": current_model.get_string(),
+ "messages": self.chats["chats"][self.chats["selected_chat"]]["messages"]
+ }
+ if self.verify_if_image_can_be_used() and self.attached_image["base64"] is not None:
+ data["messages"][-1]["images"] = [self.attached_image["base64"]]
+ self.message_text_view.set_sensitive(False)
+ self.send_button.set_css_classes(["destructive-action"])
+ self.send_button.get_child().set_label("Stop")
+ self.send_button.get_child().set_icon_name("edit-delete-symbolic")
+ self.chat_list_box.set_sensitive(False)
+ self.add_chat_button.set_sensitive(False)
+ self.image_button.set_sensitive(False)
+ self.show_message(self.message_text_view.get_buffer().get_text(self.message_text_view.get_buffer().get_start_iter(), self.message_text_view.get_buffer().get_end_iter(), False), False, f"\n\n{formated_datetime}", self.attached_image["base64"])
+ self.message_text_view.get_buffer().set_text("", 0)
+ self.show_message("", True)
+ self.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True)
+ self.chat_container.append(self.loading_spinner)
+ thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model']))
+ thread.start()
def delete_model(self, dialog, task, model_name):
if dialog.choose_finish(task) == "delete":
diff --git a/src/window.ui b/src/window.ui
index 63cef93..bc5751a 100644
--- a/src/window.ui
+++ b/src/window.ui
@@ -4,7 +4,7 @@
True
- 360
+ 350
500
1300
800
@@ -81,7 +81,6 @@
true