aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/conversation_view.vala
diff options
context:
space:
mode:
authorfrosty <gabriel@bwaaa.monster>2026-08-27 18:56:06 -0400
committerfrosty <gabriel@bwaaa.monster>2026-08-27 18:56:06 -0400
commit3ab53f7cb601c62ede22f1927db5aa3baf00a6e9 (patch)
treed56db40c79c2d72c1aa054cc7f15e5a448d6e922 /main/src/ui/conversation_content_view/conversation_view.vala
parent09891ea2f392bad30f4fd4a0cf6f6098ca5c1b4f (diff)
feat: improve message actions and add copy option
Diffstat (limited to 'main/src/ui/conversation_content_view/conversation_view.vala')
-rw-r--r--main/src/ui/conversation_content_view/conversation_view.vala21
1 files changed, 20 insertions, 1 deletions
diff --git a/main/src/ui/conversation_content_view/conversation_view.vala b/main/src/ui/conversation_content_view/conversation_view.vala
index 6a686f1b..83e86827 100644
--- a/main/src/ui/conversation_content_view/conversation_view.vala
+++ b/main/src/ui/conversation_content_view/conversation_view.vala
@@ -55,6 +55,7 @@ public class ConversationView : Widget, Plugins.ConversationItemCollection, Plug
Widget currently_highlighted = null;
ContentMetaItem? current_meta_item = null;
double last_y = -1;
+ private bool message_text_selectable = true;
private Button create_action_button(string action_name) {
var button = new Button() { name=action_name };
@@ -82,6 +83,7 @@ public class ConversationView : Widget, Plugins.ConversationItemCollection, Plug
create_action_button("reply");
create_action_button("delete");
+ create_action_button("copy");
var menu_button = new MenuButton() { name="menu", tooltip_text=_("More actions") };
action_buttons["menu"] = menu_button;
@@ -127,7 +129,10 @@ public class ConversationView : Widget, Plugins.ConversationItemCollection, Plug
// reaches the overlapping part of a button.
EventControllerMotion main_motion_events = new EventControllerMotion();
main.add_controller(main_motion_events);
- main_motion_events.motion.connect(update_highlight);
+ main_motion_events.motion.connect((x, y) => {
+ set_message_text_selectable(true);
+ update_highlight(x, y);
+ });
// Process touch events and capture phase to allow highlighting a message without cursor
GestureClick click_controller = new GestureClick();
@@ -135,12 +140,23 @@ public class ConversationView : Widget, Plugins.ConversationItemCollection, Plug
click_controller.propagation_phase = Gtk.PropagationPhase.CAPTURE;
main_wrap_box.add_controller(click_controller);
click_controller.pressed.connect_after((n, x, y) => {
+ set_message_text_selectable(false);
update_highlight(x, y);
});
return this;
}
+ private void set_message_text_selectable(bool selectable) {
+ if (message_text_selectable == selectable) return;
+
+ message_text_selectable = selectable;
+ foreach (Plugins.MetaConversationItem item in meta_items) {
+ MessageMetaItem? message_item = item as MessageMetaItem;
+ if (message_item != null) message_item.set_text_selectable(selectable);
+ }
+ }
+
public void activate_last_message_correction() {
Gee.BidirIterator<Plugins.MetaConversationItem> iter = content_items.bidir_iterator();
iter.last();
@@ -578,6 +594,9 @@ public class ConversationView : Widget, Plugins.ConversationItemCollection, Plug
private Widget insert_new(Plugins.MetaConversationItem item) {
Plugins.MetaConversationItem? lower_item = meta_items.lower(item);
+ MessageMetaItem? message_item = item as MessageMetaItem;
+ if (message_item != null) message_item.set_text_selectable(message_text_selectable);
+
// Fill datastructure
ConversationItemSkeleton item_skeleton = new ConversationItemSkeleton(stream_interactor, conversation, item);
item_item_skeletons[item] = item_skeleton;