[gtk/matthiasc/for-master: 4/9] inspector: Support copying nodes to clipboard




commit e7284c23da13686156aa0eb7981374889032c40c
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Apr 2 21:38:14 2021 -0400

    inspector: Support copying nodes to clipboard
    
    Add a button that copies the serialization of the
    selected node to the clipboard.

 gtk/inspector/recorder.c  | 32 +++++++++++++++++++++++++++++++-
 gtk/inspector/recorder.ui |  9 +++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
---
diff --git a/gtk/inspector/recorder.c b/gtk/inspector/recorder.c
index c8042ca580..7b3ead81ee 100644
--- a/gtk/inspector/recorder.c
+++ b/gtk/inspector/recorder.c
@@ -66,6 +66,7 @@ struct _GtkInspectorRecorder
   GtkWidget *render_node_view;
   GtkWidget *render_node_list;
   GtkWidget *render_node_save_button;
+  GtkWidget *render_node_clip_button;
   GtkWidget *node_property_tree;
   GtkTreeModel *render_node_properties;
 
@@ -1168,12 +1169,15 @@ render_node_list_selection_changed (GtkListBox           *list,
   GtkTreeListRow *row_item;
 
   row_item = gtk_single_selection_get_selected_item (recorder->render_node_selection);
+
+  gtk_widget_set_sensitive (recorder->render_node_save_button, row_item != NULL);
+  gtk_widget_set_sensitive (recorder->render_node_clip_button, row_item != NULL);
+
   if (row_item == NULL)
     return;
 
   paintable = gtk_tree_list_row_get_item (row_item);
 
-  gtk_widget_set_sensitive (recorder->render_node_save_button, TRUE);
   gtk_picture_set_paintable (GTK_PICTURE (recorder->render_node_view), paintable);
   node = gtk_render_node_paintable_get_render_node (GTK_RENDER_NODE_PAINTABLE (paintable));
   populate_render_node_properties (GTK_LIST_STORE (recorder->render_node_properties), node);
@@ -1252,6 +1256,30 @@ render_node_save (GtkButton            *button,
   gtk_widget_show (dialog);
 }
 
+static void
+render_node_clip (GtkButton            *button,
+                  GtkInspectorRecorder *recorder)
+{
+  GskRenderNode *node;
+  GdkClipboard *clipboard;
+  GBytes *bytes;
+  GdkContentProvider *content;
+
+  node = get_selected_node (recorder);
+  if (node == NULL)
+    return;
+
+  bytes = gsk_render_node_serialize (node);
+  content = gdk_content_provider_new_for_bytes ("text/plain;charset=utf-8", bytes);
+
+  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (recorder));
+
+  gdk_clipboard_set_content (clipboard, content);
+
+  g_object_unref (content);
+  g_bytes_unref (bytes);
+}
+
 static void
 toggle_dark_mode (GtkToggleButton *button,
                   GParamSpec      *pspec,
@@ -1460,11 +1488,13 @@ gtk_inspector_recorder_class_init (GtkInspectorRecorderClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_view);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_list);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_save_button);
+  gtk_widget_class_bind_template_child (widget_class, GtkInspectorRecorder, render_node_clip_button);
   gtk_widget_class_bind_template_child (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_save);
+  gtk_widget_class_bind_template_callback (widget_class, render_node_clip);
   gtk_widget_class_bind_template_callback (widget_class, node_property_activated);
   gtk_widget_class_bind_template_callback (widget_class, toggle_dark_mode);
 
diff --git a/gtk/inspector/recorder.ui b/gtk/inspector/recorder.ui
index d2c932410d..de0d7cd9f3 100644
--- a/gtk/inspector/recorder.ui
+++ b/gtk/inspector/recorder.ui
@@ -54,6 +54,15 @@
                 <signal name="clicked" handler="render_node_save"/>
               </object>
             </child>
+            <child>
+              <object class="GtkButton" id="render_node_clip_button">
+                <property name="has-frame">0</property>
+                <property name="sensitive">0</property>
+                <property name="icon-name">edit-copy-symbolic</property>
+                <property name="tooltip-text" translatable="yes">Copy to clipboard</property>
+                <signal name="clicked" handler="render_node_clip"/>
+              </object>
+            </child>
           </object>
         </child>
         <child>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]