|
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 |
|