diff --git a/src/alpaca.gresource.xml b/src/alpaca.gresource.xml
index b9ece66..2027979 100644
--- a/src/alpaca.gresource.xml
+++ b/src/alpaca.gresource.xml
@@ -32,6 +32,7 @@
icons/down-symbolic.svg
icons/chat-bubble-text-symbolic.svg
icons/execute-from-symbolic.svg
+ icons/cross-large-symbolic.svg
window.ui
gtk/help-overlay.ui
diff --git a/src/custom_widgets/message_widget.py b/src/custom_widgets/message_widget.py
index ca26e6e..816780f 100644
--- a/src/custom_widgets/message_widget.py
+++ b/src/custom_widgets/message_widget.py
@@ -16,7 +16,7 @@ logger = logging.getLogger(__name__)
window = None
-class edit_text_block(Gtk.TextView):
+class edit_text_block(Gtk.Box):
__gtype_name__ = 'AlpacaEditTextBlock'
def __init__(self, text:str):
@@ -27,21 +27,71 @@ class edit_text_block(Gtk.TextView):
margin_bottom=5,
margin_start=5,
margin_end=5,
- css_classes=["view", "editing_message_textview"]
- )
- self.get_buffer().insert(self.get_buffer().get_start_iter(), text, len(text.encode('utf-8')))
- enter_key_controller = Gtk.EventControllerKey.new()
- enter_key_controller.connect("key-pressed", lambda controller, keyval, keycode, state: self.edit_message() if keyval==Gdk.KEY_Return and not (state & Gdk.ModifierType.SHIFT_MASK) else None)
- self.add_controller(enter_key_controller)
- def edit_message(self):
- self.get_parent().get_parent().action_buttons.set_visible(True)
- self.get_parent().get_parent().set_text(self.get_buffer().get_text(self.get_buffer().get_start_iter(), self.get_buffer().get_end_iter(), False))
- self.get_parent().get_parent().add_footer(self.get_parent().get_parent().dt)
- window.save_history(self.get_parent().get_parent().get_parent().get_parent().get_parent().get_parent())
+ spacing=5,
+ orientation=1
+ )
+ self.text_view = Gtk.TextView(
+ halign=0,
+ hexpand=True,
+ css_classes=["view", "editing_message_textview"],
+ wrap_mode=3
+ )
+ cancel_button = Gtk.Button(
+ vexpand=False,
+ valign=2,
+ halign=2,
+ tooltip_text=_("Cancel"),
+ css_classes=['flat', 'circular'],
+ icon_name='cross-large-symbolic'
+ )
+ cancel_button.connect('clicked', lambda *_: self.cancel_edit())
+ save_button = Gtk.Button(
+ vexpand=False,
+ valign=2,
+ halign=2,
+ tooltip_text=_("Save Message"),
+ css_classes=['flat', 'circular'],
+ icon_name='paper-plane-symbolic'
+ )
+ save_button.connect('clicked', lambda *_: self.edit_message())
+ self.append(self.text_view)
+
+ button_container = Gtk.Box(
+ halign=2,
+ spacing=5
+ )
+ button_container.append(cancel_button)
+ button_container.append(save_button)
+ self.append(button_container)
+ self.text_view.get_buffer().insert(self.text_view.get_buffer().get_start_iter(), text, len(text.encode('utf-8')))
+ key_controller = Gtk.EventControllerKey.new()
+ key_controller.connect("key-pressed", self.handle_key)
+ self.text_view.add_controller(key_controller)
+
+ def handle_key(self, controller, keyval, keycode, state):
+ if keyval==Gdk.KEY_Return and not (state & Gdk.ModifierType.SHIFT_MASK):
+ self.save_edit()
+ return True
+ elif keyval==Gdk.KEY_Escape:
+ self.cancel_edit()
+ return True
+
+ def save_edit(self):
+ message_element = self.get_parent().get_parent()
+ message_element.action_buttons.set_visible(True)
+ message_element.set_text(self.text_view.get_buffer().get_text(self.text_view.get_buffer().get_start_iter(), self.text_view.get_buffer().get_end_iter(), False))
+ message_element.add_footer(message_element.dt)
+ window.save_history(message_element.get_parent().get_parent().get_parent().get_parent())
self.get_parent().remove(self)
window.show_toast(_("Message edited successfully"), window.main_overlay)
- return True
+
+ def cancel_edit(self):
+ message_element = self.get_parent().get_parent()
+ message_element.action_buttons.set_visible(True)
+ message_element.set_text(message_element.text)
+ message_element.add_footer(message_element.dt)
+ self.get_parent().remove(self)
class text_block(Gtk.Label):
__gtype_name__ = 'AlpacaTextBlock'