[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