[gtk+] inspector: Add a render node save button
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] inspector: Add a render node save button
- Date: Fri, 23 Dec 2016 07:44:06 +0000 (UTC)
commit 91c71b10e67f85961f2f87b3ef3cfa88f94c008d
Author: Benjamin Otte <otte redhat com>
Date: Wed Dec 21 06:50:39 2016 +0100
inspector: Add a render node save button
Now we can select buggy nodes, save them to a file, and add that file to
our testsuite.
gtk/inspector/recorder.c | 85 ++++++++++++++++++++++++++++++++++++++++++++-
gtk/inspector/recorder.ui | 12 ++++++
2 files changed, 96 insertions(+), 1 deletions(-)
---
diff --git a/gtk/inspector/recorder.c b/gtk/inspector/recorder.c
index e39bdab..25f98a5 100644
--- a/gtk/inspector/recorder.c
+++ b/gtk/inspector/recorder.c
@@ -21,8 +21,10 @@
#include "recorder.h"
#include <gtk/gtkbox.h>
+#include <gtk/gtkfilechooserdialog.h>
#include <gtk/gtklabel.h>
#include <gtk/gtklistbox.h>
+#include <gtk/gtkmessagedialog.h>
#include <gtk/gtktogglebutton.h>
#include <gtk/gtktreeselection.h>
#include <gtk/gtktreeview.h>
@@ -43,6 +45,7 @@ struct _GtkInspectorRecorderPrivate
GtkWidget *recordings_list;
GtkWidget *render_node_view;
GtkWidget *render_node_tree;
+ GtkWidget *render_node_save_button;
GtkWidget *node_property_tree;
GtkTreeModel *render_node_properties;
@@ -219,14 +222,92 @@ render_node_list_selection_changed (GtkTreeSelection *selection,
GtkTreeIter iter;
if (!gtk_tree_selection_get_selected (selection, NULL, &iter))
- return;
+ {
+ gtk_widget_set_sensitive (priv->render_node_save_button, FALSE);
+ return;
+ }
+ gtk_widget_set_sensitive (priv->render_node_save_button, TRUE);
node = gtk_tree_model_render_node_get_node_from_iter (GTK_TREE_MODEL_RENDER_NODE
(priv->render_node_model), &iter);
gtk_render_node_view_set_render_node (GTK_RENDER_NODE_VIEW (priv->render_node_view), node);
populate_render_node_properties (GTK_LIST_STORE (priv->render_node_properties), node);
}
+static void
+render_node_save_response (GtkWidget *dialog,
+ gint response,
+ GskRenderNode *node)
+{
+ gtk_widget_hide (dialog);
+
+ if (response == GTK_RESPONSE_ACCEPT)
+ {
+ GBytes *bytes = gsk_render_node_serialize (node);
+ GError *error = NULL;
+
+ if (!g_file_replace_contents (gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog)),
+ g_bytes_get_data (bytes, NULL),
+ g_bytes_get_size (bytes),
+ NULL,
+ FALSE,
+ 0,
+ NULL,
+ NULL,
+ &error))
+ {
+ GtkWidget *message_dialog;
+
+ message_dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_window_get_transient_for (GTK_WINDOW
(dialog))),
+ GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_INFO,
+ GTK_BUTTONS_OK,
+ _("Saving RenderNode failed"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (message_dialog),
+ "%s", error->message);
+ g_signal_connect (message_dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
+ gtk_widget_show (message_dialog);
+ g_error_free (error);
+ }
+
+ g_bytes_unref (bytes);
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+static void
+render_node_save (GtkButton *button,
+ GtkInspectorRecorder *recorder)
+{
+ GtkInspectorRecorderPrivate *priv = gtk_inspector_recorder_get_instance_private (recorder);
+ GskRenderNode *node;
+ GtkTreeIter iter;
+ GtkWidget *dialog;
+ char *filename;
+
+ if (!gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW
(priv->render_node_tree)), NULL, &iter))
+ return;
+
+ node = gtk_tree_model_render_node_get_node_from_iter (GTK_TREE_MODEL_RENDER_NODE
(priv->render_node_model), &iter);
+
+ dialog = gtk_file_chooser_dialog_new ("",
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (recorder))),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_Save"), GTK_RESPONSE_ACCEPT,
+ NULL);
+ filename = g_strdup_printf ("%s.node", gsk_render_node_get_name (node) ? gsk_render_node_get_name (node)
+ : node_type_name
(gsk_render_node_get_node_type (node)));
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), filename);
+ g_free (filename);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_ACCEPT);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
+ g_signal_connect (dialog, "response", G_CALLBACK (render_node_save_response), node);
+ gtk_widget_show (dialog);
+}
+
static char *
format_timespan (gint64 timespan)
{
@@ -394,11 +475,13 @@ gtk_inspector_recorder_class_init (GtkInspectorRecorderClass *klass)
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorRecorder, recordings_list);
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorRecorder, render_node_view);
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorRecorder, render_node_tree);
+ gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorRecorder, render_node_save_button);
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorRecorder, node_property_tree);
gtk_widget_class_bind_template_callback (widget_class, recordings_clear_all);
gtk_widget_class_bind_template_callback (widget_class, recordings_list_row_selected);
gtk_widget_class_bind_template_callback (widget_class, render_node_list_selection_changed);
+ gtk_widget_class_bind_template_callback (widget_class, render_node_save);
}
static void
diff --git a/gtk/inspector/recorder.ui b/gtk/inspector/recorder.ui
index b7fc96f..6ee0933 100644
--- a/gtk/inspector/recorder.ui
+++ b/gtk/inspector/recorder.ui
@@ -33,6 +33,18 @@
<property name="stack">render_stack</property>
</object>
</child>
+ <child>
+ <object class="GtkButton" id="render_node_save_button">
+ <property name="visible">1</property>
+ <property name="relief">none</property>
+ <property name="sensitive">0</property>
+ <property name="icon-name">document-save-as-symbolic</property>
+ <signal name="clicked" handler="render_node_save"/>
+ </object>
+ <packing>
+ <property name="pack-type">end</property>
+ </packing>
+ </child>
</object>
</child>
<child>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]