mirror of
https://github.com/transmission/transmission.git
synced 2025-12-24 12:28:52 +00:00
(gtk) try to iron out the remaining "add torrent" issues reported by wereHamster and Lacrocivous
This commit is contained in:
160
gtk/dialogs.c
160
gtk/dialogs.c
@@ -33,152 +33,6 @@
|
||||
#include "tr-core.h"
|
||||
#include "tr-prefs.h"
|
||||
|
||||
struct dirdata
|
||||
{
|
||||
GtkWidget * widget;
|
||||
TrCore * core;
|
||||
GList * files;
|
||||
tr_ctor * ctor;
|
||||
};
|
||||
|
||||
static void
|
||||
promptdirnocore( gpointer gdata, GObject * core UNUSED )
|
||||
{
|
||||
struct dirdata * stuff = gdata;
|
||||
|
||||
/* prevent the response callback from trying to remove the weak
|
||||
reference which no longer exists */
|
||||
stuff->core = NULL;
|
||||
|
||||
gtk_dialog_response( GTK_DIALOG( stuff->widget ), GTK_RESPONSE_NONE );
|
||||
}
|
||||
|
||||
static void
|
||||
promptresp( GtkWidget * widget, gint resp, gpointer data )
|
||||
{
|
||||
struct dirdata * stuff;
|
||||
|
||||
stuff = data;
|
||||
|
||||
if( GTK_RESPONSE_ACCEPT == resp )
|
||||
{
|
||||
char * dir;
|
||||
GList * l;
|
||||
|
||||
/* update the destination */
|
||||
dir = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( widget ) );
|
||||
tr_ctorSetDestination( stuff->ctor, TR_FORCE, dir );
|
||||
g_free( dir );
|
||||
|
||||
/* if there's metainfo in the ctor already, use it */
|
||||
if( !tr_ctorGetMetainfo( stuff->ctor, NULL ) )
|
||||
tr_core_add_ctor( stuff->core, stuff->ctor );
|
||||
|
||||
/* if there's a list of files, use them too */
|
||||
for( l=stuff->files; l!=NULL; l=l->next )
|
||||
if( !tr_ctorSetMetainfoFromFile( stuff->ctor, l->data ) )
|
||||
tr_core_add_ctor( stuff->core, stuff->ctor );
|
||||
}
|
||||
|
||||
if( stuff->core )
|
||||
g_object_weak_unref( G_OBJECT( stuff->core ), promptdirnocore, stuff );
|
||||
|
||||
gtk_widget_destroy( widget );
|
||||
freestrlist( stuff->files );
|
||||
tr_ctorFree( stuff->ctor );
|
||||
g_free( stuff );
|
||||
}
|
||||
|
||||
void
|
||||
fmtpeercount( GtkLabel * label, int count )
|
||||
{
|
||||
char str[16];
|
||||
|
||||
if( 0 > count )
|
||||
{
|
||||
gtk_label_set_text( label, "?" );
|
||||
}
|
||||
else
|
||||
{
|
||||
g_snprintf( str, sizeof str, "%i", count );
|
||||
gtk_label_set_text( label, str );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
deleteToggled( GtkToggleButton * tb, gpointer ctor )
|
||||
{
|
||||
tr_ctorSetDeleteSource( ctor, gtk_toggle_button_get_active( tb ) );
|
||||
}
|
||||
|
||||
static void
|
||||
startToggled( GtkToggleButton * tb, gpointer ctor )
|
||||
{
|
||||
tr_ctorSetPaused( ctor, TR_FORCE, !gtk_toggle_button_get_active( tb ) );
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
promptfordir( GtkWindow * parent, TrCore * core, GList * files, tr_ctor * ctor )
|
||||
{
|
||||
uint8_t flag = 0;
|
||||
const char * str;
|
||||
struct dirdata * stuff;
|
||||
GtkWidget * wind;
|
||||
GtkWidget * v;
|
||||
GtkWidget * w;
|
||||
|
||||
stuff = g_new0( struct dirdata, 1 );
|
||||
stuff->core = core;
|
||||
stuff->ctor = ctor;
|
||||
stuff->files = dupstrlist( files );
|
||||
|
||||
g_object_weak_ref( G_OBJECT( core ), promptdirnocore, stuff );
|
||||
|
||||
wind = gtk_file_chooser_dialog_new( _("Destination folder"), parent,
|
||||
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
|
||||
NULL );
|
||||
gtk_dialog_set_alternative_button_order( GTK_DIALOG( wind ),
|
||||
GTK_RESPONSE_ACCEPT,
|
||||
GTK_RESPONSE_CANCEL,
|
||||
-1 );
|
||||
gtk_file_chooser_set_local_only( GTK_FILE_CHOOSER( wind ), TRUE );
|
||||
gtk_file_chooser_set_select_multiple( GTK_FILE_CHOOSER( wind ), FALSE );
|
||||
if( tr_ctorGetDestination( ctor, TR_FORCE, &str ) )
|
||||
g_assert_not_reached( );
|
||||
if( !gtk_file_chooser_set_filename( GTK_FILE_CHOOSER( wind ), str ) )
|
||||
g_warning( "couldn't set destination '%s'", str );
|
||||
|
||||
v = gtk_vbox_new( FALSE, GUI_PAD );
|
||||
|
||||
flag = 0;
|
||||
w = gtk_check_button_new_with_mnemonic( _( "_Trash original torrent files" ) );
|
||||
g_signal_connect( w, "toggled", G_CALLBACK( deleteToggled ), ctor );
|
||||
if( tr_ctorGetDeleteSource( ctor, &flag ) )
|
||||
g_assert_not_reached( );
|
||||
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), flag );
|
||||
gtk_box_pack_start( GTK_BOX( v ), w, FALSE, FALSE, 0 );
|
||||
|
||||
flag = 1;
|
||||
w = gtk_check_button_new_with_mnemonic( _( "_Start when added" ) );
|
||||
g_signal_connect( w, "toggled", G_CALLBACK( startToggled ), ctor );
|
||||
if( tr_ctorGetPaused( ctor, TR_FORCE, &flag ) )
|
||||
g_assert_not_reached( );
|
||||
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), !flag );
|
||||
gtk_box_pack_start( GTK_BOX( v ), w, FALSE, FALSE, 0 );
|
||||
|
||||
gtk_file_chooser_set_extra_widget( GTK_FILE_CHOOSER( wind ), v );
|
||||
|
||||
stuff->widget = wind;
|
||||
|
||||
g_signal_connect( G_OBJECT( wind ), "response",
|
||||
G_CALLBACK( promptresp ), stuff );
|
||||
|
||||
gtk_widget_show_all( wind );
|
||||
return wind;
|
||||
}
|
||||
|
||||
/***
|
||||
****
|
||||
***/
|
||||
@@ -287,17 +141,17 @@ askquit( TrCore * core,
|
||||
struct DeleteData
|
||||
{
|
||||
gboolean delete_files;
|
||||
GList * torrents;
|
||||
GSList * torrents;
|
||||
TrCore * core;
|
||||
};
|
||||
|
||||
static void
|
||||
removeTorrents( struct DeleteData * data )
|
||||
{
|
||||
GList * l;
|
||||
GSList * l;
|
||||
for( l=data->torrents; l!=NULL; l=l->next )
|
||||
tr_core_remove_torrent( data->core, l->data, data->delete_files );
|
||||
g_list_free( data->torrents );
|
||||
g_slist_free( data->torrents );
|
||||
}
|
||||
|
||||
|
||||
@@ -309,7 +163,7 @@ removeResponse( GtkDialog * dialog, gint response, gpointer gdata )
|
||||
if( response == GTK_RESPONSE_ACCEPT )
|
||||
removeTorrents( data );
|
||||
else
|
||||
g_list_foreach( data->torrents, (GFunc)g_object_unref, NULL );
|
||||
g_slist_foreach( data->torrents, (GFunc)g_object_unref, NULL );
|
||||
|
||||
gtk_widget_destroy( GTK_WIDGET( dialog ) );
|
||||
g_free( data );
|
||||
@@ -327,13 +181,13 @@ countBusyTorrents( gpointer gtor, gpointer busyCount )
|
||||
void
|
||||
confirmRemove( GtkWindow * parent,
|
||||
TrCore * core,
|
||||
GList * torrents,
|
||||
GSList * torrents,
|
||||
gboolean delete_files )
|
||||
{
|
||||
GtkWidget * d;
|
||||
struct DeleteData * dd;
|
||||
int busyCount;
|
||||
const int count = g_list_length( torrents );
|
||||
const int count = g_slist_length( torrents );
|
||||
const char * primary_text;
|
||||
const char * secondary_text;
|
||||
|
||||
@@ -346,7 +200,7 @@ confirmRemove( GtkWindow * parent,
|
||||
dd->delete_files = delete_files;
|
||||
|
||||
busyCount = 0;
|
||||
g_list_foreach( torrents, countBusyTorrents, &busyCount );
|
||||
g_slist_foreach( torrents, countBusyTorrents, &busyCount );
|
||||
|
||||
if( !busyCount && !delete_files ) /* don't prompt boring torrents */
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user