[blam/gtk-builder] Start working on a a cleaner replacement for ItemList, FeedList



commit c30ee04f1be435938ae41adbdf8f36ab06cef827
Author: Carlos Martín Nieto <cmn dwim me>
Date:   Sat Mar 23 05:37:34 2013 +0100

    Start working on a a cleaner replacement for ItemList, FeedList

 src/Blam.cs              |    9 +++--
 src/ChannelCollection.cs |   20 +++++++------
 src/ChannelList.cs       |   73 +++++++++++++++++++++++++++++++++++++++++++++-
 src/ItemList.cs          |    8 ++---
 4 files changed, 91 insertions(+), 19 deletions(-)
---
diff --git a/src/Blam.cs b/src/Blam.cs
index 8b216a3..ff20f42 100644
--- a/src/Blam.cs
+++ b/src/Blam.cs
@@ -7,12 +7,13 @@ using Defines = Imendio.Blam.Defines;
 namespace Blam
 {
        using Channel = Imendio.Blam.Channel;
+       using IChannel = Imendio.Blam.IChannel;
 
        public class BlamApplication
        {
                Window MainWindow;
                ItemList ItemList;
-               ChannelList FeedList;
+               FeedList FeedList;
                ItemView ItemView;
 
                ScrolledWindow FeedListSw;
@@ -31,7 +32,7 @@ namespace Blam
 
                        channels = ChannelCollection.LoadFromFile (Defines.APP_HOMEDIR + "/collection.xml");
                        FeedListSw = bld.GetObject<ScrolledWindow>("feed-list-scroll");
-                       var FeedList = new ChannelList(channels.Channels, channels.Groups);
+                       FeedList = new FeedList(channels.Channels, channels.Groups);
                        FeedListSw.Child = FeedList;
 
                        ItemList = new ItemList();
@@ -63,12 +64,12 @@ namespace Blam
                        TreeSelection selection = (TreeSelection)obj;
                        TreeIter      iter;
                        TreeModel     model;
-                       Channel      channel;
+                       IChannel      channel;
 
                        if (!selection.GetSelected(out model, out iter))
                                return;
 
-                       channel = model.GetValue(iter, 0) as Channel;
+                       channel = model.GetValue(iter, 0) as IChannel;
                        ItemList.Channel = channel;
                }
 
diff --git a/src/ChannelCollection.cs b/src/ChannelCollection.cs
index 9a23c02..d7fb0f9 100644
--- a/src/ChannelCollection.cs
+++ b/src/ChannelCollection.cs
@@ -7,6 +7,7 @@
 
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.Linq;
 using System.IO;
 using System.Reflection;
@@ -37,9 +38,9 @@ namespace Imendio.Blam {
        
        static XmlSerializer serializer = new XmlSerializer (typeof (ChannelCollection));
        
-       private ArrayList mChannels;
+       List<Channel> mChannels;
        [XmlElement ("Channel", typeof (Channel))]
-       public ArrayList Channels {
+       public List<Channel> Channels {
            get {
                return mChannels;
            }
@@ -48,7 +49,8 @@ namespace Imendio.Blam {
            }
        }
 
-       [XmlElement("Group", typeof(ChannelGroup))] public ArrayList Groups;
+       [XmlElement("Group", typeof(ChannelGroup))]
+       public List<ChannelGroup> Groups {get; private set; }
 
        public int NrOfUnreadItems {
            get {
@@ -97,8 +99,8 @@ namespace Imendio.Blam {
                    collection = RealLoadFromFile (Defines.APP_DATADIR + "/collection.xml");
                } catch {
                    collection = new ChannelCollection ();
-                   collection.mChannels = new ArrayList ();
-            collection.Groups = new ArrayList ();
+                       collection.mChannels = new List<Channel>();
+            collection.Groups = new List<ChannelGroup>();
                }
            }
 
@@ -134,7 +136,7 @@ namespace Imendio.Blam {
            reader.Close ();
 
             if (collection.Channels == null) {
-                collection.mChannels = new ArrayList ();
+                collection.mChannels = new List<Channel>();
             }
 
            return collection;
@@ -181,7 +183,7 @@ namespace Imendio.Blam {
             channel.Name = channel.Url;
         }
 
-        mChannels.Add (channel);
+        mChannels.Add (channel as Channel);
             channel.RefreshAsync(updated => {
                 MarkAsDirty(true);
                 if (ChannelAdded != null)
@@ -216,9 +218,9 @@ namespace Imendio.Blam {
        {
         /* Try to find out from which list we need to remove. */
         if(mChannels.Contains(channel)){
-            mChannels.Remove (channel);
+            mChannels.Remove (channel as Channel);
         } else if(Groups.Contains(channel)){
-            Groups.Remove(channel);
+            Groups.Remove(channel as ChannelGroup);
         } else {
             /* It's not a first-level channel or group. Dig deeper. */
             foreach(ChannelGroup group in Groups){
diff --git a/src/ChannelList.cs b/src/ChannelList.cs
index 2a9a51e..1a76dc0 100644
--- a/src/ChannelList.cs
+++ b/src/ChannelList.cs
@@ -10,9 +10,80 @@ using Gtk;
 using GtkSharp;
 using System;
 using System.Collections;
+using System.Collections.Generic;
 using System.Runtime.InteropServices;
 using Mono.Unix;
 
+namespace Blam
+{
+       using Channel = Imendio.Blam.Channel;
+       using IChannel = Imendio.Blam.IChannel;
+       using ChannelGroup = Imendio.Blam.ChannelGroup;
+
+       public class FeedList : Gtk.TreeView
+       {
+               TreeViewColumn name_col;
+
+               public FeedList(IEnumerable<Channel> channels, IEnumerable<ChannelGroup> groups)
+               {
+                       name_col = new TreeViewColumn();
+                       var renderer = new CellRendererText();
+                       name_col.PackStart(renderer, true);
+                       name_col.Sizing = TreeViewColumnSizing.GrowOnly;
+                       name_col.Expand = true;
+                       name_col.SetCellDataFunc(renderer, NamesCellDataFunc);
+                       AppendColumn(name_col);
+
+                       var items_col = new TreeViewColumn();
+                       renderer = new CellRendererText();
+                       items_col.PackStart(renderer, true);
+                       items_col.SetCellDataFunc(renderer, ItemsCellDataFunc);
+                       AppendColumn(items_col);
+
+                       RulesHint = true;
+                       Model = new TreeStore (typeof(IChannel));
+                       HeadersVisible = false;
+
+                       var model = Model as TreeStore;
+
+                       foreach (IChannel chan in channels)
+                               chan.Iter = model.AppendValues(chan);
+
+                       foreach (ChannelGroup group in groups) {
+                               var iter = model.AppendValues(group);
+                               group.Iter = iter;
+                               //SetDragDestRow(Model.GetPath(iter), TreeViewDropPosition.IntoOrAfter);
+
+                               foreach(IChannel chan in group.Channels)
+                                       chan.Iter = model.AppendValues(group.Iter, chan);
+                       }
+               }
+
+               void NamesCellDataFunc(TreeViewColumn col, CellRenderer _cell, TreeModel model, TreeIter iter)
+               {
+                       IChannel channel = model.GetValue(iter, 0) as IChannel;
+                       var cell = _cell as CellRendererText;
+                       var weight = channel.NrOfUnreadItems > 0 ? Pango.Weight.Bold : Pango.Weight.Normal;
+
+                       cell.Text = channel.Name;
+                       cell.Ellipsize = Pango.EllipsizeMode.End;
+                       cell.Weight = (int)weight;
+               }
+
+               private void ItemsCellDataFunc(TreeViewColumn col, CellRenderer  _cell, TreeModel model, 
TreeIter iter)
+               {
+                       IChannel channel = model.GetValue(iter, 0) as IChannel;
+                       var cell = _cell as CellRendererText;
+                       var weight = channel.NrOfUnreadItems > 0 ? Pango.Weight.Bold : Pango.Weight.Normal;
+
+                       cell.Text = String.Format("{0}/{1}", channel.NrOfUnreadItems, channel.NrOfItems);
+                       cell.Xalign = 1.0f;
+                       cell.Weight = (int)weight;
+               }
+
+       }
+}
+
 namespace Imendio.Blam {
 
        public class ChannelList : Gtk.TreeView {
@@ -36,7 +107,7 @@ namespace Imendio.Blam {
             new TargetEntry("channel", TargetFlags.Widget, (uint)TargetType.Channel)
        };
 
-        public ChannelList(IList channels, IList groups)
+        public ChannelList(IEnumerable<Channel> channels, IEnumerable<ChannelGroup> groups)
         { 
             TreeViewColumn col;
             CellRenderer   cell;
diff --git a/src/ItemList.cs b/src/ItemList.cs
index 44135ff..0b18b2f 100644
--- a/src/ItemList.cs
+++ b/src/ItemList.cs
@@ -17,6 +17,7 @@ using System.ServiceModel.Syndication;
 namespace Blam
 {
        using Channel = Imendio.Blam.Channel;
+       using IChannel = Imendio.Blam.IChannel;
        using ItemView = Imendio.Blam.ItemView;
        using Item = Imendio.Blam.Item;
        using ItemStore = Imendio.Blam.ItemStore;
@@ -25,7 +26,7 @@ namespace Blam
 
        public class ItemList : Gtk.TreeView
        {
-               public Channel Channel {
+               public IChannel Channel {
                        get {
                                return current;
                        }
@@ -35,7 +36,7 @@ namespace Blam
                        }
                }
 
-               Channel current;
+               IChannel current;
                TreeViewColumn column;
 
                public event OnChange OnChangeEvent;
@@ -68,9 +69,6 @@ namespace Blam
 
                void UpdateList()
                {
-                       if (current == null)
-                               return;
-
                        var list = Model as ListStore;
                        var store = ItemStore.GetInstance();
 


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