geary/src/client/plugin/messaging-menu/messaging-menu.vala
Michael Gratton 56876365ba Rename GearyApplication class and source to match code style
Rename `GearyApplication` => `Application.Client` and
`geary-application.vala to `application-client.vala`. Update call sites
and test cases.
2019-11-17 21:38:29 +11:00

106 lines
3.4 KiB
Vala

/*
* Copyright 2016 Software Freedom Conservancy Inc.
* Copyright 2019 Michael Gratton <mike@vee.net>.
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
[ModuleInit]
public void peas_register_types(TypeModule module) {
Peas.ObjectModule obj = module as Peas.ObjectModule;
obj.register_extension_type(
typeof(Plugin.Notification),
typeof(Plugin.MessagingMenu)
);
}
/** Updates the Unity messaging menu when new mail arrives. */
public class Plugin.MessagingMenu : Notification {
public override Application.Client application {
get; construct set;
}
public override Application.NotificationContext context {
get; construct set;
}
private global::MessagingMenu.App? app = null;
public override void activate() {
this.app = new global::MessagingMenu.App(
"%s.desktop".printf(Application.Client.APP_ID)
);
this.app.register();
this.app.activate_source.connect(on_activate_source);
this.context.folder_removed.connect(on_folder_removed);
this.context.new_messages_arrived.connect(on_new_messages_changed);
this.context.new_messages_retired.connect(on_new_messages_changed);
}
public override void deactivate(bool is_shutdown) {
this.context.folder_removed.disconnect(on_folder_removed);
this.context.new_messages_arrived.disconnect(on_new_messages_changed);
this.context.new_messages_retired.disconnect(on_new_messages_changed);
this.app.activate_source.disconnect(on_activate_source);
this.app.unregister();
this.app = null;
}
private string get_source_id(Geary.Folder folder) {
return "new-messages-id-%s-%s".printf(folder.account.information.id, folder.path.to_string());
}
private void on_activate_source(string source_id) {
foreach (Geary.Folder folder in this.context.get_folders()) {
if (source_id == get_source_id(folder)) {
this.application.show_folder.begin(folder);
break;
}
}
}
private void on_new_messages_changed(Geary.Folder folder, int count) {
if (count > 0) {
show_new_messages_count(folder, count);
} else {
remove_new_messages_count(folder);
}
}
private void on_folder_removed(Geary.Folder folder) {
remove_new_messages_count(folder);
}
private void show_new_messages_count(Geary.Folder folder, int count) {
if (this.context.should_notify_new_messages(folder)) {
string source_id = get_source_id(folder);
if (this.app.has_source(source_id)) {
this.app.set_source_count(source_id, count);
} else {
this.app.append_source_with_count(
source_id,
null,
_("%s — New Messages").printf(folder.account.information.display_name),
count);
}
this.app.draw_attention(source_id);
}
}
private void remove_new_messages_count(Geary.Folder folder) {
string source_id = get_source_id(folder);
if (this.app.has_source(source_id)) {
this.app.remove_attention(source_id);
this.app.remove_source(source_id);
}
}
}