28
28
using System.Collections.Generic;
30
30
using Banshee.Collection;
31
using Banshee.Collection.Database;
36
34
namespace Banshee.ClutterFlow
39
public interface ISortComparer<T> : IComparer<T>
41
string GetSortLabel (T obj);
44
public abstract class AlbumComparer : ISortComparer<AlbumInfo>
46
protected virtual string GetTitle (AlbumInfo obj)
48
return (obj.TitleSort ?? obj.Title ?? obj.DisplayTitle ?? "");
51
protected virtual string GetArtist (AlbumInfo obj)
53
return (obj.ArtistNameSort ?? obj.ArtistName ?? obj.DisplayArtistName ?? "");
56
public abstract int Compare (AlbumInfo x, AlbumInfo y);
57
public abstract string GetSortLabel (AlbumInfo obj);
60
public class AlbumAlbumComparer : AlbumComparer
63
public override string GetSortLabel (AlbumInfo obj)
66
return obj.TitleSort ?? obj.Title ?? "?";
71
public override int Compare (AlbumInfo x, AlbumInfo y)
73
string tx = GetTitle(x) + GetArtist(x);
74
string ty = GetTitle(y) + GetArtist(y);
75
return tx.CompareTo(ty);
79
public class AlbumArtistComparer : AlbumComparer
81
public override string GetSortLabel (AlbumInfo obj)
84
return obj.ArtistNameSort ?? obj.ArtistName ?? "?";
89
public override int Compare (AlbumInfo x, AlbumInfo y)
91
string tx = GetArtist(x) + GetTitle(x);
92
string ty = GetArtist(y) + GetTitle(y);
93
return tx.CompareTo(ty);
97
public enum SortOptions { Artist = 0 , Album = 1 }
99
public abstract class BansheeActorLoader<TGen> : ActorLoader<string, TGen> where TGen : ICacheableItem, new()
103
#pragma warning disable 0067
104
public event EventHandler SortingChanged;
105
#pragma warning restore 0067
106
protected void InvokeSortingChanged ()
108
ClutterFlowSchemas.SortBy.Set (Enum.GetName(typeof(SortOptions), SortBy));
109
if (SortingChanged!=null) SortingChanged (this, EventArgs.Empty);
112
protected SortOptions sort_by = (SortOptions) Enum.Parse(typeof(SortOptions), ClutterFlowSchemas.SortBy.Get ());
113
public virtual SortOptions SortBy {
114
get { return sort_by; }
116
if (value!=sort_by) {
118
RefreshCoverManager ();
119
InvokeSortingChanged ();
124
protected abstract ISortComparer<TGen> Comparer { get; }
126
private int count; //previous model count
128
protected List<int> index_map; //maps list indeces to model indeces
130
private FilterListModel<TGen> model;
131
public virtual FilterListModel<TGen> Model {
132
get { return model; }
136
model.Cleared -= OnModelClearedHandler;
137
model.Reloaded -= OnModelReloadedHandler;
143
model.Cleared += OnModelClearedHandler;
144
model.Reloaded += OnModelReloadedHandler;
147
RefreshCoverManager ();
153
public BansheeActorLoader (CoverManager coverManager) : base (coverManager) { }
154
public override void Dispose ()
160
public override List<ClutterFlowBaseActor> GetActors (System.Action<ClutterFlowBaseActor> method_call)
162
SortedList<TGen, ClutterFlowBaseActor> list =
163
new SortedList<TGen, ClutterFlowBaseActor>(Comparer);
165
for (int i = 1; i < Model.Count; i++)
166
AddActorToList(Model[i], list);
167
index_map = new List<int>(list.Values.Count);
168
for (int i = 0; i < list.Values.Count; i++) {
169
ClutterFlowBaseActor actor = list.Values[i];
170
index_map.Add(actor.Index);
172
if (method_call!=null) method_call(actor);
175
return new List<ClutterFlowBaseActor>(list.Values);
178
public virtual int ConvertIndexToModelIndex (int index)
180
return (index_map!=null && index_map.Count > index) ? index_map[index] : 0;
183
#region Event Handlers
184
protected void OnModelClearedHandler (object o, EventArgs args)
186
RefreshCoverManager ();
189
protected void OnModelReloadedHandler (object o, EventArgs args)
191
if (count!=model.Count) {
193
RefreshCoverManager ();
199
public class AlbumLoader : BansheeActorLoader<AlbumInfo>
36
public class AlbumLoader : IActorLoader
203
public event ActorEventHandler<ClutterFlowAlbum> ActorActivated;
204
protected void InvokeActorActivated (ClutterFlowAlbum actor) {
205
if (ActorActivated!=null) ActorActivated (actor, EventArgs.Empty);
39
public event EventHandler SortingChanged;
41
protected void OnSortingChanged ()
43
var handler = SortingChanged;
44
if (handler != null) {
45
handler (this, EventArgs.Empty);
210
protected static ISortComparer<AlbumInfo> sort_by_name = new AlbumAlbumComparer ();
211
protected static ISortComparer<AlbumInfo> sort_by_arst = new AlbumArtistComparer ();
213
protected override ISortComparer<AlbumInfo> Comparer {
216
case SortOptions.Album:
218
case SortOptions.Artist:
226
public ClutterFlowAlbum CurrentActor {
227
get { return (ClutterFlowAlbum) CoverManager.CurrentCover; }
230
public AlbumInfo CurrentAlbum {
232
if (CoverManager.CurrentCover!=null && CoverManager.CurrentCover is ClutterFlowAlbum)
233
return (CoverManager.CurrentCover as ClutterFlowAlbum).Album;
238
public int CurrentIndex {
240
if (CoverManager.CurrentCover!=null && CoverManager.CurrentCover is ClutterFlowAlbum)
241
return (CoverManager.CurrentCover as ClutterFlowAlbum).Index;
51
private Dictionary<string, ClutterFlowBaseActor> cached_covers = new Dictionary<string, ClutterFlowBaseActor> ();
52
public Dictionary<string, ClutterFlowBaseActor> Cache {
53
get { return cached_covers; }
56
protected static ISortComparer<AlbumInfo> sort_by_name = new AlbumAlbumComparer ();
57
protected static ISortComparer<AlbumInfo> sort_by_artist = new AlbumArtistComparer ();
59
protected ISortComparer<AlbumInfo> Comparer {
62
case SortOptions.Album:
64
case SortOptions.Artist:
65
return sort_by_artist;
72
private SortOptions sort_by = (SortOptions) Enum.Parse(typeof(SortOptions), ClutterFlowSchemas.SortBy.Get ());
73
public SortOptions SortBy {
74
get { return sort_by; }
76
if (value != sort_by) {
78
ClutterFlowSchemas.SortBy.Set (Enum.GetName(typeof(SortOptions), SortBy));
84
//maps list indices to model indices
85
private List<int> index_map;
87
private FilterListModel<AlbumInfo> model;
88
public FilterListModel<AlbumInfo> Model {
90
set { model = value; }
248
public AlbumLoader (CoverManager coverManager) : base (coverManager)
252
public virtual void ScrollTo (AlbumInfo generator)
254
CoverManager.Timeline.Timeout = 500; //give 'm some time to load the song etc.
255
ScrollTo (ClutterFlowAlbum.CreateCacheKey (generator));
258
protected override ClutterFlowBaseActor AddActorToList (AlbumInfo generator, SortedList<AlbumInfo, ClutterFlowBaseActor> list)
260
if (generator == null)
97
protected bool disposed = false;
98
public void Dispose ()
105
foreach (ClutterFlowBaseActor actor in cached_covers.Values) {
108
cached_covers.Clear ();
111
private ClutterFlowBaseActor AddActorToList (AlbumInfo generator, SortedList<AlbumInfo, ClutterFlowBaseActor> list, CoverManager cover_manager)
113
if (generator == null) {
261
114
generator = new AlbumInfo (AlbumInfo.UnknownAlbumTitle);
262
116
string key = ClutterFlowAlbum.CreateCacheKey(generator);
263
ClutterFlowBaseActor actor = Cache.ContainsKey (key) ? Cache[key] : null;
265
actor = new ClutterFlowAlbum (generator, CoverManager);
117
ClutterFlowBaseActor actor = null;
118
if (!Cache.TryGetValue (key, out actor)) {
119
actor = new ClutterFlowAlbum (generator, cover_manager);
267
121
Cache.Add (key, actor);
269
actor.SortLabel = Comparer.GetSortLabel(generator);
123
actor.SortLabel = Comparer.GetSortLabel (generator);
270
124
list[generator] = actor;
271
actor.Index = list.Count;
125
actor.Index = list.Count;
275
public override void HandleActorActivated (ClutterFlowBaseActor actor, EventArgs args)
277
if (actor is ClutterFlowAlbum)
278
InvokeActorActivated (actor as ClutterFlowAlbum);
129
public List<ClutterFlowBaseActor> GetActors (CoverManager cover_manager)
131
SortedList<AlbumInfo, ClutterFlowBaseActor> list =
132
new SortedList<AlbumInfo, ClutterFlowBaseActor>(Comparer);
134
for (int i = 1; i < Model.Count; i++) {
135
AddActorToList(Model[i], list, cover_manager);
137
index_map = new List<int>(list.Values.Count);
138
for (int i = 0; i < list.Values.Count; i++) {
139
ClutterFlowBaseActor actor = list.Values[i];
140
index_map.Add(actor.Index);
144
return new List<ClutterFlowBaseActor>(list.Values);
147
public int ConvertIndexToModelIndex (int index)
149
return (index_map != null && index_map.Count > index) ? index_map[index] : 0;