aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_summary/content_populator.vala
blob: 9ebb9159dcb64995b01e0a3c4880b7fd9911bc5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
using Gee;
using Gtk;

using Xmpp;
using Dino.Entities;

namespace Dino.Ui.ConversationSummary {

public class ContentProvider : ContentItemCollection, Object {

    private StreamInteractor stream_interactor;
    private ContentItemWidgetFactory widget_factory;
    private Conversation? current_conversation;
    private Plugins.ConversationItemCollection? item_collection;

    public ContentProvider(StreamInteractor stream_interactor) {
        this.stream_interactor = stream_interactor;
        this.widget_factory =  new ContentItemWidgetFactory(stream_interactor);
    }

    public void init(Plugins.ConversationItemCollection item_collection, Conversation conversation, Plugins.WidgetType type) {
        if (current_conversation != null) {
            stream_interactor.get_module(ContentItemStore.IDENTITY).uninit(current_conversation, this);
        }
        current_conversation = conversation;
        this.item_collection = item_collection;
        stream_interactor.get_module(ContentItemStore.IDENTITY).init(conversation, this);
    }

    public void insert_item(ContentItem item) {
        item_collection.insert_item(new ContentMetaItem(item, widget_factory));
    }

    public void remove_item(ContentItem item) { }


    public Gee.List<ContentMetaItem> populate_latest(Conversation conversation, int n) {
        Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation, n);
        Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
        foreach (ContentItem item in items) {
            ret.add(new ContentMetaItem(item, widget_factory));
        }
        return ret;
    }

    public Gee.List<ContentMetaItem> populate_before(Conversation conversation, ContentItem before_item, int n) {
        Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
        Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_before(conversation, before_item, n);
        foreach (ContentItem item in items) {
            ret.add(new ContentMetaItem(item, widget_factory));
        }
        return ret;
    }

    public Gee.List<ContentMetaItem> populate_after(Conversation conversation, ContentItem after_item, int n) {
        Gee.List<ContentMetaItem> ret = new ArrayList<ContentMetaItem>();
        Gee.List<ContentItem> items = stream_interactor.get_module(ContentItemStore.IDENTITY).get_after(conversation, after_item, n);
        foreach (ContentItem item in items) {
            ret.add(new ContentMetaItem(item, widget_factory));
        }
        return ret;
    }

    public ContentMetaItem get_content_meta_item(ContentItem content_item) {
        return new ContentMetaItem(content_item, widget_factory);
    }
}

public class ContentMetaItem : Plugins.MetaConversationItem {
    public override Jid? jid { get; set; }
    public override DateTime? sort_time { get; set; }
    public override DateTime? display_time { get; set; }
    public override Encryption? encryption { get; set; }

    public ContentItem content_item;
    private ContentItemWidgetFactory widget_factory;

    public ContentMetaItem(ContentItem content_item, ContentItemWidgetFactory widget_factory) {
        this.jid = content_item.jid;
        this.sort_time = content_item.sort_time;
        this.seccondary_sort_indicator = content_item.seccondary_sort_indicator;
        this.display_time = content_item.display_time;
        this.encryption = content_item.encryption;
        this.mark = content_item.mark;

        WeakRef weak_item = WeakRef(content_item);
        content_item.notify["mark"].connect(() => {
            ContentItem? ci = weak_item.get() as ContentItem;
            if (ci == null) return;
            this.mark = ci.mark;
        });

        this.can_merge = true;
        this.requires_avatar = true;
        this.requires_header = true;

        this.content_item = content_item;
        this.widget_factory = widget_factory;
    }

    public override bool can_merge { get; set; default=true; }
    public override bool requires_avatar { get; set; default=true; }
    public override bool requires_header { get; set; default=true; }

    public override Object? get_widget(Plugins.WidgetType type) {
        return widget_factory.get_widget(content_item);
    }
}

}