[blam: 3/4] ChannelList, ChannelCollection: communicate directly
- From: Carlos Martín Nieto <cmartin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [blam: 3/4] ChannelList, ChannelCollection: communicate directly
- Date: Mon, 17 Jun 2013 17:44:27 +0000 (UTC)
commit 7b20ec94c90aa15f4a8cd390c6d7da87eee22749
Author: Carlos Martín Nieto <cmn dwim me>
Date: Mon Jun 17 19:11:49 2013 +0200
ChannelList, ChannelCollection: communicate directly
It's silly for changes in ChannelCollection to go through a myriad of
events through Application to affect what the ChannelList shows. Pass
the collection directly to the list and set up the notifications so
they can talk directly.
blam.csproj | 1 +
src/Application.cs | 29 +-----------
src/ChannelCollection.cs | 62 +++++++++++++++-----------
src/ChannelList.cs | 108 ++++++++++++++++++++++++++++++---------------
src/Makefile.am | 1 +
5 files changed, 112 insertions(+), 89 deletions(-)
---
diff --git a/blam.csproj b/blam.csproj
index 41025e6..0e01d9f 100644
--- a/blam.csproj
+++ b/blam.csproj
@@ -77,6 +77,7 @@
<Private>False</Private>
<Package>gconf-sharp-2.0</Package>
</Reference>
+ <Reference Include="Microsoft.CSharp" />
</ItemGroup>
<ItemGroup>
<Compile Include="src\Application.cs" />
diff --git a/src/Application.cs b/src/Application.cs
index 1db2dd7..0423c38 100644
--- a/src/Application.cs
+++ b/src/Application.cs
@@ -157,10 +157,6 @@ namespace Imendio.Blam {
mCollection = ChannelCollection.LoadFromFile (Defines.APP_HOMEDIR + "/collection.xml");
- mCollection.ChannelUpdated += ChannelUpdatedCb;
- mCollection.ChannelAdded += ChannelAddedCb;
- mCollection.ChannelGroupAdded += ChannelGroupAddedCb;
- mCollection.ChannelRemoved += ChannelRemovedCb;
mCollection.ChannelRefreshStarted += ChannelRefreshStartedCb;
mCollection.ChannelRefreshFinished += ChannelRefreshFinishedCb;
@@ -186,7 +182,7 @@ namespace Imendio.Blam {
"mainWindow", null);
gladeXML.Autoconnect(this);
- channelList = new ChannelList(mCollection.Channels, mCollection.Groups);
+ channelList = new ChannelList(mCollection);
((Container)channelListSw).Child = channelList;
channelList.ChannelSelectedEvent += ChannelSelected;
@@ -701,27 +697,6 @@ namespace Imendio.Blam {
}
}
- private void ChannelAddedCb (IChannel channel)
- {
- channelList.Add (channel);
- }
-
- private void ChannelGroupAddedCb(IChannel group, IChannel chan)
- {
- channelList.AddToGroup(group, chan);
- }
-
- private void ChannelUpdatedCb (IChannel channel)
- {
- UpdateTotalNumberOfUnread ();
- }
-
- private void ChannelRemovedCb (IChannel channel)
- {
- channelList.Remove (channel);
- UpdateTotalNumberOfUnread ();
- }
-
private void ChannelRefreshStartedCb (IChannel channel)
{
uint contextId = statusbar.GetContextId("update-status");
@@ -853,7 +828,7 @@ namespace Imendio.Blam {
Conf.Sync ();
}
- private void UpdateTotalNumberOfUnread ()
+ public void UpdateTotalNumberOfUnread()
{
int nrOfUnread, nrOfNew;
diff --git a/src/ChannelCollection.cs b/src/ChannelCollection.cs
index a78a6b3..88c6db2 100644
--- a/src/ChannelCollection.cs
+++ b/src/ChannelCollection.cs
@@ -7,6 +7,7 @@
using System;
using System.Collections;
+using System.Collections.Specialized;
using System.Linq;
using System.IO;
using System.Reflection;
@@ -18,12 +19,10 @@ using System.ComponentModel;
namespace Imendio.Blam {
- public class ChannelCollection {
+ public class ChannelCollection : INotifyCollectionChanged {
- public event ChannelEventHandler ChannelAdded;
- public event ChannelGroupEventHandler ChannelGroupAdded;
- public event ChannelEventHandler ChannelUpdated;
- public event ChannelEventHandler ChannelRemoved;
+ public event NotifyCollectionChangedEventHandler CollectionChanged;
+ public event PropertyChangedEventHandler PropertyChanged;
public event ChannelEventHandler ChannelRefreshStarted;
public event ChannelEventHandler ChannelRefreshFinished;
@@ -82,6 +81,32 @@ namespace Imendio.Blam {
}
}
+ void NotifyAdd(IChannel channel)
+ {
+ NotifyCollectionChanged(NotifyCollectionChangedAction.Add, channel);
+ }
+
+ void NotifyAdd(object obj)
+ {
+ NotifyCollectionChanged(NotifyCollectionChangedAction.Add, obj);
+ }
+
+ void NotifyRemove(IChannel channel)
+ {
+ NotifyCollectionChanged(NotifyCollectionChangedAction.Remove, channel);
+ }
+
+ void NotifyChange(IChannel channel)
+ {
+ NotifyCollectionChanged(NotifyCollectionChangedAction.Replace, channel);
+ }
+
+ void NotifyCollectionChanged(NotifyCollectionChangedAction action, object obj)
+ {
+ if (CollectionChanged != null)
+ CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, obj));
+ }
+
public ChannelCollection ()
{
}
@@ -179,8 +204,8 @@ namespace Imendio.Blam {
bool res = await channel.RefreshAsync();
if (res)
MarkAsDirty();
- if (ChannelAdded != null)
- ChannelAdded (channel);
+
+ NotifyAdd(channel);
}
public async void Add(ChannelGroup group, IChannel channel)
@@ -189,9 +214,7 @@ namespace Imendio.Blam {
bool updated = await channel.RefreshAsync();
channel.PropertyChanged += ChannelChanged;
- if(ChannelGroupAdded != null){
- ChannelGroupAdded(group, channel);
- }
+ NotifyAdd(new { Group = group, Channel = channel });
MarkAsDirty();
}
@@ -201,20 +224,10 @@ namespace Imendio.Blam {
IChannel channel = (IChannel)sender;
MarkAsDirty();
- if (ChannelUpdated != null) {
- ChannelUpdated (channel);
- }
+ if (PropertyChanged != null)
+ PropertyChanged(this, args);
}
- public void Updated (IChannel channel)
- {
- MarkAsDirty();
-
- if (ChannelUpdated != null) {
- ChannelUpdated (channel);
- }
- }
-
public void Remove (IChannel channel)
{
/* Try to find out from which list we need to remove. */
@@ -232,10 +245,7 @@ namespace Imendio.Blam {
}
}
- if (ChannelRemoved != null) {
- ChannelRemoved (channel);
- }
-
+ NotifyRemove(channel);
MarkAsDirty();
}
diff --git a/src/ChannelList.cs b/src/ChannelList.cs
index a7de14a..13d1ff7 100644
--- a/src/ChannelList.cs
+++ b/src/ChannelList.cs
@@ -10,6 +10,7 @@ using Gtk;
using GtkSharp;
using System;
using System.Collections;
+using System.Collections.Specialized;
using System.Runtime.InteropServices;
using System.ComponentModel;
using Mono.Unix;
@@ -37,62 +38,97 @@ namespace Imendio.Blam {
new TargetEntry("channel", TargetFlags.Widget, (uint)TargetType.Channel)
};
- public ChannelList(IList channels, IList groups)
- {
- TreeViewColumn col;
- CellRenderer cell;
+ ChannelCollection Collection;
- /* Channel name column */
- nameColumn = new TreeViewColumn();
- cell = new CellRendererText();
+ public ChannelList(ChannelCollection collection)
+ {
+ Collection = collection;
+ Collection.CollectionChanged += CollectionChanged;
+ Collection.PropertyChanged += CollectionPropertyChanged;
+
+ TreeViewColumn col;
+ CellRenderer cell;
+
+ /* Channel name column */
+ nameColumn = new TreeViewColumn();
+ cell = new CellRendererText();
- nameColumn.PackStart(cell, true);
- nameColumn.Sizing = TreeViewColumnSizing.GrowOnly;
- nameColumn.Expand = true;
- nameColumn.SetCellDataFunc(cell, new TreeCellDataFunc(NamesCellDataFunc));
+ nameColumn.PackStart(cell, true);
+ nameColumn.Sizing = TreeViewColumnSizing.GrowOnly;
+ nameColumn.Expand = true;
+ nameColumn.SetCellDataFunc(cell, new TreeCellDataFunc(NamesCellDataFunc));
- AppendColumn(nameColumn);
+ AppendColumn(nameColumn);
- /* Items column */
- col = new TreeViewColumn();
- cell = new CellRendererText();
+ /* Items column */
+ col = new TreeViewColumn();
+ cell = new CellRendererText();
- col.PackStart(cell, true);
- col.SetCellDataFunc(cell,
- new TreeCellDataFunc(ItemsCellDataFunc));
+ col.PackStart(cell, true);
+ col.SetCellDataFunc(cell,
+ new TreeCellDataFunc(ItemsCellDataFunc));
- AppendColumn(col);
+ AppendColumn(col);
- this.RulesHint = true;
+ this.RulesHint = true;
- selectionChangedHandler = new EventHandler(SelectionChanged);
- this.Selection.Changed += selectionChangedHandler;
+ selectionChangedHandler = new EventHandler(SelectionChanged);
+ this.Selection.Changed += selectionChangedHandler;
- this.Model = new TreeStore (typeof(Channel));
- this.HeadersVisible = false;
+ this.Model = new TreeStore (typeof(Channel));
+ this.HeadersVisible = false;
- // Sort the list
- (Model as TreeStore).DefaultSortFunc = ChannelSort;
- (this.Model as TreeStore).SetSortColumnId (-1, SortType.Ascending);
+ // Sort the list
+ (Model as TreeStore).DefaultSortFunc = ChannelSort;
+ (this.Model as TreeStore).SetSortColumnId (-1, SortType.Ascending);
- // Right click popup
- this.popupMenu = new ChannelMenu();
- this.popupMenu.EditSelected += EditChannelCb;
- this.popupMenu.MarkAsReadSelected += MarkAsReadCb;
- this.popupMenu.RemoveSelected += RemoveChannelCb;
- this.popupMenu.RefreshSelected += RefreshChannelCb;
+ // Right click popup
+ this.popupMenu = new ChannelMenu();
+ this.popupMenu.EditSelected += EditChannelCb;
+ this.popupMenu.MarkAsReadSelected += MarkAsReadCb;
+ this.popupMenu.RemoveSelected += RemoveChannelCb;
+ this.popupMenu.RefreshSelected += RefreshChannelCb;
EnableModelDragSource(ModifierType.Button1Mask, DragEntries, DragAction.Copy);
DragDataGet += DragDataGetHandler;
EnableModelDragDest(DragEntries, DragAction.Copy);
DragDataReceived += DragDataReceivedHandler;
- foreach (IChannel channel in channels)
+ // Add the groups and chanels to the view
+ foreach (IChannel channel in Collection.Channels)
Add (channel);
- foreach (IChannel group in groups)
+ foreach (IChannel group in Collection.Groups)
AddGroup(group);
- }
+ }
+
+ void CollectionPropertyChanged(object sender, PropertyChangedEventArgs args)
+ {
+ Application.TheApp.UpdateTotalNumberOfUnread();
+ }
+
+ void CollectionChanged(object sender, NotifyCollectionChangedEventArgs args)
+ {
+ switch (args.Action) {
+ case NotifyCollectionChangedAction.Add:
+ foreach (var channel in args.NewItems) {
+ if (channel is Channel) {
+ Add((IChannel)channel);
+ } else if (channel is ChannelGroup) {
+ AddGroup((IChannel)channel);
+ } else {
+ dynamic obj = channel;
+ AddToGroup(obj.Group, obj.Channel);
+ }
+ }
+ break;
+ case NotifyCollectionChangedAction.Remove:
+ foreach (IChannel channel in args.OldItems) {
+ Remove(channel);
+ }
+ break;
+ }
+ }
private void ForceResort()
{
diff --git a/src/Makefile.am b/src/Makefile.am
index 50a8910..3780f0c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -11,6 +11,7 @@ RESOURCES = \
ASSEMBLIES = \
-r:System.Web \
-r:Mono.Posix \
+ -r:Microsoft.CSharp \
-r:System.ServiceModel
BLAM_CSFILES = Application.cs \
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]