96 lines
2.4 KiB
C
96 lines
2.4 KiB
C
/*
|
|
* Copyright 2016 (c) Anna Schumaker.
|
|
*/
|
|
#include <core/audio.h>
|
|
#include <gui/builder.h>
|
|
#include <glib/gi18n.h>
|
|
|
|
static struct album *__artwork_cur_album = NULL;
|
|
static unsigned int __artwork_timeo_id = 0;
|
|
|
|
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;
|
|
}
|
|
|
|
static bool __artwork_set_pixbuf(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 true;
|
|
|
|
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;
|
|
return (pix != NULL);
|
|
}
|
|
|
|
static gboolean __artwork_timeout(gpointer data)
|
|
{
|
|
if (__artwork_set_pixbuf()) {
|
|
__artwork_timeo_id = 0;
|
|
return G_SOURCE_REMOVE;
|
|
}
|
|
return G_SOURCE_CONTINUE;
|
|
}
|
|
|
|
void gui_artwork_set_cover(void)
|
|
{
|
|
if (!__artwork_set_pixbuf() && __artwork_timeo_id == 0)
|
|
__artwork_timeo_id = g_timeout_add(2000, __artwork_timeout, 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);
|
|
}
|