[gtk+] inspector: Allow jumping to actions
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] inspector: Allow jumping to actions
- Date: Sat, 31 May 2014 03:23:03 +0000 (UTC)
commit 5ed6653859f6782ef4a62f0b06f9e35a2360a748
Author: Matthias Clasen <mclasen redhat com>
Date: Fri May 30 22:56:12 2014 -0400
inspector: Allow jumping to actions
The property editor for action-name properties now offers
to go to the object where the action is defined.
gtk/inspector/prop-editor.c | 105 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 105 insertions(+), 0 deletions(-)
---
diff --git a/gtk/inspector/prop-editor.c b/gtk/inspector/prop-editor.c
index f81d002..213592d 100644
--- a/gtk/inspector/prop-editor.c
+++ b/gtk/inspector/prop-editor.c
@@ -19,6 +19,7 @@
#include <glib/gi18n-lib.h>
#include "prop-editor.h"
#include "widget-tree.h"
+#include "gtkwidgetprivate.h"
struct _GtkInspectorPropEditorPrivate
{
@@ -1198,6 +1199,104 @@ attribute_editor (GObject *object,
return vbox;
}
+static GtkWidget *
+action_ancestor (GtkWidget *widget)
+{
+ if (GTK_IS_MENU (widget))
+ return gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else if (GTK_IS_POPOVER (widget))
+ return gtk_popover_get_relative_to (GTK_POPOVER (widget));
+ else
+ return gtk_widget_get_parent (widget);
+}
+
+static GObject *
+find_action_owner (GtkActionable *actionable)
+{
+ GtkWidget *widget = GTK_WIDGET (actionable);
+ const gchar *full_name;
+ const gchar *dot;
+ const gchar *name;
+ gchar *prefix;
+ GtkWidget *win;
+ GActionGroup *group;
+
+ full_name = gtk_actionable_get_action_name (actionable);
+ dot = strchr (full_name, '.');
+ prefix = g_strndup (full_name, dot - full_name);
+ name = dot + 1;
+
+ win = gtk_widget_get_ancestor (widget, GTK_TYPE_APPLICATION_WINDOW);
+ if (g_strcmp0 (prefix, "win") == 0)
+ {
+ if (G_IS_OBJECT (win))
+ return (GObject *)win;
+ }
+ else if (g_strcmp0 (prefix, "app") == 0)
+ {
+ if (GTK_IS_WINDOW (win))
+ return (GObject *)gtk_window_get_application (GTK_WINDOW (win));
+ }
+ else
+ {
+ while (widget != NULL)
+ {
+ group = _gtk_widget_get_action_group (widget, prefix);
+ if (group && g_action_group_has_action (group, name))
+ return (GObject *)widget;
+ widget = action_ancestor (widget);
+ }
+ }
+
+ return NULL;
+}
+
+static void
+show_action_owner (GtkButton *button,
+ GtkInspectorPropEditor *editor)
+{
+ GObject *owner;
+
+ owner = g_object_get_data (G_OBJECT (button), "owner");
+ g_signal_emit (editor, signals[SHOW_OBJECT], 0, owner, NULL);
+}
+
+static GtkWidget *
+action_editor (GObject *object,
+ GtkInspectorPropEditor *editor)
+{
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *box;
+ GtkWidget *button;
+ GObject *owner;
+ gchar *text;
+
+ owner = find_action_owner (GTK_ACTIONABLE (object));
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ if (owner)
+ {
+ label = gtk_label_new (_("Action"));
+ gtk_widget_set_margin_top (label, 10);
+ gtk_container_add (GTK_CONTAINER (vbox), label);
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
+ text = g_strdup_printf (_("Defined at: %p (%s)"),
+ owner, g_type_name_from_instance ((GTypeInstance *)owner));
+ gtk_container_add (GTK_CONTAINER (box), gtk_label_new (text));
+ g_free (text);
+ button = gtk_button_new_with_label (_("Properties"));
+ g_object_set_data (G_OBJECT (button), "owner", owner);
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (show_action_owner), editor);
+ gtk_container_add (GTK_CONTAINER (box), button);
+ gtk_container_add (GTK_CONTAINER (vbox), box);
+ gtk_widget_show_all (vbox);
+ }
+
+ return vbox;
+}
+
static void
constructed (GObject *object)
{
@@ -1225,6 +1324,12 @@ constructed (GObject *object)
if (GTK_IS_CELL_RENDERER (editor->priv->object))
gtk_container_add (GTK_CONTAINER (editor),
attribute_editor (editor->priv->object, spec, editor));
+
+ if (GTK_IS_ACTIONABLE (editor->priv->object) &&
+ g_strcmp0 (editor->priv->name, "action-name") == 0)
+ gtk_container_add (GTK_CONTAINER (editor),
+ action_editor (editor->priv->object, editor));
+
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]