424
433
buildTree( GNode * node, gpointer gdata )
426
436
GtkTreeIter child_iter;
427
437
struct build_data * build = gdata;
428
438
struct row_struct *child_data = node->data;
429
439
const gboolean isLeaf = node->children == NULL;
431
const char * mime_type = isLeaf ? get_mime_type_from_filename( child_data->name ) : DIRECTORY_MIME_TYPE;
432
GdkPixbuf * icon = get_mime_type_icon( mime_type, GTK_ICON_SIZE_MENU, build->w );
441
const char * mime_type = isLeaf ? gtr_get_mime_type_from_filename( child_data->name ) : DIRECTORY_MIME_TYPE;
442
GdkPixbuf * icon = gtr_get_mime_type_icon( mime_type, GTK_ICON_SIZE_MENU, build->w );
433
443
const tr_info * inf = tr_torrentInfo( build->tor );
434
444
const int priority = isLeaf ? inf->files[ child_data->index ].priority : 0;
435
445
const gboolean enabled = isLeaf ? !inf->files[ child_data->index ].dnd : TRUE;
447
tr_strlsize( size_str, child_data->length, sizeof size_str );
436
449
#if GTK_CHECK_VERSION(2,10,0)
437
450
gtk_tree_store_insert_with_values( build->store, &child_iter, build->iter, INT_MAX,
438
451
FC_INDEX, child_data->index,
439
452
FC_LABEL, child_data->name,
440
453
FC_SIZE, child_data->length,
454
FC_SIZE_STR, size_str,
442
456
FC_PRIORITY, priority,
443
457
FC_ENABLED, enabled,
681
onViewPathToggled( GtkTreeView * view,
682
GtkTreeViewColumn * col,
688
gboolean handled = FALSE;
693
cid = GPOINTER_TO_INT( g_object_get_data( G_OBJECT( col ), TR_COLUMN_ID_KEY ) );
694
tor = gtr_core_find_torrent( data->core, data->torrentId );
695
if( ( tor != NULL ) && ( ( cid == FC_PRIORITY ) || ( cid == FC_ENABLED ) ) )
698
GArray * indices = getActiveFilesForPath( view, path );
699
GtkTreeModel * model = data->model;
701
gtk_tree_model_get_iter( model, &iter, path );
703
if( cid == FC_PRIORITY )
706
gtk_tree_model_get( model, &iter, FC_PRIORITY, &priority, -1 );
708
case TR_PRI_NORMAL: priority = TR_PRI_HIGH; break;
709
case TR_PRI_HIGH: priority = TR_PRI_LOW; break;
710
default: priority = TR_PRI_NORMAL; break;
712
tr_torrentSetFilePriorities( tor,
713
(tr_file_index_t *) indices->data,
714
(tr_file_index_t) indices->len,
720
gtk_tree_model_get( model, &iter, FC_ENABLED, &enabled, -1 );
723
tr_torrentSetFileDLs( tor,
724
(tr_file_index_t *) indices->data,
725
(tr_file_index_t) indices->len,
730
g_array_free( indices, TRUE );
738
* @note 'col' and 'path' are assumed not to be NULL.
741
getAndSelectEventPath( GtkTreeView * treeview,
742
GdkEventButton * event,
743
GtkTreeViewColumn ** col,
744
GtkTreePath ** path )
746
GtkTreeSelection * sel;
748
if( gtk_tree_view_get_path_at_pos( treeview,
750
path, col, NULL, NULL ) )
752
sel = gtk_tree_view_get_selection( treeview );
753
if( !gtk_tree_selection_path_is_selected( sel, *path ) )
755
gtk_tree_selection_unselect_all( sel );
756
gtk_tree_selection_select_path( sel, *path );
688
765
onViewButtonPressed( GtkWidget * w, GdkEventButton * event, gpointer gdata )
767
GtkTreeViewColumn * col;
768
GtkTreePath * path = NULL;
769
gboolean handled = FALSE;
770
GtkTreeView * treeview = GTK_TREE_VIEW( w );
690
771
FileData * data = gdata;
691
gboolean handled = FALSE;
692
tr_torrent * tor = tr_torrentFindFromId( tr_core_session( data->core ), data->torrentId );
697
if( ( event->type == GDK_BUTTON_PRESS ) && ( event->button == 1 )
698
&& !( event->state & ( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) )
773
if( ( event->type == GDK_BUTTON_PRESS )
774
&& ( event->button == 1 )
775
&& !( event->state & ( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) )
776
&& getAndSelectEventPath( treeview, event, &col, &path ) )
700
GtkTreeView * view = GTK_TREE_VIEW( w );
702
GtkTreeViewColumn * column;
705
if( gtk_tree_view_get_path_at_pos( view, event->x, event->y,
706
&path, &column, &cell_x, &cell_y ) )
708
const char * column_title = gtk_tree_view_column_get_title( column );
709
const gboolean downloadColumn = !strcmp( column_title, _( "Download" ) );
710
const gboolean priorityColumn = !strcmp( column_title, _( "Priority" ) );
711
if( downloadColumn || priorityColumn )
713
GArray * a = getActiveFilesForPath( view, path );
714
GtkTreeSelection * sel = gtk_tree_view_get_selection( view );
715
const gboolean isSelected = gtk_tree_selection_path_is_selected( sel, path );
716
GtkTreeModel * model = data->model;
719
gtk_tree_model_get_iter( model, &iter, path );
725
/* get the `priority' state of the clicked row */
726
gtk_tree_model_get( model, &iter, FC_PRIORITY, &priority, -1 );
728
/* twiddle it to the next state */
730
case TR_PRI_NORMAL: priority = TR_PRI_HIGH; break;
731
case TR_PRI_HIGH: priority = TR_PRI_LOW; break;
732
default: priority = TR_PRI_NORMAL; break;
735
/* apply that new state to the active files */
736
tr_torrentSetFilePriorities( tor,
737
(tr_file_index_t*)a->data,
738
(tr_file_index_t)a->len,
741
else if( downloadColumn )
745
/* get the `enabled' state of the clicked row */
746
gtk_tree_model_get( model, &iter, FC_ENABLED, &enabled, -1 );
748
/* twiddle it to the next state */
751
/* apply that new state to the active files */
752
tr_torrentSetFileDLs( tor,
753
(tr_file_index_t*)a->data,
754
(tr_file_index_t)a->len,
760
/* the click was meant to change the priority or enabled state,
761
not to alter which rows were selected, so don't pass this
762
event on to the other handlers. */
763
handled = isSelected;
766
g_array_free( a, TRUE );
778
handled = onViewPathToggled( treeview, col, path, data );
769
781
gtk_tree_path_free( path );
777
file_list_new( TrCore * core, int torrentId )
788
gtr_file_list_new( TrCore * core, int torrentId )
781
793
GtkWidget * view;
821
840
gtk_tree_view_column_add_attribute( col, rend, "pixbuf", FC_ICON );
822
841
/* add text renderer */
823
842
rend = gtk_cell_renderer_text_new( );
824
g_object_set( rend, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
843
g_object_set( rend, "ellipsize", PANGO_ELLIPSIZE_END, "font-desc", pango_font_description, NULL );
825
844
gtk_tree_view_column_pack_start( col, rend, TRUE );
826
gtk_tree_view_column_set_cell_data_func( col, rend, renderFilename, NULL, NULL );
845
gtk_tree_view_column_set_attributes( col, rend, "text", FC_LABEL, NULL );
827
846
gtk_tree_view_column_set_sort_column_id( col, FC_LABEL );
828
847
gtk_tree_view_append_column( tree_view, col );
849
/* add "size" column */
851
rend = gtk_cell_renderer_text_new( );
852
g_object_set( rend, "alignment", PANGO_ALIGN_RIGHT,
853
"font-desc", pango_font_description,
858
col = gtk_tree_view_column_new_with_attributes( title, rend, NULL );
859
gtk_tree_view_column_set_sizing( col, GTK_TREE_VIEW_COLUMN_GROW_ONLY );
860
gtk_tree_view_column_set_sort_column_id( col, FC_SIZE );
861
gtk_tree_view_column_set_attributes( col, rend, "text", FC_SIZE_STR, NULL );
862
gtk_tree_view_append_column( tree_view, col );
830
864
/* add "progress" column */
831
title = _( "Progress" );
832
866
pango_layout = gtk_widget_create_pango_layout( view, title );
833
867
pango_layout_get_pixel_size( pango_layout, &width, NULL );
834
868
width += 30; /* room for the sort indicator */