[blam] ItemList: simplify SelectionChanged



commit 099477340981d5f76f07186a84997112cad0461b
Author: Carlos Martín Nieto <cmn dwim me>
Date:   Sat Jun 15 04:08:05 2013 +0200

    ItemList: simplify SelectionChanged
    
    Use a delay task instead of turning a timer on and off and use early
    returns instead of using so many levels of if.
    
    I'm unsure why the last part causes an error unless put into
    Glib.Idle, as we should be running in the UI thread.

 src/ItemList.cs |   82 +++++++++++++++++++++++++++++-------------------------
 1 files changed, 44 insertions(+), 38 deletions(-)
---
diff --git a/src/ItemList.cs b/src/ItemList.cs
index f020946..9acb46e 100644
--- a/src/ItemList.cs
+++ b/src/ItemList.cs
@@ -13,6 +13,7 @@ using GtkSharp;
 using System;
 using System.Collections;
 using System.Threading;
+using System.Threading.Tasks;
 using System.ServiceModel.Syndication;
 
 namespace Imendio.Blam {
@@ -26,12 +27,9 @@ namespace Imendio.Blam {
        
     private TreeViewColumn titleColumn;
     private TreeViewColumn iconColumn;
+    CancellationTokenSource MarkReadCancel;
 
-    private Item lastItem;
-    Timer timer;
-    const int infinite = System.Threading.Timeout.Infinite;
-
-       private IChannel channel;
+               private IChannel channel;
        public IChannel CurrentChannel {
            get {
                return channel;
@@ -165,41 +163,49 @@ namespace Imendio.Blam {
                        return null;
                }
 
-       private void SelectionChanged (object obj, EventArgs args)
-       {
-           TreeSelection selection = (TreeSelection) obj;
-           TreeIter iter;
-           TreeModel model;
-           Imendio.Blam.Item item;
+               private async void SelectionChanged (object obj, EventArgs args)
+               {
+                       TreeSelection selection = (TreeSelection) obj;
+                       TreeIter iter;
+                       TreeModel model;
+                       Imendio.Blam.Item item;
 
-           if (!selection.GetSelected (out model, out iter)) {
-               return;
-           }
+                       if (!selection.GetSelected (out model, out iter)) {
+                               return;
+                       }
 
-           item = (Imendio.Blam.Item) model.GetValue (iter, 0);
-           if (item != null) {
-            EmitItemSelected (item);
-
-            bool useTimeout = (bool) Conf.Get(Preference.MARK_ITEMS_READ, false);
-            if(useTimeout) {
-                if (timer == null) {
-                    timer = new Timer(o => {
-                        if (lastItem == GetSelected())
-                            lastItem.SetUnread(false);
-                    });
-                }
-
-                // disable the old timeout
-                timer.Change(infinite, infinite);
-
-                uint readTimeout = (uint) Conf.Get(Preference.MARK_ITEMS_READ_TIMEOUT, 3000);
-                lastItem = item;
-                    timer.Change(readTimeout, infinite);
-            } else {
-                item.SetUnread(false);
-            }
-           }
-       }
+                       item = (Imendio.Blam.Item) model.GetValue (iter, 0);
+                       if (item == null)
+                               return;
+
+                       if (MarkReadCancel != null)
+                               MarkReadCancel.Cancel();
+
+                       EmitItemSelected(item);
+                       bool useTimeout = (bool) Conf.Get(Preference.MARK_ITEMS_READ, false);
+
+                       if (!useTimeout) {
+                               item.SetUnread(false);
+                               model.EmitRowChanged(model.GetPath(iter), iter);
+                               return;
+                       }
+
+                       MarkReadCancel = new CancellationTokenSource();
+                       var readTimeout = (uint) Conf.Get(Preference.MARK_ITEMS_READ_TIMEOUT, 3000);
+
+                       try {
+                               await Task.Delay(TimeSpan.FromMilliseconds(readTimeout), 
MarkReadCancel.Token);
+                       } catch (OperationCanceledException) {
+                               return;
+                       }
+
+                       MarkReadCancel = null;
+                       Idle.Add(() => {
+                               item.SetUnread(false);
+                               model.EmitRowChanged(model.GetPath(iter), iter);
+                               return false;
+                       });
+               }
 
                private int CompareFunc(TreeModel model, TreeIter a, TreeIter b)
                {


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