Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 24 additions & 27 deletions src/MessageList/MessageList.vala
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ public class Mail.MessageList : Gtk.Box {
public Hdy.HeaderBar headerbar { get; private set; }

private FolderPopover folder_popover;
private Gtk.ListBox list_box;
private Gtk.ScrolledWindow scrolled_window;
private Gee.HashMap<string, MessageListItem> messages;
private ListStore message_list;

construct {
message_list = new ListStore (typeof (MessageListItem));

get_style_context ().add_class (Gtk.STYLE_CLASS_BACKGROUND);

var application_instance = (Gtk.Application) GLib.Application.get_default ();
Expand Down Expand Up @@ -105,20 +106,20 @@ public class Mail.MessageList : Gtk.Box {
placeholder_style_context.add_class (Granite.STYLE_CLASS_H2_LABEL);
placeholder_style_context.add_class (Gtk.STYLE_CLASS_DIM_LABEL);

list_box = new Gtk.ListBox () {
var list_box = new Gtk.ListBox () {
hexpand = true,
vexpand = true,
selection_mode = NONE
};
list_box.bind_model (message_list, (obj) => (MessageListItem) obj);

list_box.get_style_context ().add_class (Gtk.STYLE_CLASS_BACKGROUND);
list_box.set_placeholder (placeholder);
list_box.set_sort_func (message_sort_function);

scrolled_window = new Gtk.ScrolledWindow (null, null) {
var scrolled_window = new Gtk.ScrolledWindow (null, null) {
child = list_box,
hscrollbar_policy = NEVER
};
scrolled_window.add (list_box);

// Prevent the focus of the webview causing the ScrolledWindow to scroll
var scrolled_child = scrolled_window.get_child ();
Expand All @@ -140,10 +141,8 @@ public class Mail.MessageList : Gtk.Box {
can_reply (false);
can_move_thread (false);

list_box.get_children ().foreach ((child) => {
child.destroy ();
});
messages = new Gee.HashMap<string, MessageListItem> (null, null);
message_list.remove_all ();

if (node == null) {
return;
Expand All @@ -159,24 +158,21 @@ public class Mail.MessageList : Gtk.Box {
folder_popover.set_store (store);

var item = new MessageListItem (node.message);
list_box.add (item);

messages.set (node.message.uid, item);
message_list.insert_sorted (item, message_sort_function);

if (node.child != null) {
go_down ((Camel.FolderThreadNode?) node.child);
}

var children = list_box.get_children ();
var num_children = children.length ();
if (num_children > 0) {
var child = list_box.get_row_at_index ((int) num_children - 1);
if (child != null && child is MessageListItem) {
var list_item = (MessageListItem) child;
list_item.expanded = true;
can_reply (list_item.loaded);
list_item.notify["loaded"].connect (() => {
can_reply (list_item.loaded);
});
}
if (message_list.n_items > 0) {
var last_item = (MessageListItem) message_list.get_item (message_list.n_items - 1);
last_item.expanded = true;
can_reply (last_item.loaded);
last_item.notify["loaded"].connect (() => {
can_reply (last_item.loaded);
});
}

if (node.message != null && Camel.MessageFlags.DRAFT in (int) node.message.flags) {
Expand All @@ -188,8 +184,10 @@ public class Mail.MessageList : Gtk.Box {
unowned Camel.FolderThreadNode? current_node = node;
while (current_node != null) {
var item = new MessageListItem (current_node.message);
list_box.add (item);

messages.set (current_node.message.uid, item);
message_list.insert_sorted (item, message_sort_function);

if (current_node.next != null) {
go_down ((Camel.FolderThreadNode?) current_node.next);
}
Expand All @@ -200,15 +198,14 @@ public class Mail.MessageList : Gtk.Box {

public async void compose (Composer.Type type, Variant uid) {
/* Can't open a new composer if thread is empty*/
var last_child = list_box.get_row_at_index ((int) list_box.get_children ().length () - 1);
if (last_child == null) {
if (message_list.n_items == 0) {
return;
}

MessageListItem message_item = null;

if (uid.get_string () == "") {
message_item = (MessageListItem) last_child;
message_item = (MessageListItem) message_list.get_item (message_list.n_items - 1);
} else {
message_item = messages.get (uid.get_string ());
}
Expand Down Expand Up @@ -249,7 +246,7 @@ public class Mail.MessageList : Gtk.Box {
((SimpleAction) main_window.lookup_action (MainWindow.ACTION_MOVE_TO_TRASH)).set_enabled (enabled);
}

private static int message_sort_function (Gtk.ListBoxRow item1, Gtk.ListBoxRow item2) {
private static int message_sort_function (Object item1, Object item2) {
unowned MessageListItem message1 = (MessageListItem)item1;
unowned MessageListItem message2 = (MessageListItem)item2;

Expand Down