[Xfce4-commits] <postler:master> Move selected folder monitoring into Messages
Christian Dywan
noreply at xfce.org
Mon Nov 15 20:20:02 CET 2010
Updating branch refs/heads/master
to e123c8289a77b480a4fccf325ae80e87e458c526 (commit)
from 46c78e550e41d3f6242576049bd512f3a85133cb (commit)
commit e123c8289a77b480a4fccf325ae80e87e458c526
Author: Christian Dywan <christian at twotoasts.de>
Date: Mon Nov 15 20:15:55 2010 +0100
Move selected folder monitoring into Messages
Instead of completely reloading the folder, only the new file
is inserted or removed accordingly.
postler/postler-folders.vala | 25 -------------------
postler/postler-messages.vala | 53 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 25 deletions(-)
diff --git a/postler/postler-folders.vala b/postler/postler-folders.vala
index 86f3d38..2386d75 100644
--- a/postler/postler-folders.vala
+++ b/postler/postler-folders.vala
@@ -19,7 +19,6 @@ public class Postler.Folders : Gtk.TreeView {
Accounts accounts;
Gtk.TreeStore store;
string last_location;
- FileMonitor[] folder_monitors = {};
public Postler.Messages messages { get; set; }
public string? selected_location {
@@ -75,11 +74,6 @@ public class Postler.Folders : Gtk.TreeView {
{ "Trash", STOCK_USER_TRASH, N_("Trash") },
{ "Archive", STOCK_ARCHIVE, N_("Archive") }
};
-
- void folder_monitor_changed (string location) {
- messages.populate (location);
- messages.grab_focus ();
- }
void unread_monitor_changed (File msg_dir, string path, string account) {
try {
@@ -265,32 +259,13 @@ public class Postler.Folders : Gtk.TreeView {
notify_property ("selected-location");
if (location != null) {
- folder_monitors = {};
messages.populate (location);
messages.grab_focus ();
-
- var location_dir = File.new_for_path (location);
- var new_message_dir = location_dir.resolve_relative_path (
- location + "/new");
- var message_dir = location_dir.resolve_relative_path (
- location + "/cur");
- FileMonitor new_monitor = monitor_folder (new_message_dir, location);
- FileMonitor monitor = monitor_folder (message_dir, location);
- folder_monitors += new_monitor;
- folder_monitors += monitor;
}
else
messages.clear ();
}
- FileMonitor monitor_folder (File message_dir, string location) {
- FileMonitor folder_monitor = message_dir.monitor_directory (0, null);
- folder_monitor.changed.connect ((folder_monitor, file, other, event) => {
- folder_monitor_changed (location);
- });
- return folder_monitor;
- }
-
void import_folder (Gtk.TreeIter iter) {
var dialog = new Gtk.FileChooserDialog (_("Import Archived Mailbox"),
get_toplevel () as Gtk.Window, Gtk.FileChooserAction.OPEN);
diff --git a/postler/postler-messages.vala b/postler/postler-messages.vala
index 61abe33..d893b47 100644
--- a/postler/postler-messages.vala
+++ b/postler/postler-messages.vala
@@ -24,6 +24,7 @@ public class Postler.Messages : Gtk.TreeView {
string to_or_from;
string last_location;
string last_filter = "";
+ FileMonitor[] folder_monitors = {};
enum Columns {
FLAGGED,
@@ -396,6 +397,7 @@ public class Postler.Messages : Gtk.TreeView {
}
public void clear () {
+ folder_monitors = {};
store.clear ();
}
@@ -637,6 +639,10 @@ public class Postler.Messages : Gtk.TreeView {
FILE_ATTRIBUTE_STANDARD_SIZE, 0, null);
GLib.FileInfo info;
+ FileMonitor folder_monitor = folder_dir.monitor_directory (0, null);
+ folder_monitor.changed.connect (folder_monitor_changed);
+ folder_monitors += folder_monitor;
+
folder = folder_dir.get_basename ();
bool folder_new = folder_dir.get_path ().has_suffix ("new");
while ((info = folder_enumerator.next_file (null)) != null) {
@@ -678,6 +684,7 @@ public class Postler.Messages : Gtk.TreeView {
vadjustment.value = 0;
} catch (GLib.Error error) {
+ folder_monitors = {};
sort = new Gtk.TreeModelSort.with_model (store);
model = sort;
GLib.critical (_("Failed to read folder \"%s\": %s"),
@@ -732,6 +739,52 @@ public class Postler.Messages : Gtk.TreeView {
}
}
+ bool get_message_iter (string location, out Gtk.TreeIter iter) {
+ Gtk.TreeIter message_iter;
+ if (!store.iter_children (out message_iter, null))
+ return false;
+ do {
+ string existing_location;
+ store.get (message_iter, Columns.LOCATION, out existing_location);
+ if (existing_location == location) {
+ if (&iter != null)
+ iter = message_iter;
+ return true;
+ }
+ } while (store.iter_next (ref message_iter));
+ return false;
+ }
+
+ void folder_monitor_changed (File file, File? other, FileMonitorEvent event) {
+ switch (event) {
+ case FileMonitorEvent.CREATED:
+ if (get_message_iter (file.get_path (), null))
+ break;
+ bool folder_new = file.get_path ().has_suffix ("/new");
+ var message = read_message (file, folder_new, {}, {});
+ message.size = 0; /* FIXME: get file size */
+ store.insert_with_values (null, null, 0,
+ Columns.FLAGGED, message.flagged,
+ Columns.STATUS, message.status,
+ Columns.ATTACHMENT, message.attachment,
+ Columns.SUBJECT, message.get_subject (),
+ Columns.WEIGHT, message.font_weight,
+ Columns.FROM, message.get_from (),
+ Columns.TIMESTAMP, message.timestamp,
+ Columns.SIZE, message.size,
+ Columns.LOCATION, message.location);
+ break;
+ case FileMonitorEvent.DELETED:
+ Gtk.TreeIter iter;
+ if (get_message_iter (file.get_path (), out iter))
+ store.remove (iter);
+ break;
+ default:
+ GLib.warning ("Unhandled folder change: " + event.to_string ());
+ break;
+ }
+ }
+
void mark_message_read (Gtk.TreeIter sort_iter, ref string location) {
string bare_filename;
if (!flags_from_filename (location, out bare_filename).contains ("S"))
More information about the Xfce4-commits
mailing list