commit f8bf1e9fdce95d3c51011afc46115fb0e1e8a2e2 Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> Date: Fri Sep 2 23:29:17 2011 +0100
Support for track removal in Clarity * Handle the updating of clarity display when a track is removed from the current playlist. Essentially removes the cover if the last track and removes it from the album model. * gp_itdb.c * Seems we are signalling track removal twice unnecessarily * clarity_canvas.c * Most of the initialisation of covers is only done for the visible ones. Not setting the position causes other covers to lie below the original visible covers and looks odd. Set the position of all covers. libgtkpod/gp_itdb.c | 2 - plugins/clarity/album_model.c | 30 ++++++++++++++++++++++ plugins/clarity/album_model.h | 8 ++++++ plugins/clarity/clarity_canvas.c | 50 +++++++++++++++++++++++++++++++------ plugins/clarity/clarity_canvas.h | 2 + plugins/clarity/clarity_cover.c | 4 +- plugins/clarity/clarity_cover.h | 2 + plugins/clarity/clarity_widget.c | 29 +++++++++++++++++++++- 8 files changed, 114 insertions(+), 13 deletions(-) --- diff --git a/libgtkpod/gp_itdb.c b/libgtkpod/gp_itdb.c index b95847e..6e5d54e 100644 --- a/libgtkpod/gp_itdb.c +++ b/libgtkpod/gp_itdb.c @@ -551,8 +551,6 @@ void gp_playlist_remove_track(Playlist *plitem, Track *track, DeleteAction delet g_return_if_fail (plitem); - gtkpod_track_removed(track); - /* remove track from playlist */ itdb_playlist_remove_track(plitem, track); diff --git a/plugins/clarity/album_model.c b/plugins/clarity/album_model.c index cab5e41..821ba40 100644 --- a/plugins/clarity/album_model.c +++ b/plugins/clarity/album_model.c @@ -274,6 +274,36 @@ gboolean album_model_add_track(AlbumModel *model, Track *track) { return _insert_track(priv, track); } +gboolean album_model_remove_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); + + AlbumItem *item = album_model_get_item_with_track(model, track); + if (!item || !item->tracks) { + return FALSE; + } + + item->tracks = g_list_remove(item->tracks, track); + + if (g_list_length(item->tracks) == 0) { + // Remove the album item + + gint index = album_model_get_index_with_album_item(model, item); + gchar *album_key = g_list_nth_data(priv->album_key_list, index); + + priv->album_key_list = g_list_remove(priv->album_key_list, album_key); + + g_hash_table_remove(priv->album_hash, item); + + g_free(album_key); + return TRUE; + } + + return FALSE; +} + void album_model_foreach (AlbumModel *model, AMFunc func, gpointer user_data) { g_return_if_fail(model); g_return_if_fail(func); diff --git a/plugins/clarity/album_model.h b/plugins/clarity/album_model.h index d91868d..8e20fa8 100644 --- a/plugins/clarity/album_model.h +++ b/plugins/clarity/album_model.h @@ -99,6 +99,14 @@ void album_model_add_tracks(AlbumModel *model, GList *tracks); */ gboolean album_model_add_track(AlbumModel *model, Track *track); +/** + * Remove a single track from the album model. + * + * @return gboolean: whether an album model was removed. + * + */ +gboolean album_model_remove_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); diff --git a/plugins/clarity/clarity_canvas.c b/plugins/clarity/clarity_canvas.c index 8baa2e8..015775f 100644 --- a/plugins/clarity/clarity_canvas.c +++ b/plugins/clarity/clarity_canvas.c @@ -400,13 +400,18 @@ static gboolean _create_cover_actors(ClarityCanvasPrivate *priv, AlbumItem *albu clarity_cover_set_album_item(ccover, album_item); + gint pos = _calculate_index_distance(index); + clutter_actor_set_position( + CLUTTER_ACTOR(ccover), + pos - clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2, + 110 - clutter_actor_get_height(CLUTTER_ACTOR(ccover))); + if((priv->curr_index + VISIBLE_ITEMS < index) || (priv->curr_index - VISIBLE_ITEMS > index)) { _set_loading_complete(priv, TRUE); return FALSE; } - gint pos = _calculate_index_distance(index); float scale = _calculate_index_scale(index); gint angle; @@ -420,11 +425,6 @@ static gboolean _create_cover_actors(ClarityCanvasPrivate *priv, AlbumItem *albu clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2, 0, 0); - clutter_actor_set_position( - CLUTTER_ACTOR(ccover), - pos - clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2, - 110 - clutter_actor_get_height(CLUTTER_ACTOR(ccover))); - clutter_actor_set_scale_full( CLUTTER_ACTOR(ccover), scale, @@ -453,6 +453,24 @@ void _init_album_item(gpointer value, gint index, gpointer user_data) { _create_cover_actors(priv, item, index); } +void _destroy_cover(ClarityCanvas *cc, gint index) { + ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(cc); + + ClarityCover *ccover = (ClarityCover *) g_list_nth_data(priv->covers, index); + if (!ccover) + return; + + priv->covers = g_list_remove(priv->covers, ccover); + + clutter_container_remove_actor( + CLUTTER_CONTAINER(priv->container), + CLUTTER_ACTOR(ccover)); + + clarity_cover_destroy(CLUTTER_ACTOR(ccover)); + + return; +} + static gpointer _init_album_model(gpointer data) { g_return_val_if_fail(CLARITY_IS_CANVAS(data), NULL); @@ -489,7 +507,7 @@ static void _clear_rotation_behaviours(GList *covers) { } } -static void _animate_indices(ClarityCanvasPrivate *priv, enum DIRECTION direction, gint increment) { +static void _animate_indices(ClarityCanvasPrivate *priv, gint direction, gint increment) { for (gint i = 0; i < g_list_length(priv->covers); ++i) { @@ -521,7 +539,7 @@ static void _animate_indices(ClarityCanvasPrivate *priv, enum DIRECTION directio "scale-y", depth, "scale-center-x" , clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2, "scale-center-y" , clutter_actor_get_height(CLUTTER_ACTOR(ccover)) / 2, - "x", pos - clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2 , + "x", pos - clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2, NULL); } } @@ -619,3 +637,19 @@ void clarity_canvas_add_album_item(ClarityCanvas *self, AlbumItem *item) { _set_loading_complete(priv, TRUE); } + +void clarity_canvas_remove_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); + + _destroy_cover(self, index); + + _animate_indices(priv, 0, 0); + + _set_loading_complete(priv, TRUE); +} diff --git a/plugins/clarity/clarity_canvas.h b/plugins/clarity/clarity_canvas.h index 4b20e8d..3a1a691 100644 --- a/plugins/clarity/clarity_canvas.h +++ b/plugins/clarity/clarity_canvas.h @@ -90,6 +90,8 @@ gboolean clarity_canvas_is_loading(ClarityCanvas *self); void clarity_canvas_add_album_item(ClarityCanvas *self, AlbumItem *item); +void clarity_canvas_remove_album_item(ClarityCanvas *self, AlbumItem *item); + G_END_DECLS #endif /* CLARITY_CANVAS_H_ */ diff --git a/plugins/clarity/clarity_cover.c b/plugins/clarity/clarity_cover.c index 074dc43..d5d44e6 100644 --- a/plugins/clarity/clarity_cover.c +++ b/plugins/clarity/clarity_cover.c @@ -99,7 +99,7 @@ static void clarity_cover_finalize(GObject *gobject) { * implementation destroy any actors they are composed from; * in this case, we just destroy the child ClutterBox */ -static void clarity_cover_destroy(ClutterActor *self) { +void clarity_cover_destroy(ClutterActor *self) { ClarityCoverPrivate *priv = CLARITY_COVER_GET_PRIVATE(self); if (priv) { @@ -114,7 +114,7 @@ static void clarity_cover_destroy(ClutterActor *self) { } if (G_IS_OBJECT(priv->rotateBehaviour)) - g_object_unref(priv->rotateBehaviour); + priv->rotateBehaviour = NULL; } /* chain up to destroy() on the parent ClutterActorClass; diff --git a/plugins/clarity/clarity_cover.h b/plugins/clarity/clarity_cover.h index ee6542b..8b8f18b 100644 --- a/plugins/clarity/clarity_cover.h +++ b/plugins/clarity/clarity_cover.h @@ -108,4 +108,6 @@ gchar *clarity_cover_get_artist(ClarityCover *self); /* constructor - note this returns a ClutterActor instance */ ClarityCover *clarity_cover_new (void); +void clarity_cover_destroy(ClutterActor *self); + #endif /* CLARITY_COVER_H_ */ diff --git a/plugins/clarity/clarity_widget.c b/plugins/clarity/clarity_widget.c index c549ccc..6981216 100644 --- a/plugins/clarity/clarity_widget.c +++ b/plugins/clarity/clarity_widget.c @@ -487,7 +487,34 @@ void clarity_widget_track_added_cb(GtkPodApp *app, gpointer tk, gpointer data) { } } -void clarity_widget_track_removed_cb(GtkPodApp *app, gpointer tk, gpointer data) {} +void clarity_widget_track_removed_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); + } + + // Remove the track from the model + album_model_remove_track(priv->album_model, track); + + _init_slider_range(priv); +} + 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 gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2