diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2008-11-01 23:16:07 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2008-11-01 23:16:07 +0000 |
commit | a2c01f0fab5e0106f6053bbbcbc5818b80eaa785 (patch) | |
tree | 8a923bbf9e2a56f983fd23e99e91b04e066b88a1 | |
parent | 1db8e3cc3f23656dcc76b51c76d68d17d2274610 (diff) |
Save traces.
-rw-r--r-- | src/main.c | 73 |
1 files changed, 72 insertions, 1 deletions
@@ -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", "<control>E", "Execute a new trace", G_CALLBACK (execute_command_dlg) }, { "Save", GTK_STOCK_SAVE, "_Save", "<control>S", - "Save the trace", G_CALLBACK (gtk_main_quit) }, + "Save the trace", G_CALLBACK (save_trace_cb) }, { "Print", GTK_STOCK_PRINT, "_Print", "<control>P", "Print the trace", G_CALLBACK (print_trace_cb) }, { "Quit", GTK_STOCK_QUIT, "_Quit", "<control>Q", |