240
267
struct TorrentCellRendererPrivate
243
GtkCellRenderer * text_renderer;
244
GtkCellRenderer * text_renderer_err;
245
GtkCellRenderer * progress_renderer;
270
GtkCellRenderer * text_renderer;
271
GtkCellRenderer * text_renderer_err;
272
GtkCellRenderer * progress_renderer;
273
GtkCellRenderer * icon_renderer;
247
275
gboolean minimal;
251
torrent_cell_renderer_get_size( GtkCellRenderer * cell,
253
GdkRectangle * cell_area,
283
get_icon( const tr_torrent * tor, GtkIconSize icon_size, GtkWidget * for_widget )
285
const char * mime_type;
286
const tr_info * info = tr_torrentInfo( tor );
288
if( info->fileCount > 1 )
289
mime_type = DIRECTORY_MIME_TYPE;
291
mime_type = get_mime_type_from_filename( info->files[0].name );
293
return get_mime_type_icon( mime_type, icon_size, for_widget );
296
static GtkCellRenderer*
297
get_text_renderer( const tr_stat * st, TorrentCellRenderer * r )
299
return st->error ? r->priv->text_renderer_err : r->priv->text_renderer;
307
get_size_minimal( TorrentCellRenderer * cell,
313
GdkRectangle icon_area;
314
GdkRectangle name_area;
315
GdkRectangle stat_area;
319
GtkCellRenderer * text_renderer;
321
struct TorrentCellRendererPrivate * p = cell->priv;
322
const tr_torrent * tor = p->tor;
323
const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor );
325
icon = get_icon( tor, MINIMAL_ICON_SIZE, widget );
326
name = tr_torrentInfo( tor )->name;
327
status = getShortStatusString( st );
329
/* get the idealized cell dimensions */
330
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
331
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
333
icon_area.height = h;
334
text_renderer = get_text_renderer( st, cell );
335
g_object_set( text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
336
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
338
name_area.height = h;
339
g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
340
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
342
stat_area.height = h;
349
*width = cell->parent.xpad * 2 + icon_area.width + GUI_PAD + name_area.width + GUI_PAD + stat_area.width;
351
*height = cell->parent.ypad * 2 + name_area.height + p->bar_height;
355
g_object_unref( icon );
358
#define MAX3(a,b,c) MAX(a,MAX(b,c))
361
get_size_full( TorrentCellRenderer * cell,
367
GdkRectangle icon_area;
368
GdkRectangle name_area;
369
GdkRectangle stat_area;
370
GdkRectangle prog_area;
375
GtkCellRenderer * text_renderer;
377
struct TorrentCellRendererPrivate * p = cell->priv;
378
const tr_torrent * tor = p->tor;
379
const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor );
380
const tr_info * inf = tr_torrentInfo( tor );
382
icon = get_icon( tor, FULL_ICON_SIZE, widget );
384
status = getStatusString( st );
385
progress = getProgressString( tor, inf, st );
387
/* get the idealized cell dimensions */
388
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
389
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
391
icon_area.height = h;
392
text_renderer = get_text_renderer( st, cell );
393
g_object_set( text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "scale", 1.0, "ellipsize", PANGO_ELLIPSIZE_NONE, NULL );
394
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
396
name_area.height = h;
397
g_object_set( text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
398
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
400
prog_area.height = h;
401
g_object_set( text_renderer, "text", status, NULL );
402
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
404
stat_area.height = h;
411
*width = cell->parent.xpad * 2 + icon_area.width + GUI_PAD + MAX3( name_area.width, prog_area.width, stat_area.width );
413
*height = cell->parent.ypad * 2 + name_area.height + prog_area.height + GUI_PAD_SMALL + p->bar_height + GUI_PAD_SMALL + stat_area.height;
418
g_object_unref( icon );
423
torrent_cell_renderer_get_size( GtkCellRenderer * cell,
425
GdkRectangle * cell_area,
259
431
TorrentCellRenderer * self = TORRENT_CELL_RENDERER( cell );
261
433
if( self && self->priv->tor )
263
const tr_torrent * tor = self->priv->tor;
264
const tr_info * info = tr_torrentInfo( tor );
265
const char * name = info->name;
266
const tr_stat * torStat =
267
tr_torrentStatCached( (tr_torrent*)tor );
270
435
struct TorrentCellRendererPrivate * p = self->priv;
271
GtkCellRenderer * text_renderer =
278
g_object_set( text_renderer, "ellipsize", PANGO_ELLIPSIZE_NONE,
281
/* above the progressbar */
285
char * shortStatus = getShortStatusString( torStat );
286
g_object_set( text_renderer, "text", name, NULL );
287
gtk_cell_renderer_get_size( text_renderer,
288
widget, NULL, NULL, NULL, &w1, &h1 );
289
str = g_markup_printf_escaped( "<small>%s</small>", shortStatus );
290
g_object_set( text_renderer, "markup", str, NULL );
291
gtk_cell_renderer_get_size( text_renderer,
292
widget, NULL, NULL, NULL, &w2, &h2 );
294
w = MAX( w, w1 + GUI_PAD_BIG + w2 );
296
g_free( shortStatus );
439
get_size_minimal( TORRENT_CELL_RENDERER( cell ), widget, &w, &h );
301
char * progressString = getProgressString( info, torStat );
302
str = g_markup_printf_escaped( "<b>%s</b>\n<small>%s</small>",
303
name, progressString );
304
g_object_set( text_renderer, "markup", str, NULL );
305
gtk_cell_renderer_get_size( text_renderer,
306
widget, NULL, NULL, NULL, &w1, &h1 );
310
g_free( progressString );
313
/* below the progressbar */
317
char * statusString = getStatusString( torStat );
318
str = g_markup_printf_escaped( "<small>%s</small>",
320
g_object_set( text_renderer, "markup", str, NULL );
321
gtk_cell_renderer_get_size( text_renderer,
322
widget, NULL, NULL, NULL, &w1, &h1 );
326
g_free( statusString );
441
get_size_full( TORRENT_CELL_RENDERER( cell ), widget, &w, &h );
333
450
if( x_offset ) *x_offset = 0;
337
( cell_area->height - ( h + ( 2 * cell->ypad ) ) );
452
*y_offset = 0.5 * ( cell_area->height - ( h + ( 2 * cell->ypad ) ) );
338
453
*y_offset = MAX( *y_offset, 0 );
342
*width = w + cell->xpad * 2;
343
*height = h + cell->ypad * 2;
348
torrent_cell_renderer_render(
349
GtkCellRenderer * cell,
350
GdkDrawable * window,
354
GdkRectangle * cell_area UNUSED,
355
GdkRectangle * expose_area UNUSED,
356
GtkCellRendererState flags )
460
render_minimal( TorrentCellRenderer * cell,
461
GdkDrawable * window,
463
GdkRectangle * background_area,
464
GdkRectangle * cell_area UNUSED,
465
GdkRectangle * expose_area UNUSED,
466
GtkCellRendererState flags )
469
GdkRectangle icon_area;
470
GdkRectangle name_area;
471
GdkRectangle stat_area;
472
GdkRectangle prog_area;
473
GdkRectangle fill_area;
477
GtkCellRenderer * text_renderer;
479
struct TorrentCellRendererPrivate * p = cell->priv;
480
const tr_torrent * tor = p->tor;
481
const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor );
482
const gboolean active = st->activity != TR_STATUS_STOPPED;
483
const double percentDone = MAX( 0.0, st->percentDone );
485
icon = get_icon( tor, MINIMAL_ICON_SIZE, widget );
486
name = tr_torrentInfo( tor )->name;
487
status = getShortStatusString( st );
489
/* get the cell dimensions */
490
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
491
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
493
icon_area.height = h;
494
text_renderer = get_text_renderer( st, cell );
495
g_object_set( text_renderer, "text", name, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
496
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
498
name_area.height = h;
499
g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, NULL );
500
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
502
stat_area.height = h;
508
fill_area = *background_area;
509
fill_area.x += cell->parent.xpad;
510
fill_area.y += cell->parent.ypad;
511
fill_area.width -= cell->parent.xpad * 2;
512
fill_area.height -= cell->parent.ypad * 2;
515
icon_area.x = fill_area.x;
516
icon_area.y = fill_area.y + ( fill_area.height - icon_area.height ) / 2;
518
/* short status (right justified) */
519
stat_area.x = fill_area.x + fill_area.width - stat_area.width;
520
stat_area.y = fill_area.y + ( name_area.height - stat_area.height ) / 2;
523
name_area.x = icon_area.x + icon_area.width + GUI_PAD;
524
name_area.y = fill_area.y;
525
name_area.width = stat_area.x - GUI_PAD - name_area.x;
528
prog_area.x = name_area.x;
529
prog_area.y = name_area.y + name_area.height;
530
prog_area.width = name_area.width + GUI_PAD + stat_area.width;
531
prog_area.height = p->bar_height;
537
g_object_set( p->icon_renderer, "pixbuf", icon, "sensitive", active, NULL );
538
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
539
g_object_set( text_renderer, "text", status, "scale", SMALL_SCALE, "sensitive", active, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
540
gtk_cell_renderer_render( text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
541
g_object_set( text_renderer, "text", name, "scale", 1.0, NULL );
542
gtk_cell_renderer_render( text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
543
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", "", "sensitive", active, NULL );
544
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
548
g_object_unref( icon );
552
render_full( TorrentCellRenderer * cell,
553
GdkDrawable * window,
555
GdkRectangle * background_area,
556
GdkRectangle * cell_area UNUSED,
557
GdkRectangle * expose_area UNUSED,
558
GtkCellRendererState flags )
561
GdkRectangle fill_area;
562
GdkRectangle icon_area;
563
GdkRectangle name_area;
564
GdkRectangle stat_area;
565
GdkRectangle prog_area;
566
GdkRectangle prct_area;
571
GtkCellRenderer * text_renderer;
573
struct TorrentCellRendererPrivate * p = cell->priv;
574
const tr_torrent * tor = p->tor;
575
const tr_stat * st = tr_torrentStatCached( (tr_torrent*)tor );
576
const tr_info * inf = tr_torrentInfo( tor );
577
const gboolean active = st->activity != TR_STATUS_STOPPED;
578
const double percentDone = MAX( 0.0, st->percentDone );
580
icon = get_icon( tor, FULL_ICON_SIZE, widget );
582
status = getStatusString( st );
583
progress = getProgressString( tor, inf, st );
585
/* get the idealized cell dimensions */
586
g_object_set( p->icon_renderer, "pixbuf", icon, NULL );
587
gtk_cell_renderer_get_size( p->icon_renderer, widget, NULL, NULL, NULL, &w, &h );
589
icon_area.height = h;
590
text_renderer = get_text_renderer( st, cell );
591
g_object_set( text_renderer, "text", name, "weight", PANGO_WEIGHT_BOLD, "ellipsize", PANGO_ELLIPSIZE_NONE, "scale", 1.0, NULL );
592
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
594
name_area.height = h;
595
g_object_set( text_renderer, "text", progress, "weight", PANGO_WEIGHT_NORMAL, "scale", SMALL_SCALE, NULL );
596
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
598
prog_area.height = h;
599
g_object_set( text_renderer, "text", status, NULL );
600
gtk_cell_renderer_get_size( text_renderer, widget, NULL, NULL, NULL, &w, &h );
602
stat_area.height = h;
608
fill_area = *background_area;
609
fill_area.x += cell->parent.xpad;
610
fill_area.y += cell->parent.ypad;
611
fill_area.width -= cell->parent.xpad * 2;
612
fill_area.height -= cell->parent.ypad * 2;
615
icon_area.x = fill_area.x;
616
icon_area.y = fill_area.y + ( fill_area.height - icon_area.height ) / 2;
619
name_area.x = icon_area.x + icon_area.width + GUI_PAD;
620
name_area.y = fill_area.y;
621
name_area.width = fill_area.width - GUI_PAD - icon_area.width - GUI_PAD_SMALL;
624
prog_area.x = name_area.x;
625
prog_area.y = name_area.y + name_area.height;
626
prog_area.width = name_area.width;
629
prct_area.x = prog_area.x;
630
prct_area.y = prog_area.y + prog_area.height + GUI_PAD_SMALL;
631
prct_area.width = prog_area.width;
632
prct_area.height = p->bar_height;
635
stat_area.x = prct_area.x;
636
stat_area.y = prct_area.y + prct_area.height + GUI_PAD_SMALL;
637
stat_area.width = prct_area.width;
643
g_object_set( p->icon_renderer, "pixbuf", icon, "sensitive", active, NULL );
644
gtk_cell_renderer_render( p->icon_renderer, window, widget, &icon_area, &icon_area, &icon_area, flags );
645
g_object_set( text_renderer, "text", name, "scale", 1.0, "sensitive", active, "ellipsize", PANGO_ELLIPSIZE_END, "weight", PANGO_WEIGHT_BOLD, NULL );
646
gtk_cell_renderer_render( text_renderer, window, widget, &name_area, &name_area, &name_area, flags );
647
g_object_set( text_renderer, "text", progress, "scale", SMALL_SCALE, "weight", PANGO_WEIGHT_NORMAL, NULL );
648
gtk_cell_renderer_render( text_renderer, window, widget, &prog_area, &prog_area, &prog_area, flags );
649
g_object_set( p->progress_renderer, "value", (int)(percentDone*100.0), "text", "", "sensitive", active, NULL );
650
gtk_cell_renderer_render( p->progress_renderer, window, widget, &prct_area, &prct_area, &prct_area, flags );
651
g_object_set( text_renderer, "text", status, NULL );
652
gtk_cell_renderer_render( text_renderer, window, widget, &stat_area, &stat_area, &stat_area, flags );
657
g_object_unref( icon );
661
torrent_cell_renderer_render( GtkCellRenderer * cell,
662
GdkDrawable * window,
664
GdkRectangle * background_area,
665
GdkRectangle * cell_area,
666
GdkRectangle * expose_area,
667
GtkCellRendererState flags )
358
669
TorrentCellRenderer * self = TORRENT_CELL_RENDERER( cell );
365
676
if( self && self->priv->tor )
367
const tr_torrent * tor = self->priv->tor;
368
const tr_info * info = tr_torrentInfo( tor );
369
const char * name = info->name;
370
const tr_stat * torStat =
371
tr_torrentStatCached( (tr_torrent*)tor );
373
GdkRectangle my_cell;
374
GdkRectangle my_expose;
376
678
struct TorrentCellRendererPrivate * p = self->priv;
377
GtkCellRenderer * text_renderer = torStat->error != 0
378
? p->text_renderer_err
380
const gboolean isActive = torStat->activity != TR_STATUS_STOPPED;
382
my_bg = *background_area;
383
my_bg.x += cell->xpad;
384
my_bg.y += cell->ypad;
385
my_bg.width -= cell->xpad * 2;
386
my_cell = my_expose = my_bg;
388
g_object_set( text_renderer, "sensitive", isActive, NULL );
389
g_object_set( p->progress_renderer, "sensitive", isActive, NULL );
391
/* above the progressbar */
394
char * progressString = getProgressString( info, torStat );
395
char * str = g_markup_printf_escaped(
396
"<b>%s</b>\n<small>%s</small>",
397
name, progressString );
398
g_object_set( text_renderer, "markup", str,
399
"ellipsize", PANGO_ELLIPSIZE_NONE,
401
gtk_cell_renderer_get_size( text_renderer,
402
widget, NULL, NULL, NULL, &w, &h );
405
my_expose.height = h;
406
g_object_set( text_renderer, "ellipsize", PANGO_ELLIPSIZE_END,
408
gtk_cell_renderer_render( text_renderer,
410
&my_bg, &my_cell, &my_expose, flags );
416
g_free( progressString );
680
render_minimal( self, window, widget, background_area, cell_area, expose_area, flags );
420
char * statusStr = getShortStatusString( torStat );
421
char * str = g_markup_printf_escaped( "<small>%s</small>",
423
int w1, w2, h1, h2, tmp_h;
424
GdkRectangle tmp_bg, tmp_cell, tmp_expose;
426
/* get the dimensions for the name */
427
g_object_set( text_renderer, "text", name,
428
"ellipsize", PANGO_ELLIPSIZE_NONE,
430
gtk_cell_renderer_get_size( text_renderer,
431
widget, NULL, NULL, NULL, &w1, &h1 );
433
/* get the dimensions for the short status string */
434
g_object_set( text_renderer, "markup", str,
435
"ellipsize", PANGO_ELLIPSIZE_NONE,
437
gtk_cell_renderer_get_size( text_renderer,
438
widget, NULL, NULL, NULL, &w2, &h2 );
440
tmp_h = MAX( h1, h2 );
443
tmp_bg.x = my_bg.width - w2;
444
tmp_bg.y = my_bg.y + ( h2 - h1 ) / 2;
446
tmp_bg.height = tmp_h;
447
tmp_expose = tmp_cell = tmp_bg;
448
g_object_set( text_renderer, "markup", str,
449
"ellipsize", PANGO_ELLIPSIZE_END,
451
gtk_cell_renderer_render( text_renderer,
453
&tmp_bg, &tmp_cell, &tmp_expose,
458
tmp_bg.width = my_bg.width - w2 - GUI_PAD_BIG;
459
tmp_expose = tmp_cell = tmp_bg;
460
g_object_set( text_renderer, "text", name,
461
"ellipsize", PANGO_ELLIPSIZE_END,
463
gtk_cell_renderer_render( text_renderer,
465
&tmp_bg, &tmp_cell, &tmp_expose,
468
my_bg.y = tmp_bg.y + tmp_bg.height;
469
my_cell.y = tmp_cell.y + tmp_cell.height;
470
my_expose.y = tmp_expose.y + tmp_cell.height;
476
/* the progressbar */
477
my_cell.height = p->bar_height;
480
const double percent = MAX( 0.0, torStat->percentDone );
481
g_object_set( p->progress_renderer, "value",
482
(int)( percent * 100.0 ),
485
gtk_cell_renderer_render( p->progress_renderer,
487
&my_cell, &my_cell, &my_cell, flags );
489
my_bg.y += my_cell.height;
490
my_cell.y += my_cell.height;
491
my_expose.y += my_cell.height;
493
/* below progressbar */
496
char * statusString = getStatusString( torStat );
497
char * str = g_markup_printf_escaped( "<small>%s</small>",
499
g_object_set( text_renderer, "markup", str,
500
"ellipsize", PANGO_ELLIPSIZE_END,
502
gtk_cell_renderer_get_size( text_renderer,
503
widget, NULL, NULL, NULL, &w, &h );
506
my_expose.height = h;
507
gtk_cell_renderer_render( text_renderer,
509
&my_bg, &my_cell, &my_expose, flags );
512
g_free( statusString );
682
render_full( self, window, widget, background_area, cell_area, expose_area, flags );