aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/ui/add_conversation/chat/dialog.vala
blob: 80dac68e99362b3722db1ffa394ae3cb2fab9f42 (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
using Gee;
using Gdk;
using Gtk;

using Dino.Entities;

namespace Dino.Ui.AddConversation.Chat {

public class Dialog : Gtk.Dialog {

    public signal void conversation_opened(Conversation conversation);

    private Button ok_button;

    private RosterList roster_list;
    private SelectJidFragment select_jid_fragment;
    private StreamInteractor stream_interactor;

    public Dialog(StreamInteractor stream_interactor) {
        Object(use_header_bar : 1);
        this.title = "Start Chat";
        this.modal = true;
        this.stream_interactor = stream_interactor;

        setup_headerbar();
        setup_view();
    }

    private void setup_headerbar() {
        HeaderBar header_bar = get_header_bar() as HeaderBar;
        header_bar.show_close_button = false;

        Button cancel_button = new Button();
        cancel_button.set_label("Cancel");
        cancel_button.visible = true;
        header_bar.pack_start(cancel_button);

        ok_button = new Button();
        ok_button.get_style_context().add_class("suggested-action");
        ok_button.label = "Start";
        ok_button.sensitive = false;
        ok_button.visible = true;
        header_bar.pack_end(ok_button);

        cancel_button.clicked.connect(() => { close(); });
        ok_button.clicked.connect(on_ok_button_clicked);
    }

    private void setup_view() {
        roster_list = new RosterList(stream_interactor);
        roster_list.row_activated.connect(() => { ok_button.clicked(); });
        select_jid_fragment = new SelectJidFragment(stream_interactor, roster_list);
        select_jid_fragment.add_jid.connect((row) => {
            AddContactDialog add_contact_dialog = new AddContactDialog(stream_interactor);
            add_contact_dialog.set_transient_for(this);
            add_contact_dialog.show();
        });
        select_jid_fragment.edit_jid.connect(() => {

        });
        select_jid_fragment.remove_jid.connect((row) => {
            ListRow list_row = roster_list.get_selected_row() as ListRow;
            RosterManager.get_instance(stream_interactor).remove_jid(list_row.account, list_row.jid);
        });
        select_jid_fragment.notify["done"].connect(() => {
            ok_button.sensitive = select_jid_fragment.done;
        });
        get_content_area().add(select_jid_fragment);
    }

    protected void on_ok_button_clicked() {
        ListRow? selected_row = roster_list.get_selected_row() as ListRow;
        if (selected_row != null) {
            // TODO move in list to front immediately
            ConversationManager.get_instance(stream_interactor).ensure_start_conversation(selected_row.jid, selected_row.account);
            Conversation conversation = ConversationManager.get_instance(stream_interactor).get_conversation(selected_row.jid, selected_row.account);
            conversation_opened(conversation);
        }
        close();
    }
}
}