static int compare_by_activity (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data) { int ret = 0; tr_torrent *ta, *tb; const tr_stat *sa, *sb; double aUp, aDown, bUp, bDown; gtk_tree_model_get (m, a, MC_SPEED_UP, &aUp, MC_SPEED_DOWN, &aDown, MC_TORRENT, &ta, -1); gtk_tree_model_get (m, b, MC_SPEED_UP, &bUp, MC_SPEED_DOWN, &bDown, MC_TORRENT, &tb, -1); sa = tr_torrentStatCached (ta); sb = tr_torrentStatCached (tb); if (!ret) ret = compare_double (aUp+aDown, bUp+bDown); if (!ret) ret = compare_uint64 (sa->uploadedEver, sb->uploadedEver); if (!ret) ret = compare_by_queue (m, a, b, user_data); return ret; }
static int compareByETA( GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data ) { int ret = 0; tr_torrent *ta, *tb; gtk_tree_model_get( m, a, MC_TORRENT_RAW, &ta, -1 ); gtk_tree_model_get( m, b, MC_TORRENT_RAW, &tb, -1 ); if( !ret ) ret = compareETA( tr_torrentStatCached( ta )->eta, tr_torrentStatCached( tb )->eta ); if( !ret ) ret = compareByName( m, a, b, user_data ); return ret; }
static int compareByRatio( GtkTreeModel* m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data ) { int ret = 0; tr_torrent *ta, *tb; const tr_stat *sa, *sb; gtk_tree_model_get( m, a, MC_TORRENT_RAW, &ta, -1 ); sa = tr_torrentStatCached( ta ); gtk_tree_model_get( m, b, MC_TORRENT_RAW, &tb, -1 ); sb = tr_torrentStatCached( tb ); if( !ret ) ret = compareRatio( sa->ratio, sb->ratio ); if( !ret ) ret = compareByName( m, a, b, user_data ); return ret; }
static int compare_by_queue (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data UNUSED) { tr_torrent *ta, *tb; const tr_stat *sa, *sb; gtk_tree_model_get (m, a, MC_TORRENT, &ta, -1); sa = tr_torrentStatCached (ta); gtk_tree_model_get (m, b, MC_TORRENT, &tb, -1); sb = tr_torrentStatCached (tb); return sb->queuePosition - sa->queuePosition; }
static void get_size_full( TorrentCellRenderer * cell, GtkWidget * widget, gint * width, gint * height ) { int w, h; int xpad, ypad; GdkRectangle icon_area; GdkRectangle name_area; GdkRectangle stat_area; GdkRectangle prog_area; const char * name; GdkPixbuf * icon; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor ); const tr_info * inf = tr_torrentInfo( tor ); GString * gstr_prog = p->gstr1; GString * gstr_stat = p->gstr2; icon = get_icon( tor, FULL_ICON_SIZE, widget ); name = tr_torrentName( tor ); g_string_truncate( gstr_stat, 0 ); getStatusString( gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps ); g_string_truncate( gstr_prog, 0 ); getProgressString( gstr_prog, tor, inf, st ); gtr_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad ); /* get the idealized cell dimensions */ g_object_set( p->icon_renderer, "pixbuf", icon, NULL ); gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h ); icon_area.width = w; icon_area.height = h; g_object_set( p->text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "scale", 1.0, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL ); gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h ); name_area.width = w; name_area.height = h; g_object_set( p->text_renderer, "text", gstr_prog->str, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL ); gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h ); prog_area.width = w; prog_area.height = h; g_object_set( p->text_renderer, "text", gstr_stat->str, NULL ); gtk_cell_renderer_get_size( p->text_renderer, widget, NULL, NULL, NULL, &w, &h ); stat_area.width = w; stat_area.height = h; /** *** LAYOUT **/ if( width != NULL ) *width = xpad * 2 + icon_area.width + GUI_PAD + MAX3( name_area.width, prog_area.width, stat_area.width ); if( height != NULL ) *height = ypad * 2 + name_area.height + prog_area.height + GUI_PAD_SMALL + p->bar_height + GUI_PAD_SMALL + stat_area.height; /* cleanup */ g_object_unref( icon ); }
static void get_size_full( TorrentCellRenderer * cell, GtkWidget * widget, gint * width, gint * height ) { int w, h; GdkRectangle icon_area; GdkRectangle name_area; GdkRectangle stat_area; GdkRectangle prog_area; const char * name; char * status; char * progress; GdkPixbuf * icon; GtkCellRenderer * text_renderer; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor ); const tr_info * inf = tr_torrentInfo( tor ); icon = get_icon( tor, FULL_ICON_SIZE, widget ); name = inf->name; status = getStatusString( tor, st, p->upload_speed, p->download_speed ); progress = getProgressString( tor, inf, st ); /* get the idealized cell dimensions */ g_object_set( p->icon_renderer, "pixbuf", icon, NULL ); gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h ); icon_area.width = w; icon_area.height = h; text_renderer = get_text_renderer( st, cell ); g_object_set( text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "scale", 1.0, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h ); name_area.width = w; name_area.height = h; g_object_set( text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h ); prog_area.width = w; prog_area.height = h; g_object_set( text_renderer, "text", status, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h ); stat_area.width = w; stat_area.height = h; /** *** LAYOUT **/ if( width != NULL ) *width = cell->parent.xpad * 2 + icon_area.width + GUI_PAD + MAX3( name_area.width, prog_area.width, stat_area.width ); if( height != NULL ) *height = cell->parent.ypad * 2 + name_area.height + prog_area.height + GUI_PAD_SMALL + p->bar_height + GUI_PAD_SMALL + stat_area.height; /* cleanup */ g_free( status ); g_free( progress ); g_object_unref( icon ); }
static int compareByProgress( GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer user_data ) { int ret = 0; tr_torrent * t; const tr_stat *sa, *sb; gtk_tree_model_get( m, a, MC_TORRENT_RAW, &t, -1 ); sa = tr_torrentStatCached( t ); gtk_tree_model_get( m, b, MC_TORRENT_RAW, &t, -1 ); sb = tr_torrentStatCached( t ); if( !ret ) ret = compareDouble( sa->percentComplete, sb->percentComplete ); if( !ret ) ret = compareDouble( sa->seedRatioPercentDone, sb->seedRatioPercentDone ); if( !ret ) ret = compareByRatio( m, a, b, user_data ); return ret; }
static void get_size_compact( TorrentCellRenderer * cell, GtkWidget * widget, gint * width, gint * height ) { int w, h; int xpad, ypad; GdkRectangle icon_area; GdkRectangle name_area; GdkRectangle stat_area; const char * name; char * status; GdkPixbuf * icon; GtkCellRenderer * text_renderer; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor ); icon = get_icon( tor, COMPACT_ICON_SIZE, widget ); name = tr_torrentInfo( tor )->name; status = getShortStatusString( tor, st, p->upload_speed_KBps, p->download_speed_KBps ); gtr_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad ); /* get the idealized cell dimensions */ g_object_set( p->icon_renderer, "pixbuf", icon, NULL ); gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h ); icon_area.width = w; icon_area.height = h; text_renderer = get_text_renderer( st, cell ); g_object_set( text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h ); name_area.width = w; name_area.height = h; g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h ); stat_area.width = w; stat_area.height = h; /** *** LAYOUT **/ #define BAR_WIDTH 50 if( width != NULL ) *width = xpad * 2 + icon_area.width + GUI_PAD + name_area.width + GUI_PAD + BAR_WIDTH + GUI_PAD + stat_area.width; if( height != NULL ) *height = ypad * 2 + MAX( name_area.height, p->bar_height ); /* cleanup */ g_free( status ); g_object_unref( icon ); }
static int compare_by_eta (GtkTreeModel * m, GtkTreeIter * a, GtkTreeIter * b, gpointer u) { int ret = 0; tr_torrent *ta, *tb; gtk_tree_model_get (m, a, MC_TORRENT, &ta, -1); gtk_tree_model_get (m, b, MC_TORRENT, &tb, -1); if (!ret) ret = compare_eta (tr_torrentStatCached (ta)->eta, tr_torrentStatCached (tb)->eta); if (!ret) ret = compare_by_name (m, a, b, u); return ret; }
static void get_size_compact(TorrentCellRenderer* cell, GtkWidget* widget, gint* width, gint* height) { int xpad; int ypad; GtkRequisition icon_size; GtkRequisition name_size; GtkRequisition stat_size; char const* name; GdkPixbuf* icon; struct TorrentCellRendererPrivate* p = cell->priv; tr_torrent const* tor = p->tor; tr_stat const* st = tr_torrentStatCached((tr_torrent*)tor); GString* gstr_stat = p->gstr1; icon = get_icon(tor, COMPACT_ICON_SIZE, widget); name = tr_torrentName(tor); g_string_truncate(gstr_stat, 0); getShortStatusString(gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps); gtk_cell_renderer_get_padding(GTK_CELL_RENDERER(cell), &xpad, &ypad); /* get the idealized cell dimensions */ g_object_set(p->icon_renderer, "pixbuf", icon, NULL); gtr_cell_renderer_get_preferred_size(p->icon_renderer, widget, NULL, &icon_size); g_object_set(p->text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL); gtr_cell_renderer_get_preferred_size(p->text_renderer, widget, NULL, &name_size); g_object_set(p->text_renderer, "text", gstr_stat->str, "scale", SMALL_SCALE, NULL); gtr_cell_renderer_get_preferred_size(p->text_renderer, widget, NULL, &stat_size); /** *** LAYOUT **/ #define BAR_WIDTH 50 if (width != NULL) { *width = xpad * 2 + icon_size.width + GUI_PAD + name_size.width + GUI_PAD + BAR_WIDTH + GUI_PAD + stat_size.width; } if (height != NULL) { *height = ypad * 2 + MAX(name_size.height, p->bar_height); } /* cleanup */ g_object_unref(icon); }
static gboolean test_torrent_activity (tr_torrent * tor, int type) { const tr_stat * st = tr_torrentStatCached (tor); switch (type) { case ACTIVITY_FILTER_DOWNLOADING: return (st->activity == TR_STATUS_DOWNLOAD) || (st->activity == TR_STATUS_DOWNLOAD_WAIT); case ACTIVITY_FILTER_SEEDING: return (st->activity == TR_STATUS_SEED) || (st->activity == TR_STATUS_SEED_WAIT); case ACTIVITY_FILTER_ACTIVE: return (st->peersSendingToUs > 0) || (st->peersGettingFromUs > 0) || (st->webseedsSendingToUs > 0) || (st->activity == TR_STATUS_CHECK); case ACTIVITY_FILTER_PAUSED: return st->activity == TR_STATUS_STOPPED; case ACTIVITY_FILTER_FINISHED: return st->finished == TRUE; case ACTIVITY_FILTER_VERIFYING: return (st->activity == TR_STATUS_CHECK) || (st->activity == TR_STATUS_CHECK_WAIT); case ACTIVITY_FILTER_ERROR: return st->error != 0; default: /* ACTIVITY_FILTER_ALL */ return TRUE; } }
{ int xpad, ypad; GtkRequisition size; GdkRectangle icon_area; GdkRectangle name_area; GdkRectangle stat_area; GdkRectangle prog_area; GdkRectangle fill_area; const char * name; GdkPixbuf * icon; GtrColor text_color; bool seed; struct TorrentCellRendererPrivate * p = cell->priv; const tr_torrent * tor = p->tor; const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor ); const gboolean active = ( st->activity != TR_STATUS_STOPPED ) && ( st->activity != TR_STATUS_DOWNLOAD_WAIT ) && ( st->activity != TR_STATUS_SEED_WAIT ); const double percentDone = get_percent_done( tor, st, &seed ); const gboolean sensitive = active || st->error; GString * gstr_stat = p->gstr1; icon = get_icon( tor, COMPACT_ICON_SIZE, widget ); name = tr_torrentName( tor ); g_string_truncate( gstr_stat, 0 ); getShortStatusString( gstr_stat, tor, st, p->upload_speed_KBps, p->download_speed_KBps ); gtk_cell_renderer_get_padding( GTK_CELL_RENDERER( cell ), &xpad, &ypad ); get_text_color( widget, st, &text_color ); fill_area = *background_area; fill_area.x += xpad; fill_area.y += ypad;
static void torrent_cell_renderer_get_size( GtkCellRenderer * cell, GtkWidget * widget, GdkRectangle * cell_area, gint * x_offset, gint * y_offset, gint * width, gint * height ) { TorrentCellRenderer * self = TORRENT_CELL_RENDERER( cell ); if( self && self->priv->tor ) { const tr_torrent * tor = self->priv->tor; const tr_info * info = tr_torrentInfo( tor ); const char * name = info->name; const tr_stat * torStat = tr_torrentStatCached( (tr_torrent*)tor ); char * str; int w = 0, h = 0; struct TorrentCellRendererPrivate * p = self->priv; GtkCellRenderer * text_renderer = torStat->error != 0 ? p-> text_renderer_err : p-> text_renderer; g_object_set( text_renderer, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL ); /* above the progressbar */ if( p->minimal ) { int w1, w2, h1, h2; char * shortStatus = getShortStatusString( torStat ); g_object_set( text_renderer, "text", name, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w1, &h1 ); str = g_markup_printf_escaped( "<small>%s</small>", shortStatus ); g_object_set( text_renderer, "markup", str, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w2, &h2 ); h += MAX( h1, h2 ); w = MAX( w, w1 + GUI_PAD_BIG + w2 ); g_free( str ); g_free( shortStatus ); } else { int w1, h1; char * progressString = getProgressString( info, torStat ); str = g_markup_printf_escaped( "<b>%s</b>\n<small>%s</small>", name, progressString ); g_object_set( text_renderer, "markup", str, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w1, &h1 ); h += h1; w = MAX( w, w1 ); g_free( str ); g_free( progressString ); } /* below the progressbar */ if( !p->minimal ) { int w1, h1; char * statusString = getStatusString( torStat ); str = g_markup_printf_escaped( "<small>%s</small>", statusString ); g_object_set( text_renderer, "markup", str, NULL ); gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w1, &h1 ); h += h1; w = MAX( w, w1 ); g_free( str ); g_free( statusString ); } h += p->bar_height; if( cell_area ) { if( x_offset ) *x_offset = 0; if( y_offset ) { *y_offset = 0.5 * ( cell_area->height - ( h + ( 2 * cell->ypad ) ) ); *y_offset = MAX( *y_offset, 0 ); } } *width = w + cell->xpad * 2; *height = h + cell->ypad * 2; } }