~hkdb/geary/disco

« back to all changes in this revision

Viewing changes to src/client/components/status-bar.vala

  • Committer: hkdb
  • Date: 2019-09-26 19:40:48 UTC
  • Revision ID: hkdb@3df.io-20190926194048-n0vggm3yfo8p1ubr
Tags: upstream-3.32.2-disco
Import upstream version 3.32.2-disco

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright 2016 Software Freedom Conservancy Inc.
 
2
 *
 
3
 * This software is licensed under the GNU Lesser General Public License
 
4
 * (version 2.1 or later).  See the COPYING file in this distribution.
 
5
 */
 
6
 
 
7
/**
 
8
 * A wrapper around Gtk.Statusbar that predefines messages and context areas so
 
9
 * you don't have to keep track of them elsewhere.  You can activate and
 
10
 * deactivate messages, instead of worrying about context areas and stacks.
 
11
 * Internally, activations are reference counted, and every new activation
 
12
 * pushes the message to the top of its context area's stack.  Only when
 
13
 * the number of deactivations equals the number of activations is the message
 
14
 * removed from the stack entirely.
 
15
 */
 
16
public class StatusBar : Gtk.Statusbar {
 
17
    public enum Message {
 
18
        OUTBOX_SENDING,
 
19
        OUTBOX_SEND_FAILURE,
 
20
        OUTBOX_SAVE_SENT_MAIL_FAILED;
 
21
 
 
22
        internal string get_text() {
 
23
            switch (this) {
 
24
                case Message.OUTBOX_SENDING:
 
25
                    /// Displayed in the space-limited status bar while a message is in the process of being sent.
 
26
                    return _("Sending…");
 
27
                case Message.OUTBOX_SEND_FAILURE:
 
28
                    /// Displayed in the space-limited status bar when a message fails to be sent due to error.
 
29
                    return _("Error sending email");
 
30
                case Message.OUTBOX_SAVE_SENT_MAIL_FAILED:
 
31
                    // Displayed in the space-limited status bar when a message fails to be uploaded
 
32
                    // to Sent Mail after being sent.
 
33
                    return _("Error saving sent mail");
 
34
                default:
 
35
                    assert_not_reached();
 
36
            }
 
37
        }
 
38
 
 
39
        internal Context get_context() {
 
40
            switch (this) {
 
41
                case Message.OUTBOX_SENDING:
 
42
                    return Context.OUTBOX;
 
43
                case Message.OUTBOX_SEND_FAILURE:
 
44
                    return Context.OUTBOX;
 
45
                case Message.OUTBOX_SAVE_SENT_MAIL_FAILED:
 
46
                    return Context.OUTBOX;
 
47
                default:
 
48
                    assert_not_reached();
 
49
            }
 
50
        }
 
51
    }
 
52
 
 
53
    internal enum Context {
 
54
        OUTBOX,
 
55
    }
 
56
 
 
57
    private Gee.HashMap<Context, uint> context_ids = new Gee.HashMap<Context, uint>();
 
58
    private Gee.HashMap<Message, uint> message_ids = new Gee.HashMap<Message, uint>();
 
59
    private Gee.HashMap<Message, int> message_counts = new Gee.HashMap<Message, int>();
 
60
 
 
61
    public StatusBar() {
 
62
        set_context_id(Context.OUTBOX);
 
63
    }
 
64
 
 
65
    private void set_context_id(Context context) {
 
66
        context_ids.set(context, get_context_id(context.to_string()));
 
67
    }
 
68
 
 
69
    private int get_count(Message message) {
 
70
        return (message_counts.has_key(message) ? message_counts.get(message) : 0);
 
71
    }
 
72
 
 
73
    private void push_message(Message message) {
 
74
        message_ids.set(message, push(context_ids.get(message.get_context()), message.get_text()));
 
75
    }
 
76
 
 
77
    private void remove_message(Message message) {
 
78
        remove(context_ids.get(message.get_context()), message_ids.get(message));
 
79
        message_ids.unset(message);
 
80
    }
 
81
 
 
82
    /**
 
83
     * Return whether the message has been activated more times than it has
 
84
     * been deactivated.
 
85
     */
 
86
    public bool is_message_active(Message message) {
 
87
        return message_ids.has_key(message);
 
88
    }
 
89
 
 
90
    public void activate_message(Message message) {
 
91
        if (is_message_active(message))
 
92
            remove_message(message);
 
93
 
 
94
        push_message(message);
 
95
        message_counts.set(message, get_count(message) + 1);
 
96
    }
 
97
 
 
98
    public void deactivate_message(Message message) {
 
99
        if (!is_message_active(message))
 
100
            return;
 
101
 
 
102
        int count = get_count(message);
 
103
        if (count == 1)
 
104
            remove_message(message);
 
105
        message_counts.set(message, count - 1);
 
106
    }
 
107
}