geary/src/client/components/components-in-app-notification.vala
Adam Dingle 02c65476ea Allow brief notifications
This change allows certain notifications to be displayed only briefly. The new DConf key brief-notification-duration is the number of seconds for which brief notifications should be displayed.

At the moment the only brief notifications are "Message sent", "Conversation archived" and "Message archived".

Closes #602
2020-01-19 15:26:21 +01:00

68 lines
2 KiB
Vala

/* Copyright 2017 Software Freedom Conservancy Inc.
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
/**
* Represents an in-app notification.
*
* Following the GNOME HIG, it should only contain a label and maybe a button.
*/
[GtkTemplate (ui = "/org/gnome/Geary/components-in-app-notification.ui")]
public class Components.InAppNotification : Gtk.Revealer {
/** Length of the default timeout to close the notification. */
public const uint DEFAULT_KEEPALIVE = 5;
[GtkChild]
private Gtk.Label message_label;
[GtkChild]
private Gtk.Button action_button;
/**
* Creates an in-app notification.
*
* @param message The message that should be displayed.
* @param keepalive The amount of seconds that the notification should stay visible.
*/
public InAppNotification(string message, uint keepalive = 0) {
if (keepalive == 0)
keepalive = DEFAULT_KEEPALIVE;
this.transition_type = Gtk.RevealerTransitionType.SLIDE_DOWN;
this.message_label.label = message;
// Close after the given amount of time.
Timeout.add_seconds(keepalive, () => { close(); return false; });
}
/**
* Sets a button for the notification.
*/
public void set_button(string label, string action_name) {
this.action_button.visible = true;
this.action_button.label = label;
this.action_button.action_name = action_name;
}
public override void show() {
base.show();
this.reveal_child = true;
}
/**
* Closes the in-app notification.
*/
[GtkCallback]
public void close() {
// Allows for the disappearing transition
this.reveal_child = false;
}
// Make sure the notification gets destroyed after closing.
[GtkCallback]
private void on_child_revealed(Object src, ParamSpec p) {
if (!this.child_revealed)
destroy();
}
}