diff options
| author | frosty <gabriel@bwaaa.monster> | 2026-08-27 18:56:06 -0400 |
|---|---|---|
| committer | frosty <gabriel@bwaaa.monster> | 2026-08-27 18:56:06 -0400 |
| commit | 3ab53f7cb601c62ede22f1927db5aa3baf00a6e9 (patch) | |
| tree | d56db40c79c2d72c1aa054cc7f15e5a448d6e922 /main/src/ui/conversation_content_view/conversation_view.vala | |
| parent | 09891ea2f392bad30f4fd4a0cf6f6098ca5c1b4f (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.vala | 21 |
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; |
