commit 533666aef411172a51ed02561fb6a71fbdbc1aa0
Author: phantomjinx <[email protected]>
Date: Sun Sep 4 23:17:17 2011 +0100
Support for updating clarity when a track is modified
* When a track has its meta-data changed then this should update the display
according to the correct affect of the change, eg. no effect is unrelated
to the album key, move the track to a new album etc..
* album_model.*
* remove_track function should not need to refind the relevant album item
when in fact it has already been found and could be passed in as a
parameter
* it is not an error for the _get_index function to fail to find a key so
return -1 in an if condition rather than using g_return...
* search_for_track function simply iterates through all album items in an
attempt to find the given track. Long winded and slow but necessary if a
track has sufficiently changed to make looking it up in the index
impossible
* claritiy_canvas.c
* Need to ensure that like the remove function, the covers are refreshed.
The animate function provides this perfectly.
* clarity_widget.c
* Separate out _add and _remove functions as both used by respective
callbacks
and by the track_updated callback.
* Given we already know the album item in _remove function it is
unnecessary
to find it again so pass it in as a parameter.
* Completion of track_updated callback.
plugins/clarity/album_model.c | 28 +++++++-
plugins/clarity/album_model.h | 3 +-
plugins/clarity/clarity_canvas.c | 2 +
plugins/clarity/clarity_widget.c | 126 ++++++++++++++++++++++++++++++++-----
4 files changed, 137 insertions(+), 22 deletions(-)
---
diff --git a/plugins/clarity/album_model.c b/plugins/clarity/album_model.c
index 821ba40..2779f6a 100644
--- a/plugins/clarity/album_model.c
+++ b/plugins/clarity/album_model.c
@@ -274,14 +274,14 @@ gboolean album_model_add_track(AlbumModel *model, Track
*track) {
return _insert_track(priv, track);
}
-gboolean album_model_remove_track(AlbumModel *model, Track *track) {
+gboolean album_model_remove_track(AlbumModel *model, AlbumItem *item, Track
*track) {
g_return_val_if_fail(model, -1);
+ g_return_val_if_fail(item, -1);
g_return_val_if_fail(track, -1);
AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE(model);
- AlbumItem *item = album_model_get_item_with_track(model, track);
- if (!item || !item->tracks) {
+ if (!item->tracks) {
return FALSE;
}
@@ -345,7 +345,8 @@ 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_keys);
- g_return_val_if_fail (key, -1);
+ if (!key)
+ return -1;
gint index = g_list_position(key_list, key);
@@ -384,4 +385,23 @@ gint album_model_get_size(AlbumModel *model) {
return g_list_length(priv->album_key_list);
}
+AlbumItem *album_model_search_for_track(AlbumModel *model, Track *track) {
+ g_return_val_if_fail(model, NULL);
+ g_return_val_if_fail(track, NULL);
+
+ AlbumModelPrivate *priv = ALBUM_MODEL_GET_PRIVATE (model);
+ GList *album_items = g_hash_table_get_values(priv->album_hash);
+ while (album_items) {
+ AlbumItem *item = album_items->data;
+
+ if (g_list_index(item->tracks, track) > -1) {
+ return item;
+ }
+
+ album_items = album_items->next;
+ }
+
+ return NULL;
+}
+
#endif /* ALBUM_MODEL_C_ */
diff --git a/plugins/clarity/album_model.h b/plugins/clarity/album_model.h
index 8e20fa8..00acc8b 100644
--- a/plugins/clarity/album_model.h
+++ b/plugins/clarity/album_model.h
@@ -105,7 +105,7 @@ gboolean album_model_add_track(AlbumModel *model, Track
*track);
* @return gboolean: whether an album model was removed.
*
*/
-gboolean album_model_remove_track(AlbumModel *model, Track *track);
+gboolean album_model_remove_track(AlbumModel *model, AlbumItem *item, Track
*track);
AlbumItem *album_model_get_item_with_index(AlbumModel *model, gint index);
@@ -119,5 +119,6 @@ gint album_model_get_size(AlbumModel *model);
gint compare_tracks(Track *a, Track *b);
+AlbumItem *album_model_search_for_track(AlbumModel *model, Track *track);
#endif /* ALBUM_MODEL_H_ */
diff --git a/plugins/clarity/clarity_canvas.c b/plugins/clarity/clarity_canvas.c
index bb42a68..26b86fe 100644
--- a/plugins/clarity/clarity_canvas.c
+++ b/plugins/clarity/clarity_canvas.c
@@ -641,6 +641,8 @@ void clarity_canvas_add_album_item(ClarityCanvas *self,
AlbumItem *item) {
_init_album_item(item, index, self);
+ _animate_indices(priv, 0, 0);
+
_set_loading_complete(priv, TRUE);
}
diff --git a/plugins/clarity/clarity_widget.c b/plugins/clarity/clarity_widget.c
index 6981216..ca50d74 100644
--- a/plugins/clarity/clarity_widget.c
+++ b/plugins/clarity/clarity_widget.c
@@ -67,9 +67,6 @@ enum {
*
* popup menu
* drag n drop
- * track added
- * track removed
- * track updated
* set cover from file
*/
@@ -458,6 +455,19 @@ void clarity_widget_tracks_selected_cb(GtkPodApp *app,
gpointer tks, gpointer da
gtk_range_set_value(GTK_RANGE (priv->cdslider), album_index);
}
+static void _add_track(ClarityWidgetPrivate *priv, Track *track) {
+ 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_added_cb(GtkPodApp *app, gpointer tk, gpointer data)
{
g_return_if_fail(CLARITY_IS_WIDGET(data));
@@ -475,16 +485,29 @@ void clarity_widget_track_added_cb(GtkPodApp *app,
gpointer tk, gpointer data) {
return;
}
+ _add_track(priv, track);
+}
+
+static void _remove_track(ClarityWidgetPrivate *priv, AlbumItem *item, Track
*track) {
+ g_return_if_fail(priv);
+
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);
+ if(!item)
+ return;
+
+ if(g_list_length(item->tracks) == 1) {
+ // Last track in album item so remove canvas cover first
+ clarity_canvas_remove_album_item(CLARITY_CANVAS(priv->draw_area),
item);
}
+
+ // Remove the track from the model
+ album_model_remove_track(priv->album_model, item, track);
+
+ _init_slider_range(priv);
}
void clarity_widget_track_removed_cb(GtkPodApp *app, gpointer tk, gpointer
data) {
@@ -498,23 +521,92 @@ void clarity_widget_track_removed_cb(GtkPodApp *app,
gpointer tk, gpointer data)
if (!track)
return;
+ AlbumItem *item = album_model_get_item_with_track(priv->album_model,
track);
+
+ _remove_track(priv, item, track);
+}
+
+void clarity_widget_track_updated_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;
+
ClarityCanvas *ccanvas = CLARITY_CANVAS(priv->draw_area);
if (clarity_canvas_is_loading(ccanvas))
return;
- AlbumItem *item = album_model_get_item_with_track(priv->album_model,
track);
- if(g_list_length(item->tracks) == 1) {
- // Last track in album item so remove canvas cover first
- clarity_canvas_remove_album_item(CLARITY_CANVAS(priv->draw_area),
item);
- }
+ AlbumItem *item;
+ gboolean findremove = FALSE;
- // Remove the track from the model
- album_model_remove_track(priv->album_model, track);
+ gint index = album_model_get_index_with_track(priv->album_model, track);
+ if (index == -1) {
+ /* The track's key could not be found according to the track!
+ * The ONLY way this could happen is if the user changed the
+ * components of the track's key. Well it should be rare but the only
+ * way to remove it from its "old" album item is to search each one
+ */
+ findremove = TRUE;
+ }
+ else {
+ /* Track has a valid key so can get the album back.
+ * Either has happened:
+ * a) Artist/Album key has been changed so the track is being moved
+ * to another existing album
+ * b) Some other change has occurred that is irrelevant to this code.
+ *
+ * To determine if a) is the case need to determine whether track
exists
+ * in the album items track list. If it does then b) is true and
nothing
+ * more is required.
+ */
+ item = album_model_get_item_with_track(priv->album_model, track);
+ g_return_if_fail (item);
+
+ index = g_list_index(item->tracks, track);
+ if (index != -1) {
+ /* Track exists in the album list so ignore the change and return
*/
+ ExtraTrackData *etd;
+ etd = track->userdata;
+ if (etd->tartwork_changed == TRUE) {
+ etd->tartwork_changed = FALSE;
+ }
+
+ return;
+ }
+ else {
+ /* Track does not exist in the album list so the artist/album
+ * key has definitely changed */
+ findremove = TRUE;
+ }
+ }
- _init_slider_range(priv);
+ if (findremove) {
+ /* It has been determined that the track has had its key changed
+ * and thus a search must be performed to find the "original" album
+ * that the track belonged to, remove it then add the track to the
+ * new album.
+ */
+ item = album_model_search_for_track(priv->album_model, track);
+ /* item represents the album item containing the track */
+ if (item) {
+ g_warning("Item %s %s", item->albumname, item->artist);
+
+ /* The track is in this album so remove it in preparation for
+ * readding under the new album key
+ */
+ _remove_track(priv, item, track);
+ }
+
+ /* Create a new album item or find existing album to house the
+ * "brand new" track
+ */
+ _add_track(priv, track);
+ }
}
-void clarity_widget_track_updated_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
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2