(trunk gtk) #3166 "Add Tracker Favicons to Tracker Tab in Properties Window." -- implemented in trunk for 2.00
This commit is contained in:
parent
921bb00d7c
commit
1aa2a856c8
|
@ -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 ),
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
26
gtk/filter.c
26
gtk/filter.c
|
@ -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 )
|
||||
|
|
21
gtk/util.c
21
gtk/util.c
|
@ -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 )
|
||||
|
|
|
@ -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 );
|
||||
|
|
Loading…
Reference in New Issue