commit ddef6ad02ab592877d82cd36c5def70f3a1228f0
Author: phantomjinx <[email protected]>
Date: Sat Sep 10 13:38:30 2011 +0100
Implement the updating of a track in clarity
* If a track has been changed, clarity should react and if necessary update
the artwork cover accordingly. This may mean changing the artwork, text
or moving the track completely to a new album item.
* AlbumItem
* data reference no longer necessary
* clarity_canvas
* Formally defines the FLOOR constant better to understand the location
set or each cover
* Support for shift + mouse-button-1 to select the tracks referenced by the
cover art.
plugins/clarity/album_model.c | 15 ++++-
plugins/clarity/album_model.h | 4 +-
plugins/clarity/clarity_canvas.c | 159 +++++++++++++++++++++++---------------
plugins/clarity/clarity_canvas.h | 9 +--
plugins/clarity/clarity_cover.c | 45 ++++++++---
plugins/clarity/clarity_cover.h | 4 +
plugins/clarity/clarity_widget.c | 6 +-
7 files changed, 156 insertions(+), 86 deletions(-)
---
diff --git a/plugins/clarity/album_model.c b/plugins/clarity/album_model.c
index 5db9fb3..7c4b5b2 100644
--- a/plugins/clarity/album_model.c
+++ b/plugins/clarity/album_model.c
@@ -30,6 +30,7 @@
#define ALBUM_MODEL_C_
#include "album_model.h"
+#include "clarity_utils.h"
#include "libgtkpod/prefs.h"
#include "libgtkpod/misc.h"
#include "libgtkpod/gp_private.h"
@@ -185,7 +186,6 @@ static void album_model_free_album_item(AlbumItem *item) {
if (item->albumart)
g_object_unref(item->albumart);
- item->data = NULL;
}
}
@@ -327,6 +327,19 @@ void album_model_foreach (AlbumModel *model, AMFunc func,
gpointer user_data) {
}
}
+void album_model_init_coverart(AlbumModel *model, AlbumItem *item) {
+ g_return_if_fail(item);
+
+ Track *track = g_list_nth_data(item->tracks, 0);
+
+ if (item->albumart) {
+ g_object_unref(item->albumart);
+ item->albumart = NULL;
+ }
+
+ item->albumart = _get_track_image(track);
+}
+
AlbumItem *album_model_get_item_with_index(AlbumModel *model, gint index) {
g_return_val_if_fail(model, NULL);
diff --git a/plugins/clarity/album_model.h b/plugins/clarity/album_model.h
index 00acc8b..617a6cb 100644
--- a/plugins/clarity/album_model.h
+++ b/plugins/clarity/album_model.h
@@ -41,8 +41,6 @@ typedef struct {
gchar *artist;
GdkPixbuf *albumart;
- gpointer data;
-
} AlbumItem;
typedef void (*AMFunc) (gpointer value, gint index, gpointer user_data);
@@ -107,6 +105,8 @@ gboolean album_model_add_track(AlbumModel *model, Track
*track);
*/
gboolean album_model_remove_track(AlbumModel *model, AlbumItem *item, Track
*track);
+void album_model_init_coverart(AlbumModel *model, AlbumItem *item);
+
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 be04b23..865a114 100644
--- a/plugins/clarity/clarity_canvas.c
+++ b/plugins/clarity/clarity_canvas.c
@@ -46,6 +46,7 @@ G_DEFINE_TYPE( ClarityCanvas, clarity_canvas, GTK_TYPE_BOX);
#define FRONT_COVER_SPACE 150
#define MAX_SCALE 1.4
#define VISIBLE_ITEMS 8
+#define FLOOR 110
struct _ClarityCanvasPrivate {
@@ -102,6 +103,43 @@ static void clarity_canvas_class_init(ClarityCanvasClass
*klass) {
g_type_class_add_private(klass, sizeof(ClarityCanvasPrivate));
}
+static void _update_text(ClarityCanvasPrivate *priv) {
+ g_return_if_fail(priv);
+
+ if (g_list_length(priv->covers) == 0)
+ return;
+
+ ClarityCover *ccover = g_list_nth_data(priv->covers, priv->curr_index);
+
+ gchar *title = clarity_cover_get_title(ccover);
+ gchar *artist = clarity_cover_get_artist(ccover);
+
+ clutter_text_set_text(CLUTTER_TEXT(priv->title_text), title);
+ clutter_text_set_text(CLUTTER_TEXT(priv->artist_text), artist);
+
+ g_free(title);
+ g_free(artist);
+
+ clutter_actor_raise_top(priv->title_text);
+ clutter_actor_raise_top(priv->artist_text);
+
+ gfloat artistx = (clutter_actor_get_width(priv->artist_text) / 2) * -1;
+ gfloat artisty = FLOOR - (clarity_cover_get_artwork_height(ccover) *
MAX_SCALE);
+ clutter_actor_set_position(priv->artist_text, artistx, artisty);
+
+ gfloat titlex = (clutter_actor_get_width(priv->title_text) / 2) * -1;
+ gfloat titley = artisty - clutter_actor_get_height(priv->artist_text) - 2;
+ clutter_actor_set_position(priv->title_text, titlex, titley);
+}
+
+static void _set_loading_complete(ClarityCanvasPrivate *priv, gboolean value) {
+ priv->loading_complete = value;
+
+ if (value) {
+ _update_text(priv);
+ }
+}
+
static void _preview_cover(ClarityCanvasPrivate *priv) {
if (!priv->model)
return;
@@ -135,7 +173,17 @@ static gint _on_main_cover_image_clicked_cb(GtkWidget
*widget, GdkEvent *event,
mbutton = event->button.button;
- if (mbutton == 1) {
+ if ((mbutton == 1) && (event->button.state & GDK_SHIFT_MASK)) {
+ _set_loading_complete(priv, FALSE);
+
+ AlbumItem *item = album_model_get_item_with_index(priv->model,
priv->curr_index);
+ if (item) {
+ gtkpod_set_displayed_tracks(item->tracks);
+ }
+
+ _set_loading_complete(priv, TRUE);
+ }
+ else if (mbutton == 1) {
_preview_cover(priv);
}
else if ((mbutton == 3) && (event->button.state & GDK_SHIFT_MASK)) {
@@ -385,35 +433,6 @@ static gint _calculate_index_opacity (gint
dist_from_front) {
return CLAMP ( 255 * (VISIBLE_ITEMS - ABS(dist_from_front)) /
VISIBLE_ITEMS, 0, 255);
}
-static void _update_text(ClarityCanvasPrivate *priv) {
- g_return_if_fail(priv);
-
- if (g_list_length(priv->covers) == 0)
- return;
-
- ClarityCover *ccover = g_list_nth_data(priv->covers, priv->curr_index);
-
- gchar *title = clarity_cover_get_title(ccover);
- gchar *artist = clarity_cover_get_artist(ccover);
-
- clutter_text_set_text(CLUTTER_TEXT(priv->title_text), title);
- clutter_text_set_text(CLUTTER_TEXT(priv->artist_text), artist);
-
- g_free(title);
- g_free(artist);
-
- clutter_actor_raise_top(priv->title_text);
- clutter_actor_raise_top(priv->artist_text);
-
- gfloat artistx = (clutter_actor_get_width(priv->artist_text) / 2) * -1;
- gfloat artisty = ((clutter_actor_get_height(CLUTTER_ACTOR(ccover)) / 2) -
25) * -1;
- clutter_actor_set_position(priv->artist_text, artistx, artisty);
-
- gfloat titlex = (clutter_actor_get_width(priv->title_text) / 2) * -1;
- gfloat titley = artisty - clutter_actor_get_height(priv->artist_text) - 2;
- clutter_actor_set_position(priv->title_text, titlex, titley);
-}
-
static void _display_clarity_cover(ClarityCover *ccover, gint index) {
ClutterTimeline *timeline = clutter_timeline_new(1600 * 5);
ClutterAlpha *alpha = clutter_alpha_new_full (timeline,
CLUTTER_EASE_OUT_EXPO);
@@ -423,12 +442,12 @@ static void _display_clarity_cover(ClarityCover *ccover,
gint index) {
clutter_timeline_start (timeline);
}
-static void _set_loading_complete(ClarityCanvasPrivate *priv, gboolean value) {
- priv->loading_complete = value;
-
- if (value) {
- _update_text(priv);
- }
+static void _set_cover_position(ClarityCover *ccover, gint index) {
+ gint pos = _calculate_index_distance(index);
+ clutter_actor_set_position(
+ CLUTTER_ACTOR(ccover),
+ pos - clarity_cover_get_artwork_width(ccover) / 2,
+ FLOOR - clarity_cover_get_artwork_height(ccover));
}
static gboolean _create_cover_actors(ClarityCanvasPrivate *priv, AlbumItem
*album_item, gint index) {
@@ -446,11 +465,7 @@ 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)));
+ _set_cover_position(ccover, index);
if((priv->curr_index + VISIBLE_ITEMS < index) ||
(priv->curr_index - VISIBLE_ITEMS > index)) {
@@ -475,8 +490,8 @@ static gboolean _create_cover_actors(ClarityCanvasPrivate
*priv, AlbumItem *albu
CLUTTER_ACTOR(ccover),
scale,
scale,
- clutter_actor_get_width(CLUTTER_ACTOR(ccover)) / 2,
- clutter_actor_get_height(CLUTTER_ACTOR(ccover)) / 2);
+ clarity_cover_get_artwork_width(ccover) / 2,
+ clarity_cover_get_artwork_height(ccover) / 2);
clutter_actor_lower_bottom(CLUTTER_ACTOR(ccover));
@@ -492,9 +507,7 @@ void _init_album_item(gpointer value, gint index, gpointer
user_data) {
ClarityCanvas *cc = CLARITY_CANVAS(user_data);
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;
+ album_model_init_coverart(priv->model, item);
_create_cover_actors(priv, item, index);
}
@@ -556,18 +569,17 @@ static void _clear_rotation_behaviours(GList *covers) {
static void _animate_indices(ClarityCanvasPrivate *priv, gint direction, gint
increment) {
for (gint i = 0; i < g_list_length(priv->covers); ++i) {
-
ClarityCover *ccover = g_list_nth_data(priv->covers, i);
gint dist = i - priv->curr_index + (direction * increment);
- gfloat depth = 1;
+ gfloat scale = 1;
gint pos = 0;
gint opacity = 0;
gint angle = 0;
ClutterRotateDirection rotation_dir;
opacity = _calculate_index_opacity(dist);
- depth = _calculate_index_scale(dist);
+ scale = _calculate_index_scale(dist);
pos = _calculate_index_distance(dist);
_calculate_index_angle_and_dir(dist, direction, &angle, &rotation_dir);
@@ -579,13 +591,17 @@ static void _animate_indices(ClarityCanvasPrivate *priv,
gint direction, gint in
"opacity", opacity,
NULL);
+ gfloat w = clarity_cover_get_artwork_width(ccover);
+ gfloat h = clarity_cover_get_artwork_height(ccover);
+
/* Position and scale */
clutter_actor_animate_with_alpha (CLUTTER_ACTOR(ccover), priv->alpha,
- "scale-x", depth,
- "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,
+ "scale-x", scale,
+ "scale-y", scale,
+ "scale-center-x" , w / 2,
+ "scale-center-y", h / 2,
+ "x", pos - (w / 2),
+ "y", FLOOR - h,
NULL);
}
}
@@ -702,14 +718,31 @@ void clarity_canvas_remove_album_item(ClarityCanvas
*self, AlbumItem *item) {
_set_loading_complete(priv, TRUE);
}
-/**
- * clarity_canvas_set_cover_from_file:
- *
- * Add a cover to the displayed track by setting it from a
- * picture file.
- *
- */
-void clarity_canvas_set_cover_from_file(ClarityCanvas *self) {
+void clarity_canvas_update(ClarityCanvas *cc, AlbumItem *item) {
+ g_return_if_fail(cc);
+
+ ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(cc);
+
+ gint index = album_model_get_index_with_album_item(priv->model, item);
+
+ _set_loading_complete(priv, FALSE);
+
+ album_model_init_coverart(priv->model, item);
+
+ ClarityCover *ccover = (ClarityCover *) g_list_nth_data(priv->covers,
index);
+ if (!ccover)
+ return;
+
+ clarity_cover_set_album_item(ccover, item);
+
+ _set_cover_position(ccover, index);
+
+ _animate_indices(priv, 0, 0);
+
+ _set_loading_complete(priv, TRUE);
+}
+
+static void _set_cover_from_file(ClarityCanvas *self) {
g_return_if_fail(self);
ClarityCanvasPrivate *priv = CLARITY_CANVAS_GET_PRIVATE(self);
@@ -748,5 +781,5 @@ void clarity_canvas_set_cover_from_file(ClarityCanvas
*self) {
void on_clarity_set_cover_menuitem_activate(GtkMenuItem *mi, gpointer data) {
g_return_if_fail(CLARITY_IS_CANVAS(data));
- clarity_canvas_set_cover_from_file(CLARITY_CANVAS(data));
+ _set_cover_from_file(CLARITY_CANVAS(data));
}
diff --git a/plugins/clarity/clarity_canvas.h b/plugins/clarity/clarity_canvas.h
index 23561fa..e5bc41b 100644
--- a/plugins/clarity/clarity_canvas.h
+++ b/plugins/clarity/clarity_canvas.h
@@ -92,14 +92,7 @@ void clarity_canvas_add_album_item(ClarityCanvas *self,
AlbumItem *item);
void clarity_canvas_remove_album_item(ClarityCanvas *self, AlbumItem *item);
-/**
- * clarity_canvas_set_cover_from_file:
- *
- * Add a cover to the displayed track by setting it from a
- * picture file.
- *
- */
-void clarity_canvas_set_cover_from_file(ClarityCanvas *self);
+void clarity_canvas_update(ClarityCanvas *cc, AlbumItem *item);
void on_clarity_set_cover_menuitem_activate(GtkMenuItem *mi, gpointer data);
diff --git a/plugins/clarity/clarity_cover.c b/plugins/clarity/clarity_cover.c
index d5d44e6..32e3943 100644
--- a/plugins/clarity/clarity_cover.c
+++ b/plugins/clarity/clarity_cover.c
@@ -233,9 +233,13 @@ void clarity_cover_set_album_item (ClarityCover *self,
AlbumItem *item) {
GError *error = NULL;
gint y_offset;
- priv->texture = gtk_clutter_texture_new();
- gtk_clutter_texture_set_from_pixbuf (GTK_CLUTTER_TEXTURE(priv->texture),
item->albumart, &error);
+ if (!priv->texture) {
+ priv->texture = gtk_clutter_texture_new();
+ clutter_container_add_actor(CLUTTER_CONTAINER(self), priv->texture);
+ }
+ // Set cover artwork
+ gtk_clutter_texture_set_from_pixbuf (GTK_CLUTTER_TEXTURE(priv->texture),
item->albumart, &error);
if (error) {
g_warning(error->message);
g_error_free(error);
@@ -243,19 +247,21 @@ void clarity_cover_set_album_item (ClarityCover *self,
AlbumItem *item) {
}
// Add reflection
- y_offset = clutter_actor_get_height (priv->texture) + V_PADDING;
-
- priv->reflection = clutter_clone_new (priv->texture);
- clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_X, 0.0));
- clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_Y, y_offset));
- clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_WIDTH, 0.0));
- clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_HEIGHT, 0.0));
- g_signal_connect (priv->reflection,
+ if (! priv->reflection) {
+ y_offset = clutter_actor_get_height (priv->texture) + V_PADDING;
+
+ priv->reflection = clutter_clone_new (priv->texture);
+ clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_X, 0.0));
+ clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_Y, y_offset));
+ clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_WIDTH, 0.0));
+ clutter_actor_add_constraint (priv->reflection,
clutter_bind_constraint_new (priv->texture, CLUTTER_BIND_HEIGHT, 0.0));
+ g_signal_connect (priv->reflection,
"paint",
G_CALLBACK (_clone_paint_cb),
NULL);
- clutter_container_add(CLUTTER_CONTAINER(self), priv->texture,
priv->reflection, NULL);
+ clutter_container_add_actor(CLUTTER_CONTAINER(self), priv->reflection);
+ }
ClutterActorBox box;
gfloat w, h;
@@ -268,7 +274,14 @@ void clarity_cover_set_album_item (ClarityCover *self,
AlbumItem *item) {
}
// Add title / artist data
+ if (priv->title)
+ g_free(priv->title);
+
priv->title = g_strdup(item->albumname);
+
+ if (priv->artist)
+ g_free(priv->artist);
+
priv->artist = g_strdup(item->artist);
}
@@ -320,6 +333,16 @@ gchar *clarity_cover_get_artist(ClarityCover *self) {
return g_strdup(priv->artist);
}
+gfloat clarity_cover_get_artwork_height(ClarityCover *self) {
+ ClarityCoverPrivate *priv = self->priv;
+ return clutter_actor_get_height(priv->texture);
+}
+
+gfloat clarity_cover_get_artwork_width(ClarityCover *self) {
+ ClarityCoverPrivate *priv = self->priv;
+ return clutter_actor_get_width(priv->texture);
+}
+
/**
* clarity_cover_new:
*
diff --git a/plugins/clarity/clarity_cover.h b/plugins/clarity/clarity_cover.h
index 8b8f18b..3f52dfa 100644
--- a/plugins/clarity/clarity_cover.h
+++ b/plugins/clarity/clarity_cover.h
@@ -105,6 +105,10 @@ gchar *clarity_cover_get_title(ClarityCover *self);
gchar *clarity_cover_get_artist(ClarityCover *self);
+gfloat clarity_cover_get_artwork_height(ClarityCover *self);
+
+gfloat clarity_cover_get_artwork_width(ClarityCover *self);
+
/* constructor - note this returns a ClutterActor instance */
ClarityCover *clarity_cover_new (void);
diff --git a/plugins/clarity/clarity_widget.c b/plugins/clarity/clarity_widget.c
index 2bccbaf..b379f23 100644
--- a/plugins/clarity/clarity_widget.c
+++ b/plugins/clarity/clarity_widget.c
@@ -567,7 +567,11 @@ void clarity_widget_track_updated_cb(GtkPodApp *app,
gpointer tk, gpointer data)
*/
ExtraTrackData *etd;
etd = track->userdata;
- if (! etd->tartwork_changed) {
+ if (etd->tartwork_changed) {
+ clarity_canvas_update(ccanvas, item);
+ return;
+ }
+ else {
/*
* Artwork is up to date so nothing changed relevant
* to the display.
------------------------------------------------------------------------------
Malware Security Report: Protecting Your Business, Customers, and the
Bottom Line. Protect your business and customers by understanding the
threat from malware and how it can impact your online business.
http://www.accelacomm.com/jaw/sfnl/114/51427462/
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2