static char* getStatusString( const tr_stat * torStat ) { const int isActive = torStat->activity != TR_STATUS_STOPPED; const int isChecking = torStat->activity == TR_STATUS_CHECK || torStat->activity == TR_STATUS_CHECK_WAIT; GString * gstr = g_string_new( NULL ); if( torStat->error ) { g_string_assign( gstr, torStat->errorString ); } else switch( torStat->activity ) { case TR_STATUS_STOPPED: case TR_STATUS_CHECK_WAIT: case TR_STATUS_CHECK: { char * pch = getShortStatusString( torStat ); g_string_assign( gstr, pch ); g_free( pch ); break; } case TR_STATUS_DOWNLOAD: g_string_append_printf( gstr, ngettext( "Downloading from %1$'d of %2$'d connected peer", "Downloading from %1$'d of %2$'d connected peers", torStat->peersConnected ), torStat->peersSendingToUs + torStat->webseedsSendingToUs, torStat->peersConnected + torStat->webseedsSendingToUs ); break; case TR_STATUS_SEED: g_string_append_printf( gstr, ngettext( "Seeding to %1$'d of %2$'d connected peer", "Seeding to %1$'d of %2$'d connected peers", torStat->peersConnected ), torStat->peersGettingFromUs, torStat->peersConnected ); break; } if( isActive && !isChecking ) { char buf[256]; getShortTransferString( torStat, buf, sizeof( buf ) ); g_string_append_printf( gstr, " - %s", buf ); } return g_string_free( gstr, FALSE ); }
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 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 void getStatusString( GString * gstr, const tr_torrent * tor, const tr_stat * st, const double uploadSpeed_KBps, const double downloadSpeed_KBps ) { if( st->error ) { const char * fmt[] = { NULL, N_( "Tracker gave a warning: \"%s\"" ), N_( "Tracker gave an error: \"%s\"" ), N_( "Error: %s" ) }; g_string_append_printf( gstr, _( fmt[st->error] ), st->errorString ); } else switch( st->activity ) { case TR_STATUS_STOPPED: case TR_STATUS_CHECK_WAIT: case TR_STATUS_CHECK: case TR_STATUS_DOWNLOAD_WAIT: case TR_STATUS_SEED_WAIT: { getShortStatusString( gstr, tor, st, uploadSpeed_KBps, downloadSpeed_KBps ); break; } case TR_STATUS_DOWNLOAD: { if( tr_torrentHasMetadata( tor ) ) { g_string_append_printf( gstr, ngettext( "Downloading from %1$'d of %2$'d connected peer", "Downloading from %1$'d of %2$'d connected peers", st->webseedsSendingToUs + st->peersSendingToUs ), st->webseedsSendingToUs + st->peersSendingToUs, st->webseedsSendingToUs + st->peersConnected ); } else { g_string_append_printf( gstr, ngettext( "Downloading metadata from %1$'d peer (%2$d%% done)", "Downloading metadata from %1$'d peers (%2$d%% done)", st->peersConnected + st->peersConnected ), st->peersConnected + st->webseedsSendingToUs, (int)(100.0*st->metadataPercentComplete) ); } break; } case TR_STATUS_SEED: g_string_append_printf( gstr, ngettext( "Seeding to %1$'d of %2$'d connected peer", "Seeding to %1$'d of %2$'d connected peers", st->peersConnected ), st->peersGettingFromUs, st->peersConnected ); break; } if( ( st->activity != TR_STATUS_CHECK_WAIT ) && ( st->activity != TR_STATUS_CHECK ) && ( st->activity != TR_STATUS_DOWNLOAD_WAIT ) && ( st->activity != TR_STATUS_SEED_WAIT ) && ( st->activity != TR_STATUS_STOPPED ) ) { char buf[256]; getShortTransferString( tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof( buf ) ); if( *buf ) g_string_append_printf( gstr, " - %s", buf ); } }
static void getStatusString(GString* gstr, tr_torrent const* tor, tr_stat const* st, double const uploadSpeed_KBps, double const downloadSpeed_KBps) { if (st->error != 0) { char const* fmt[] = { NULL, N_("Tracker gave a warning: \"%s\""), N_("Tracker gave an error: \"%s\""), N_("Error: %s") }; g_string_append_printf(gstr, _(fmt[st->error]), st->errorString); } else { switch (st->activity) { case TR_STATUS_STOPPED: case TR_STATUS_CHECK_WAIT: case TR_STATUS_CHECK: case TR_STATUS_DOWNLOAD_WAIT: case TR_STATUS_SEED_WAIT: { getShortStatusString(gstr, tor, st, uploadSpeed_KBps, downloadSpeed_KBps); break; } case TR_STATUS_DOWNLOAD: { if (!tr_torrentHasMetadata(tor)) { /* Downloading metadata from 2 peer (s)(50% done) */ g_string_append_printf(gstr, _("Downloading metadata from %1$'d %2$s (%3$d%% done)"), st->peersConnected, ngettext("peer", "peers", st->peersConnected), (int)(100.0 * st->metadataPercentComplete)); } else if (st->peersSendingToUs != 0 && st->webseedsSendingToUs != 0) { /* Downloading from 2 of 3 peer (s) and 2 webseed (s) */ g_string_append_printf(gstr, _("Downloading from %1$'d of %2$'d %3$s and %4$'d %5$s"), st->peersSendingToUs, st->peersConnected, ngettext("peer", "peers", st->peersConnected), st->webseedsSendingToUs, ngettext("web seed", "web seeds", st->webseedsSendingToUs)); } else if (st->webseedsSendingToUs != 0) { /* Downloading from 3 web seed (s) */ g_string_append_printf(gstr, _("Downloading from %1$'d %2$s"), st->webseedsSendingToUs, ngettext("web seed", "web seeds", st->webseedsSendingToUs)); } else { /* Downloading from 2 of 3 peer (s) */ g_string_append_printf(gstr, _("Downloading from %1$'d of %2$'d %3$s"), st->peersSendingToUs, st->peersConnected, ngettext("peer", "peers", st->peersConnected)); } break; } case TR_STATUS_SEED: g_string_append_printf(gstr, ngettext("Seeding to %1$'d of %2$'d connected peer", "Seeding to %1$'d of %2$'d connected peers", st->peersConnected), st->peersGettingFromUs, st->peersConnected); break; } } if (st->activity != TR_STATUS_CHECK_WAIT && st->activity != TR_STATUS_CHECK && st->activity != TR_STATUS_DOWNLOAD_WAIT && st->activity != TR_STATUS_SEED_WAIT && st->activity != TR_STATUS_STOPPED) { char buf[256]; getShortTransferString(tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof(buf)); if (*buf != '\0') { g_string_append_printf(gstr, " - %s", buf); } } }
static char* getStatusString( const tr_torrent * tor, const tr_stat * st, const double uploadSpeed_KBps, const double downloadSpeed_KBps ) { const int isActive = st->activity != TR_STATUS_STOPPED; const int isChecking = st->activity == TR_STATUS_CHECK || st->activity == TR_STATUS_CHECK_WAIT; GString * gstr = g_string_new( NULL ); if( st->error ) { const char * fmt[] = { NULL, N_( "Tracker gave a warning: \"%s\"" ), N_( "Tracker gave an error: \"%s\"" ), N_( "Error: %s" ) }; g_string_append_printf( gstr, _( fmt[st->error] ), st->errorString ); } else switch( st->activity ) { case TR_STATUS_STOPPED: case TR_STATUS_CHECK_WAIT: case TR_STATUS_CHECK: { char * pch = getShortStatusString( tor, st, uploadSpeed_KBps, downloadSpeed_KBps ); g_string_assign( gstr, pch ); g_free( pch ); break; } case TR_STATUS_DOWNLOAD: { if( tr_torrentHasMetadata( tor ) ) { g_string_append_printf( gstr, gtr_ngettext( "Downloading from %1$'d of %2$'d connected peer", "Downloading from %1$'d of %2$'d connected peers", st->webseedsSendingToUs + st->peersSendingToUs ), st->webseedsSendingToUs + st->peersSendingToUs, st->webseedsSendingToUs + st->peersConnected ); } else { g_string_append_printf( gstr, gtr_ngettext( "Downloading metadata from %1$'d peer (%2$d%% done)", "Downloading metadata from %1$'d peers (%2$d%% done)", st->peersConnected + st->peersConnected ), st->peersConnected + st->webseedsSendingToUs, (int)(100.0*st->metadataPercentComplete) ); } break; } case TR_STATUS_SEED: g_string_append_printf( gstr, gtr_ngettext( "Seeding to %1$'d of %2$'d connected peer", "Seeding to %1$'d of %2$'d connected peers", st->peersConnected ), st->peersGettingFromUs, st->peersConnected ); break; } if( isActive && !isChecking ) { char buf[256]; getShortTransferString( tor, st, uploadSpeed_KBps, downloadSpeed_KBps, buf, sizeof( buf ) ); if( *buf ) g_string_append_printf( gstr, " - %s", buf ); } return g_string_free( gstr, FALSE ); }
GdkRectangle fill_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 ); const gboolean active = st->activity != TR_STATUS_STOPPED; const double percentDone = MAX( 0.0, st->percentDone ); const gboolean sensitive = active || st->error; 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 ); fill_area = *background_area; fill_area.x += xpad; fill_area.y += ypad; fill_area.width -= xpad * 2; fill_area.height -= ypad * 2; icon_area = name_area = stat_area = prog_area = fill_area; g_object_set( p->icon_renderer, "pixbuf", icon, NULL ); gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &icon_area.width, NULL ); 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, &name_area.width, NULL ); g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
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; } }
GdkRectangle fill_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 ); const gboolean active = st->activity != TR_STATUS_STOPPED; const double percentDone = MAX( 0.0, st->percentDone ); const gboolean sensitive = active || st->error; icon = get_icon( tor, COMPACT_ICON_SIZE, widget ); name = tr_torrentInfo( tor )->name; status = getShortStatusString( tor, st, p->upload_speed, p->download_speed ); /* get the 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;