[geary/wip/spinner-713703] Add folder progress monitor, hook it up to spinner



commit 31be7e25c0e0842cfa317eb5c2d537da15b2775e
Author: Charles Lindsay <chaz yorba org>
Date:   Mon Feb 24 15:59:18 2014 -0800

    Add folder progress monitor, hook it up to spinner
    
    This adds a progress monitor to the folder open operation.  The spinner
    in the status bar is hooked up to it only for the currently selected
    folder, so that background updates don't trigger the spinner.

 src/client/components/main-window.vala             |   14 ++++++++++++++
 src/engine/abstract/geary-abstract-folder.vala     |    2 ++
 src/engine/api/geary-folder.vala                   |    2 ++
 .../imap-engine/imap-engine-minimal-folder.vala    |    6 ++++++
 4 files changed, 24 insertions(+), 0 deletions(-)
---
diff --git a/src/client/components/main-window.vala b/src/client/components/main-window.vala
index 887bd43..7bce867 100644
--- a/src/client/components/main-window.vala
+++ b/src/client/components/main-window.vala
@@ -30,6 +30,7 @@ public class MainWindow : Gtk.ApplicationWindow {
     private MonitoredSpinner spinner = new MonitoredSpinner();
     private Geary.AggregateProgressMonitor progress_monitor = new Geary.AggregateProgressMonitor();
     private Geary.ProgressMonitor? conversation_monitor_progress = null;
+    private Geary.ProgressMonitor? folder_progress = null;
     
     public MainWindow(GearyApplication application) {
         Object(application: application);
@@ -67,6 +68,7 @@ public class MainWindow : Gtk.ApplicationWindow {
         focus_in_event.connect(on_focus_event);
         GearyApplication.instance.controller.notify[GearyController.PROP_CURRENT_CONVERSATION].
             connect(on_conversation_monitor_changed);
+        GearyApplication.instance.controller.folder_selected.connect(on_folder_selected);
         Geary.Engine.instance.account_available.connect(on_account_available);
         Geary.Engine.instance.account_unavailable.connect(on_account_unavailable);
         
@@ -212,6 +214,18 @@ public class MainWindow : Gtk.ApplicationWindow {
         }
     }
     
+    private void on_folder_selected(Geary.Folder? folder) {
+        if (folder_progress != null) {
+            progress_monitor.remove(folder_progress);
+            folder_progress = null;
+        }
+        
+        if (folder != null) {
+            folder_progress = folder.opening_monitor;
+            progress_monitor.add(folder_progress);
+        }
+    }
+    
     private void on_account_available(Geary.AccountInformation account) {
         try {
             progress_monitor.add(Geary.Engine.instance.get_account_instance(account).opening_monitor);
diff --git a/src/engine/abstract/geary-abstract-folder.vala b/src/engine/abstract/geary-abstract-folder.vala
index 2f32387..9ff96b3 100644
--- a/src/engine/abstract/geary-abstract-folder.vala
+++ b/src/engine/abstract/geary-abstract-folder.vala
@@ -5,6 +5,8 @@
  */
 
 public abstract class Geary.AbstractFolder : BaseObject, Geary.Folder {
+    public Geary.ProgressMonitor opening_monitor { get; protected set; }
+    
     /*
      * notify_* methods for AbstractFolder are marked internal because the SendReplayOperations
      * need access to them to report changes as they occur.
diff --git a/src/engine/api/geary-folder.vala b/src/engine/api/geary-folder.vala
index 9fa9e61..c43fce0 100644
--- a/src/engine/api/geary-folder.vala
+++ b/src/engine/api/geary-folder.vala
@@ -145,6 +145,8 @@ public interface Geary.Folder : BaseObject {
     
     public abstract Geary.SpecialFolderType special_folder_type { get; }
     
+    public abstract Geary.ProgressMonitor opening_monitor { get; protected set; }
+    
     /**
      * Fired when the folder is successfully opened by a caller.
      *
diff --git a/src/engine/imap-engine/imap-engine-minimal-folder.vala 
b/src/engine/imap-engine/imap-engine-minimal-folder.vala
index f1e6297..ac95584 100644
--- a/src/engine/imap-engine/imap-engine-minimal-folder.vala
+++ b/src/engine/imap-engine/imap-engine-minimal-folder.vala
@@ -55,6 +55,8 @@ private class Geary.ImapEngine.MinimalFolder : Geary.AbstractFolder, Geary.Folde
         _special_folder_type = special_folder_type;
         _properties.add(local_folder.get_properties());
         
+        opening_monitor = new Geary.SimpleProgressMonitor(Geary.ProgressType.ACTIVITY);
+        
         email_flag_watcher = new EmailFlagWatcher(this);
         email_flag_watcher.email_flags_changed.connect(on_email_flags_changed);
         
@@ -512,6 +514,8 @@ private class Geary.ImapEngine.MinimalFolder : Geary.AbstractFolder, Geary.Folde
         if (open_count == 0)
             return;
         
+        opening_monitor.notify_start();
+        
         try {
             debug("Fetching information for remote folder %s", to_string());
             Imap.Folder folder = yield remote.fetch_folder_async(local_folder.get_path(),
@@ -555,6 +559,8 @@ private class Geary.ImapEngine.MinimalFolder : Geary.AbstractFolder, Geary.Folde
                 cancellable);
             
             return;
+        } finally {
+            opening_monitor.notify_finish();
         }
         
         // open success, reset reestablishment delay


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]