summaryrefslogtreecommitdiff
path: root/plugins/gtk+/glade-gtk-shortcutsgroup.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/gtk+/glade-gtk-shortcutsgroup.c')
-rw-r--r--plugins/gtk+/glade-gtk-shortcutsgroup.c255
1 files changed, 255 insertions, 0 deletions
diff --git a/plugins/gtk+/glade-gtk-shortcutsgroup.c b/plugins/gtk+/glade-gtk-shortcutsgroup.c
new file mode 100644
index 00000000..b5c8bbfc
--- /dev/null
+++ b/plugins/gtk+/glade-gtk-shortcutsgroup.c
@@ -0,0 +1,255 @@
+/*
+ * glade-gtk-shortcutsgroup.c - GladeWidgetAdaptor for GtkShortcutsGroup
+ *
+ * Copyright (C) 2015 Red Hat, Inc
+ *
+ * Authors:
+ * Matthias Clasen <mclasen@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+#include <config.h>
+#include <glib/gi18n-lib.h>
+#include <gladeui/glade.h>
+#include "glade-gtk.h"
+#include "glade-fixed.h"
+#include "glade-shortcutsgroup-editor.h"
+
+static gboolean
+glade_gtk_shortcutsgroup_configure_child (GladeFixed *fixed,
+ GladeWidget *child,
+ GdkRectangle *rect,
+ GtkWidget *group)
+{
+ return TRUE;
+}
+
+void
+glade_gtk_shortcutsgroup_post_create (GladeWidgetAdaptor *adaptor,
+ GObject *container,
+ GladeCreateReason reason)
+{
+ GladeWidget *gwidget = glade_widget_get_from_gobject (container);
+
+ g_signal_connect (G_OBJECT (gwidget), "configure-child",
+ G_CALLBACK (glade_gtk_shortcutsgroup_configure_child), container);
+
+ if (reason == GLADE_CREATE_USER)
+ {
+ GladeWidgetAdaptor *shortcut_adaptor = glade_widget_adaptor_get_by_type (GTK_TYPE_SHORTCUTS_SHORTCUT);
+ GladeWidget *shortcut;
+
+ shortcut = glade_widget_adaptor_create_widget (shortcut_adaptor, FALSE,
+ "parent", gwidget,
+ "project", glade_widget_get_project (gwidget),
+ NULL);
+ glade_widget_add_child (gwidget, shortcut, FALSE);
+ }
+}
+
+gboolean
+glade_gtk_shortcutsgroup_add_verify (GladeWidgetAdaptor *adaptor,
+ GtkWidget *container,
+ GtkWidget *child,
+ gboolean user_feedback)
+{
+ if (!GTK_IS_SHORTCUTS_SHORTCUT (child))
+ {
+ if (user_feedback)
+ {
+ GladeWidgetAdaptor *tool_item_adaptor =
+ glade_widget_adaptor_get_by_type (GTK_TYPE_SHORTCUTS_SHORTCUT);
+
+ glade_util_ui_message (glade_app_get_window (),
+ GLADE_UI_INFO, NULL,
+ ONLY_THIS_GOES_IN_THAT_MSG,
+ glade_widget_adaptor_get_title (tool_item_adaptor),
+ glade_widget_adaptor_get_title (adaptor));
+ }
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+add_new_shortcut (GObject *object)
+{
+ GladeWidgetAdaptor *adaptor = glade_widget_adaptor_get_by_type (GTK_TYPE_SHORTCUTS_SHORTCUT);
+ GladeWidget *gparent = glade_widget_get_from_gobject (object);
+ GladeProject *project = glade_widget_get_project (gparent);
+
+ glade_command_push_group (_("Adding a shortcut to %s"), glade_widget_get_name (gparent));
+ glade_command_create (adaptor, gparent, NULL, project);
+ glade_project_selection_set (project, object, TRUE);
+ glade_command_pop_group ();
+}
+
+GladeEditable *
+glade_gtk_shortcutsgroup_create_editable (GladeWidgetAdaptor * adaptor,
+ GladeEditorPageType type)
+{
+ if (type == GLADE_PAGE_GENERAL)
+ return (GladeEditable *) glade_shortcutsgroup_editor_new ();
+
+ return GWA_GET_CLASS (GTK_TYPE_CONTAINER)->create_editable (adaptor, type);
+}
+
+typedef struct {
+ gint size;
+} ChildData;
+
+static void
+count_child (GtkWidget *child, gpointer data)
+{
+ ChildData *cdata = data;
+
+ cdata->size++;
+}
+
+static gint
+glade_gtk_shortcutsgroup_get_n_shortcuts (GObject *object)
+{
+ ChildData data;
+
+ data.size = 0;
+ gtk_container_foreach (GTK_CONTAINER (object), count_child, &data);
+ return data.size;
+}
+
+static void
+glade_gtk_shortcutsgroup_set_n_shortcuts (GObject *object,
+ const GValue *value)
+{
+ gint old_size;
+ gint new_size;
+ gint i;
+ GList *children, *l, *list;
+
+ new_size = g_value_get_int (value);
+ old_size = glade_gtk_shortcutsgroup_get_n_shortcuts (object);
+
+ if (old_size == new_size)
+ return;
+
+ for (i = old_size; i < new_size; i++)
+ add_new_shortcut (object);
+
+ list = NULL;
+ children = gtk_container_get_children (GTK_CONTAINER (object));
+ for (i = old_size, l = g_list_last (children); i > 0; i--, l = l->prev)
+ {
+ if (old_size <= new_size)
+ break;
+
+ list = g_list_append (list, glade_widget_get_from_gobject (G_OBJECT (l->data)));
+ }
+ g_list_free (children);
+
+ if (list)
+ {
+ glade_command_delete (list);
+ g_list_free (list);
+ }
+}
+
+void
+glade_gtk_shortcutsgroup_set_property (GladeWidgetAdaptor * adaptor,
+ GObject * object,
+ const gchar * id,
+ const GValue * value)
+{
+ if (!strcmp (id, "shortcuts"))
+ glade_gtk_shortcutsgroup_set_n_shortcuts (object, value);
+ else
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->set_property (adaptor, object, id, value);
+}
+
+void
+glade_gtk_shortcutsgroup_get_property (GladeWidgetAdaptor * adaptor,
+ GObject * object,
+ const gchar * id,
+ GValue * value)
+{
+ if (!strcmp (id, "shortcuts"))
+ {
+ g_value_reset (value);
+ g_value_set_int (value, glade_gtk_shortcutsgroup_get_n_shortcuts (object));
+ }
+ else
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->get_property (adaptor, object, id, value);
+}
+
+void
+glade_gtk_shortcutsgroup_action_activate (GladeWidgetAdaptor * adaptor,
+ GObject * object,
+ const gchar * action_path)
+{
+ if (strcmp (action_path, "add_shortcut") == 0)
+ {
+ GladeWidget *gwidget = glade_widget_get_from_gobject (object);
+ GladeProperty *property;
+ gint shortcuts;
+
+ shortcuts = glade_gtk_shortcutsgroup_get_n_shortcuts (object);
+ property = glade_widget_get_property (gwidget, "shortcuts");
+ glade_command_set_property (property, shortcuts + 1);
+ }
+ else
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->action_activate (adaptor,
+ object, action_path);
+}
+
+void
+glade_gtk_shortcutsgroup_add_child (GladeWidgetAdaptor * adaptor,
+ GObject * object,
+ GObject * child)
+{
+ GladeWidget *gwidget = glade_widget_get_from_gobject (object);
+ GladeProperty *property;
+ gint shortcuts;
+
+ gtk_container_add (GTK_CONTAINER (object), GTK_WIDGET (child));
+
+ shortcuts = glade_gtk_shortcutsgroup_get_n_shortcuts (object);
+ property = glade_widget_get_property (gwidget, "shortcuts");
+ glade_command_set_property (property, shortcuts);
+}
+
+void
+glade_gtk_shortcutsgroup_remove_child (GladeWidgetAdaptor * adaptor,
+ GObject * object,
+ GObject * child)
+{
+ GladeWidget *gwidget = glade_widget_get_from_gobject (object);
+ GladeProperty *property;
+ gint shortcuts;
+
+ gtk_container_remove (GTK_CONTAINER (object), GTK_WIDGET (child));
+
+ shortcuts = glade_gtk_shortcutsgroup_get_n_shortcuts (object);
+ property = glade_widget_get_property (gwidget, "shortcuts");
+ glade_command_set_property (property, shortcuts);
+}
+
+void
+glade_gtk_shortcutsgroup_replace_child (GladeWidgetAdaptor * adaptor,
+ GObject * container,
+ GObject * current,
+ GObject * new_widget)
+{
+ GWA_GET_CLASS (GTK_TYPE_CONTAINER)->replace_child (adaptor, container, current, new_widget);
+}