Changeset 6720


Ignore:
Timestamp:
Sep 6, 2008, 1:52:47 AM (13 years ago)
Author:
charles
Message:

(gtk) #1192: 1.3x's method of setting file priorities & download flags is unpopular

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/file-list.c

    r6718 r6720  
    310310
    311311static gboolean
    312 getActiveFilesForeach( GtkTreeModel  * model,
    313                        GtkTreePath   * path UNUSED,
    314                        GtkTreeIter   * iter,
    315                        gpointer        gdata )
     312getSelectedFilesForeach( GtkTreeModel  * model,
     313                         GtkTreePath   * path UNUSED,
     314                         GtkTreeIter   * iter,
     315                         gpointer        gdata )
    316316{
    317317    struct ActiveData * data = gdata;
     
    340340}
    341341
    342 static GArray*
    343 getActiveFiles( GtkTreeView * view )
     342static void
     343getSelectedFilesAndDescendants( GtkTreeView * view, GArray * indices )
    344344{
    345345    struct ActiveData data;
    346346    data.sel = gtk_tree_view_get_selection( view );
    347     data.array  = g_array_new( FALSE, FALSE, sizeof( tr_file_index_t ) );
    348     gtk_tree_model_foreach( gtk_tree_view_get_model( view ), getActiveFilesForeach, &data );
    349     return data.array;
    350 }
    351 
    352 static void
    353 setPriority( FileData * data, int priority )
    354 {
    355     GtkTreeView * view = GTK_TREE_VIEW( data->view );
    356     GArray * a = getActiveFiles( view );
    357     tr_torrentSetFilePriorities( tr_torrent_handle( data->gtor ),
    358                                  (tr_file_index_t*)a->data,
    359                                  (tr_file_index_t)a->len,
    360                                  priority );
    361     refresh( data );
    362     g_array_free( a, TRUE );
    363 }
    364 
    365 
    366 static void
    367 onHighClicked( GtkButton * button UNUSED, gpointer gdata )
    368 {
    369     setPriority( gdata, TR_PRI_HIGH );
    370 }
    371 static void
    372 onNormalClicked( GtkButton * button UNUSED, gpointer gdata )
    373 {
    374     setPriority( gdata, TR_PRI_NORMAL );
    375 }
    376 static void
    377 onLowClicked( GtkButton * button UNUSED, gpointer gdata )
    378 {
    379     setPriority( gdata, TR_PRI_LOW );
    380 }
    381 
    382 static void
    383 onDownloadToggled( GtkCellRendererToggle * cell UNUSED, char * path_str, gpointer gdata )
    384 {
    385     FileData * data = gdata;
    386     GtkTreeView * view = GTK_TREE_VIEW( data->view );
     347    data.array  = indices;
     348    gtk_tree_model_foreach( gtk_tree_view_get_model( view ), getSelectedFilesForeach, &data );
     349}
     350
     351/* if `path' is a selected row, all selected rows are returned.
     352 * otherwise, only the row indicated by `path' is returned.
     353 * this is for toggling all the selected rows' states in a batch.
     354 */
     355static GArray*
     356getActiveFilesForPath( GtkTreeView * view, GtkTreePath * path )
     357{
    387358    GtkTreeSelection * sel = gtk_tree_view_get_selection( view );
    388     GtkTreePath * path = gtk_tree_path_new_from_string( path_str );
    389     GArray * a;
     359    GArray * indices = g_array_new( FALSE, FALSE, sizeof( tr_file_index_t ) );
    390360
    391361    if( gtk_tree_selection_path_is_selected( sel, path ) )
    392362    {
    393363        /* clicked in a selected row... use the current selection */
    394         a = getActiveFiles( view );
     364        getSelectedFilesAndDescendants( view, indices );
    395365    }
    396366    else
     
    402372        GtkTreeIter iter;
    403373        gtk_tree_model_get_iter( model, &iter, path );
    404         a = g_array_new( FALSE, FALSE, sizeof( tr_file_index_t ) );
    405374        gtk_tree_model_get( model, &iter, FC_IS_FILE, &is_file, FC_INDEX, &i, -1 );
    406         if( is_file ) {
    407             g_message( "appending %u", i );
    408             g_array_append_val( a, i );
    409         }
    410     }
    411 
    412     if( a->len )
    413     {
    414         /* toggle the selected files based on the first one's current value */
    415         const tr_file_index_t i = g_array_index( a, tr_file_index_t, 0 );
    416         const tr_info * inf = tr_torrentInfo( tr_torrent_handle( data->gtor ) );
    417         const int do_download = inf->files[i].dnd;
    418         tr_torrentSetFileDLs ( tr_torrent_handle( data->gtor ),
    419                                (tr_file_index_t*)a->data,
    420                                (tr_file_index_t)a->len,
    421                                do_download );
    422         refresh( data );
    423     }
    424 
    425     /* cleanup */
    426     g_array_free( a, TRUE );
    427     gtk_tree_path_free( path );
     375        if( is_file )
     376            g_array_append_val( indices, i );
     377    }
     378
     379    return indices;
    428380}
    429381
     
    616568onViewButtonPressed( GtkWidget      * w,
    617569                     GdkEventButton * event,
    618                      gpointer         unused UNUSED )
    619 {
     570                     gpointer         gdata )
     571{
     572    FileData * data = gdata;
    620573    gboolean handled = FALSE;
    621574
    622     if( ( event->type == GDK_BUTTON_PRESS ) && ( event->button == 1 ) )
    623     {
     575    if( ( event->type == GDK_BUTTON_PRESS ) && ( event->button == 1 ) && !( event->state & ( GDK_SHIFT_MASK|GDK_CONTROL_MASK) ) )
     576    {
     577        GtkTreeView * view = GTK_TREE_VIEW( w );
    624578        GtkTreePath * path;
    625579        GtkTreeViewColumn * column;
    626580        int cell_x;
    627581        int cell_y;
    628         if( gtk_tree_view_get_path_at_pos( GTK_TREE_VIEW( w ), event->x, event->y,
     582        if( gtk_tree_view_get_path_at_pos( view, event->x, event->y,
    629583                                           &path, &column, &cell_x, &cell_y ) )
    630584        {
    631585            const char * column_title = gtk_tree_view_column_get_title( column );
    632             if( !strcmp( column_title, _( "Priority" ) ) )
     586            const gboolean downloadColumn = !strcmp( column_title, Q_( "filedetails|Download" ) );
     587            const gboolean priorityColumn = !strcmp( column_title, _( "Priority" ) );
     588            if( downloadColumn || priorityColumn )
    633589            {
    634                 handled = TRUE;
    635                 g_message( "row is (%s)", gtk_tree_path_to_string( path ) );
     590                GArray * a = getActiveFilesForPath( view, path );
     591                GtkTreeSelection * sel = gtk_tree_view_get_selection( view );
     592                const gboolean isSelected = gtk_tree_selection_path_is_selected( sel, path );
     593                GtkTreeModel * model = gtk_tree_view_get_model( view );
     594                GtkTreeIter iter;
     595
     596                gtk_tree_model_get_iter( model, &iter, path );
     597
     598                if( priorityColumn )
     599                {
     600                    gboolean is_file;
     601                    int sub_state;
     602                    int priority;
     603
     604                    /* get the `priority' state of the clicked row */
     605                    gtk_tree_model_get( model, &iter, FC_IS_FILE, &is_file,
     606                                                      FC_PRIORITY, &priority,
     607                                                      FC_SUB_STATE, &sub_state,
     608                                                      -1 );
     609
     610                    /* twiddle it to the next state */
     611                    if( !is_file ) switch( sub_state & SUB_STATE_PRIORITY_MASK ) {
     612                        case SUB_STATE_NORMAL: priority = TR_PRI_HIGH; break;
     613                        case SUB_STATE_HIGH:   priority = TR_PRI_LOW; break;
     614                        default:               priority = TR_PRI_NORMAL; break;
     615                    } else switch( priority ) {
     616                        case TR_PRI_LOW:       priority = TR_PRI_NORMAL; break;
     617                        case TR_PRI_NORMAL:    priority = TR_PRI_HIGH; break;
     618                        case TR_PRI_HIGH:      priority = TR_PRI_LOW; break;
     619                    }
     620                                                   
     621                    /* apply that new state to the active files */
     622                    tr_torrentSetFilePriorities( tr_torrent_handle( data->gtor ),
     623                                                 (tr_file_index_t*)a->data,
     624                                                 (tr_file_index_t)a->len,
     625                                                 priority );
     626                }
     627                else if( downloadColumn )
     628                {
     629                    gboolean is_file;
     630                    int sub_state;
     631                    gboolean enabled;
     632
     633                    /* get the `enabled' state of the row that was clicked on */
     634                    gtk_tree_model_get( model, &iter, FC_IS_FILE, &is_file,
     635                                                      FC_ENABLED, &enabled,
     636                                                      FC_SUB_STATE, &sub_state, -1 );
     637
     638                    /* twiddle it to the next state */
     639                    if( is_file )
     640                        enabled = !enabled;
     641                    else
     642                        enabled = ( sub_state & SUB_STATE_IGNORE ) ? 1 : 0;
     643
     644                    /* apply that new state to the active files */
     645                    tr_torrentSetFileDLs ( tr_torrent_handle( data->gtor ),
     646                                           (tr_file_index_t*)a->data,
     647                                           (tr_file_index_t)a->len,
     648                                           enabled );
     649                }
     650
     651                refresh( data );
     652                handled = isSelected;
     653
     654                /* cleanup */
     655                g_array_free( a, TRUE );
    636656            }
     657
    637658            gtk_tree_path_free( path );
    638659        }
     
    646667{
    647668    GtkWidget           * ret;
    648     FileData            * data;
    649669    GtkWidget           * view, * scroll;
    650670    GtkCellRenderer     * rend;
    651671    GtkTreeViewColumn   * col;
    652672    GtkTreeSelection    * sel;
    653     GtkWidget           * hbox;
    654     GtkWidget           * vbox;
    655     GtkWidget           * w;
     673    FileData            * data = g_new0( FileData, 1 );
    656674
    657675    /* create the view */
     
    659677    gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( view ), TRUE );
    660678    gtk_container_set_border_width( GTK_CONTAINER( view ), GUI_PAD_BIG );
    661     g_signal_connect( view, "button-press-event", G_CALLBACK(onViewButtonPressed), NULL );
     679    g_signal_connect( view, "button-press-event", G_CALLBACK(onViewButtonPressed), data );
    662680
    663681    /* set up view */
     
    692710    gtk_tree_view_column_set_cell_data_func( col, rend, renderProgress, NULL, NULL);
    693711    gtk_tree_view_append_column ( GTK_TREE_VIEW( view ), col);
    694 data = g_new0( FileData, 1 );
    695712
    696713    /* add "enabled" column */
    697714    rend = gtk_cell_renderer_toggle_new( );
    698     g_signal_connect( rend, "toggled", G_CALLBACK( onDownloadToggled ), data );
    699715    /* Translators: this is a column header in Files tab, Details dialog;
    700716       Don't include the prefix "filedetails|" in the translation.
     
    719735    gtk_widget_set_size_request (scroll, -1, 200 );
    720736
    721     vbox = gtk_vbox_new( FALSE, GUI_PAD );
    722         w = gtk_button_new_with_mnemonic( _( "_High" ) );
    723         g_signal_connect( w, "clicked", G_CALLBACK(onHighClicked), data );
    724         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
    725         w = gtk_button_new_with_mnemonic( _( "_Normal" ) );
    726         g_signal_connect( w, "clicked", G_CALLBACK(onNormalClicked), data );
    727         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
    728         w = gtk_button_new_with_mnemonic( _( "_Low" ) );
    729         g_signal_connect( w, "clicked", G_CALLBACK(onLowClicked), data );
    730         gtk_box_pack_start( GTK_BOX( vbox ), w, FALSE, FALSE, 0 );
    731     hbox = gtk_hbox_new( FALSE, GUI_PAD );
    732     gtk_box_pack_start_defaults( GTK_BOX( hbox ), scroll );
    733     gtk_box_pack_start( GTK_BOX( hbox ), vbox, 0, 0, 0 );
    734 
    735     ret = hbox;
     737    ret = scroll;
    736738    data->view = view;
    737739    data->top = scroll;
Note: See TracChangeset for help on using the changeset viewer.