commit b7c9145bde1fb59feb7196478ddba4441cf01f15
Author: phantomjinx <p.g.richard...@phantomjinx.co.uk>
Date:   Wed Aug 31 21:40:54 2011 +0100

    Support for clarity detecting track additions
    
    * album_model.*
     * Changes to API adding functions for getting the index of an album item
       given an album item or track.
     * Include the album item index in the album_model_foreach function,
       avoiding the need to the canvas to refind the index which is a potential
       bottle neck.
    
    * clarity_canvas
     * Remove the threading as serves little purpose.
     * Modifications supporting canvas add album item function
    
    * clarity_widget
     * callback for track added completed

 plugins/clarity/album_model.c    |   76 +++++++++++++++++++++++++-------
 plugins/clarity/album_model.h    |   20 +++++++-
 plugins/clarity/clarity_canvas.c |   90 ++++++++++++++++++-------------------
 plugins/clarity/clarity_canvas.h |    2 +
 plugins/clarity/clarity_widget.c |   32 +++++++++++++-
 5 files changed, 153 insertions(+), 67 deletions(-)
---
diff --git a/plugins/clarity/album_model.c b/plugins/clarity/album_model.c
index 6db251c..f495118 100644
--- a/plugins/clarity/album_model.c
+++ b/plugins/clarity/album_model.c
@@ -45,10 +45,14 @@ struct _AlbumModelPrivate {
     GList *album_key_list;
 };
 
-static gchar *_create_key(Track *track) {
+static gchar *_create_key(gchar *artist, gchar *album) {
+    return g_strconcat(artist, "_", album, NULL);
+}
+
+static gchar *_create_key_from_track(Track *track) {
     g_return_val_if_fail(track, "");
 
-    return g_strconcat(track->artist, "_", track->album, NULL);
+    return _create_key(track->artist, track->album);
 }
 
 static void _add_track_to_album_item(AlbumItem *item, Track *track) {
@@ -118,11 +122,14 @@ void _index_album_item(AlbumModelPrivate *priv, gchar 
*album_key, AlbumItem *ite
     }
 }
 
-static void _insert_track(AlbumModelPrivate *priv, Track *track) {
+/**
+ * Return true if a new album item was created. Otherwise false.
+ */
+static gboolean _insert_track(AlbumModelPrivate *priv, Track *track) {
     AlbumItem *item;
     gchar *album_key;
 
-    album_key = _create_key(track);
+    album_key = _create_key_from_track(track);
     /* Check whether an album item has already been created in connection
      * with the track's artist and album
      */
@@ -131,13 +138,14 @@ static void _insert_track(AlbumModelPrivate *priv, Track 
*track) {
         // Create new album item
         item = _create_album_item(track);
         _index_album_item(priv, album_key, item);
+        return TRUE;
     }
-    else {
-        /* Album Item found in the album hash so prepend the
-         * track to the start of the track list */
-        g_free(album_key);
-        _add_track_to_album_item(item, track);
-    }
+
+    /* Album Item found in the album hash so prepend the
+     * track to the start of the track list */
+    g_free(album_key);
+    _add_track_to_album_item(item, track);
+    return FALSE;
 }
 
 /**
@@ -245,24 +253,34 @@ void album_model_add_tracks(AlbumModel *model, GList 
*tracks) {
     }
 }
 
-void album_model_foreach (AlbumModel *model, GFunc func, gpointer user_data) {
+gboolean album_model_add_track(AlbumModel *model, Track *track) {
+    g_return_val_if_fail(model, -1);
+    g_return_val_if_fail(track, -1);
+
+    AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE(model);
+    return _insert_track(priv, track);
+}
+
+void album_model_foreach (AlbumModel *model, AMFunc func, gpointer user_data) {
     g_return_if_fail(model);
     g_return_if_fail(func);
 
     AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE (model);
     GList *iter = priv->album_key_list;
 
+    gint i = 0;
     while(iter) {
         gchar *key = iter->data;
         AlbumItem *item = g_hash_table_lookup(priv->album_hash, key);
 
-        (* func) (item, user_data);
+        (* func) (item, i, user_data);
 
         iter = iter->next;
+        i++;
     }
 }
 
-AlbumItem *album_model_get_item(AlbumModel *model, gint index) {
+AlbumItem *album_model_get_item_with_index(AlbumModel *model, gint index) {
     g_return_val_if_fail(model, NULL);
 
     AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE (model);
@@ -271,18 +289,44 @@ AlbumItem *album_model_get_item(AlbumModel *model, gint 
index) {
     return g_hash_table_lookup(priv->album_hash, key);
 }
 
-gint album_model_get_index(AlbumModel *model, Track *track) {
-    g_return_val_if_fail(model, -1);
+AlbumItem *album_model_get_item_with_track(AlbumModel *model, Track *track) {
+    g_return_val_if_fail(model, NULL);
 
     AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE (model);
 
-    gchar *trk_key = _create_key(track);
+    gchar *album_key = _create_key_from_track(track);
+    return g_hash_table_lookup(priv->album_hash, album_key);
+}
+
+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);
     g_return_val_if_fail (key, -1);
 
     gint index = g_list_position(key_list, key);
+
+    return index;
+}
+
+gint album_model_get_index_with_album_item(AlbumModel *model, AlbumItem *item) 
{
+    g_return_val_if_fail(model, -1);
+    AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE (model);
+
+    gchar *trk_key = _create_key(item->artist, item->albumname);
+    gint index = _get_index(priv, trk_key);
+    g_free(trk_key);
+
+    return index;
+}
+
+gint album_model_get_index_with_track(AlbumModel *model, Track *track) {
+    g_return_val_if_fail(model, -1);
+
+    AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE (model);
+
+    gchar *trk_key = _create_key_from_track(track);
+    gint index = _get_index(priv, trk_key);
     g_free(trk_key);
 
     return index;
diff --git a/plugins/clarity/album_model.h b/plugins/clarity/album_model.h
index 2314f8f..5ce900b 100644
--- a/plugins/clarity/album_model.h
+++ b/plugins/clarity/album_model.h
@@ -45,6 +45,8 @@ typedef struct {
 
 } AlbumItem;
 
+typedef void (*AMFunc) (gpointer value, gint index, gpointer user_data);
+
 GType album_model_get_type (void);
 
 #define ALBUM_TYPE_MODEL            (album_model_get_type ())
@@ -83,15 +85,27 @@ void album_model_destroy(AlbumModel *model);
 
 void album_model_clear(AlbumModel *model);
 
-void album_model_foreach(AlbumModel *model, GFunc func, gpointer user_data);
+void album_model_foreach(AlbumModel *model, AMFunc func, gpointer user_data);
 
 void album_model_resort(AlbumModel *model, GList *tracks);
 
 void album_model_add_tracks(AlbumModel *model, GList *tracks);
 
-AlbumItem *album_model_get_item(AlbumModel *model, gint index);
+/**
+ * Add a single track to the album model.
+ *
+ * @return gboolean: whether a new album model was
+ *                                  created.
+ */
+gboolean album_model_add_track(AlbumModel *model, Track *track);
+
+AlbumItem *album_model_get_item_with_index(AlbumModel *model, gint index);
+
+AlbumItem *album_model_get_item_with_track(AlbumModel *model, Track *track);
+
+gint album_model_get_index_with_album_item(AlbumModel *model, AlbumItem *item);
 
-gint album_model_get_index(AlbumModel *model, Track *track);
+gint album_model_get_index_with_track(AlbumModel *model, Track *track);
 
 gint album_model_get_size(AlbumModel *model);
 
diff --git a/plugins/clarity/clarity_canvas.c b/plugins/clarity/clarity_canvas.c
index fbce129..837822c 100644
--- a/plugins/clarity/clarity_canvas.c
+++ b/plugins/clarity/clarity_canvas.c
@@ -106,7 +106,7 @@ static gboolean _preview_cover_cb(GtkWidget *widget, 
GdkEvent *event, gpointer u
     if (!priv->model)
         return TRUE;
 
-    AlbumItem *item = album_model_get_item(priv->model, priv->curr_index);
+    AlbumItem *item = album_model_get_item_with_index(priv->model, 
priv->curr_index);
 
     GtkWidget *dialog = clarity_preview_new(item);
 
@@ -353,8 +353,6 @@ static void _update_text(ClarityCanvasPrivate *priv) {
     clutter_text_set_text(CLUTTER_TEXT(priv->title_text), title);
     clutter_text_set_text(CLUTTER_TEXT(priv->artist_text), artist);
 
-    g_warning("%s", 
clutter_text_get_font_name(CLUTTER_TEXT(priv->title_text)));
-
     g_free(title);
     g_free(artist);
 
@@ -379,26 +377,24 @@ static void _display_clarity_cover(ClarityCover *ccover, 
gint index) {
     clutter_timeline_start (timeline);
 }
 
-static gboolean _set_loading_complete(gpointer data) {
-    ClarityCanvasPrivate *priv = (ClarityCanvasPrivate *) data;
-    priv->loading_complete = TRUE;
-    _update_text(priv);
-    return FALSE;
-}
+static void _set_loading_complete(ClarityCanvasPrivate *priv, gboolean value) {
+    priv->loading_complete = value;
 
-static gboolean _create_cover_idle(gpointer data) {
+    if (value) {
+        _update_text(priv);
+    }
+
+    g_warning("Loading complete = %d", priv->loading_complete);
+}
 
-    AlbumItem *album_item = (AlbumItem *) data;
-    GObject *gobject = album_item->data;
+static gboolean _create_cover_actors(ClarityCanvasPrivate *priv, AlbumItem 
*album_item, gint index) {
+    g_return_val_if_fail(priv, FALSE);
 
-    g_return_val_if_fail(CLARITY_IS_CANVAS(gobject), FALSE);
-    ClarityCanvas *ccanvas = CLARITY_CANVAS(gobject);
-    ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(ccanvas);
+    _set_loading_complete(priv, FALSE);
 
-    gint index = g_list_length(priv->covers);
     ClarityCover *ccover = clarity_cover_new();
     clutter_actor_set_opacity(CLUTTER_ACTOR(ccover), 0);
-    priv->covers = g_list_append(priv->covers, ccover);
+    priv->covers = g_list_insert(priv->covers, ccover, index);
 
     clutter_container_add_actor(
                             CLUTTER_CONTAINER(priv->container),
@@ -406,15 +402,12 @@ static gboolean _create_cover_idle(gpointer data) {
 
     clarity_cover_set_album_item(ccover, album_item);
 
-    //TEXT
-    //FIXME
-//    temp.filename = filename;
-//    temp.filetype = filetype;
-
-    //FIXME
-    // Confirm whether this does improve performance
-    if(index > 20)
+    if((priv->curr_index + VISIBLE_ITEMS < index) ||
+            (priv->curr_index - VISIBLE_ITEMS > index)) {
+        g_warning("Not creating anything more");
+        _set_loading_complete(priv, TRUE);
         return FALSE;
+    }
 
     gint pos = _calculate_index_distance(index);
     float scale = _calculate_index_scale(index);
@@ -446,25 +439,24 @@ static gboolean _create_cover_idle(gpointer data) {
 
     _display_clarity_cover(ccover, index);
 
+    _set_loading_complete(priv, TRUE);
+
     return FALSE;
 }
 
-void _init_album_item(gpointer data, gpointer user_data) {
-    AlbumItem *item = (AlbumItem *) data;
+void _init_album_item(gpointer value, gint index, gpointer user_data) {
+    AlbumItem *item = (AlbumItem *) value;
     ClarityCanvas *cc = CLARITY_CANVAS(user_data);
-
-    gdk_threads_enter();
+    ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(cc);
 
     Track *track = g_list_nth_data(item->tracks, 0);
     item->albumart = _get_track_image(track);
     item->data = cc;
 
-    g_idle_add_full(G_PRIORITY_LOW, _create_cover_idle, item, NULL);
-
-    gdk_threads_leave();
+    _create_cover_actors(priv, item, index);
 }
 
-static gpointer _init_album_model_threaded(gpointer data) {
+static gpointer _init_album_model(gpointer data) {
     g_return_val_if_fail(CLARITY_IS_CANVAS(data), NULL);
 
     ClarityCanvas *cc = CLARITY_CANVAS(data);
@@ -473,8 +465,6 @@ static gpointer _init_album_model_threaded(gpointer data) {
 
     album_model_foreach(model, _init_album_item, cc);
 
-    g_idle_add_full(G_PRIORITY_LOW, _set_loading_complete, priv, NULL);
-
     return NULL;
 }
 
@@ -487,13 +477,8 @@ void clarity_canvas_init_album_model(ClarityCanvas *self, 
AlbumModel *model) {
 
     ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(self);
     priv->model = model;
-    priv->loading_complete = FALSE;
 
-    g_thread_create_full(_init_album_model_threaded, self, /* user data  */
-    0, /* stack size */
-    FALSE, /* joinable   */
-    TRUE, /* bound      */
-    G_THREAD_PRIORITY_LOW, NULL);
+    _init_album_model(self);
 
 }
 
@@ -569,6 +554,9 @@ static void _restore_z_order(ClarityCanvasPrivate *priv) {
 }
 
 static void _move(ClarityCanvasPrivate *priv, enum DIRECTION direction, gint 
increment) {
+
+    _set_loading_complete(priv, FALSE);
+
     /* Stop any animation */
     clutter_timeline_stop(priv->timeline);
 
@@ -583,8 +571,9 @@ static void _move(ClarityCanvasPrivate *priv, enum 
DIRECTION direction, gint inc
 
     priv->curr_index += ((direction * -1) * increment);
 
-    _update_text(priv);
     _restore_z_order(priv);
+
+    _set_loading_complete(priv, TRUE);
 }
 
 void clarity_canvas_move_left(ClarityCanvas *self, gint increment) {
@@ -594,8 +583,6 @@ void clarity_canvas_move_left(ClarityCanvas *self, gint 
increment) {
     if(priv->curr_index == g_list_length(priv->covers) - 1)
         return;
 
-    priv->loading_complete = FALSE;
-
     _move(priv, MOVE_LEFT, increment);
 }
 
@@ -606,8 +593,6 @@ void clarity_canvas_move_right(ClarityCanvas *self, gint 
increment) {
     if(priv->curr_index == 0)
         return;
 
-    priv->loading_complete = FALSE;
-
     _move(priv, MOVE_RIGHT, increment);
 }
 
@@ -624,3 +609,16 @@ gboolean clarity_canvas_is_loading(ClarityCanvas *self) {
     return !priv->loading_complete;
 }
 
+void clarity_canvas_add_album_item(ClarityCanvas *self, AlbumItem *item) {
+    g_return_if_fail(self);
+    g_return_if_fail(item);
+
+    ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(self);
+    gint index = album_model_get_index_with_album_item(priv->model, item);
+
+    _set_loading_complete(priv, FALSE);
+
+    _init_album_item(item, index, self);
+
+    _set_loading_complete(priv, TRUE);
+}
diff --git a/plugins/clarity/clarity_canvas.h b/plugins/clarity/clarity_canvas.h
index 346c8de..4b20e8d 100644
--- a/plugins/clarity/clarity_canvas.h
+++ b/plugins/clarity/clarity_canvas.h
@@ -88,6 +88,8 @@ gint clarity_canvas_get_current_index(ClarityCanvas *self);
 
 gboolean clarity_canvas_is_loading(ClarityCanvas *self);
 
+void clarity_canvas_add_album_item(ClarityCanvas *self, AlbumItem *item);
+
 G_END_DECLS
 
 #endif /* CLARITY_CANVAS_H_ */
diff --git a/plugins/clarity/clarity_widget.c b/plugins/clarity/clarity_widget.c
index 03c9e7d..ea96e8e 100644
--- a/plugins/clarity/clarity_widget.c
+++ b/plugins/clarity/clarity_widget.c
@@ -434,12 +434,40 @@ void clarity_widget_tracks_selected_cb(GtkPodApp *app, 
gpointer tks, gpointer da
     if (clarity_canvas_is_loading(ccanvas))
         return;
 
-    gint album_index = album_model_get_index(priv->album_model, tracks->data);
+    gint album_index = album_model_get_index_with_track(priv->album_model, 
tracks->data);
     gtk_range_set_value(GTK_RANGE (priv->cdslider), album_index);
 }
 
+void clarity_widget_track_added_cb(GtkPodApp *app, gpointer tk, gpointer data) 
{
+    g_return_if_fail(CLARITY_IS_WIDGET(data));
+
+    ClarityWidget *cw = CLARITY_WIDGET(data);
+    ClarityWidgetPrivate *priv = CLARITY_WIDGET_GET_PRIVATE(cw);
+    Track *track = tk;
+
+
+    if (!track)
+        return;
+
+    GList *current_tracks = cw->current_playlist->members;
+    if (!g_list_find(current_tracks, track)) {
+        // Track not added to this playlist
+        return;
+    }
+
+    ClarityCanvas *ccanvas = CLARITY_CANVAS(priv->draw_area);
+
+    if (clarity_canvas_is_loading(ccanvas))
+        return;
+
+    if (album_model_add_track(priv->album_model, track)) {
+        AlbumItem *item = album_model_get_item_with_track(priv->album_model, 
track);
+        clarity_canvas_add_album_item(CLARITY_CANVAS(priv->draw_area), item);
+        _init_slider_range(priv);
+    }
+}
+
 void clarity_widget_track_removed_cb(GtkPodApp *app, gpointer tk, gpointer 
data) {}
 void clarity_widget_track_updated_cb(GtkPodApp *app, gpointer tk, gpointer 
data) {}
-void clarity_widget_track_added_cb(GtkPodApp *app, gpointer tk, gpointer data) 
{}
 
 

------------------------------------------------------------------------------
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