[gnome-builder] gui: add stateful action helper



commit e9e6134c962a0baefa0c41732b1700cd6ffebeb2
Author: Christian Hergert <chergert redhat com>
Date:   Thu Mar 14 13:17:07 2019 -0700

    gui: add stateful action helper
    
    This will return TRUE if the action is known to be stateful.

 src/libide/gui/ide-gui-global.c  | 78 ++++++++++++++++++++++++++++++++++++++++
 src/libide/gui/ide-gui-private.h |  2 ++
 2 files changed, 80 insertions(+)
---
diff --git a/src/libide/gui/ide-gui-global.c b/src/libide/gui/ide-gui-global.c
index bf4063367..fac619753 100644
--- a/src/libide/gui/ide-gui-global.c
+++ b/src/libide/gui/ide-gui-global.c
@@ -356,3 +356,81 @@ ide_gtk_window_present (GtkWindow *window)
    */
   gtk_window_present_with_time (window, g_get_monotonic_time () / 1000L);
 }
+
+static void
+split_action_name (const gchar  *action_name,
+                   gchar       **prefix,
+                   gchar       **name)
+{
+  const gchar *dot;
+
+  g_assert (prefix != NULL);
+  g_assert (name != NULL);
+
+  *prefix = NULL;
+  *name = NULL;
+
+  if (action_name == NULL)
+    return;
+
+  dot = strchr (action_name, '.');
+
+  if (dot == NULL)
+    *name = g_strdup (action_name);
+  else
+    {
+      *prefix = g_strndup (action_name, dot - action_name);
+      *name = g_strdup (dot + 1);
+    }
+}
+
+gboolean
+_ide_gtk_widget_action_is_stateful (GtkWidget   *widget,
+                                    const gchar *action_name)
+{
+  g_autofree gchar *name = NULL;
+  g_autofree gchar *prefix = NULL;
+  GtkWidget *toplevel;
+  GApplication *app;
+  GActionGroup *group = NULL;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+  g_return_val_if_fail (action_name, FALSE);
+
+  split_action_name (action_name, &prefix, &name);
+
+  app = g_application_get_default ();
+  toplevel = gtk_widget_get_toplevel (widget);
+
+  while ((group == NULL) && (widget != NULL))
+    {
+      group = gtk_widget_get_action_group (widget, prefix);
+
+      if G_UNLIKELY (GTK_IS_POPOVER (widget))
+        {
+          GtkWidget *relative_to;
+
+          relative_to = gtk_popover_get_relative_to (GTK_POPOVER (widget));
+
+          if (relative_to != NULL)
+            widget = relative_to;
+          else
+            widget = gtk_widget_get_parent (widget);
+        }
+      else
+        {
+          widget = gtk_widget_get_parent (widget);
+        }
+    }
+
+  if (!group && g_str_equal (prefix, "win") && G_IS_ACTION_GROUP (toplevel))
+    group = G_ACTION_GROUP (toplevel);
+
+  if (!group && g_str_equal (prefix, "app") && G_IS_ACTION_GROUP (app))
+    group = G_ACTION_GROUP (app);
+
+  if (group && g_action_group_has_action (group, name))
+    return g_action_group_get_action_state_type (group, name) != NULL;
+
+  return FALSE;
+}
diff --git a/src/libide/gui/ide-gui-private.h b/src/libide/gui/ide-gui-private.h
index a400d0eb8..764b923c3 100644
--- a/src/libide/gui/ide-gui-private.h
+++ b/src/libide/gui/ide-gui-private.h
@@ -43,6 +43,8 @@
 
 G_BEGIN_DECLS
 
+gboolean  _ide_gtk_widget_action_is_stateful    (GtkWidget           *widget,
+                                                 const gchar         *action_name);
 void      _ide_frame_init_actions               (IdeFrame            *self);
 void      _ide_frame_init_shortcuts             (IdeFrame            *self);
 void      _ide_frame_update_actions             (IdeFrame            *self);


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