(trunk gtk) #3166 "Add Tracker Favicons to Tracker Tab in Properties Window." -- implemented in trunk for 2.00

This commit is contained in:
Charles Kerr 2010-04-23 01:46:02 +00:00
parent 921bb00d7c
commit 1aa2a856c8
6 changed files with 104 additions and 37 deletions

View File

@ -23,6 +23,7 @@
#include "actions.h"
#include "details.h"
#include "favicon.h" /* gtr_get_favicon() */
#include "file-list.h"
#include "hig.h"
#include "tr-prefs.h"
@ -1885,6 +1886,7 @@ enum
TRACKER_COL_BACKUP,
TRACKER_COL_TORRENT_NAME,
TRACKER_COL_TRACKER_NAME,
TRACKER_COL_FAVICON,
TRACKER_N_COLS
};
@ -1926,6 +1928,30 @@ populate_tracker_buffer( GtkTextBuffer * buffer, const tr_torrent * tor )
#define TORRENT_PTR_KEY "torrent-pointer"
static void
favicon_ready_cb( gpointer pixbuf, gpointer vreference )
{
GtkTreeIter iter;
GtkTreeRowReference * reference = vreference;
if( pixbuf != NULL )
{
GtkTreePath * path = gtk_tree_row_reference_get_path( reference );
GtkTreeModel * model = gtk_tree_row_reference_get_model( reference );
if( gtk_tree_model_get_iter( model, &iter, path ) )
gtk_list_store_set( GTK_LIST_STORE( model ), &iter,
TRACKER_COL_FAVICON, pixbuf,
-1 );
gtk_tree_path_free( path );
g_object_unref( pixbuf );
}
gtk_tree_row_reference_free( reference );
}
static void
refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
{
@ -1957,7 +1983,8 @@ refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
G_TYPE_STRING,
G_TYPE_BOOLEAN,
G_TYPE_STRING,
G_TYPE_STRING );
G_TYPE_STRING,
GDK_TYPE_PIXBUF );
filter = gtk_tree_model_filter_new( GTK_TREE_MODEL( store ), NULL );
gtk_tree_model_filter_set_visible_func( GTK_TREE_MODEL_FILTER( filter ),
@ -1979,6 +2006,8 @@ refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
model = GTK_TREE_MODEL( store );
if( n && !gtk_tree_model_get_iter_first( model, &iter ) )
{
tr_session * session = tr_core_session( di->core );
for( i=0; i<n; ++i )
{
int j;
@ -1987,12 +2016,23 @@ refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
const tr_info * inf = tr_torrentInfo( tor );
for( j=0; j<statCount[i]; ++j )
{
GtkTreePath * path;
GtkTreeRowReference * reference;
const tr_tracker_stat * st = &stats[i][j];
gtk_list_store_insert_with_values( store, &iter, -1,
TRACKER_COL_TORRENT_ID, torrentId,
TRACKER_COL_TRACKER_INDEX, j,
TRACKER_COL_TORRENT_NAME, inf->name,
TRACKER_COL_TRACKER_NAME, stats[i][j].host,
TRACKER_COL_TRACKER_NAME, st->host,
-1 );
path = gtk_tree_model_get_path( model, &iter );
reference = gtk_tree_row_reference_new( model, path );
gtr_get_favicon_from_url( session, st->announce, favicon_ready_cb, reference );
gtk_tree_path_free( path );
}
}
}
@ -2170,9 +2210,10 @@ static GtkWidget*
tracker_page_new( struct DetailsImpl * di )
{
gboolean b;
GtkWidget *vbox, *sw, *w, *v, *hbox;
GtkCellRenderer *r;
GtkTreeViewColumn *c;
GtkWidget *vbox, *sw, *w, *v, *hbox;
const int pad = ( GUI_PAD + GUI_PAD_BIG ) / 2;
vbox = gtk_vbox_new( FALSE, GUI_PAD );
gtk_container_set_border_width( GTK_CONTAINER( vbox ), GUI_PAD_BIG );
@ -2183,13 +2224,20 @@ tracker_page_new( struct DetailsImpl * di )
g_signal_connect( v, "button-release-event",
G_CALLBACK( on_tree_view_button_released ), NULL );
gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( v ), TRUE );
r = gtk_cell_renderer_text_new( );
g_object_set( r, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
c = gtk_tree_view_column_new_with_attributes( _( "Trackers" ), r, "markup", TRACKER_COL_TEXT, NULL );
c = gtk_tree_view_column_new( );
gtk_tree_view_column_set_title( c, _( "Trackers" ) );
gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c );
g_object_set( G_OBJECT( r ), "ypad", (GUI_PAD+GUI_PAD_BIG)/2,
"xpad", (GUI_PAD+GUI_PAD_BIG)/2,
NULL );
r = gtk_cell_renderer_pixbuf_new( );
g_object_set( r, "width", 20 + (GUI_PAD_SMALL*2), "xpad", GUI_PAD_SMALL, "ypad", pad, "yalign", 0.0f, NULL );
gtk_tree_view_column_pack_start( c, r, FALSE );
gtk_tree_view_column_add_attribute( c, r, "pixbuf", TRACKER_COL_FAVICON );
r = gtk_cell_renderer_text_new( );
g_object_set( G_OBJECT( r ), "ellipsize", PANGO_ELLIPSIZE_END, "xpad", GUI_PAD_SMALL, "ypad", pad, NULL );
gtk_tree_view_column_pack_start( c, r, TRUE );
gtk_tree_view_column_add_attribute( c, r, "markup", TRACKER_COL_TEXT );
sw = gtk_scrolled_window_new( NULL, NULL );
gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( sw ),

View File

@ -169,3 +169,14 @@ gtr_get_favicon( tr_session * session,
g_free( url );
}
}
void
gtr_get_favicon_from_url( tr_session * session,
const char * url,
GFunc pixbuf_ready_func,
gpointer pixbuf_ready_func_data )
{
char * host = gtr_get_host_from_url( url );
gtr_get_favicon( session, host, pixbuf_ready_func, pixbuf_ready_func_data );
g_free( host );
}

View File

@ -16,9 +16,15 @@
#include <gtk/gtk.h>
#include <libtransmission/transmission.h>
void gtr_get_favicon( tr_session * session,
const char * host,
GFunc pixbuf_ready_func,
gpointer pixbuf_ready_func_data );
void gtr_get_favicon( tr_session * session,
const char * host,
GFunc pixbuf_ready_func,
gpointer pixbuf_ready_func_data );
void gtr_get_favicon_from_url( tr_session * session,
const char * url,
GFunc pixbuf_ready_func,
gpointer pixbuf_ready_func_data );
#endif

View File

@ -71,28 +71,6 @@ pstrcmp( const void * a, const void * b )
return strcmp( *(const char**)a, *(const char**)b );
}
/* pattern-matching text; ie, legaltorrents.com */
static char*
get_host_from_url( const char * url )
{
char * h = NULL;
char * name;
const char * first_dot;
const char * last_dot;
tr_urlParse( url, -1, NULL, &h, NULL, NULL );
first_dot = strchr( h, '.' );
last_dot = strrchr( h, '.' );
if( ( first_dot ) && ( last_dot ) && ( first_dot != last_dot ) )
name = g_strdup( first_dot + 1 );
else
name = g_strdup( h );
tr_free( h );
return name;
}
/* human-readable name; ie, Legaltorrents */
static char*
get_name_from_host( const char * host )
@ -185,7 +163,7 @@ category_filter_model_update( GtkTreeStore * store )
for( i=0, n=inf->trackerCount; i<n; ++i )
{
int k;
char * key = get_host_from_url( inf->trackers[i].announce );
char * key = gtr_get_host_from_url( inf->trackers[i].announce );
int * count = g_hash_table_lookup( hosts_hash, key );
if( count == NULL )
{
@ -580,7 +558,7 @@ testCategory( GtkWidget * category_combo, tr_torrent * tor )
char * host;
gtk_tree_model_get( model, &iter, CAT_FILTER_COL_HOST, &host, -1 );
for( i=0; i<inf->trackerCount; ++i ) {
char * tmp = get_host_from_url( inf->trackers[i].announce );
char * tmp = gtr_get_host_from_url( inf->trackers[i].announce );
const gboolean hit = !strcmp( tmp, host );
g_free( tmp );
if( hit )

View File

@ -331,6 +331,27 @@ decode_uri( const char * uri )
return ret;
}
/* pattern-matching text; ie, legaltorrents.com */
char*
gtr_get_host_from_url( const char * url )
{
char * h = NULL;
char * name;
const char * first_dot;
const char * last_dot;
tr_urlParse( url, -1, NULL, &h, NULL, NULL );
first_dot = strchr( h, '.' );
last_dot = strrchr( h, '.' );
if( ( first_dot ) && ( last_dot ) && ( first_dot != last_dot ) )
name = g_strdup( first_dot + 1 );
else
name = g_strdup( h );
tr_free( h );
return name;
}
gboolean
gtr_is_supported_url( const char * str )

View File

@ -62,6 +62,9 @@ char* gtr_localtime2( char * buf, time_t time, size_t buflen );
****
***/
/* http://www.legaltorrents.com/some/announce/url --> legaltorrents.com */
char* gtr_get_host_from_url( const char * url );
gboolean gtr_is_supported_url( const char * str );
gboolean gtr_is_magnet_link( const char * str );