diff --git a/gtk/makemeta-ui.c b/gtk/makemeta-ui.c index 6d42c8398..5c5e34ef4 100644 --- a/gtk/makemeta-ui.c +++ b/gtk/makemeta-ui.c @@ -26,7 +26,6 @@ typedef struct { - char torrent_name[2048]; GtkWidget * size_lb; GtkWidget * pieces_lb; GtkWidget * announce_entry; @@ -34,9 +33,11 @@ typedef struct GtkWidget * progressbar; GtkWidget * private_check; GtkWidget * dialog; - GtkWidget * progress_dialog; + tr_metainfo_builder * builder; tr_handle * handle; + + gboolean isBuilding; } MakeMetaUI; @@ -50,18 +51,26 @@ freeMetaUI( gpointer p ) } static void -progress_response_cb ( GtkDialog *d UNUSED, int response, gpointer user_data ) +refreshButtons( MakeMetaUI * ui ) { - MakeMetaUI * ui = (MakeMetaUI *) user_data; + GtkDialog * d = GTK_DIALOG( ui->dialog ); + gtk_dialog_set_response_sensitive( d, GTK_RESPONSE_ACCEPT, !ui->isBuilding && ( ui->builder!=NULL ) ); + gtk_dialog_set_response_sensitive( d, GTK_RESPONSE_CLOSE, !ui->isBuilding ); + gtk_dialog_set_response_sensitive( d, GTK_RESPONSE_CANCEL, ui->isBuilding ); +} - if( response == GTK_RESPONSE_CANCEL ) - { - ui->builder->abortFlag = TRUE; - } - else - { - gtk_widget_destroy( ui->dialog ); - } +static void +setIsBuilding( MakeMetaUI * ui, gboolean isBuilding ) +{ + ui->isBuilding = isBuilding; + + if( ui->builder != NULL ) + ui->builder->failed = FALSE; + + if( !isBuilding ) + gtk_progress_bar_set_fraction( GTK_PROGRESS_BAR( ui->progressbar ), 0 ); + + refreshButtons( ui ); } static gboolean @@ -76,33 +85,26 @@ refresh_cb ( gpointer user_data ) denom = ui->builder->pieceCount ? ui->builder->pieceCount : 1; fraction = (double)ui->builder->pieceIndex / denom; gtk_progress_bar_set_fraction( p, fraction ); - g_snprintf( buf, sizeof(buf), "%s (%d%%)", ui->torrent_name, (int)(fraction*100)); + g_snprintf( buf, sizeof(buf), "%s.torrent (%d%%)", ui->builder->top, (int)(fraction*100) ); gtk_progress_bar_set_text( p, buf ); if( ui->builder->isDone ) { - GtkWidget * w; - if( ui->builder->failed ) { const char * reason = ui->builder->abortFlag - ? _("Torrent creation aborted.") + ? _("Torrent creation cancelled.") : _("Torrent creation failed."); - w = gtk_message_dialog_new (GTK_WINDOW(ui->progress_dialog), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, reason ); - gtk_dialog_run( GTK_DIALOG( w ) ); - gtk_widget_destroy( ui->progress_dialog ); + + gtk_progress_bar_set_text( p, reason ); + gtk_progress_bar_set_fraction( p, 0 ); } else { - GtkWidget * w = ui->progress_dialog; - gtk_window_set_title (GTK_WINDOW(ui->progress_dialog), _("Torrent Created")); - gtk_dialog_set_response_sensitive (GTK_DIALOG(w), GTK_RESPONSE_CANCEL, FALSE); - gtk_dialog_set_response_sensitive (GTK_DIALOG(w), GTK_RESPONSE_CLOSE, TRUE); - gtk_progress_bar_set_text( p, buf ); + gtk_progress_bar_set_text( p, _("Torrent Created") ); } + + setIsBuilding( ui, FALSE ); } return !ui->builder->isDone; @@ -118,41 +120,39 @@ static void response_cb( GtkDialog* d, int response, gpointer user_data ) { MakeMetaUI * ui = (MakeMetaUI*) user_data; - GtkWidget *w, *p, *fr; char *tmp; char buf[1024]; guint tag; if( response != GTK_RESPONSE_ACCEPT ) { - gtk_widget_destroy( GTK_WIDGET( d ) ); + if( ui->builder == NULL ) + { + gtk_widget_destroy( GTK_WIDGET( d ) ); + return; + } + + if( ui->builder->isDone || !ui->isBuilding ) + { + gtk_widget_destroy( ui->dialog ); + } + else + { + ui->builder->abortFlag = TRUE; + } + return; } - if( ui->builder == NULL ) + if( ui->builder == NULL || ui->isBuilding ) return; - w = gtk_dialog_new_with_buttons( _("Making Torrent..."), - GTK_WINDOW(d), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL ); - g_signal_connect( w, "response", G_CALLBACK(progress_response_cb), ui ); - ui->progress_dialog = w; - gtk_dialog_set_response_sensitive (GTK_DIALOG(w), GTK_RESPONSE_CLOSE, FALSE); + setIsBuilding( ui, TRUE ); tmp = g_path_get_basename (ui->builder->top); - g_snprintf( ui->torrent_name, sizeof(ui->torrent_name), "%s.torrent", tmp ); - g_snprintf( buf, sizeof(buf), "%s (%d%%)", ui->torrent_name, 0); - p = ui->progressbar = gtk_progress_bar_new (); - gtk_progress_bar_set_text( GTK_PROGRESS_BAR(p), buf ); - fr = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME(fr), GTK_SHADOW_NONE); - gtk_container_set_border_width( GTK_CONTAINER(fr), 20 ); - gtk_container_add (GTK_CONTAINER(fr), p); - gtk_box_pack_start_defaults( GTK_BOX(GTK_DIALOG(w)->vbox), fr ); - gtk_widget_show_all ( w ); + g_snprintf( buf, sizeof(buf), "%s.torrent (%d%%)", ui->builder->top, 0 ); + + gtk_progress_bar_set_text( GTK_PROGRESS_BAR(ui->progressbar), buf ); g_free( tmp ); tr_makeMetaInfo( ui->builder, @@ -162,7 +162,7 @@ response_cb( GtkDialog* d, int response, gpointer user_data ) gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( ui->private_check ) ) ); tag = g_timeout_add (UPDATE_INTERVAL_MSEC, refresh_cb, ui); - g_object_set_data_full (G_OBJECT(w), "tag", GUINT_TO_POINTER(tag), remove_tag); + g_object_set_data_full (G_OBJECT(d), "tag", GUINT_TO_POINTER(tag), remove_tag); } /*** @@ -175,7 +175,7 @@ file_selection_changed_cb( GtkFileChooser *chooser, gpointer user_data ) MakeMetaUI * ui = (MakeMetaUI *) user_data; char * filename; char sizeStr[128]; - char buf[512]; + char buf[MAX_PATH_LENGTH]; uint64_t totalSize=0; int fileCount=0, pieceCount=0, pieceSize=0; @@ -185,14 +185,19 @@ file_selection_changed_cb( GtkFileChooser *chooser, gpointer user_data ) } filename = gtk_file_chooser_get_filename( chooser ); - if( filename ) { + if( !filename ) + *buf = '\0'; + else { ui->builder = tr_metaInfoBuilderCreate( ui->handle, filename ); + g_snprintf( buf, sizeof(buf), "%s.torrent (%d%%)", filename, 0 ); g_free( filename ); fileCount = ui->builder->fileCount; totalSize = ui->builder->totalSize; pieceCount = ui->builder->pieceCount; pieceSize = ui->builder->pieceSize; } + gtk_progress_bar_set_text( GTK_PROGRESS_BAR( ui->progressbar ), buf ); + refreshButtons( ui ); tr_strlsize( sizeStr, totalSize, sizeof(sizeStr) ); g_snprintf( buf, sizeof(buf), "%s; %d %s", @@ -222,6 +227,7 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) { int row = 0; GtkWidget *d, *t, *w, *h, *rb_file, *rb_dir; + GtkBox * main_vbox; char name[256]; MakeMetaUI * ui = g_new0 ( MakeMetaUI, 1 ); ui->handle = handle; @@ -230,11 +236,13 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) parent, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, GTK_STOCK_NEW, GTK_RESPONSE_ACCEPT, NULL ); g_signal_connect( d, "response", G_CALLBACK(response_cb), ui ); g_object_set_data_full( G_OBJECT(d), "ui", ui, freeMetaUI ); ui->dialog = d; + main_vbox = GTK_BOX( GTK_DIALOG( d )->vbox ); t = hig_workarea_create (); @@ -291,9 +299,21 @@ make_meta_ui( GtkWindow * parent, tr_handle * handle ) w = ui->comment_entry = gtk_entry_new( ); hig_workarea_add_row (t, &row, name, w, NULL ); + hig_workarea_finish( t, &row ); + gtk_box_pack_start_defaults( main_vbox, t ); + + w = gtk_frame_new( NULL ); + gtk_frame_set_shadow_type( GTK_FRAME( w ), GTK_SHADOW_NONE ); + gtk_container_set_border_width( GTK_CONTAINER( w ), GUI_PAD_BIG ); + + ui->progressbar = gtk_progress_bar_new( ); + gtk_progress_bar_set_text( GTK_PROGRESS_BAR( ui->progressbar), _( "No Files Selected" ) ); + gtk_container_add( GTK_CONTAINER( w ), ui->progressbar ); + + gtk_box_pack_start( main_vbox, w, FALSE, FALSE, GUI_PAD_BIG ); gtk_window_set_default_size( GTK_WINDOW(d), 400u, 0u ); - gtk_box_pack_start_defaults( GTK_BOX(GTK_DIALOG(d)->vbox), t ); gtk_widget_show_all( GTK_DIALOG(d)->vbox ); + setIsBuilding( ui, FALSE ); return d; }