Blame plugins/gtk+/glade-gtk-popover-menu.c

Packit 1e8aac
/*
Packit 1e8aac
 * glade-gtk-popovermenu.c - GladeWidgetAdaptor for GtkPopoverMenu
Packit 1e8aac
 *
Packit 1e8aac
 * Copyright (C) 2014 Red Hat, Inc
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *      Matthias Clasen <mclasen@redhat.com>
Packit 1e8aac
 *
Packit 1e8aac
 * This library is free software; you can redistribute it and/or modify it
Packit 1e8aac
 * under the terms of the GNU Lesser General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2.1 of
Packit 1e8aac
 * the License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This library is distributed in the hope that it will be useful, but
Packit 1e8aac
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 1e8aac
 * Lesser General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU Lesser General Public 
Packit 1e8aac
 * License along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
#include <gladeui/glade.h>
Packit 1e8aac
Packit 1e8aac
#include "glade-popover-menu-editor.h"
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_parse_finished (GladeProject * project,
Packit 1e8aac
                                       GObject * object)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gbox;
Packit 1e8aac
  gint submenus;
Packit 1e8aac
Packit 1e8aac
  gbox = glade_widget_get_from_gobject (object);
Packit 1e8aac
  glade_widget_property_get (gbox, "submenus", &submenus);
Packit 1e8aac
  glade_widget_property_set (gbox, "submenus", submenus);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_selection_changed (GladeProject * project,
Packit 1e8aac
                                          GladeWidget * gwidget)
Packit 1e8aac
{
Packit 1e8aac
  GList *list;
Packit 1e8aac
  GtkWidget *page, *sel_widget;
Packit 1e8aac
  GtkWidget *popover = GTK_WIDGET (glade_widget_get_object (gwidget));
Packit 1e8aac
Packit 1e8aac
  if ((list = glade_project_selection_get (project)) != NULL &&
Packit 1e8aac
      g_list_length (list) == 1)
Packit 1e8aac
    {
Packit 1e8aac
      sel_widget = list->data;
Packit 1e8aac
Packit 1e8aac
      if (GTK_IS_WIDGET (sel_widget) &&
Packit 1e8aac
          gtk_widget_is_ancestor (sel_widget, popover))
Packit 1e8aac
        {
Packit 1e8aac
          GList *children, *l;
Packit 1e8aac
Packit 1e8aac
          children = gtk_container_get_children (GTK_CONTAINER (popover));
Packit 1e8aac
          for (l = children; l; l = l->next)
Packit 1e8aac
            {
Packit 1e8aac
              page = l->data;
Packit 1e8aac
              if (sel_widget == page ||
Packit 1e8aac
                  gtk_widget_is_ancestor (sel_widget, page))
Packit 1e8aac
                {
Packit 1e8aac
                  gint position;
Packit 1e8aac
                  glade_widget_property_get (glade_widget_get_from_gobject (page), "position", &position);
Packit 1e8aac
                  glade_widget_property_set (glade_widget_get_from_gobject (popover), "current", position);
Packit 1e8aac
                  break;
Packit 1e8aac
                }
Packit 1e8aac
            }
Packit 1e8aac
          g_list_free (children);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_project_changed (GladeWidget * gwidget,
Packit 1e8aac
                                        GParamSpec * pspec,
Packit 1e8aac
                                        gpointer userdata)
Packit 1e8aac
{
Packit 1e8aac
  GladeProject * project = glade_widget_get_project (gwidget);
Packit 1e8aac
  GladeProject * old_project = g_object_get_data (G_OBJECT (gwidget), "popover-menu-project-ptr");
Packit 1e8aac
Packit 1e8aac
  if (old_project)
Packit 1e8aac
    g_signal_handlers_disconnect_by_func (G_OBJECT (old_project),
Packit 1e8aac
                                          G_CALLBACK (glade_gtk_popover_menu_selection_changed),
Packit 1e8aac
                                          gwidget);
Packit 1e8aac
Packit 1e8aac
  if (project)
Packit 1e8aac
    g_signal_connect (G_OBJECT (project), "selection-changed",
Packit 1e8aac
                      G_CALLBACK (glade_gtk_popover_menu_selection_changed),
Packit 1e8aac
                      gwidget);
Packit 1e8aac
Packit 1e8aac
  g_object_set_data (G_OBJECT (gwidget), "popover-menu-project-ptr", project);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
get_visible_child (GtkPopoverMenu *popover, GtkWidget **visible_child)
Packit 1e8aac
{
Packit 1e8aac
  gchar *visible;
Packit 1e8aac
  GList *children, *l;
Packit 1e8aac
  gint ret, i;
Packit 1e8aac
Packit 1e8aac
  ret = -1;
Packit 1e8aac
Packit 1e8aac
  g_object_get (G_OBJECT (popover), "visible-submenu", &visible, NULL);
Packit 1e8aac
  children = gtk_container_get_children (GTK_CONTAINER (popover));
Packit 1e8aac
  for (l = children, i = 0; visible && l; l = l->next, i++)
Packit 1e8aac
    {
Packit 1e8aac
      GtkWidget *child = l->data;
Packit 1e8aac
      gchar *name;
Packit 1e8aac
      gboolean found;
Packit 1e8aac
Packit 1e8aac
      gtk_container_child_get (GTK_CONTAINER (popover), child, "submenu", &name, NULL);
Packit 1e8aac
      found = name != NULL && !strcmp (visible, name);
Packit 1e8aac
      g_free (name);
Packit 1e8aac
      if (found)
Packit 1e8aac
        {
Packit 1e8aac
          if (visible_child)
Packit 1e8aac
            *visible_child = child;
Packit 1e8aac
          ret = i;
Packit 1e8aac
          break;
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (children);
Packit 1e8aac
  g_free (visible);
Packit 1e8aac
Packit 1e8aac
  return ret;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_visible_submenu_changed (GObject *popover,
Packit 1e8aac
                                                GParamSpec *pspec,
Packit 1e8aac
                                                gpointer data)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gwidget = glade_widget_get_from_gobject (popover);
Packit 1e8aac
  GladeProject *project = glade_widget_get_project (gwidget);
Packit 1e8aac
  gint current;
Packit 1e8aac
  GList *list;
Packit 1e8aac
  GtkWidget *visible_child;
Packit 1e8aac
Packit 1e8aac
  current = get_visible_child (GTK_POPOVER_MENU (popover), &visible_child);
Packit 1e8aac
  glade_widget_property_set (gwidget, "current", current);
Packit 1e8aac
Packit 1e8aac
  if ((list = glade_project_selection_get (project)) != NULL &&
Packit 1e8aac
      list->next == NULL)
Packit 1e8aac
    {
Packit 1e8aac
      GObject *selected = list->data;
Packit 1e8aac
Packit 1e8aac
      if (GTK_IS_WIDGET (selected) &&
Packit 1e8aac
          gtk_widget_is_ancestor (GTK_WIDGET (selected), GTK_WIDGET (popover)) &&
Packit 1e8aac
          (GtkWidget*)selected != visible_child &&
Packit 1e8aac
          !gtk_widget_is_ancestor (GTK_WIDGET (selected), GTK_WIDGET (visible_child)))
Packit 1e8aac
        {
Packit 1e8aac
          glade_project_selection_clear (project, TRUE);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_post_create (GladeWidgetAdaptor *adaptor,
Packit 1e8aac
                                    GObject *container,
Packit 1e8aac
                                    GladeCreateReason reason)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *parent = glade_widget_get_from_gobject (container);
Packit 1e8aac
  GladeProject *project = glade_widget_get_project (parent);
Packit 1e8aac
Packit 1e8aac
  if (reason == GLADE_CREATE_LOAD)
Packit 1e8aac
    g_signal_connect (project, "parse-finished",
Packit 1e8aac
                      G_CALLBACK (glade_gtk_popover_menu_parse_finished),
Packit 1e8aac
                      container);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (G_OBJECT (parent), "notify::project",
Packit 1e8aac
                    G_CALLBACK (glade_gtk_popover_menu_project_changed), NULL);
Packit 1e8aac
Packit 1e8aac
  glade_gtk_popover_menu_project_changed (parent, NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (container, "notify::visible-submenu",
Packit 1e8aac
                    G_CALLBACK (glade_gtk_popover_menu_visible_submenu_changed), NULL);
Packit 1e8aac
Packit 1e8aac
  GWA_GET_CLASS (GTK_TYPE_POPOVER)->post_create (adaptor, container, reason);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_add_child (GladeWidgetAdaptor *adaptor,
Packit 1e8aac
                                  GObject *parent,
Packit 1e8aac
                                  GObject *child)
Packit 1e8aac
{
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (parent), GTK_WIDGET (child));
Packit 1e8aac
Packit 1e8aac
  if (!glade_widget_superuser ())
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidget *gbox;
Packit 1e8aac
      gint submenus;
Packit 1e8aac
Packit 1e8aac
      gbox = glade_widget_get_from_gobject (parent);
Packit 1e8aac
Packit 1e8aac
      glade_widget_property_get (gbox, "submenus", &submenus);
Packit 1e8aac
      glade_widget_property_set (gbox, "submenus", submenus);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_remove_child (GladeWidgetAdaptor *adaptor,
Packit 1e8aac
                                     GObject *parent,
Packit 1e8aac
                                     GObject *child)
Packit 1e8aac
{
Packit 1e8aac
  gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (child));
Packit 1e8aac
Packit 1e8aac
  if (!glade_widget_superuser ())
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidget *gbox;
Packit 1e8aac
      gint submenus;
Packit 1e8aac
Packit 1e8aac
      gbox = glade_widget_get_from_gobject (parent);
Packit 1e8aac
Packit 1e8aac
      glade_widget_property_get (gbox, "submenus", &submenus);
Packit 1e8aac
      glade_widget_property_set (gbox, "submenus", submenus);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_replace_child (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                      GObject * container,
Packit 1e8aac
                                      GObject * current,
Packit 1e8aac
                                      GObject * new_widget)
Packit 1e8aac
{
Packit 1e8aac
  gchar *visible;
Packit 1e8aac
  gchar *name;
Packit 1e8aac
  gint position;
Packit 1e8aac
  GladeWidget *gwidget;
Packit 1e8aac
Packit 1e8aac
  g_object_get (G_OBJECT (container), "visible-submenu", &visible, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_container_child_get (GTK_CONTAINER (container),
Packit 1e8aac
                           GTK_WIDGET (current),
Packit 1e8aac
                           "submenu", &name,
Packit 1e8aac
                           "position", &position,
Packit 1e8aac
                           NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (container), GTK_WIDGET (new_widget));
Packit 1e8aac
  gtk_container_remove (GTK_CONTAINER (container), GTK_WIDGET (current));
Packit 1e8aac
Packit 1e8aac
  gtk_container_child_set (GTK_CONTAINER (container),
Packit 1e8aac
                           GTK_WIDGET (new_widget),
Packit 1e8aac
                           "submenu", name,
Packit 1e8aac
                           "position", position,
Packit 1e8aac
                           NULL);
Packit 1e8aac
Packit 1e8aac
  g_object_set (G_OBJECT (container), "visible-submenu", visible, NULL);
Packit 1e8aac
Packit 1e8aac
  gwidget = glade_widget_get_from_gobject (new_widget);
Packit 1e8aac
  if (gwidget)
Packit 1e8aac
    {
Packit 1e8aac
      glade_widget_pack_property_set (gwidget, "submenu", name);
Packit 1e8aac
      glade_widget_pack_property_set (gwidget, "position", position);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  g_free (visible);
Packit 1e8aac
  g_free (name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
typedef struct {
Packit 1e8aac
  gint size;
Packit 1e8aac
  gboolean include_placeholders;
Packit 1e8aac
} ChildData;
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
count_child (GtkWidget *child, gpointer data)
Packit 1e8aac
{
Packit 1e8aac
  ChildData *cdata = data;
Packit 1e8aac
Packit 1e8aac
  if (cdata->include_placeholders || !GLADE_IS_PLACEHOLDER (child))
Packit 1e8aac
    cdata->size++;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gint
Packit 1e8aac
count_children (GtkContainer *container,
Packit 1e8aac
                gboolean      include_placeholders)
Packit 1e8aac
{
Packit 1e8aac
  ChildData data;
Packit 1e8aac
Packit 1e8aac
  data.size = 0;
Packit 1e8aac
  data.include_placeholders = include_placeholders;
Packit 1e8aac
  gtk_container_foreach (container, count_child, &data);
Packit 1e8aac
  return data.size;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gchar *
Packit 1e8aac
get_unused_name (GtkPopoverMenu *popover)
Packit 1e8aac
{
Packit 1e8aac
  gint i;
Packit 1e8aac
  gchar *name = NULL;
Packit 1e8aac
  GList *children, *l;
Packit 1e8aac
  gboolean exists;
Packit 1e8aac
Packit 1e8aac
  children = gtk_container_get_children (GTK_CONTAINER (popover));
Packit 1e8aac
Packit 1e8aac
  i = g_list_length (children);
Packit 1e8aac
  while (1)
Packit 1e8aac
    {
Packit 1e8aac
      name = g_strdup_printf ("submenu%d", i);
Packit 1e8aac
      exists = FALSE;
Packit 1e8aac
      for (l = children; l && !exists; l = l->next)
Packit 1e8aac
        {
Packit 1e8aac
          gchar *submenu;
Packit 1e8aac
          gtk_container_child_get (GTK_CONTAINER (popover), GTK_WIDGET (l->data),
Packit 1e8aac
                                   "submenu", &submenu, NULL);
Packit 1e8aac
          if (!strcmp (submenu, name))
Packit 1e8aac
            exists = TRUE;
Packit 1e8aac
          g_free (submenu);
Packit 1e8aac
        }
Packit 1e8aac
      if (!exists)
Packit 1e8aac
        break;
Packit 1e8aac
Packit 1e8aac
      g_free (name);
Packit 1e8aac
      i++;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  g_list_free (children);
Packit 1e8aac
Packit 1e8aac
  return name;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_set_submenus (GObject * object,
Packit 1e8aac
                                     const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidget *gbox;
Packit 1e8aac
  GtkWidget *child;
Packit 1e8aac
  gint new_size, i;
Packit 1e8aac
  gint old_size;
Packit 1e8aac
  gchar *name;
Packit 1e8aac
  gint page;
Packit 1e8aac
Packit 1e8aac
  new_size = g_value_get_int (value);
Packit 1e8aac
  old_size = count_children (GTK_CONTAINER (object), TRUE);
Packit 1e8aac
Packit 1e8aac
  if (old_size == new_size)
Packit 1e8aac
    return;
Packit 1e8aac
  else if (old_size < new_size)
Packit 1e8aac
    {
Packit 1e8aac
      for (i = old_size; i < new_size; i++)
Packit 1e8aac
        {
Packit 1e8aac
          name = get_unused_name (GTK_POPOVER_MENU (object));
Packit 1e8aac
          child = glade_placeholder_new ();
Packit 1e8aac
          gtk_container_add_with_properties (GTK_CONTAINER (object), child,
Packit 1e8aac
                                             "submenu", name, NULL);
Packit 1e8aac
          g_free (name);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      GList *children, *l;
Packit 1e8aac
Packit 1e8aac
      children = gtk_container_get_children (GTK_CONTAINER (object));
Packit 1e8aac
      for (l = g_list_last (children); l; l = l->prev)
Packit 1e8aac
        {
Packit 1e8aac
          if (old_size <= new_size)
Packit 1e8aac
            break;
Packit 1e8aac
      
Packit 1e8aac
          child = l->data;
Packit 1e8aac
          if (GLADE_IS_PLACEHOLDER (child))
Packit 1e8aac
            {
Packit 1e8aac
              gtk_container_remove (GTK_CONTAINER (object), child);
Packit 1e8aac
              old_size--;
Packit 1e8aac
            }
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  gbox = glade_widget_get_from_gobject (object);
Packit 1e8aac
  glade_widget_property_get (gbox, "current", &page);
Packit 1e8aac
  glade_widget_property_set (gbox, "current", page);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_set_current (GObject *object,
Packit 1e8aac
                                    const GValue *value)
Packit 1e8aac
{
Packit 1e8aac
  gint new_page;
Packit 1e8aac
  GList *children;
Packit 1e8aac
  GtkWidget *child;
Packit 1e8aac
  gchar *submenu;
Packit 1e8aac
Packit 1e8aac
  new_page = g_value_get_int (value);
Packit 1e8aac
  children = gtk_container_get_children (GTK_CONTAINER (object));
Packit 1e8aac
  child = g_list_nth_data (children, new_page);
Packit 1e8aac
  if (child)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_container_child_get (GTK_CONTAINER (object), child,
Packit 1e8aac
                               "submenu", &submenu,
Packit 1e8aac
                               NULL);
Packit 1e8aac
      gtk_popover_menu_open_submenu (GTK_POPOVER_MENU (object), submenu);
Packit 1e8aac
      g_free (submenu);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  g_list_free (children);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_set_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                     GObject * object,
Packit 1e8aac
                                     const gchar * id,
Packit 1e8aac
                                     const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  if (!strcmp (id, "submenus"))
Packit 1e8aac
    glade_gtk_popover_menu_set_submenus (object, value);
Packit 1e8aac
  else if (!strcmp (id, "current"))
Packit 1e8aac
    glade_gtk_popover_menu_set_current (object, value);
Packit 1e8aac
  else
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_POPOVER)->set_property (adaptor, object, id, value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_get_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                     GObject * object,
Packit 1e8aac
                                     const gchar * id,
Packit 1e8aac
                                     GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  if (!strcmp (id, "submenus"))
Packit 1e8aac
    {
Packit 1e8aac
      g_value_reset (value);
Packit 1e8aac
      g_value_set_int (value, count_children (GTK_CONTAINER (object), TRUE));
Packit 1e8aac
    } 
Packit 1e8aac
  else if (!strcmp (id, "current"))
Packit 1e8aac
    {
Packit 1e8aac
      g_value_reset (value);
Packit 1e8aac
      g_value_set_int (value, get_visible_child (GTK_POPOVER_MENU (object), NULL));
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_POPOVER)->get_property (adaptor, object, id, value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_gtk_popover_menu_verify_submenus (GObject * object,
Packit 1e8aac
                                        const GValue *value)
Packit 1e8aac
{
Packit 1e8aac
  gint new_size, old_size;
Packit 1e8aac
Packit 1e8aac
  new_size = g_value_get_int (value);
Packit 1e8aac
  old_size = count_children (GTK_CONTAINER (object), FALSE);
Packit 1e8aac
Packit 1e8aac
  return old_size <= new_size;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_gtk_popover_menu_verify_current (GObject *object,
Packit 1e8aac
                                       const GValue *value)
Packit 1e8aac
{
Packit 1e8aac
  gint current;
Packit 1e8aac
  gint submenus;
Packit 1e8aac
Packit 1e8aac
  current = g_value_get_int (value);
Packit 1e8aac
  submenus = count_children (GTK_CONTAINER (object), TRUE);
Packit 1e8aac
Packit 1e8aac
  return 0 <= current && current < submenus;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_gtk_popover_menu_verify_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                        GObject * object,
Packit 1e8aac
                                        const gchar * id,
Packit 1e8aac
                                        const GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  if (!strcmp (id, "submenus"))
Packit 1e8aac
    return glade_gtk_popover_menu_verify_submenus (object, value);
Packit 1e8aac
  else if (!strcmp (id, "current"))
Packit 1e8aac
    return glade_gtk_popover_menu_verify_current (object, value);
Packit 1e8aac
  else if (GWA_GET_CLASS (GTK_TYPE_POPOVER)->verify_property)
Packit 1e8aac
    return GWA_GET_CLASS (GTK_TYPE_POPOVER)->verify_property (adaptor, object, id, value);
Packit 1e8aac
Packit 1e8aac
  return TRUE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
update_position (GtkWidget *widget, gpointer data)
Packit 1e8aac
{
Packit 1e8aac
  GtkContainer *parent = data;
Packit 1e8aac
  GladeWidget *gwidget;
Packit 1e8aac
  gint position;
Packit 1e8aac
Packit 1e8aac
  gwidget = glade_widget_get_from_gobject (widget);
Packit 1e8aac
  if (gwidget)
Packit 1e8aac
    {
Packit 1e8aac
      gtk_container_child_get (parent, widget, "position", &position, NULL);
Packit 1e8aac
      glade_widget_pack_property_set (gwidget, "position", position);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_gtk_popover_menu_set_child_position (GObject * container,
Packit 1e8aac
                                           GObject * child,
Packit 1e8aac
                                           GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  static gboolean recursion = FALSE;
Packit 1e8aac
  gint new_position, old_position;
Packit 1e8aac
  gchar *visible_child;
Packit 1e8aac
  GladeWidget *gbox;
Packit 1e8aac
Packit 1e8aac
  g_object_get (container, "visible-submenu", &visible_child, NULL);
Packit 1e8aac
Packit 1e8aac
  if (recursion)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  gtk_container_child_get (GTK_CONTAINER (container), GTK_WIDGET (child), "position", &old_position, NULL);
Packit 1e8aac
  new_position = g_value_get_int (value);
Packit 1e8aac
Packit 1e8aac
  if (old_position != new_position)
Packit 1e8aac
    {
Packit 1e8aac
      recursion = TRUE;
Packit 1e8aac
      gtk_container_child_set (GTK_CONTAINER (container), GTK_WIDGET (child),
Packit 1e8aac
                               "position", new_position,
Packit 1e8aac
                               NULL);
Packit 1e8aac
      gtk_container_forall (GTK_CONTAINER (container), update_position, container);
Packit 1e8aac
      recursion = FALSE;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  g_object_set (container, "visible-submenu", visible_child, NULL);
Packit 1e8aac
  g_free (visible_child); 
Packit 1e8aac
Packit 1e8aac
  gbox = glade_widget_get_from_gobject (container);
Packit 1e8aac
  glade_widget_pack_property_set (gbox, "visible-submenu", get_visible_child (GTK_POPOVER_MENU (container), NULL));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_set_child_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                           GObject * container,
Packit 1e8aac
                                           GObject * child,
Packit 1e8aac
                                           const gchar * id,
Packit 1e8aac
                                           GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  if (!strcmp (id, "position"))
Packit 1e8aac
    glade_gtk_popover_menu_set_child_position (container, child, value);
Packit 1e8aac
  else if (!strcmp (id, "submenu"))
Packit 1e8aac
    gtk_container_child_set_property (GTK_CONTAINER (container),
Packit 1e8aac
                                      GTK_WIDGET (child), id, value);
Packit 1e8aac
  else    
Packit 1e8aac
    GWA_GET_CLASS (GTK_TYPE_POPOVER)->child_set_property (adaptor, container, child, id, value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_gtk_popover_menu_get_child_property (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                           GObject * container,
Packit 1e8aac
                                           GObject * child,
Packit 1e8aac
                                           const gchar * id,
Packit 1e8aac
                                           GValue * value)
Packit 1e8aac
{
Packit 1e8aac
  gtk_container_child_get_property (GTK_CONTAINER (container),
Packit 1e8aac
                                    GTK_WIDGET (child), id, value);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
GladeEditable *
Packit 1e8aac
glade_gtk_popover_menu_create_editable (GladeWidgetAdaptor * adaptor,
Packit 1e8aac
                                        GladeEditorPageType  type)
Packit 1e8aac
{
Packit 1e8aac
  if (type == GLADE_PAGE_GENERAL)
Packit 1e8aac
    return (GladeEditable *) glade_popover_menu_editor_new ();
Packit 1e8aac
  else
Packit 1e8aac
    return GWA_GET_CLASS (GTK_TYPE_POPOVER)->create_editable (adaptor, type);
Packit 1e8aac
}
Packit 1e8aac