diff --git a/src/window.py b/src/window.py index 1bc421c..e6fe87a 100644 --- a/src/window.py +++ b/src/window.py @@ -73,6 +73,7 @@ class AlpacaWindow(Adw.ApplicationWindow): chat_window = Gtk.Template.Child() message_text_view = Gtk.Template.Child() send_button = Gtk.Template.Child() + stop_button = Gtk.Template.Child() image_button = Gtk.Template.Child() file_filter_image = Gtk.Template.Child() file_filter_json = Gtk.Template.Child() @@ -139,56 +140,53 @@ class AlpacaWindow(Adw.ApplicationWindow): self.attached_image = {"path": None, "base64": None} return False + @Gtk.Template.Callback() + def stop_message(self, button=None): + 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(["circular"]) + self.image_button.get_child().set_icon_name("image-x-generic-symbolic") + self.attached_image = {"path": None, "base64": None} + self.toggle_ui_sensitive(True) + self.switch_send_stop_button() + self.bot_message = None + self.bot_message_box = None + self.bot_message_view = None + @Gtk.Template.Callback() def send_message(self, button=None): - 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(["circular"]) - self.image_button.get_child().set_icon_name("image-x-generic-symbolic") - self.attached_image = {"path": None, "base64": None} - self.toggle_ui_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"], - "options": {"temperature": self.model_tweaks["temperature"], "seed": self.model_tweaks["seed"]}, - "keep_alive": f"{self.model_tweaks['keep_alive']}m" - } - 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.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.toggle_ui_sensitive(False) - self.image_button.set_sensitive(False) + 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"], + "options": {"temperature": self.model_tweaks["temperature"], "seed": self.model_tweaks["seed"]}, + "keep_alive": f"{self.model_tweaks['keep_alive']}m" + } + 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.switch_send_stop_button() + self.toggle_ui_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.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True) - self.chat_container.append(self.loading_spinner) - self.show_message("", True) + 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.loading_spinner = Gtk.Spinner(spinning=True, margin_top=12, margin_bottom=12, hexpand=True) + self.chat_container.append(self.loading_spinner) + self.show_message("", True) - thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model'])) - thread.start() + thread = threading.Thread(target=self.run_message, args=(data['messages'], data['model'])) + thread.start() @Gtk.Template.Callback() def manage_models_button_activate(self, button=None): @@ -549,12 +547,14 @@ class AlpacaWindow(Adw.ApplicationWindow): for element in [self.chat_list_box, self.export_chat_button, self.import_chat_button, self.add_chat_button]: element.set_sensitive(status) + def switch_send_stop_button(self): + self.stop_button.set_visible(self.send_button.get_visible()) + self.send_button.set_visible(not self.send_button.get_visible()) + def run_message(self, messages, model): response = connection_handler.stream_post(f"{connection_handler.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_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.switch_send_stop_button) GLib.idle_add(self.toggle_ui_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, ["circular"]) diff --git a/src/window.ui b/src/window.ui index c6e558b..3213b7e 100644 --- a/src/window.ui +++ b/src/window.ui @@ -240,6 +240,23 @@ + + + + false + 3 + false + + + + edit-delete-symbolic + + + +