From a2c01f0fab5e0106f6053bbbcbc5818b80eaa785 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 1 Nov 2008 23:16:07 +0000 Subject: Save traces. --- src/main.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index cb3f46a..53313dd 100644 --- a/src/main.c +++ b/src/main.c @@ -218,6 +218,77 @@ print_trace_cb (GtkAction *action, sphinx_t *sphinx) g_object_unref (operation); } +static void +save_trace_cb (GtkAction *action, sphinx_t *sphinx) +{ + GtkTextIter start, end; + GtkWidget *dialog; + GtkFileFilter *filter; + gchar *filename; + gchar *text; + gboolean ok; + GError *error = NULL; + + dialog = gtk_file_chooser_dialog_new ("Choose location to save trace...", + GTK_WINDOW (sphinx->window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, + GTK_RESPONSE_OK, + NULL); + + if (sphinx->trace_name != NULL) { + gchar *s; + + s = strchr (filename = sphinx->trace_name, ' '); + if (s != NULL) { + filename = g_strndup (sphinx->trace_name, + s - sphinx->trace_name); + } + s = g_strconcat (filename, ".trace", NULL); + if (filename != sphinx->trace_name) + g_free (filename); + + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), s); + g_free (s); + } + gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), + TRUE); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, "Traces"); + gtk_file_filter_add_pattern (filter, "*.trace"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + + filter = gtk_file_filter_new (); + gtk_file_filter_set_name (filter, "All"); + gtk_file_filter_add_pattern (filter, "*"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + + ok = gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK; + filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + gtk_widget_destroy (dialog); + + gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (sphinx->buffer), + &start, &end); + text = gtk_text_buffer_get_text (GTK_TEXT_BUFFER (sphinx->buffer), + &start, &end, FALSE); + if (! g_file_set_contents (filename, text, -1, &error)) { + dialog = gtk_message_dialog_new (GTK_WINDOW (sphinx->window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "Failed to save trace '%s': %s", + filename, error->message); + g_signal_connect (dialog, + "response", G_CALLBACK (gtk_widget_destroy), NULL); + gtk_widget_show (dialog); + g_error_free (error); + } + g_free (text); +} + static gchar ** prepend_search_path (const gchar *const *dirs, const gchar *const *paths) { @@ -690,7 +761,7 @@ sphinx_new (void) { "Execute", GTK_STOCK_EXECUTE, "_Execute", "E", "Execute a new trace", G_CALLBACK (execute_command_dlg) }, { "Save", GTK_STOCK_SAVE, "_Save", "S", - "Save the trace", G_CALLBACK (gtk_main_quit) }, + "Save the trace", G_CALLBACK (save_trace_cb) }, { "Print", GTK_STOCK_PRINT, "_Print", "P", "Print the trace", G_CALLBACK (print_trace_cb) }, { "Quit", GTK_STOCK_QUIT, "_Quit", "Q", -- cgit v1.2.3