aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/quote_widget.vala
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2023-01-06 13:19:42 +0100
committerfiaxh <git@lightrise.org>2023-01-06 14:03:54 +0100
commitdc52e7595cca06d0a2da7d11b3c88cb2f7ce529c (patch)
tree111f4a86a8541ce51bba7ec56f5b32197fcefc83 /main/src/ui/conversation_content_view/quote_widget.vala
parent4d7809bb12199a598b531ca3ca019a4bb5a867f7 (diff)
downloaddino-dc52e7595cca06d0a2da7d11b3c88cb2f7ce529c.tar.gz
dino-dc52e7595cca06d0a2da7d11b3c88cb2f7ce529c.zip
Add support for XEP-0461 replies (with fallback)
Diffstat (limited to 'main/src/ui/conversation_content_view/quote_widget.vala')
-rw-r--r--main/src/ui/conversation_content_view/quote_widget.vala73
1 files changed, 73 insertions, 0 deletions
diff --git a/main/src/ui/conversation_content_view/quote_widget.vala b/main/src/ui/conversation_content_view/quote_widget.vala
new file mode 100644
index 00000000..f627c852
--- /dev/null
+++ b/main/src/ui/conversation_content_view/quote_widget.vala
@@ -0,0 +1,73 @@
+using Dino.Ui.ConversationSummary;
+using Gee;
+using Gtk;
+using Xmpp;
+
+using Dino.Entities;
+
+namespace Dino.Ui.Quote {
+
+ public class Model : Object {
+ public signal void aborted();
+ public signal void jump_to();
+
+ public string display_name { get; set; }
+ public string message { get; set; }
+ public DateTime message_time { get; set; }
+
+ public StreamInteractor stream_interactor { get; set; }
+ public Conversation conversation { get; set; }
+ public Jid author_jid { get; set; }
+
+ public bool can_abort { get; set; default=false; }
+
+ public Model.from_content_item(ContentItem content_item, Conversation conversation, StreamInteractor stream_interactor) {
+ this.display_name = Util.get_participant_display_name(stream_interactor, conversation, content_item.jid, true);
+ if (content_item.type_ == MessageItem.TYPE) {
+ var message = ((MessageItem) content_item).message;
+ this.message = Dino.message_body_without_reply_fallback(message);
+ } else if (content_item.type_ == FileItem.TYPE) {
+ this.message = "[File]";
+ }
+ this.message_time = content_item.time;
+
+ this.stream_interactor = stream_interactor;
+ this.conversation = conversation;
+ this.author_jid = content_item.jid;
+ }
+ }
+
+ public Widget get_widget(Model model) {
+ Builder builder = new Builder.from_resource("/im/dino/Dino/quote.ui");
+ AvatarImage avatar = (AvatarImage) builder.get_object("avatar");
+ Label author = (Label) builder.get_object("author");
+ Label time = (Label) builder.get_object("time");
+ Label message = (Label) builder.get_object("message");
+ Button abort_button = (Button) builder.get_object("abort-button");
+
+ avatar.set_conversation_participant(model.stream_interactor, model.conversation, model.author_jid);
+ model.bind_property("display-name", author, "label", BindingFlags.SYNC_CREATE);
+ model.bind_property("message-time", time, "label", BindingFlags.SYNC_CREATE, (_, from_value, ref to_value) => {
+ DateTime message_time = (DateTime) from_value;
+ to_value = ConversationItemSkeleton.get_relative_time(message_time);
+ return true;
+ });
+ model.bind_property("message", message, "label", BindingFlags.SYNC_CREATE);
+ model.bind_property("can-abort", abort_button, "visible", BindingFlags.SYNC_CREATE);
+
+ abort_button.clicked.connect(() => {
+ model.aborted();
+ });
+
+ Widget outer = builder.get_object("outer") as Widget;
+
+ GestureClick gesture_click_controller = new GestureClick();
+ outer.add_controller(gesture_click_controller);
+ gesture_click_controller.pressed.connect(() => {
+ model.jump_to();
+ });
+
+ return outer;
+ }
+}
+