aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/chat_input/view.vala
blob: 454cff526e20c3447acf8107e11f471ad9bde12c (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using Gdk;
using Gee;
using Gtk;

using Dino.Entities;
using Xmpp;

namespace Dino.Ui.ChatInput {

[GtkTemplate (ui = "/im/dino/Dino/chat_input.ui")]
public class View : Box {

    public string text {
        owned get { return chat_text_view.text_view.buffer.text; }
        set { chat_text_view.text_view.buffer.text = value; }
    }

    private StreamInteractor stream_interactor;
    private Conversation? conversation;
    private HashMap<Conversation, string> entry_cache = new HashMap<Conversation, string>(Conversation.hash_func, Conversation.equals_func);

    [GtkChild] public unowned Frame frame;
    [GtkChild] public unowned ChatTextView chat_text_view;
    [GtkChild] public unowned Box outer_box;
    [GtkChild] public unowned Button file_button;
    [GtkChild] public unowned Separator file_separator;
    [GtkChild] public unowned Label chat_input_status;

    public EncryptionButton encryption_widget;

    public View init(StreamInteractor stream_interactor) {
        this.stream_interactor = stream_interactor;

        encryption_widget = new EncryptionButton(stream_interactor) { relief=ReliefStyle.NONE, margin_top=3, valign=Align.CENTER, visible=true };

        file_button.get_style_context().add_class("dino-attach-button");

        encryption_widget.get_style_context().add_class("dino-chatinput-button");

        // Emoji button for emoji picker (recents don't work < 3.22.19, category icons don't work <3.23.2)
        if (Gtk.get_major_version() >= 3 && Gtk.get_minor_version() >= 24) {
            MenuButton emoji_button = new MenuButton() { relief=ReliefStyle.NONE, margin_top=3, valign=Align.CENTER, visible=true };
            emoji_button.get_style_context().add_class("flat");
            emoji_button.get_style_context().add_class("dino-chatinput-button");
            emoji_button.image = new Image.from_icon_name("dino-emoticon-symbolic", IconSize.BUTTON) { visible=true };

            EmojiChooser chooser = new EmojiChooser();
            chooser.emoji_picked.connect((emoji) => {
                chat_text_view.text_view.buffer.insert_at_cursor(emoji, emoji.data.length);
            });
            emoji_button.set_popover(chooser);

            outer_box.add(emoji_button);
        }

        outer_box.add(encryption_widget);

        Dino.Entities.Settings settings = Dino.Application.get_default().settings;

        MenuButton send_button = new MenuButton() {
            tooltip_text="Send message",
            relief=ReliefStyle.NONE,
            margin_top=3,
            valign=Align.CENTER,
            visible=settings.send_button,
            sensitive=false
        };

        settings.send_button_update.connect(() => {
            send_button.visible = settings.send_button;
        });

        send_button.get_style_context().add_class("flat");
        send_button.get_style_context().add_class("dino-chatinput-button");
        send_button.image = new Image.from_icon_name("document-send", IconSize.BUTTON) {
            visible=true,
            icon_size=3
        };

        chat_text_view.text_view.buffer.changed.connect(() => {
            if (chat_text_view.text_view.buffer.text != "") {
                send_button.sensitive = true;
            }
            else {
                send_button.sensitive = false;
            }
        });

        send_button.button_release_event.connect(() => {
            chat_text_view.send_text();
            return true;
        });

        outer_box.add(send_button);

        Util.force_css(frame, "* { border-radius: 3px; }");

        return this;
    }

    public void set_file_upload_active(bool active) {
        file_button.visible = active;
        file_separator.visible = active;
    }

    public void initialize_for_conversation(Conversation conversation) {
        if (this.conversation != null) entry_cache[this.conversation] = chat_text_view.text_view.buffer.text;
        this.conversation = conversation;

        chat_text_view.text_view.buffer.text = "";
        if (entry_cache.has_key(conversation)) {
            chat_text_view.text_view.buffer.text = entry_cache[conversation];
        }

        do_focus();
    }

    public void set_input_state(Plugins.InputFieldStatus.MessageType message_type) {
        switch (message_type) {
            case Plugins.InputFieldStatus.MessageType.NONE:
                this.get_style_context().remove_class("dino-input-warning");
                this.get_style_context().remove_class("dino-input-error");
                break;
            case Plugins.InputFieldStatus.MessageType.INFO:
                this.get_style_context().remove_class("dino-input-warning");
                this.get_style_context().remove_class("dino-input-error");
                break;
            case Plugins.InputFieldStatus.MessageType.WARNING:
                this.get_style_context().add_class("dino-input-warning");
                this.get_style_context().remove_class("dino-input-error");
                break;
            case Plugins.InputFieldStatus.MessageType.ERROR:
                this.get_style_context().remove_class("dino-input-warning");
                this.get_style_context().add_class("dino-input-error");
                break;
        }
    }

    public void highlight_state_description() {
        chat_input_status.get_style_context().add_class("input-status-highlight-once");
        Timeout.add_seconds(1, () => {
            chat_input_status.get_style_context().remove_class("input-status-highlight-once");
            return false;
        });
    }

    public void do_focus() {
        chat_text_view.text_view.grab_focus();
    }
}

}