All pastes #1731403 Raw Edit

C

public c v1 · immutable
#1731403 ·published 2009-12-30 03:00 UTC
rendered paste body
#include <gtk/gtk.h>#include "gui.h"#include "playlist.h"#include "statusbox.h"#include "coverart_wizard.h"enum {	CA_NAME_COL,	CA_PIX_COL,	CA_TYPE_COL,	CA_PTR_COL,	CA_N_COLS};/* This is the dumbest thing i've ever done */typedef struct{	void *p1;	void *p2;	void *p3;	void *p4;	void *p5;	int i1;	int i2;}misc;void populate_artview(GtkButton *button,gpointer data){	GUI_SESSION *g = data;	GtkTreeStore *store = g->artstore;	gboolean rv;	printf("data1 = %p\n",data);	GtkTreeIter iter;	GtkTreePath *path;	/* Remove any existing rows */	rv = gtk_tree_model_get_iter_first(store,&iter);	while(rv == TRUE){		rv = gtk_tree_store_remove(store,&iter);			}	int i,j;	GtkTreeIter iter2;	char *img_data;	size_t img_size;	GdkPixbuf *pix_buf;	GdkPixbuf *pix_tbuf;	unsigned short rvi;	for(i=0;i<g->a_size;i++){		gtk_tree_store_append(store, &iter,NULL);		gtk_tree_store_set(store, &iter,			CA_NAME_COL,g->artist_lib[i]->name,			CA_TYPE_COL,ARTIST,			CA_PTR_COL,g->artist_lib[i],			-1);		for(j=0;j<g->artist_lib[i]->album_count;j++){			if(g->artist_lib[i]->album[j]->has_art){				printf("%s has art\n",g->artist_lib[i]->name);				 rvi = LIBRARY_get_image_blob(0,					g->artist_lib[i]->album[j]->id,					&img_data,&img_size);				if(rvi){					printf("image fetch error:\m");				}else {					pix_tbuf = vgdk_pixbuf_new_from_memory(							img_data,img_size);					free(img_data);					pix_buf = vgdk_pixbuf_scale_keep_ratio(							pix_tbuf,0,100);					g_object_unref(pix_tbuf);				}			}						gtk_tree_store_append(store,&iter2,&iter);			gtk_tree_store_set(store,&iter2,				CA_NAME_COL,g->artist_lib[i]->album[j]->name,				CA_TYPE_COL,ALBUM,				CA_PTR_COL,g->artist_lib[i]->album[j],				CA_PIX_COL,(rvi) ? NULL : pix_buf,				-1);			if(!rvi){				g_object_unref(pix_buf);				path = gtk_tree_model_get_path (store,&iter);				gtk_tree_view_expand_row(g->artview,path,TRUE);				gtk_tree_path_free(path);			}			rvi =1;		}	}	}void *do_fetch_art(void *data){	misc *m = data;	GUI_SESSION *g = m->p1;	GtkTreePath *path = m->p3;	GtkWidget *button = m->p4;	int type = m->i1;	GtkTreeIter iter;	gboolean rv;	if(type == ARTIST){		LASTFM_ARTIST_INFO *artist;		LIBRARY_artist_metadata *artist_met = m->p2;		artist = LASTFM_artist_get_info(g->amatory->lastfm_session,			artist->name);		if(artist->image_size ==0 ){			LASTFM_free_artist_info(artist);			goto no_art;		}		LIBRARY_add_image_blob(artist_met->id,0,artist->image,			artist->image_size);                LASTFM_print_artist_info(stdout,artist);		GdkPixbuf *tpix = vgdk_pixbuf_new_from_memory(artist->image,			artist->image_size);		GdkPixbuf *pix = vgdk_pixbuf_scale_keep_ratio(tpix,0,100);		LASTFM_free_artist_info(artist);		g_object_unref(tpix);		artist_met->has_art = 1;			gdk_threads_enter();		rv = gtk_tree_model_get_iter(g->artstore,&iter,path);		gtk_tree_store_set(g->artstore,&iter,CA_PIX_COL,pix,-1);		gdk_threads_leave();	}else if(type == ALBUM){		LASTFM_ALBUM_INFO *album;		LIBRARY_album_metadata *album_met = m->p2;		album = LASTFM_album_get_info(g->amatory->lastfm_session,			album_met->tracks[0]->artist->name,album_met->name);		if(album->image_size == 0){			LASTFM_free_album_info(album);			goto no_art;		}		LIBRARY_add_image_blob(0,album_met->id,album->image,			album->image_size);                LASTFM_print_album_info(stdout,album);		GdkPixbuf *tpix = vgdk_pixbuf_new_from_memory(album->image,			album->image_size);		GdkPixbuf *pix = vgdk_pixbuf_scale_keep_ratio(tpix,0,100);		LASTFM_free_album_info(album);		g_object_unref(tpix);		album_met->has_art = 1;		gdk_threads_enter();		rv = gtk_tree_model_get_iter(g->artstore,&iter,path);		gtk_tree_store_set(g->artstore,&iter,CA_PIX_COL,pix,-1);		gdk_threads_leave();	}	no_art:	gdk_threads_enter();	gtk_widget_set_sensitive(button,TRUE);	gdk_threads_leave();	gtk_tree_path_free(path);	free(m);	return;}void on_fetch_clicked(GtkWidget *button, gpointer data){		GUI_SESSION *g = data;	gboolean rv;	GtkTreeSelection *select;	GtkTreeIter iter;	gtk_widget_set_sensitive(button,FALSE);	select = gtk_tree_view_get_selection(g->artview);	rv = gtk_tree_selection_get_selected (select,& g->artstore, &iter);	if(rv == FALSE){		return; 	}		gpointer ptr;	int type;	gtk_tree_model_get (g->artstore, &iter,CA_TYPE_COL,&type,CA_PTR_COL,&ptr,-1);	if(type == ARTIST){		gtk_widget_show(g->progress_bar);		misc *m = malloc(sizeof(misc));		pthread_t tid;		m->p1 = g;		m->p2 = ptr;		m->p3 = gtk_tree_model_get_path(g->artstore,&iter);		m->p4 = button;		m->i1 = type;		gtk_widget_show(g->progress_bar);		g->amatory->lastfm_session->fraction = 0;		g->update_progress_bar_handler_id = gdk_threads_add_timeout_full(			G_PRIORITY_DEFAULT,100,update_progress_bar_handler,			g,NULL); 		pthread_create(&tid,NULL,do_fetch_art,m);	}else if(type == ALBUM){		misc *m = malloc(sizeof(misc));		pthread_t tid;		m->p1 = g;		m->p2 = ptr;		m->p3 = gtk_tree_model_get_path(g->artstore,&iter);		m->p4 = button;		m->i1 = type;		gtk_widget_show(g->progress_bar);		g->amatory->lastfm_session->fraction = 0;		g->update_progress_bar_handler_id = gdk_threads_add_timeout_full(			G_PRIORITY_DEFAULT,100,update_progress_bar_handler,			g,NULL); 		pthread_create(&tid,NULL,do_fetch_art,m);	}else{		printf("Invalid Type:%i\n",type);	}	no_art:	//gtk_widget_hide(g->progress_bar);	return; }GtkWidget *create_artview(GUI_SESSION *g){	GtkTreeStore *store = gtk_tree_store_new(CA_N_COLS,			G_TYPE_STRING, // Artist or Album name			GDK_TYPE_PIXBUF, // album or artist art			G_TYPE_INT,	// flag whether its an artist or album			G_TYPE_POINTER); // Artist or Album id	GtkWidget *view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view),TRUE);//	gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)),//		GTK_SELECTION_MULTIPLE);	/* Text Renderer */	GtkCellRenderer *text_renderer = gtk_cell_renderer_text_new();	g_object_set (text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, 		"size-points",10.0,NULL);	/* Text Column */	GtkTreeViewColumn *column;	column = gtk_tree_view_column_new_with_attributes(			"Artist / Album", text_renderer, "text", 0, NULL);	gtk_tree_view_column_set_resizable (column,TRUE);	gtk_tree_view_column_set_expand(column, TRUE);	gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);	/* Pix Renderer */	GtkCellRenderer *pix_renderer = gtk_cell_renderer_pixbuf_new();	/* Pix Column */	column = gtk_tree_view_column_new_with_attributes(			"Art",pix_renderer, "pixbuf",1,NULL);	gtk_tree_view_column_set_resizable (column,TRUE);	gtk_tree_view_column_set_expand(column, TRUE);	gtk_tree_view_append_column(GTK_TREE_VIEW(view), column);	g->artstore = store;	g->artview = view;	return view;}int run_coverart_wizard(GUI_SESSION *g){	GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);	GdkGeometry gdkGeometry;	gdkGeometry.min_width= 800;	gdkGeometry.min_height = 600;	gtk_window_set_geometry_hints(GTK_WINDOW(window), window,		&gdkGeometry, GDK_HINT_MIN_SIZE);	GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);	GtkWidget *view = create_artview(g);	gtk_container_add(GTK_CONTAINER(scroll), view);	GtkWidget *box =gtk_vbox_new(FALSE,0);	GtkWidget  *button_box = gtk_hbox_new(FALSE,0);	GtkWidget *db_button = gtk_button_new_with_label("Load Database");	GtkWidget *fetch_button = gtk_button_new_with_label("Fetch Selected");	g_signal_connect(db_button,"clicked",G_CALLBACK(populate_artview),g);	g_signal_connect(fetch_button,"clicked",G_CALLBACK(on_fetch_clicked),g);	gtk_box_pack_start(GTK_BOX(box),scroll,TRUE,TRUE,0);	gtk_box_pack_start(GTK_BOX(button_box),db_button,FALSE,FALSE,0);	gtk_box_pack_start(GTK_BOX(button_box),fetch_button,FALSE,FALSE,0);	gtk_box_pack_end(GTK_BOX(box),button_box,FALSE,TRUE,0);	gtk_container_add(GTK_CONTAINER(window),box);	g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_widget_destroy),window);	gtk_widget_show_all(window);		return 0;}