diff --git a/CHANGELOG b/CHANGELOG index 0523d78d..21ba80ee 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ 6.4.16: +- Split album art code into a new file - Fix PKGBUILD dependencies 6.4.16-rc: diff --git a/gui/artwork.c b/gui/artwork.c new file mode 100644 index 00000000..9b8ed67e --- /dev/null +++ b/gui/artwork.c @@ -0,0 +1,78 @@ +/* + * Copyright 2016 (c) Anna Schumaker. + */ +#include +#include +#include + +static struct album *__artwork_cur_album = NULL; + +static GdkPixbuf *__artwork_get_pixbuf(struct track *track) +{ + gchar *path = album_artwork_path(track->tr_album); + GdkPixbuf *pix; + int height; + + if (!path) + return NULL; + + height = gui_builder_widget_height("o_position") + + gui_builder_widget_height("o_tags"); + pix = gdk_pixbuf_new_from_file_at_scale(path, -1, height, true, NULL); + g_free(path); + + return pix; +} + +void gui_artwork_set_cover(void) +{ + GtkImage *cover = GTK_IMAGE(gui_builder_widget("o_cover")); + struct track *track = audio_cur_track(); + GdkPixbuf *pix; + + if (!track || track->tr_album == __artwork_cur_album) + return; + + pix = __artwork_get_pixbuf(track); + if (pix) { + gtk_image_set_from_pixbuf(cover, pix); + g_object_unref(G_OBJECT(pix)); + } else + gtk_image_set_from_icon_name(cover, "image-missing", GTK_ICON_SIZE_DIALOG); + + gtk_widget_set_sensitive(GTK_WIDGET(cover), pix != NULL); + __artwork_cur_album = pix ? track->tr_album : NULL; +} + +void __artwork_select_cover(GtkButton *button) +{ + struct track *track = audio_cur_track(); + GtkFileFilter *filter; + GtkWidget *dialog; + gchar *path; + + if (!track) + return; + + filter = gtk_file_filter_new(); + dialog = gtk_file_chooser_dialog_new("Choose an image", + GTK_WINDOW(gui_builder_widget("o_window")), + GTK_FILE_CHOOSER_ACTION_OPEN, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Open"), GTK_RESPONSE_ACCEPT, + NULL); + + gtk_file_filter_add_mime_type(filter, "image/*"); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); + gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog), true); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + album_artwork_import(track->tr_album, path); + gui_artwork_set_cover(); + g_free(path); + } + + gtk_widget_destroy(dialog); + g_object_unref(filter); +} diff --git a/gui/audio.c b/gui/audio.c index 8234c5e0..f0a01f5b 100644 --- a/gui/audio.c +++ b/gui/audio.c @@ -5,13 +5,11 @@ #include #include #include +#include #include #include #include #include -#include - -static bool __audio_have_cover = false; static inline void __audio_set_label(const gchar *label, const gchar *size, const gchar *text) @@ -29,71 +27,6 @@ static inline void __audio_set_time_label(const gchar *label, unsigned int time) g_free(str); } -static GdkPixbuf *__audio_get_pixbuf(struct track *track) -{ - gchar *path = album_artwork_path(track->tr_album); - GdkPixbuf *pix; - int height; - - if (!path) - return NULL; - - height = gui_builder_widget_height("o_position") + - gui_builder_widget_height("o_tags"); - pix = gdk_pixbuf_new_from_file_at_scale(path, -1, height, true, NULL); - g_free(path); - - return pix; -} - -static void __audio_set_cover(void) -{ - GtkImage *cover = GTK_IMAGE(gui_builder_widget("o_cover")); - GdkPixbuf *pix = __audio_get_pixbuf(audio_cur_track()); - - if (pix) { - gtk_image_set_from_pixbuf(cover, pix); - g_object_unref(G_OBJECT(pix)); - } else - gtk_image_set_from_icon_name(cover, "image-missing", GTK_ICON_SIZE_DIALOG); - - gtk_widget_set_sensitive(GTK_WIDGET(cover), pix != NULL); - __audio_have_cover = (pix != NULL); -} - -void __audio_select_cover(GtkButton *button) -{ - struct track *track = audio_cur_track(); - GtkFileFilter *filter; - GtkWidget *dialog; - gchar *path; - - if (!track) - return; - - filter = gtk_file_filter_new(); - dialog = gtk_file_chooser_dialog_new("Choose an image", - GTK_WINDOW(gui_builder_widget("o_window")), - GTK_FILE_CHOOSER_ACTION_OPEN, - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Open"), GTK_RESPONSE_ACCEPT, - NULL); - - gtk_file_filter_add_mime_type(filter, "image/*"); - gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter); - gtk_file_chooser_set_preview_widget_active(GTK_FILE_CHOOSER(dialog), true); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - album_artwork_import(track->tr_album, path); - __audio_set_cover(); - g_free(path); - } - - gtk_widget_destroy(dialog); - g_object_unref(filter); -} - static void __audio_load(struct track *track) { __audio_set_label("o_title", "xx-large", track->tr_title); @@ -107,7 +40,7 @@ static void __audio_load(struct track *track) playlist_has("Favorites", track)); gui_view_scroll(); - __audio_set_cover(); + gui_artwork_set_cover(); } static void __audio_change_state(GstState state) @@ -163,8 +96,7 @@ static int __audio_timeout(gpointer data) gtk_adjustment_set_value(progress, audio_position() / GST_SECOND); __audio_set_time_label("o_position", audio_position() / GST_SECOND); - if (audio_cur_track() && !__audio_have_cover) - __audio_set_cover(); + gui_artwork_set_cover(); return G_SOURCE_CONTINUE; } diff --git a/include/gui/artwork.h b/include/gui/artwork.h new file mode 100644 index 00000000..ea09f7d1 --- /dev/null +++ b/include/gui/artwork.h @@ -0,0 +1,10 @@ +/* + * Copyright 2016 (c) Anna Schumaker. + */ +#ifndef OCARINA_GUI_ARTWORK_H +#define OCARINA_GUI_ARTWORK_H + +/* Called to set artwork for a track. */ +void gui_artwork_set_cover(void); + +#endif /* OCARINA_GUI_ARTWORK_H */ diff --git a/include/tests/gui.h b/include/tests/gui.h index 77259a6e..ae43c8ae 100644 --- a/include/tests/gui.h +++ b/include/tests/gui.h @@ -10,7 +10,8 @@ void __audio_favorite() {} void __audio_hide() {} void __audio_pause_changed() {} void __audio_seek() {} -void __audio_select_cover() {} + +void _artwork_select_cover() {} #endif #ifdef TEST_NEED_SIDEBAR diff --git a/share/ocarina/ocarina6.glade b/share/ocarina/ocarina6.glade index bef22339..2b7362e6 100644 --- a/share/ocarina/ocarina6.glade +++ b/share/ocarina/ocarina6.glade @@ -461,7 +461,7 @@ True o_cover none - + 1 diff --git a/tests/gui/Sconscript b/tests/gui/Sconscript index a70d6d5b..5585b68b 100644 --- a/tests/gui/Sconscript +++ b/tests/gui/Sconscript @@ -34,6 +34,7 @@ res += [ GuiTest("idle") ] res += [ GuiTest("sidebar") ] res += [ GuiTest("collection") ] res += [ GuiTest("playlist") ] +gui_objs += [ env.Object("../../gui/artwork.c") ] res += [ GuiTest("audio") ] ignore.close()