Changeset 11098


Ignore:
Timestamp:
Aug 2, 2010, 8:55:11 PM (12 years ago)
Author:
charles
Message:

(trunk) add drag-and-drop support to the "create new torrent" dialogs in the Qt and GTK+ clients

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/makemeta-ui.c

    r10970 r11098  
    3333    char * target;
    3434    guint progress_tag;
     35    GtkWidget * file_radio;
    3536    GtkWidget * file_chooser;
     37    GtkWidget * folder_radio;
    3638    GtkWidget * folder_chooser;
    3739    GtkWidget * pieces_lb;
     
    378380}
    379381
     382static void
     383on_drag_data_received( GtkWidget         * widget           UNUSED,
     384                       GdkDragContext    * drag_context     UNUSED,
     385                       gint                x                UNUSED,
     386                       gint                y                UNUSED,
     387                       GtkSelectionData  * selection_data,
     388                       guint               info             UNUSED,
     389                       guint               time             UNUSED,
     390                       gpointer            user_data )
     391{
     392    MakeMetaUI * ui = user_data;
     393    char ** uris = gtk_selection_data_get_uris( selection_data );
     394
     395    if( uris && uris[0] )
     396    {
     397        const char * uri = uris[ 0 ];
     398        gchar * filename = g_filename_from_uri( uri, NULL, NULL );
     399
     400        if( g_file_test( filename, G_FILE_TEST_IS_DIR ) )
     401        {
     402            /* a directory was dragged onto the dialog... */
     403            gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ui->folder_radio ), TRUE );
     404            gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( ui->folder_chooser ), filename );
     405        }
     406        else if( g_file_test( filename, G_FILE_TEST_IS_REGULAR ) )
     407        {
     408            /* a file was dragged on to the dialog... */
     409            gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ui->file_radio ), TRUE );
     410            gtk_file_chooser_set_filename( GTK_FILE_CHOOSER( ui->file_chooser ), filename );
     411        }
     412
     413        g_free( filename );
     414    }
     415
     416    g_strfreev( uris );
     417}
     418
    380419GtkWidget*
    381420make_meta_ui( GtkWindow  * parent, TrCore * core )
     
    416455        g_signal_connect( l, "toggled", G_CALLBACK( onSourceToggled ), w );
    417456        g_signal_connect( w, "selection-changed", G_CALLBACK( onChooserChosen ), ui );
     457        ui->folder_radio = l;
    418458        ui->folder_chooser = w;
    419459        gtk_widget_set_sensitive( GTK_WIDGET( w ), FALSE );
     
    427467        g_signal_connect( l, "toggled", G_CALLBACK( onSourceToggled ), w );
    428468        g_signal_connect( w, "selection-changed", G_CALLBACK( onChooserChosen ), ui );
     469        ui->file_radio = l;
    429470        ui->file_chooser = w;
    430471        hig_workarea_add_row_w( t, &row, l, w, NULL );
     
    475516    gtk_box_pack_start( GTK_BOX( GTK_DIALOG( d )->vbox ), t, TRUE, TRUE, 0 );
    476517
     518    gtk_drag_dest_set( d, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY );
     519    gtk_drag_dest_add_uri_targets( d );
     520    gtk_drag_dest_add_text_targets( d );
     521    g_signal_connect( d, "drag-data-received", G_CALLBACK( on_drag_data_received ), ui );
     522
    477523    return d;
    478524}
  • trunk/qt/make-dialog.cc

    r11092 r11098  
    178178MakeDialog :: onFileSelected( const QStringList& list )
    179179{
    180     if( list.size() == 1 )
    181     {
    182         myFile = list.first( );
    183         myFileButton->setText( QFileInfo(myFile).fileName() );
    184         onSourceChanged( );
    185     }
     180    if( !list.empty( ) )
     181        onFileSelected( list.front( ) );
     182}
     183void
     184MakeDialog :: onFileSelected( const QString& filename )
     185{
     186    myFile = filename;
     187    myFileButton->setText( QFileInfo(myFile).fileName() );
     188    onSourceChanged( );
    186189}
    187190
     
    198201MakeDialog :: onFolderSelected( const QStringList& list )
    199202{
    200     if( list.size() == 1 )
    201     {
    202         myFolder = list.first();
    203         myFolderButton->setText( QFileInfo(myFolder).fileName() );
    204         onSourceChanged( );
    205     }
     203    if( !list.empty( ) )
     204        onFolderSelected( list.front( ) );
     205}
     206void
     207MakeDialog :: onFolderSelected( const QString& filename )
     208{
     209    myFolder = filename;
     210    myFolderButton->setText( QFileInfo(myFolder).fileName() );
     211    onSourceChanged( );
    206212}
    207213
     
    218224MakeDialog :: onDestinationSelected( const QStringList& list )
    219225{
    220     if( list.size() == 1 )
    221     {
    222         myDestination = list.first( );
    223         myDestinationButton->setText( QFileInfo(myDestination).fileName() );
    224     }
     226    if( !list.empty( ) )
     227        onDestinationSelected( list.front() );
     228}
     229void
     230MakeDialog :: onDestinationSelected( const QString& filename )
     231{
     232    myDestination = filename;
     233    myDestinationButton->setText( QFileInfo(myDestination).fileName() );
    225234}
    226235
     
    307316    myBuilder( 0 )
    308317{
     318    setAcceptDrops( true );
     319
    309320    connect( &myTimer, SIGNAL(timeout()), this, SLOT(onProgress()) );
    310321
     
    397408        tr_metaInfoBuilderFree( myBuilder );
    398409}
     410
     411/***
     412****
     413***/
     414
     415void
     416MakeDialog :: dragEnterEvent( QDragEnterEvent * event )
     417{
     418    const QMimeData * mime = event->mimeData( );
     419
     420    if( mime->urls().size() && QFile(mime->urls().front().path()).exists( ) )
     421        event->acceptProposedAction();
     422}
     423
     424void
     425MakeDialog :: dropEvent( QDropEvent * event )
     426{
     427    const QString filename = event->mimeData()->urls().front().path();
     428    const QFileInfo fileInfo( filename );
     429
     430    if( fileInfo.exists( ) )
     431    {
     432        if( fileInfo.isDir( ) )
     433        {
     434            myFolderRadio->setChecked( true );
     435            onFolderSelected( filename  );
     436        }
     437        else // it's a file
     438        {
     439            myFileRadio->setChecked( true );
     440            onFileSelected( filename );
     441        }
     442    }
     443}
  • trunk/qt/make-dialog.h

    r11092 r11098  
    4545
    4646        void onFolderClicked( );
     47        void onFolderSelected( const QString& );
    4748        void onFolderSelected( const QStringList& );
     49
    4850        void onFileClicked( );
     51        void onFileSelected( const QString& );
    4952        void onFileSelected( const QStringList& );
     53
    5054        void onDestinationClicked( );
     55        void onDestinationSelected( const QString& );
    5156        void onDestinationSelected( const QStringList& );
    5257
     
    8186        struct tr_metainfo_builder * myBuilder;
    8287
     88    protected:
     89        virtual void dragEnterEvent( QDragEnterEvent * );
     90        virtual void dropEvent( QDropEvent * );
     91
    8392    public:
    8493        MakeDialog( Session&, QWidget * parent = 0 );
Note: See TracChangeset for help on using the changeset viewer.