commit 4d91390c29bca549e668c4c25879ace43838a59d
Author: phantomjinx <p.g.richard...@phantomjinx.co.uk>
Date:   Thu Sep 1 21:29:31 2011 +0100

    Ensure tracks are sorted before selecting
    
    * Highlighting the displayed tracks in clarity plugin selects the first
      track in the list rather than the first track according to the sort
      preference.
    
    * Sort the tracks first before selecting the first track.

 plugins/clarity/album_model.c    |   27 ++++++++++++++++++++-------
 plugins/clarity/album_model.h    |    2 ++
 plugins/clarity/clarity_widget.c |   22 +++++++++++++++++++++-
 3 files changed, 43 insertions(+), 8 deletions(-)
---
diff --git a/plugins/clarity/album_model.c b/plugins/clarity/album_model.c
index f495118..cab5e41 100644
--- a/plugins/clarity/album_model.c
+++ b/plugins/clarity/album_model.c
@@ -85,15 +85,28 @@ static AlbumItem *_create_album_item(Track *track) {
  * @b: second album key to compare
  *
  */
-static gint _compare_album_item_keys(gchar *a, gchar *b) {
+static gint _compare_album_keys(gchar *a, gchar *b) {
     if (a == NULL)
         return -1;
     if (b == NULL)
-        return -1;
+        return 1;
 
     return compare_string(a, b, prefs_get_int("clarity_case_sensitive"));
 }
 
+gint compare_tracks(Track *a, Track *b) {
+    if (!a)
+        return -1;
+
+    if (!b)
+        return 1;
+
+    gchar *keya = _create_key_from_track(a);
+    gchar *keyb = _create_key_from_track(b);
+
+    return _compare_album_keys(keya, keyb);
+}
+
 void _index_album_item(AlbumModelPrivate *priv, gchar *album_key, AlbumItem 
*item) {
     enum GtkPodSortTypes value = prefs_get_int("clarity_sort");
 
@@ -101,13 +114,13 @@ void _index_album_item(AlbumModelPrivate *priv, gchar 
*album_key, AlbumItem *ite
 
     switch(value) {
     case SORT_ASCENDING:
-        priv->album_key_list = g_list_insert_sorted(priv->album_key_list, 
album_key, (GCompareFunc) _compare_album_item_keys);
+        priv->album_key_list = g_list_insert_sorted(priv->album_key_list, 
album_key, (GCompareFunc) _compare_album_keys);
         break;
     case SORT_DESCENDING:
         /* Already in descending order so reverse into ascending order */
         priv->album_key_list = g_list_reverse(priv->album_key_list);
         /* Insert the track */
-        priv->album_key_list = g_list_insert_sorted(priv->album_key_list, 
album_key, (GCompareFunc) _compare_album_item_keys);
+        priv->album_key_list = g_list_insert_sorted(priv->album_key_list, 
album_key, (GCompareFunc) _compare_album_keys);
         /* Reverse again */
         priv->album_key_list = g_list_reverse(priv->album_key_list);
         break;
@@ -227,10 +240,10 @@ void album_model_resort(AlbumModel *model, GList *tracks) 
{
 
     switch (value) {
     case SORT_ASCENDING:
-        priv->album_key_list = g_list_sort(priv->album_key_list, 
(GCompareFunc) _compare_album_item_keys);
+        priv->album_key_list = g_list_sort(priv->album_key_list, 
(GCompareFunc) _compare_album_keys);
         break;
     case SORT_DESCENDING:
-        priv->album_key_list = g_list_sort(priv->album_key_list, 
(GCompareFunc) _compare_album_item_keys);
+        priv->album_key_list = g_list_sort(priv->album_key_list, 
(GCompareFunc) _compare_album_keys);
         priv->album_key_list = g_list_reverse(priv->album_key_list);
         break;
     default:
@@ -301,7 +314,7 @@ AlbumItem *album_model_get_item_with_track(AlbumModel 
*model, Track *track) {
 static gint _get_index(AlbumModelPrivate *priv, gchar *trk_key) {
     GList *key_list = priv->album_key_list;
 
-    GList *key = g_list_find_custom(key_list, trk_key, (GCompareFunc) 
_compare_album_item_keys);
+    GList *key = g_list_find_custom(key_list, trk_key, (GCompareFunc) 
_compare_album_keys);
     g_return_val_if_fail (key, -1);
 
     gint index = g_list_position(key_list, key);
diff --git a/plugins/clarity/album_model.h b/plugins/clarity/album_model.h
index 5ce900b..d91868d 100644
--- a/plugins/clarity/album_model.h
+++ b/plugins/clarity/album_model.h
@@ -109,5 +109,7 @@ gint album_model_get_index_with_track(AlbumModel *model, 
Track *track);
 
 gint album_model_get_size(AlbumModel *model);
 
+gint compare_tracks(Track *a, Track *b);
+
 
 #endif /* ALBUM_MODEL_H_ */
diff --git a/plugins/clarity/clarity_widget.c b/plugins/clarity/clarity_widget.c
index ea96e8e..c549ccc 100644
--- a/plugins/clarity/clarity_widget.c
+++ b/plugins/clarity/clarity_widget.c
@@ -419,16 +419,36 @@ void clarity_widget_playlist_removed_cb(GtkPodApp *app, 
gpointer pl, gpointer da
         clarity_widget_clear(cw);
 }
 
+GList *_sort_track_list(GList *tracks) {
+    enum GtkPodSortTypes value = prefs_get_int("clarity_sort");
+
+    switch(value) {
+        case SORT_ASCENDING:
+            tracks = g_list_sort(tracks, (GCompareFunc) compare_tracks);
+            break;
+        case SORT_DESCENDING:
+            tracks = g_list_sort(tracks, (GCompareFunc) compare_tracks);
+            tracks = g_list_reverse(tracks);
+            break;
+        default:
+            // Do Nothing
+            break;
+    }
+
+    return tracks;
+}
+
 void clarity_widget_tracks_selected_cb(GtkPodApp *app, gpointer tks, gpointer 
data) {
     g_return_if_fail(CLARITY_IS_WIDGET(data));
 
     ClarityWidget *cw = CLARITY_WIDGET(data);
     ClarityWidgetPrivate *priv = CLARITY_WIDGET_GET_PRIVATE(cw);
-    GList *tracks = tks;
+    GList *tracks = g_list_copy((GList *) tks);
 
     if (!tracks)
         return;
 
+    tracks = _sort_track_list(tracks);
     ClarityCanvas *ccanvas = CLARITY_CANVAS(priv->draw_area);
 
     if (clarity_canvas_is_loading(ccanvas))

------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2

Reply via email to