From 8bc0d107e740be468ee0c9dcd253de36355088d3 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 27 Aug 2017 23:55:49 +0200 Subject: Plugins providing conversation items for ConversationView --- .../conversation_item_skeleton.vala | 142 +++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 main/src/ui/conversation_summary/conversation_item_skeleton.vala (limited to 'main/src/ui/conversation_summary/conversation_item_skeleton.vala') diff --git a/main/src/ui/conversation_summary/conversation_item_skeleton.vala b/main/src/ui/conversation_summary/conversation_item_skeleton.vala new file mode 100644 index 00000000..b30d45d3 --- /dev/null +++ b/main/src/ui/conversation_summary/conversation_item_skeleton.vala @@ -0,0 +1,142 @@ +using Gee; +using Gdk; +using Gtk; +using Markup; + +using Dino.Entities; + +namespace Dino.Ui.ConversationSummary { + +[GtkTemplate (ui = "/im/dino/conversation_summary/message_item.ui")] +public class ConversationItemSkeleton : Grid { + + [GtkChild] private Image image; + [GtkChild] private Label time_label; + [GtkChild] private Image encryption_image; + [GtkChild] private Image received_image; + + public StreamInteractor stream_interactor; + public Conversation conversation { get; set; } + public Gee.List items = new ArrayList(); + + private Box box = new Box(Orientation.VERTICAL, 2) { visible=true }; + + public ConversationItemSkeleton(StreamInteractor stream_interactor, Conversation conversation) { + this.conversation = conversation; + this.stream_interactor = stream_interactor; + + set_main_widget(box); + } + + public void add_meta_item(Plugins.MetaConversationItem item) { + items.add(item); + if (items.size == 1) { + setup(item); + } + Widget widget = (Widget) item.get_widget(Plugins.WidgetType.GTK); + if (item.requires_header) { + box.add(widget); + } else { + set_title_widget(widget); + } + item.notify["mark"].connect_after(update_received); + update_received(); + } + + public void set_title_widget(Widget w) { + attach(w, 1, 0, 1, 1); + } + + public void set_main_widget(Widget w) { + attach(w, 1, 1, 2, 1); + } + + public void update_time() { + if (items.size > 0 && items[0].display_time != null) { + time_label.label = get_relative_time(items[0].display_time.to_local()); + } + } + + private void setup(Plugins.MetaConversationItem item) { + update_time(); + Util.image_set_from_scaled_pixbuf(image, (new AvatarGenerator(30, 30, image.scale_factor)).set_greyscale(item.dim).draw_jid(stream_interactor, item.jid, conversation.account)); + if (item.requires_header) { + set_default_title_widget(item.jid); + } + if (item.encryption != null && item.encryption != Encryption.NONE) { + encryption_image.visible = true; + encryption_image.set_from_icon_name("changes-prevent-symbolic", IconSize.SMALL_TOOLBAR); + } + } + + private void set_default_title_widget(Jid jid) { + Label name_label = new Label("") { use_markup=true, xalign=0, hexpand=true, visible=true }; + string display_name = Util.get_display_name(stream_interactor, jid, conversation.account); + string color = Util.get_name_hex_color(stream_interactor, conversation.account, jid, Util.is_dark_theme(name_label)); + name_label.label = @"$display_name"; + name_label.style_updated.connect(() => { + string new_color = Util.get_name_hex_color(stream_interactor, conversation.account, jid, Util.is_dark_theme(name_label)); + name_label.set_markup(@"$display_name"); + }); + set_title_widget(name_label); + } + + private void update_received() { + bool all_received = true; + bool all_read = true; + foreach (Plugins.MetaConversationItem item in items) { + if (item.mark == Message.Marked.WONTSEND) { + received_image.visible = true; + received_image.set_from_icon_name("dialog-warning-symbolic", IconSize.SMALL_TOOLBAR); + Util.force_error_color(received_image); + Util.force_error_color(encryption_image); + Util.force_error_color(time_label); + return; + } else if (item.mark != Message.Marked.READ) { + all_read = false; + if (item.mark != Message.Marked.RECEIVED) { + all_received = false; + } + } + } + if (all_read) { + received_image.visible = true; + received_image.set_from_icon_name("dino-double-tick-symbolic", IconSize.SMALL_TOOLBAR); + } else if (all_received) { + received_image.visible = true; + received_image.set_from_icon_name("dino-tick-symbolic", IconSize.SMALL_TOOLBAR); + } else if (received_image.visible) { + received_image.set_from_icon_name("image-loading-symbolic", IconSize.SMALL_TOOLBAR); + } + } + + private static string get_relative_time(DateTime datetime) { + DateTime now = new DateTime.now_local(); + TimeSpan timespan = now.difference(datetime); + if (timespan > 365 * TimeSpan.DAY) { + return datetime.format(Util.is_24h_format() ? + /* xgettext:no-c-format */ /* Date + time in 24h format (w/o seconds) */ _("%x, %H\u2236%M") : + /* xgettext:no-c-format */ /* Date + time in 12h format (w/o seconds)*/ _("%x, %l\u2236%M %p")); + } else if (timespan > 7 * TimeSpan.DAY) { + return datetime.format(Util.is_24h_format() ? + /* xgettext:no-c-format */ /* Month, day and time in 24h format (w/o seconds) */ _("%b %d, %H\u2236%M") : + /* xgettext:no-c-format */ /* Month, day and time in 12h format (w/o seconds) */ _("%b %d, %l\u2236%M %p")); + } else if (datetime.get_day_of_month() != new DateTime.now_utc().get_day_of_month()) { + return datetime.format(Util.is_24h_format() ? + /* xgettext:no-c-format */ /* Day of week and time in 12h format (w/o seconds) */ _("%a, %H\u2236%M") : + /* xgettext:no-c-format */ _("%a, %l\u2236%M %p")); + } else if (timespan > 9 * TimeSpan.MINUTE) { + return datetime.format(Util.is_24h_format() ? + /* xgettext:no-c-format */ /* Time in 24h format (w/o seconds) */ _("%H\u2236%M") : + /* xgettext:no-c-format */ /* Time in 12h format (w/o seconds) */ _("%l\u2236%M %p")); + } else if (timespan > TimeSpan.MINUTE) { + ulong mins = (ulong) (timespan.abs() / TimeSpan.MINUTE); + /* xgettext:this is the beginning of a sentence. */ + return n("%i min ago", "%i mins ago", mins).printf(mins); + } else { + return _("Just now"); + } + } +} + +} -- cgit v1.2.3-54-g00ecf