diff --git a/src/alpaca.gresource.xml b/src/alpaca.gresource.xml index 596b930..245c476 100644 --- a/src/alpaca.gresource.xml +++ b/src/alpaca.gresource.xml @@ -28,6 +28,7 @@ icons/step-over-symbolic.svg icons/share-symbolic.svg icons/edit-find-symbolic.svg + icons/edit-symbolic.svg window.ui gtk/help-overlay.ui diff --git a/src/window.py b/src/window.py index 9b1a95a..5de4c27 100644 --- a/src/window.py +++ b/src/window.py @@ -46,6 +46,7 @@ class AlpacaWindow(Adw.ApplicationWindow): _ = gettext.gettext #Variables + editing_message = None available_models = None run_on_background = False remote_url = "" @@ -142,7 +143,8 @@ class AlpacaWindow(Adw.ApplicationWindow): _("That tag is already being pulled"), _("That tag has been pulled already"), _("Code copied to the clipboard"), - _("Message copied to the clipboard") + _("Message copied to the clipboard"), + _("Message edited successfully") ], "good": [ _("Model deleted successfully"), @@ -181,6 +183,19 @@ class AlpacaWindow(Adw.ApplicationWindow): @Gtk.Template.Callback() def send_message(self, button=None): + if self.editing_message: + self.editing_message["button_container"].set_visible(True) + self.editing_message["text_view"].set_css_classes(["flat"]) + self.editing_message["text_view"].set_editable(False) + buffer = self.editing_message["text_view"].get_buffer() + text = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), False).rstrip('\n') + footer = "" + self.editing_message["footer"] + "" + buffer.insert_markup(buffer.get_end_iter(), footer, len(footer)) + self.chats["chats"][self.chats["selected_chat"]]["messages"][self.editing_message["id"]]["content"] = text + self.editing_message = None + self.save_history() + self.show_toast("info", 6, self.main_overlay) + if self.bot_message: return 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().get_string() @@ -463,6 +478,25 @@ class AlpacaWindow(Adw.ApplicationWindow): clipboard.set(self.chats["chats"][self.chats["selected_chat"]]["messages"][id]["content"]) self.show_toast("info", 5, self.main_overlay) + def edit_message(self, message_element, text_view, button_container): + if self.editing_message: self.send_message() + + button_container.set_visible(False) + id = message_element.get_name() + + text_buffer = text_view.get_buffer() + end_iter = text_buffer.get_end_iter() + start_iter = end_iter.copy() + start_iter.backward_line() + start_iter.backward_char() + footer = text_buffer.get_text(start_iter, end_iter, False) + text_buffer.delete(start_iter, end_iter) + + text_view.set_editable(True) + text_view.set_css_classes(["view"]) + + self.editing_message = {"text_view": text_view, "id": id, "button_container": button_container, "footer": footer} + def preview_file(self, file_path, file_type): content = self.get_content_of_file(file_path, file_type) if content: @@ -544,6 +578,11 @@ Generate a title following these rules: css_classes = ["flat", "circular"], tooltip_text = _("Copy Message") ) + edit_button = Gtk.Button( + icon_name = "edit-symbolic", + css_classes = ["flat", "circular"], + tooltip_text = _("Edit Message") + ) button_container = Gtk.Box( orientation=0, @@ -634,8 +673,10 @@ Generate a title following these rules: delete_button.connect("clicked", lambda button, element=overlay: self.delete_message(element)) copy_button.connect("clicked", lambda button, element=overlay: self.copy_message(element)) + edit_button.connect("clicked", lambda button, element=overlay, textview=message_text, button_container=button_container: self.edit_message(element, textview, button_container)) button_container.append(delete_button) button_container.append(copy_button) + if not bot: button_container.append(edit_button) overlay.add_overlay(button_container) self.chat_container.append(overlay)