|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Copyright (C) 2006-2016 Juan Pablo Ugarte.
|
|
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 |
* Authors:
|
|
Packit |
1e8aac |
* Juan Pablo Ugarte <juanpablougarte@gmail.com>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "config.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* SECTION:glade-base-editor
|
|
Packit |
1e8aac |
* @Short_Description: A customisable editor
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Convenience object to edit containers where placeholders do not make sense, like GtkMenubar.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade.h"
|
|
Packit |
1e8aac |
#include "glade-marshallers.h"
|
|
Packit |
1e8aac |
#include "glade-editor-property.h"
|
|
Packit |
1e8aac |
#include "glade-base-editor.h"
|
|
Packit |
1e8aac |
#include "glade-app.h"
|
|
Packit |
1e8aac |
#include "glade-popup.h"
|
|
Packit |
1e8aac |
#include "glade-accumulators.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
#include <gdk/gdkkeysyms.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPES_N_COLUMNS
|
|
Packit |
1e8aac |
} GladeBaseEditorChildEnum;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_OBJECT,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPE_NAME,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_NAME,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CHILD_TYPES,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_N_COLUMNS
|
|
Packit |
1e8aac |
} GladeBaseEditorEnum;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef enum {
|
|
Packit |
1e8aac |
ADD_ROOT = 0,
|
|
Packit |
1e8aac |
ADD_SIBLING,
|
|
Packit |
1e8aac |
ADD_CHILD
|
|
Packit |
1e8aac |
} GladeBaseEditorAddMode;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef struct
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GType parent_type;
|
|
Packit |
1e8aac |
GtkTreeModel *children;
|
|
Packit |
1e8aac |
} ChildTypeTab;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
struct _GladeBaseEditorPrivate
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gcontainer; /* The container we are editing */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Editor UI */
|
|
Packit |
1e8aac |
GtkWidget *paned, *table, *treeview, *tip_label;
|
|
Packit |
1e8aac |
GtkWidget *add_button, *delete_button, *help_button;
|
|
Packit |
1e8aac |
GladeSignalEditor *signal_editor;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GList *child_types;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkTreeModel *model;
|
|
Packit |
1e8aac |
GladeProject *project;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Add button data */
|
|
Packit |
1e8aac |
GType add_type;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Temporal variables */
|
|
Packit |
1e8aac |
GtkTreeIter iter; /* used in idle functions */
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gboolean updating_treeview;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
guint properties_idle;
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
SIGNAL_CHILD_SELECTED,
|
|
Packit |
1e8aac |
SIGNAL_CHANGE_TYPE,
|
|
Packit |
1e8aac |
SIGNAL_GET_DISPLAY_NAME,
|
|
Packit |
1e8aac |
SIGNAL_BUILD_CHILD,
|
|
Packit |
1e8aac |
SIGNAL_DELETE_CHILD,
|
|
Packit |
1e8aac |
SIGNAL_MOVE_CHILD,
|
|
Packit |
1e8aac |
LAST_SIGNAL
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
PROP_0,
|
|
Packit |
1e8aac |
PROP_CONTAINER,
|
|
Packit |
1e8aac |
N_PROPERTIES
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_DEFINE_TYPE_WITH_PRIVATE (GladeBaseEditor, glade_base_editor, GTK_TYPE_BOX)
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GParamSpec *properties[N_PROPERTIES];
|
|
Packit |
1e8aac |
static guint glade_base_editor_signals[LAST_SIGNAL] = { 0 };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void glade_base_editor_set_container (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GObject *container);
|
|
Packit |
1e8aac |
static void glade_base_editor_block_callbacks (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
gboolean block);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
reset_child_types (GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
ChildTypeTab *tab;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = editor->priv->child_types; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
tab = l->data;
|
|
Packit |
1e8aac |
g_object_unref (tab->children);
|
|
Packit |
1e8aac |
g_free (tab);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
g_list_free (editor->priv->child_types);
|
|
Packit |
1e8aac |
editor->priv->child_types = NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gint
|
|
Packit |
1e8aac |
sort_type_by_hierarchy (ChildTypeTab *a, ChildTypeTab *b)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (g_type_is_a (a->parent_type, b->parent_type))
|
|
Packit |
1e8aac |
return -1;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return 1;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkTreeModel *
|
|
Packit |
1e8aac |
get_children_model_for_type (GladeBaseEditor *editor, GType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
for (l = editor->priv->child_types; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ChildTypeTab *tab = l->data;
|
|
Packit |
1e8aac |
if (g_type_is_a (type, tab->parent_type))
|
|
Packit |
1e8aac |
return tab->children;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkTreeModel *
|
|
Packit |
1e8aac |
get_children_model_for_child_type (GladeBaseEditor *editor, GType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *l;
|
|
Packit |
1e8aac |
GtkTreeModel *model = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Get deep derived classes first and work up the sorted heirarchy */
|
|
Packit |
1e8aac |
for (l = g_list_last (editor->priv->child_types); model == NULL && l;
|
|
Packit |
1e8aac |
l = l->prev)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ChildTypeTab *tab = l->data;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GType iter_type;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!gtk_tree_model_get_iter_first (tab->children, &iter))
|
|
Packit |
1e8aac |
continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (tab->children, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, &iter_type, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Find exact match types in this case */
|
|
Packit |
1e8aac |
if (iter_type == type)
|
|
Packit |
1e8aac |
model = tab->children;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (model == NULL && gtk_tree_model_iter_next (tab->children, &iter));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return model;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_get_type_info (GladeBaseEditor *e,
|
|
Packit |
1e8aac |
GtkTreeIter *retiter,
|
|
Packit |
1e8aac |
GType child_type,
|
|
Packit |
1e8aac |
...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeModel *model;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GType type;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
model = get_children_model_for_child_type (e, child_type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!model || gtk_tree_model_get_iter_first (model, &iter) == FALSE)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, &iter, GLADE_BASE_EDITOR_GTYPE, &type, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (child_type == type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
va_list args;
|
|
Packit |
1e8aac |
va_start (args, child_type);
|
|
Packit |
1e8aac |
gtk_tree_model_get_valist (model, &iter, args);
|
|
Packit |
1e8aac |
va_end (args);
|
|
Packit |
1e8aac |
if (retiter)
|
|
Packit |
1e8aac |
*retiter = iter;
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next (model, &iter));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gchar *
|
|
Packit |
1e8aac |
glade_base_editor_get_display_name (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gchild)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gchar *retval;
|
|
Packit |
1e8aac |
g_signal_emit (editor,
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_GET_DISPLAY_NAME],
|
|
Packit |
1e8aac |
0, gchild, &retval);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_fill_store_real (GladeBaseEditor *e,
|
|
Packit |
1e8aac |
GladeWidget *gwidget,
|
|
Packit |
1e8aac |
GtkTreeIter *parent)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *children, *l;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
children = glade_widget_get_children (gwidget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (l = children; l; l = l->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gchild;
|
|
Packit |
1e8aac |
GObject *child = l->data;
|
|
Packit |
1e8aac |
gchar *type_name = NULL, *name;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gchild = glade_widget_get_from_gobject (child);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Have to check parents here for compatibility (could be the parenting menuitem of this menu
|
|
Packit |
1e8aac |
* supports a menuitem...) */
|
|
Packit |
1e8aac |
if (glade_base_editor_get_type_info (e, NULL,
|
|
Packit |
1e8aac |
G_OBJECT_TYPE (child),
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME,
|
|
Packit |
1e8aac |
&type_name, -1))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_store_append (GTK_TREE_STORE (e->priv->model), &iter, parent);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
name = glade_base_editor_get_display_name (e, gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_set (GTK_TREE_STORE (e->priv->model), &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, gchild,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_OBJECT, child,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPE_NAME, type_name,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_NAME, name,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CHILD_TYPES,
|
|
Packit |
1e8aac |
get_children_model_for_child_type (e, G_OBJECT_TYPE (child)),
|
|
Packit |
1e8aac |
-1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_fill_store_real (e, gchild, &iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (name);
|
|
Packit |
1e8aac |
g_free (type_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_base_editor_fill_store_real (e, gchild, parent);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_fill_store (GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_store_clear (GTK_TREE_STORE (e->priv->model));
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (GTK_TREE_VIEW (e->priv->treeview), NULL);
|
|
Packit |
1e8aac |
glade_base_editor_fill_store_real (e, e->priv->gcontainer, NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (GTK_TREE_VIEW (e->priv->treeview), e->priv->model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (e->priv->treeview));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_get_child_selected (GladeBaseEditor *e, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeSelection *sel =
|
|
Packit |
1e8aac |
gtk_tree_view_get_selection (GTK_TREE_VIEW (e->priv->treeview));
|
|
Packit |
1e8aac |
return (sel) ? gtk_tree_selection_get_selected (sel, NULL, iter) : FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Forward declaration for glade_base_editor_project_widget_name_changed */
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_widget_name_changed (GladeProject *project,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GladeBaseEditor *editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GladeWidget *
|
|
Packit |
1e8aac |
glade_base_editor_delegate_build_child (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *parent,
|
|
Packit |
1e8aac |
GType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *child = NULL;
|
|
Packit |
1e8aac |
g_signal_emit (editor, glade_base_editor_signals[SIGNAL_BUILD_CHILD],
|
|
Packit |
1e8aac |
0, parent, type, &child);
|
|
Packit |
1e8aac |
return child;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_delegate_delete_child (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *parent,
|
|
Packit |
1e8aac |
GladeWidget *child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gboolean retval;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_emit (editor, glade_base_editor_signals[SIGNAL_DELETE_CHILD],
|
|
Packit |
1e8aac |
0, parent, child, &retval);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return retval;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_name_activate (GtkEntry *entry, GladeWidget *gchild)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *text = gtk_entry_get_text (GTK_ENTRY (entry));
|
|
Packit |
1e8aac |
GladeBaseEditor *editor = g_object_get_data (G_OBJECT (entry), "editor");
|
|
Packit |
1e8aac |
gchar *new_name = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (text == NULL || text[0] == '\0')
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* If we are explicitly trying to set the widget name to be empty,
|
|
Packit |
1e8aac |
* then we must not allow it there are any active references to
|
|
Packit |
1e8aac |
* the widget which would otherwise break.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (!glade_widget_has_prop_refs (gchild))
|
|
Packit |
1e8aac |
new_name = glade_project_new_widget_name (editor->priv->project, NULL, GLADE_UNNAMED_PREFIX);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
new_name = g_strdup (text);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (new_name && new_name[0])
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_handlers_block_by_func (editor->priv->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_widget_name_changed, editor);
|
|
Packit |
1e8aac |
glade_command_set_name (gchild, new_name);
|
|
Packit |
1e8aac |
g_signal_handlers_unblock_by_func (editor->priv->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_widget_name_changed, editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (new_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_table_attach (GladeBaseEditor *e,
|
|
Packit |
1e8aac |
GtkWidget *child1,
|
|
Packit |
1e8aac |
GtkWidget *child2)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkGrid *table = GTK_GRID (e->priv->table);
|
|
Packit |
1e8aac |
gint row = e->priv->row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (child1)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_grid_attach (table, child1, 0, row, 1, 1);
|
|
Packit |
1e8aac |
gtk_widget_set_hexpand (child1, TRUE);
|
|
Packit |
1e8aac |
gtk_widget_show (child1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (child2)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_grid_attach (table, child2, 1, row, 1, 1);
|
|
Packit |
1e8aac |
gtk_widget_show (child2);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e->priv->row++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_clear (GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show (e->tip_label);
|
|
Packit |
1e8aac |
gtk_container_foreach (GTK_CONTAINER (e->table),
|
|
Packit |
1e8aac |
(GtkCallback)gtk_widget_destroy, NULL);
|
|
Packit |
1e8aac |
e->row = 0;
|
|
Packit |
1e8aac |
gtk_widget_set_sensitive (e->delete_button, FALSE);
|
|
Packit |
1e8aac |
glade_signal_editor_load_widget (e->signal_editor, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_treeview_cursor_changed (GtkTreeView *treeview,
|
|
Packit |
1e8aac |
GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GObject *child;
|
|
Packit |
1e8aac |
GladeWidget *gchild;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GTK_IS_TREE_VIEW (treeview));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!glade_base_editor_get_child_selected (editor, &iter))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_clear (editor);
|
|
Packit |
1e8aac |
gtk_widget_set_sensitive (e->delete_button, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gchild,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_OBJECT, &child, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_unref (gchild);
|
|
Packit |
1e8aac |
g_object_unref (child);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Emit child-selected signal and let the user add the properties */
|
|
Packit |
1e8aac |
g_signal_emit (editor, glade_base_editor_signals[SIGNAL_CHILD_SELECTED],
|
|
Packit |
1e8aac |
0, gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update Signal Editor */
|
|
Packit |
1e8aac |
glade_signal_editor_load_widget (e->signal_editor, gchild);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_update_properties_idle (gpointer data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *editor = (GladeBaseEditor *) data;
|
|
Packit |
1e8aac |
glade_base_editor_treeview_cursor_changed
|
|
Packit |
1e8aac |
(GTK_TREE_VIEW (editor->priv->treeview), editor);
|
|
Packit |
1e8aac |
editor->priv->properties_idle = 0;
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* XXX Can we make it crisper by removing this idle ?? */
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_update_properties (GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!editor->priv->properties_idle)
|
|
Packit |
1e8aac |
editor->priv->properties_idle =
|
|
Packit |
1e8aac |
g_idle_add (glade_base_editor_update_properties_idle, editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_set_cursor (GladeBaseEditor *e, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreePath *path;
|
|
Packit |
1e8aac |
GtkTreeIter real_iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (iter == NULL && glade_base_editor_get_child_selected (e, &real_iter))
|
|
Packit |
1e8aac |
iter = &real_iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (iter && (path = gtk_tree_model_get_path (e->priv->model, iter)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_view_set_cursor (GTK_TREE_VIEW (e->priv->treeview), path, NULL,
|
|
Packit |
1e8aac |
FALSE);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_find_child_real (GladeBaseEditor *e,
|
|
Packit |
1e8aac |
GladeWidget *gchild,
|
|
Packit |
1e8aac |
GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeModel *model = e->priv->model;
|
|
Packit |
1e8aac |
GtkTreeIter child_iter;
|
|
Packit |
1e8aac |
GladeWidget *child;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, iter, GLADE_BASE_EDITOR_GWIDGET, &child, -1);
|
|
Packit |
1e8aac |
g_object_unref (child);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (child == gchild)
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_iter_children (model, &child_iter, iter))
|
|
Packit |
1e8aac |
if (glade_base_editor_find_child_real (e, gchild, &child_iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
*iter = child_iter;
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next (model, iter));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_find_child (GladeBaseEditor *e,
|
|
Packit |
1e8aac |
GladeWidget *child,
|
|
Packit |
1e8aac |
GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (gtk_tree_model_get_iter_first (e->priv->model, iter))
|
|
Packit |
1e8aac |
return glade_base_editor_find_child_real (e, child, iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_select_child (GladeBaseEditor *e, GladeWidget *child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_base_editor_find_child (e, child, &iter))
|
|
Packit |
1e8aac |
glade_base_editor_set_cursor (e, &iter);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_child_change_type (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gchild;
|
|
Packit |
1e8aac |
GObject *child;
|
|
Packit |
1e8aac |
gchar *class_name;
|
|
Packit |
1e8aac |
gboolean retval;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Get old widget data */
|
|
Packit |
1e8aac |
gtk_tree_model_get (editor->priv->model, iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gchild,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_OBJECT, &child, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_unref (gchild);
|
|
Packit |
1e8aac |
g_object_unref (child);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (type == G_OBJECT_TYPE (child) ||
|
|
Packit |
1e8aac |
!gchild || !glade_widget_get_parent (gchild))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, FALSE);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Start of glade-command */
|
|
Packit |
1e8aac |
if (glade_base_editor_get_type_info (editor, NULL,
|
|
Packit |
1e8aac |
type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME,
|
|
Packit |
1e8aac |
&class_name, -1))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_push_group (_("Setting object type on %s to %s"),
|
|
Packit |
1e8aac |
glade_widget_get_name (gchild), class_name);
|
|
Packit |
1e8aac |
g_free (class_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, FALSE);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_emit (editor,
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_CHANGE_TYPE],
|
|
Packit |
1e8aac |
0, gchild, type, &retval);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* End of glade-command */
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Update properties */
|
|
Packit |
1e8aac |
glade_base_editor_update_properties (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_type_changed (GtkComboBox *widget, GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter, combo_iter;
|
|
Packit |
1e8aac |
GType type;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!glade_base_editor_get_child_selected (e, &iter))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_combo_box_get_active_iter (widget, &combo_iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (gtk_combo_box_get_model (widget), &combo_iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, &type, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_child_change_type (e, &iter, type);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_child_type_edited (GtkCellRendererText *cell,
|
|
Packit |
1e8aac |
const gchar *path_string,
|
|
Packit |
1e8aac |
const gchar *new_text,
|
|
Packit |
1e8aac |
GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
GtkTreeModel *child_class;
|
|
Packit |
1e8aac |
GtkTreePath *path;
|
|
Packit |
1e8aac |
GtkTreeIter iter, combo_iter;
|
|
Packit |
1e8aac |
GType type;
|
|
Packit |
1e8aac |
gchar *type_name = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
path = gtk_tree_path_new_from_string (path_string);
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter (e->model, &iter, path);
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPE_NAME, &type_name,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CHILD_TYPES, &child_class, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (g_strcmp0 (type_name, new_text) == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (type_name);
|
|
Packit |
1e8aac |
g_object_unref (child_class);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Lookup GType */
|
|
Packit |
1e8aac |
if (!gtk_tree_model_get_iter_first (child_class, &combo_iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (type_name);
|
|
Packit |
1e8aac |
g_object_unref (child_class);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (type_name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (child_class, &combo_iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, &type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME, &type_name, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (strcmp (type_name, new_text) == 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_free (type_name);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (type_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next (child_class, &combo_iter));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_child_change_type (editor, &iter, type);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_reorder_children (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GtkTreeIter *child)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeModel *model = editor->priv->model;
|
|
Packit |
1e8aac |
GladeWidget *gchild;
|
|
Packit |
1e8aac |
GladeProperty *property;
|
|
Packit |
1e8aac |
GtkTreeIter parent, iter;
|
|
Packit |
1e8aac |
gint position = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_iter_parent (model, &parent, child))
|
|
Packit |
1e8aac |
gtk_tree_model_iter_children (model, &iter, &parent);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter_first (model, &iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, &iter, GLADE_BASE_EDITOR_GWIDGET, &gchild, -1);
|
|
Packit |
1e8aac |
g_object_unref (gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((property = glade_widget_get_property (gchild, "position")) != NULL)
|
|
Packit |
1e8aac |
glade_command_set_property (property, position);
|
|
Packit |
1e8aac |
position++;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next (model, &iter));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_add_child (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GType type,
|
|
Packit |
1e8aac |
GladeBaseEditorAddMode add_mode)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
GtkTreeIter iter, new_iter;
|
|
Packit |
1e8aac |
GladeWidget *gparent, *gchild_new;
|
|
Packit |
1e8aac |
gchar *name, *class_name;
|
|
Packit |
1e8aac |
gboolean selected_iter = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gparent = e->gcontainer;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (add_mode != ADD_ROOT &&
|
|
Packit |
1e8aac |
(selected_iter = glade_base_editor_get_child_selected (editor, &iter)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (add_mode == ADD_CHILD)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gparent, -1);
|
|
Packit |
1e8aac |
g_object_unref (gparent);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (add_mode == ADD_SIBLING &&
|
|
Packit |
1e8aac |
gtk_tree_model_iter_parent (e->model, &new_iter, &iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->model, &new_iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gparent, -1);
|
|
Packit |
1e8aac |
g_object_unref (gparent);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!glade_base_editor_get_type_info (editor, NULL, type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME,
|
|
Packit |
1e8aac |
&class_name, -1))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_push_group (_("Add a %s to %s"), class_name,
|
|
Packit |
1e8aac |
glade_widget_get_name (gparent));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Build Child */
|
|
Packit |
1e8aac |
gchild_new = glade_base_editor_delegate_build_child (editor, gparent, type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gchild_new == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (selected_iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (add_mode == ADD_CHILD)
|
|
Packit |
1e8aac |
gtk_tree_store_append (GTK_TREE_STORE (editor->priv->model), &new_iter,
|
|
Packit |
1e8aac |
&iter);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_tree_store_insert_after (GTK_TREE_STORE (editor->priv->model),
|
|
Packit |
1e8aac |
&new_iter, NULL, &iter);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_tree_store_append (GTK_TREE_STORE (editor->priv->model), &new_iter,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
name = glade_base_editor_get_display_name (editor, gchild_new);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_set (GTK_TREE_STORE (editor->priv->model), &new_iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, gchild_new,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_OBJECT,
|
|
Packit |
1e8aac |
glade_widget_get_object (gchild_new),
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPE_NAME, class_name,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_NAME, name,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CHILD_TYPES,
|
|
Packit |
1e8aac |
get_children_model_for_type (editor,
|
|
Packit |
1e8aac |
G_OBJECT_TYPE (glade_widget_get_object (gparent))),
|
|
Packit |
1e8aac |
-1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_reorder_children (editor, &new_iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (e->treeview));
|
|
Packit |
1e8aac |
glade_base_editor_set_cursor (editor, &new_iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (name);
|
|
Packit |
1e8aac |
g_free (class_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_add_item_activate (GtkMenuItem *menuitem,
|
|
Packit |
1e8aac |
GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *item = G_OBJECT (menuitem);
|
|
Packit |
1e8aac |
GType type = GPOINTER_TO_SIZE (g_object_get_data (item, "object_type"));
|
|
Packit |
1e8aac |
GladeBaseEditorAddMode add_mode =
|
|
Packit |
1e8aac |
GPOINTER_TO_INT (g_object_get_data (item, "object_add_mode"));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_add_child (e, type, add_mode);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkWidget *
|
|
Packit |
1e8aac |
glade_base_editor_popup (GladeBaseEditor *editor, GladeWidget *widget)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *popup, *item;
|
|
Packit |
1e8aac |
GtkTreeModel *model;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GType iter_type;
|
|
Packit |
1e8aac |
gchar *label;
|
|
Packit |
1e8aac |
gchar *class_name;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((model =
|
|
Packit |
1e8aac |
get_children_model_for_child_type (editor,
|
|
Packit |
1e8aac |
G_OBJECT_TYPE (glade_widget_get_object (widget)))) == NULL)
|
|
Packit |
1e8aac |
model =
|
|
Packit |
1e8aac |
get_children_model_for_type (editor,
|
|
Packit |
1e8aac |
G_OBJECT_TYPE (glade_widget_get_object (editor->priv->gcontainer)));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_assert (model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
popup = gtk_menu_new ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_get_iter_first (model, &iter))
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, &iter_type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME, &class_name, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
label = g_strdup_printf (_("Add %s"), class_name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
item = gtk_menu_item_new_with_label (label);
|
|
Packit |
1e8aac |
gtk_widget_show (item);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (item), "object_type",
|
|
Packit |
1e8aac |
GSIZE_TO_POINTER (iter_type));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (item), "object_add_mode",
|
|
Packit |
1e8aac |
GINT_TO_POINTER (ADD_SIBLING));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (item, "activate",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_add_item_activate),
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
gtk_menu_shell_append (GTK_MENU_SHELL (popup), item);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (label);
|
|
Packit |
1e8aac |
g_free (class_name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next (model, &iter));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((model =
|
|
Packit |
1e8aac |
get_children_model_for_type (editor, G_OBJECT_TYPE (glade_widget_get_object (widget)))) &&
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter_first (model, &iter))
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, &iter_type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME, &class_name, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
label = g_strdup_printf (_("Add child %s"), class_name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
item = gtk_menu_item_new_with_label (label);
|
|
Packit |
1e8aac |
gtk_widget_show (item);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (item), "object_type",
|
|
Packit |
1e8aac |
GSIZE_TO_POINTER (iter_type));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (item), "object_add_mode",
|
|
Packit |
1e8aac |
GINT_TO_POINTER (ADD_CHILD));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (item, "activate",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_add_item_activate),
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
gtk_menu_shell_append (GTK_MENU_SHELL (popup), item);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (label);
|
|
Packit |
1e8aac |
g_free (class_name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next (model, &iter));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return popup;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gint
|
|
Packit |
1e8aac |
glade_base_editor_popup_handler (GtkWidget *treeview,
|
|
Packit |
1e8aac |
GdkEventButton *event,
|
|
Packit |
1e8aac |
GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreePath *path;
|
|
Packit |
1e8aac |
GtkWidget *popup;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_popup_is_popup_event (event))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview),
|
|
Packit |
1e8aac |
(gint) event->x, (gint) event->y,
|
|
Packit |
1e8aac |
&path, NULL, NULL, NULL))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GladeWidget *gwidget;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_set_cursor (GTK_TREE_VIEW (treeview), path, NULL,
|
|
Packit |
1e8aac |
FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get_iter (e->priv->model, &iter, path);
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->priv->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gwidget, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
popup = glade_base_editor_popup (e, gwidget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_path_free (path);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_menu_popup_at_pointer (GTK_MENU (popup), (GdkEvent*) event);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_add_activate (GtkButton *button, GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (e->priv->add_type)
|
|
Packit |
1e8aac |
glade_base_editor_add_child (e, e->priv->add_type, ADD_ROOT);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_delete_child (GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *child, *gparent;
|
|
Packit |
1e8aac |
GtkTreeIter iter, parent;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!glade_base_editor_get_child_selected (e, &iter))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->priv->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &child, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_iter_parent (e->priv->model, &parent, &iter))
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->priv->model, &parent,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gparent, -1);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gparent = e->priv->gcontainer;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_push_group (_("Delete %s child from %s"),
|
|
Packit |
1e8aac |
glade_widget_get_name (child),
|
|
Packit |
1e8aac |
glade_widget_get_name (gparent));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Emit delete-child signal */
|
|
Packit |
1e8aac |
glade_base_editor_delegate_delete_child (e, gparent, child);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_treeview_key_press_event (GtkWidget *widget,
|
|
Packit |
1e8aac |
GdkEventKey *event,
|
|
Packit |
1e8aac |
GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (event->keyval == GDK_KEY_Delete)
|
|
Packit |
1e8aac |
glade_base_editor_delete_child (e);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_delete_activate (GtkButton *button, GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_base_editor_delete_child (e);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_is_child (GladeBaseEditor *e,
|
|
Packit |
1e8aac |
GladeWidget *gchild,
|
|
Packit |
1e8aac |
gboolean valid_type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *gcontainer = glade_widget_get_parent (gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!gcontainer)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (valid_type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *child = glade_widget_get_object (gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_get_internal (gchild) ||
|
|
Packit |
1e8aac |
glade_base_editor_get_type_info (e, NULL,
|
|
Packit |
1e8aac |
G_OBJECT_TYPE (child), -1) == FALSE)
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gcontainer = e->priv->gcontainer;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
if (glade_base_editor_get_child_selected (e, &iter))
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->priv->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gcontainer, -1);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
while ((gchild = glade_widget_get_parent (gchild)))
|
|
Packit |
1e8aac |
if (gchild == gcontainer)
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_update_treeview_idle (gpointer data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *e = data;
|
|
Packit |
1e8aac |
GList *selection = glade_project_selection_get (e->priv->project);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (e, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_fill_store (e);
|
|
Packit |
1e8aac |
glade_base_editor_clear (e);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (e->priv->treeview));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (selection)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *widget =
|
|
Packit |
1e8aac |
glade_widget_get_from_gobject (G_OBJECT (selection->data));
|
|
Packit |
1e8aac |
if (glade_base_editor_is_child (e, widget, TRUE))
|
|
Packit |
1e8aac |
glade_base_editor_select_child (e, widget);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e->priv->updating_treeview = FALSE;
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (e, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_widget_name_changed (GladeProject *project,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *selected_child;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_base_editor_get_child_selected (editor, &iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (editor->priv->model, &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &selected_child, -1);
|
|
Packit |
1e8aac |
if (widget == selected_child)
|
|
Packit |
1e8aac |
glade_base_editor_update_properties (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (selected_child));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_closed (GladeProject *project, GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_base_editor_set_container (e, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_reorder (GladeBaseEditor *editor, GtkTreeIter *iter)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
GladeWidget *gchild, *gparent;
|
|
Packit |
1e8aac |
GtkTreeIter parent_iter;
|
|
Packit |
1e8aac |
gboolean retval;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_push_group (_("Reorder %s's children"),
|
|
Packit |
1e8aac |
glade_widget_get_name (e->gcontainer));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->model, iter, GLADE_BASE_EDITOR_GWIDGET, &gchild, -1);
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (gchild));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_iter_parent (e->model, &parent_iter, iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (e->model, &parent_iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, &gparent, -1);
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (gparent));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gparent = e->gcontainer;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_emit (editor, glade_base_editor_signals[SIGNAL_MOVE_CHILD],
|
|
Packit |
1e8aac |
0, gparent, gchild, &retval);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (retval)
|
|
Packit |
1e8aac |
glade_base_editor_reorder_children (editor, iter);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_base_editor_clear (editor);
|
|
Packit |
1e8aac |
glade_base_editor_fill_store (editor);
|
|
Packit |
1e8aac |
glade_base_editor_find_child (editor, gchild, &editor->priv->iter);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_command_pop_group ();
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_drag_and_drop_idle (gpointer data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *e = data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_reorder (e, &e->priv->iter);
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (e->priv->treeview));
|
|
Packit |
1e8aac |
glade_base_editor_set_cursor (e, &e->priv->iter);
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (e, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_row_inserted (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreePath *path,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
e->priv->iter = *iter;
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (e, TRUE);
|
|
Packit |
1e8aac |
g_idle_add (glade_base_editor_drag_and_drop_idle, e);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_remove_widget (GladeProject *project,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (widget == e->priv->gcontainer)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_base_editor_set_container (e, NULL);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_base_editor_is_child (e, widget, TRUE))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
if (glade_base_editor_find_child (e, widget, &iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_store_remove (GTK_TREE_STORE (e->priv->model), &iter);
|
|
Packit |
1e8aac |
glade_base_editor_clear (e);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_get_internal (widget) &&
|
|
Packit |
1e8aac |
glade_base_editor_is_child (e, widget, FALSE))
|
|
Packit |
1e8aac |
glade_base_editor_update_properties (e);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_add_widget (GladeProject *project,
|
|
Packit |
1e8aac |
GladeWidget *widget,
|
|
Packit |
1e8aac |
GladeBaseEditor *e)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (e->priv->updating_treeview)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_base_editor_is_child (e, widget, TRUE))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
e->priv->updating_treeview = TRUE;
|
|
Packit |
1e8aac |
g_idle_add (glade_base_editor_update_treeview_idle, e);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_widget_get_internal (widget) &&
|
|
Packit |
1e8aac |
glade_base_editor_is_child (e, widget, FALSE))
|
|
Packit |
1e8aac |
glade_base_editor_update_properties (e);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_update_display_name (GtkTreeModel *model,
|
|
Packit |
1e8aac |
GtkTreePath *path,
|
|
Packit |
1e8aac |
GtkTreeIter *iter,
|
|
Packit |
1e8aac |
gpointer data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *editor = data;
|
|
Packit |
1e8aac |
GladeWidget *gchild;
|
|
Packit |
1e8aac |
gchar *name;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (model, iter, GLADE_BASE_EDITOR_GWIDGET, &gchild, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
name = glade_base_editor_get_display_name (editor, gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_store_set (GTK_TREE_STORE (editor->priv->model), iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_NAME, name, -1);
|
|
Packit |
1e8aac |
g_free (name);
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (gchild));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_changed (GladeProject *project,
|
|
Packit |
1e8aac |
GladeCommand *command,
|
|
Packit |
1e8aac |
gboolean forward,
|
|
Packit |
1e8aac |
GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_foreach (editor->priv->model,
|
|
Packit |
1e8aac |
glade_base_editor_update_display_name, editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_project_disconnect (GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (e->project == NULL)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_closed,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_remove_widget,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_add_widget,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_widget_name_changed,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_handlers_disconnect_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_changed,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (e->properties_idle)
|
|
Packit |
1e8aac |
g_source_remove (e->properties_idle);
|
|
Packit |
1e8aac |
e->properties_idle = 0;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_set_container (GladeBaseEditor *editor, GObject *container)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_project_disconnect (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (container == NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
reset_child_types (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e->gcontainer = NULL;
|
|
Packit |
1e8aac |
e->project = NULL;
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, TRUE);
|
|
Packit |
1e8aac |
glade_base_editor_clear (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (GTK_TREE_VIEW (editor->priv->treeview), NULL);
|
|
Packit |
1e8aac |
gtk_tree_store_clear (GTK_TREE_STORE (editor->priv->model));
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (GTK_TREE_VIEW (editor->priv->treeview),
|
|
Packit |
1e8aac |
editor->priv->model);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_set_sensitive (e->paned, FALSE);
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_signal_editor_load_widget (e->signal_editor, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_CONTAINER]);
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_set_sensitive (e->paned, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e->gcontainer = glade_widget_get_from_gobject (container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e->project = glade_widget_get_project (e->gcontainer);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (e->project, "close",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_project_closed), editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (e->project, "remove-widget",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_project_remove_widget),
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (e->project, "add-widget",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_project_add_widget), editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (e->project, "widget-name-changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_project_widget_name_changed),
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (e->project, "changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_project_changed), editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_CONTAINER]);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/*************************** GladeBaseEditor Class ****************************/
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_dispose (GObject *object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *cobj = GLADE_BASE_EDITOR (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
reset_child_types (cobj);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_project_disconnect (cobj);
|
|
Packit |
1e8aac |
cobj->priv->project = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (glade_base_editor_parent_class)->dispose (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_set_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
const GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *editor = GLADE_BASE_EDITOR (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_CONTAINER:
|
|
Packit |
1e8aac |
glade_base_editor_set_container (editor, g_value_get_object (value));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_get_property (GObject *object,
|
|
Packit |
1e8aac |
guint prop_id,
|
|
Packit |
1e8aac |
GValue *value,
|
|
Packit |
1e8aac |
GParamSpec *pspec)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *editor = GLADE_BASE_EDITOR (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
switch (prop_id)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
case PROP_CONTAINER:
|
|
Packit |
1e8aac |
g_value_set_object (value, glade_widget_get_object (editor->priv->gcontainer));
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
default:
|
|
Packit |
1e8aac |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
1e8aac |
break;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Default handlers */
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_change_type (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gchild,
|
|
Packit |
1e8aac |
GType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *parent, *gchild_new;
|
|
Packit |
1e8aac |
GList *children, *l;
|
|
Packit |
1e8aac |
GObject *child_new;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gchar *name, *class_name;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
parent = glade_widget_get_parent (gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_base_editor_get_type_info (editor, NULL, type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME,
|
|
Packit |
1e8aac |
&class_name, -1) == FALSE)
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
name = g_strdup (glade_widget_get_name (gchild));
|
|
Packit |
1e8aac |
glade_base_editor_find_child (editor, gchild, &iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Delete old widget first, we cant assume the old and new widget can live in
|
|
Packit |
1e8aac |
* the same parent simultaniously */
|
|
Packit |
1e8aac |
glade_base_editor_delegate_delete_child (editor, parent, gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Create new widget */
|
|
Packit |
1e8aac |
gchild_new = glade_base_editor_delegate_build_child (editor, parent, type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
child_new = glade_widget_get_object (gchild_new);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Cut and Paste childrens */
|
|
Packit |
1e8aac |
if ((children = glade_widget_get_children (gchild)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList *gchildren = NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
l = children;
|
|
Packit |
1e8aac |
while (l)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeWidget *w = glade_widget_get_from_gobject (l->data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (w && !glade_widget_get_internal (w))
|
|
Packit |
1e8aac |
gchildren = g_list_prepend (gchildren, w);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
l = g_list_next (l);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gchildren)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_command_dnd (gchildren, gchild_new, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_list_free (children);
|
|
Packit |
1e8aac |
g_list_free (gchildren);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Copy properties */
|
|
Packit |
1e8aac |
glade_widget_copy_properties (gchild_new, gchild, TRUE, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Apply packing properties to the new object
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* No need to use GladeCommand here on the newly created widget,
|
|
Packit |
1e8aac |
* they just become the initial state for this object.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
l = glade_widget_get_packing_properties (gchild);
|
|
Packit |
1e8aac |
while (l)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeProperty *orig_prop = (GladeProperty *) l->data;
|
|
Packit |
1e8aac |
GladePropertyClass *pclass = glade_property_get_class (orig_prop);
|
|
Packit |
1e8aac |
GladeProperty *dup_prop = glade_widget_get_property (gchild_new, glade_property_class_id (pclass));
|
|
Packit |
1e8aac |
glade_property_set_value (dup_prop, glade_property_inline_value (orig_prop));
|
|
Packit |
1e8aac |
l = g_list_next (l);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Set the name */
|
|
Packit |
1e8aac |
glade_command_set_name (gchild_new, name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (GTK_IS_WIDGET (child_new))
|
|
Packit |
1e8aac |
gtk_widget_show_all (GTK_WIDGET (child_new));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* XXX We should update the widget name in the visible tree here too */
|
|
Packit |
1e8aac |
gtk_tree_store_set (GTK_TREE_STORE (editor->priv->model), &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GWIDGET, gchild_new,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_OBJECT, child_new,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPE_NAME, class_name, -1);
|
|
Packit |
1e8aac |
g_free (class_name);
|
|
Packit |
1e8aac |
g_free (name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gchar *
|
|
Packit |
1e8aac |
glade_base_editor_get_display_name_impl (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gchild)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return g_strdup (glade_widget_get_display_name (gchild));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GladeWidget *
|
|
Packit |
1e8aac |
glade_base_editor_build_child (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gparent,
|
|
Packit |
1e8aac |
GType type)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return glade_command_create (glade_widget_adaptor_get_by_type (type),
|
|
Packit |
1e8aac |
gparent, NULL,
|
|
Packit |
1e8aac |
glade_widget_get_project (gparent));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_move_child (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gparent,
|
|
Packit |
1e8aac |
GladeWidget *gchild)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList list = { 0, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gparent != glade_widget_get_parent (gchild))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
list.data = gchild;
|
|
Packit |
1e8aac |
glade_command_dnd (&list, gparent, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
glade_base_editor_delete_child_impl (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gparent,
|
|
Packit |
1e8aac |
GladeWidget *gchild)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GList list = { 0, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
list.data = gchild;
|
|
Packit |
1e8aac |
glade_command_delete (&list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (GladeBaseEditor *editor, gboolean block)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e = editor->priv;
|
|
Packit |
1e8aac |
if (block)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_handlers_block_by_func (e->model, glade_base_editor_row_inserted,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
if (e->project)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_handlers_block_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_remove_widget,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
g_signal_handlers_block_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_add_widget,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
g_signal_handlers_block_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_changed,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_handlers_unblock_by_func (e->model,
|
|
Packit |
1e8aac |
glade_base_editor_row_inserted,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
if (e->project)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_signal_handlers_unblock_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_remove_widget,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
g_signal_handlers_unblock_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_add_widget,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
g_signal_handlers_unblock_by_func (e->project,
|
|
Packit |
1e8aac |
glade_base_editor_project_changed,
|
|
Packit |
1e8aac |
editor);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_realize_callback (GtkWidget *widget, gpointer user_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditor *editor = GLADE_BASE_EDITOR (widget);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_fill_store (editor);
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (editor->priv->treeview));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_block_callbacks (editor, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_init (GladeBaseEditor *editor)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e;
|
|
Packit |
1e8aac |
GtkCellRenderer *renderer;
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_init_template (GTK_WIDGET (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e = editor->priv = glade_base_editor_get_instance_private (editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
column = gtk_tree_view_column_new_with_attributes (_("Label"), renderer,
|
|
Packit |
1e8aac |
"text",
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_NAME,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_append_column (GTK_TREE_VIEW (e->treeview), column);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_combo_new ();
|
|
Packit |
1e8aac |
g_object_set (renderer,
|
|
Packit |
1e8aac |
"has-entry", FALSE,
|
|
Packit |
1e8aac |
"text-column", GLADE_BASE_EDITOR_CLASS_NAME,
|
|
Packit |
1e8aac |
"editable", TRUE, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "edited",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_child_type_edited), editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
column = gtk_tree_view_column_new_with_attributes (_("Type"), renderer,
|
|
Packit |
1e8aac |
"text",
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_TYPE_NAME,
|
|
Packit |
1e8aac |
"model",
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CHILD_TYPES,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_append_column (GTK_TREE_VIEW (e->treeview), column);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_class_init (GladeBaseEditorClass *klass)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
1e8aac |
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_parent_class = g_type_class_peek_parent (klass);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
object_class->dispose = glade_base_editor_dispose;
|
|
Packit |
1e8aac |
object_class->set_property = glade_base_editor_set_property;
|
|
Packit |
1e8aac |
object_class->get_property = glade_base_editor_get_property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
klass->change_type = glade_base_editor_change_type;
|
|
Packit |
1e8aac |
klass->get_display_name = glade_base_editor_get_display_name_impl;
|
|
Packit |
1e8aac |
klass->build_child = glade_base_editor_build_child;
|
|
Packit |
1e8aac |
klass->delete_child = glade_base_editor_delete_child_impl;
|
|
Packit |
1e8aac |
klass->move_child = glade_base_editor_move_child;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
properties[PROP_CONTAINER] =
|
|
Packit |
1e8aac |
g_param_spec_object ("container",
|
|
Packit |
1e8aac |
_("Container"),
|
|
Packit |
1e8aac |
_("The container object this editor is currently editing"),
|
|
Packit |
1e8aac |
G_TYPE_OBJECT,
|
|
Packit |
1e8aac |
G_PARAM_READWRITE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Install all properties */
|
|
Packit |
1e8aac |
g_object_class_install_properties (object_class, N_PROPERTIES, properties);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* GladeBaseEditor::child-selected:
|
|
Packit |
1e8aac |
* @gladebaseeditor: the #GladeBaseEditor which received the signal.
|
|
Packit |
1e8aac |
* @gchild: the selected #GladeWidget.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Emited when the user selects a child in the editor's treeview.
|
|
Packit |
1e8aac |
* You can add the relevant child properties here using
|
|
Packit |
1e8aac |
* glade_base_editor_add_default_properties() and glade_base_editor_add_properties()
|
|
Packit |
1e8aac |
* You can also add labels with glade_base_editor_add_label to make the
|
|
Packit |
1e8aac |
* editor look pretty.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_CHILD_SELECTED] =
|
|
Packit |
1e8aac |
g_signal_new ("child-selected",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladeBaseEditorClass, child_selected),
|
|
Packit |
1e8aac |
NULL, NULL,
|
|
Packit |
1e8aac |
_glade_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* GladeBaseEditor::child-change-type:
|
|
Packit |
1e8aac |
* @gladebaseeditor: the #GladeBaseEditor which received the signal.
|
|
Packit |
1e8aac |
* @child: the #GObject being changed.
|
|
Packit |
1e8aac |
* @type: the new type for @child.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: TRUE to stop signal emision.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_CHANGE_TYPE] =
|
|
Packit |
1e8aac |
g_signal_new ("change-type",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladeBaseEditorClass, change_type),
|
|
Packit |
1e8aac |
_glade_boolean_handled_accumulator, NULL, NULL,
|
|
Packit |
1e8aac |
G_TYPE_BOOLEAN, 2, G_TYPE_OBJECT, G_TYPE_GTYPE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* GladeBaseEditor::get-display-name:
|
|
Packit |
1e8aac |
* @gladebaseeditor: the #GladeBaseEditor which received the signal.
|
|
Packit |
1e8aac |
* @gchild: the child to get display name string to show in @gladebaseeditor
|
|
Packit |
1e8aac |
* treeview.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: a newly allocated string.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_GET_DISPLAY_NAME] =
|
|
Packit |
1e8aac |
g_signal_new ("get-display-name",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladeBaseEditorClass, get_display_name),
|
|
Packit |
1e8aac |
_glade_string_accumulator, NULL,
|
|
Packit |
1e8aac |
_glade_marshal_STRING__OBJECT,
|
|
Packit |
1e8aac |
G_TYPE_STRING, 1, G_TYPE_OBJECT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* GladeBaseEditor::build-child:
|
|
Packit |
1e8aac |
* @gladebaseeditor: the #GladeBaseEditor which received the signal.
|
|
Packit |
1e8aac |
* @gparent: the parent of the new child
|
|
Packit |
1e8aac |
* @type: the #GType of the child
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Create a child widget here if something else must be done other than
|
|
Packit |
1e8aac |
* calling glade_command_create() such as creating an intermediate parent.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: the newly created #GladeWidget or NULL if child cant be created
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_BUILD_CHILD] =
|
|
Packit |
1e8aac |
g_signal_new ("build-child",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladeBaseEditorClass, build_child),
|
|
Packit |
1e8aac |
_glade_stop_emission_accumulator, NULL, NULL,
|
|
Packit |
1e8aac |
G_TYPE_OBJECT, 2, G_TYPE_OBJECT, G_TYPE_GTYPE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* GladeBaseEditor::delete-child:
|
|
Packit |
1e8aac |
* @gladebaseeditor: the #GladeBaseEditor which received the signal.
|
|
Packit |
1e8aac |
* @gparent: the parent
|
|
Packit |
1e8aac |
* @gchild: the child to delete
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_DELETE_CHILD] =
|
|
Packit |
1e8aac |
g_signal_new ("delete-child",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladeBaseEditorClass, delete_child),
|
|
Packit |
1e8aac |
_glade_boolean_handled_accumulator, NULL,
|
|
Packit |
1e8aac |
_glade_marshal_BOOLEAN__OBJECT_OBJECT,
|
|
Packit |
1e8aac |
G_TYPE_BOOLEAN, 2, G_TYPE_OBJECT, G_TYPE_OBJECT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* GladeBaseEditor::move-child:
|
|
Packit |
1e8aac |
* @gladebaseeditor: the #GladeBaseEditor which received the signal.
|
|
Packit |
1e8aac |
* @gparent: the new parent of @gchild
|
|
Packit |
1e8aac |
* @gchild: the #GladeWidget to move
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Move child here if something else must be done other than cut & paste.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: wheater child has been sucessfully moved or not.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
glade_base_editor_signals[SIGNAL_MOVE_CHILD] =
|
|
Packit |
1e8aac |
g_signal_new ("move-child",
|
|
Packit |
1e8aac |
G_TYPE_FROM_CLASS (object_class),
|
|
Packit |
1e8aac |
G_SIGNAL_RUN_LAST,
|
|
Packit |
1e8aac |
G_STRUCT_OFFSET (GladeBaseEditorClass, move_child),
|
|
Packit |
1e8aac |
_glade_stop_emission_accumulator, NULL,
|
|
Packit |
1e8aac |
_glade_marshal_BOOLEAN__OBJECT_OBJECT,
|
|
Packit |
1e8aac |
G_TYPE_BOOLEAN, 2, G_TYPE_OBJECT, G_TYPE_OBJECT);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladeui/glade-base-editor.ui");
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, paned);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, treeview);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, add_button);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, delete_button);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, help_button);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, table);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, signal_editor);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_child_private (widget_class, GladeBaseEditor, tip_label);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_base_editor_realize_callback);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_base_editor_treeview_cursor_changed);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_base_editor_popup_handler);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_base_editor_treeview_key_press_event);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_base_editor_add_activate);
|
|
Packit |
1e8aac |
gtk_widget_class_bind_template_callback (widget_class, glade_base_editor_delete_activate);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/********************************* Public API *********************************/
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_new:
|
|
Packit |
1e8aac |
* @container: a container this new editor will edit.
|
|
Packit |
1e8aac |
* @main_editable: the custom #GladeEditable for @container, or %NULL
|
|
Packit |
1e8aac |
* @... A NULL terminated list of gchar *, GType
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Creates a new GladeBaseEditor with @container toplevel
|
|
Packit |
1e8aac |
* support for all the object types indicated in the variable argument list.
|
|
Packit |
1e8aac |
* Argument List:
|
|
Packit |
1e8aac |
* o The type name
|
|
Packit |
1e8aac |
* o The GType the editor will support
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: a new GladeBaseEditor.
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GladeBaseEditor *
|
|
Packit |
1e8aac |
glade_base_editor_new (GObject *container, GladeEditable *main_editable, ...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ChildTypeTab *child_type;
|
|
Packit |
1e8aac |
GladeWidget *gcontainer;
|
|
Packit |
1e8aac |
GladeBaseEditor *editor;
|
|
Packit |
1e8aac |
GladeBaseEditorPrivate *e;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GType iter_type;
|
|
Packit |
1e8aac |
gchar *name;
|
|
Packit |
1e8aac |
va_list args;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gcontainer = glade_widget_get_from_gobject (container);
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_WIDGET (gcontainer), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor = GLADE_BASE_EDITOR (g_object_new (GLADE_TYPE_BASE_EDITOR, NULL));
|
|
Packit |
1e8aac |
e = editor->priv;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Store */
|
|
Packit |
1e8aac |
e->model = (GtkTreeModel *) gtk_tree_store_new (GLADE_BASE_EDITOR_N_COLUMNS,
|
|
Packit |
1e8aac |
G_TYPE_OBJECT,
|
|
Packit |
1e8aac |
G_TYPE_OBJECT,
|
|
Packit |
1e8aac |
G_TYPE_STRING,
|
|
Packit |
1e8aac |
G_TYPE_STRING,
|
|
Packit |
1e8aac |
GTK_TYPE_TREE_MODEL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (GTK_TREE_VIEW (e->treeview), e->model);
|
|
Packit |
1e8aac |
gtk_tree_view_expand_all (GTK_TREE_VIEW (e->treeview));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (e->model, "row-inserted",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_row_inserted), editor);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (main_editable)
|
|
Packit |
1e8aac |
g_warning ("%s main_editable is deprecated, the editor will only show the hierarchy editor", __func__);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
child_type = g_new0 (ChildTypeTab, 1);
|
|
Packit |
1e8aac |
child_type->parent_type = G_OBJECT_TYPE (container);
|
|
Packit |
1e8aac |
child_type->children =
|
|
Packit |
1e8aac |
(GtkTreeModel *) gtk_list_store_new (GLADE_BASE_EDITOR_TYPES_N_COLUMNS,
|
|
Packit |
1e8aac |
G_TYPE_GTYPE, G_TYPE_STRING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
va_start (args, main_editable);
|
|
Packit |
1e8aac |
while ((name = va_arg (args, gchar *)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iter_type = va_arg (args, GType);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_list_store_append (GTK_LIST_STORE (child_type->children), &iter);
|
|
Packit |
1e8aac |
gtk_list_store_set (GTK_LIST_STORE (child_type->children), &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, iter_type,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME, name, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (editor->priv->add_type == 0)
|
|
Packit |
1e8aac |
editor->priv->add_type = iter_type;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
va_end (args);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
e->child_types = g_list_prepend (e->child_types, child_type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_base_editor_set_container (editor, container);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_signal_editor_load_widget (e->signal_editor, e->gcontainer);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return editor;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_append_types:
|
|
Packit |
1e8aac |
* @editor: A #GladeBaseEditor
|
|
Packit |
1e8aac |
* @parent_type: the parent type these child types will apply to
|
|
Packit |
1e8aac |
* @... A NULL terminated list of gchar *, GType
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Appends support for all the object types indicated in the variable argument list.
|
|
Packit |
1e8aac |
* Argument List:
|
|
Packit |
1e8aac |
* o The type name
|
|
Packit |
1e8aac |
* o The GType the editor will support for parents of type @type
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_base_editor_append_types (GladeBaseEditor *editor, GType parent_type, ...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
ChildTypeTab *child_type;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gchar *name;
|
|
Packit |
1e8aac |
va_list args;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
g_return_if_fail (get_children_model_for_type (editor, parent_type) == NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
child_type = g_new0 (ChildTypeTab, 1);
|
|
Packit |
1e8aac |
child_type->parent_type = parent_type;
|
|
Packit |
1e8aac |
child_type->children =
|
|
Packit |
1e8aac |
(GtkTreeModel *) gtk_list_store_new (GLADE_BASE_EDITOR_TYPES_N_COLUMNS,
|
|
Packit |
1e8aac |
G_TYPE_GTYPE, G_TYPE_STRING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
va_start (args, parent_type);
|
|
Packit |
1e8aac |
while ((name = va_arg (args, gchar *)))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_list_store_append (GTK_LIST_STORE (child_type->children), &iter);
|
|
Packit |
1e8aac |
gtk_list_store_set (GTK_LIST_STORE (child_type->children), &iter,
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_GTYPE, va_arg (args, GType),
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME, name,
|
|
Packit |
1e8aac |
-1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
va_end (args);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor->priv->child_types =
|
|
Packit |
1e8aac |
g_list_insert_sorted (editor->priv->child_types, child_type,
|
|
Packit |
1e8aac |
(GCompareFunc) sort_type_by_hierarchy);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_add_default_properties:
|
|
Packit |
1e8aac |
* @editor: a #GladeBaseEditor
|
|
Packit |
1e8aac |
* @gchild: a #GladeWidget
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Add @gchild name and type property to @editor
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* NOTE: This function is intended to be used in "child-selected" callbacks
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_base_editor_add_default_properties (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gchild)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter combo_iter;
|
|
Packit |
1e8aac |
GtkWidget *label, *entry;
|
|
Packit |
1e8aac |
GtkTreeModel *child_class;
|
|
Packit |
1e8aac |
GtkCellRenderer *renderer;
|
|
Packit |
1e8aac |
GObject *child;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET (gchild));
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET (glade_widget_get_parent (gchild)));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
child = glade_widget_get_object (gchild);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
child_class =
|
|
Packit |
1e8aac |
get_children_model_for_child_type (editor, G_OBJECT_TYPE (child));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Name */
|
|
Packit |
1e8aac |
label = gtk_label_new (_("ID:"));
|
|
Packit |
1e8aac |
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
Packit |
1e8aac |
gtk_widget_set_valign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
entry = gtk_entry_new ();
|
|
Packit |
1e8aac |
if (glade_widget_has_name (gchild))
|
|
Packit |
1e8aac |
gtk_entry_set_text (GTK_ENTRY (entry), glade_widget_get_name (gchild));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_entry_set_text (GTK_ENTRY (entry), "");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (entry), "editor", editor);
|
|
Packit |
1e8aac |
g_signal_connect (entry, "activate",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_name_activate), gchild);
|
|
Packit |
1e8aac |
g_signal_connect (entry, "changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_name_activate), gchild);
|
|
Packit |
1e8aac |
glade_base_editor_table_attach (editor, label, entry);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (child_class && gtk_tree_model_iter_n_children (child_class, NULL) > 1)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Type */
|
|
Packit |
1e8aac |
label = gtk_label_new (_("Type:"));
|
|
Packit |
1e8aac |
gtk_widget_set_halign (label, GTK_ALIGN_END);
|
|
Packit |
1e8aac |
gtk_widget_set_valign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
entry = gtk_combo_box_new ();
|
|
Packit |
1e8aac |
gtk_combo_box_set_model (GTK_COMBO_BOX (entry), child_class);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (entry), renderer, FALSE);
|
|
Packit |
1e8aac |
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (entry), renderer, "text",
|
|
Packit |
1e8aac |
GLADE_BASE_EDITOR_CLASS_NAME, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_base_editor_get_type_info (editor, &combo_iter,
|
|
Packit |
1e8aac |
G_OBJECT_TYPE (child), -1))
|
|
Packit |
1e8aac |
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (entry), &combo_iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (entry, "changed",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_type_changed), editor);
|
|
Packit |
1e8aac |
glade_base_editor_table_attach (editor, label, entry);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_add_properties:
|
|
Packit |
1e8aac |
* @editor: a #GladeBaseEditor
|
|
Packit |
1e8aac |
* @gchild: a #GladeWidget
|
|
Packit |
1e8aac |
* @packing: whether we are adding packing properties or not
|
|
Packit |
1e8aac |
* @...: A NULL terminated list of properties names.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Add @gchild properties to @editor
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* NOTE: This function is intended to be used in "child-selected" callbacks
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_base_editor_add_properties (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gchild,
|
|
Packit |
1e8aac |
gboolean packing,
|
|
Packit |
1e8aac |
...)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorProperty *eprop;
|
|
Packit |
1e8aac |
va_list args;
|
|
Packit |
1e8aac |
gchar *property;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET (gchild));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
va_start (args, packing);
|
|
Packit |
1e8aac |
property = va_arg (args, gchar *);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
while (property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
eprop =
|
|
Packit |
1e8aac |
glade_widget_create_editor_property (gchild, property, packing, TRUE);
|
|
Packit |
1e8aac |
if (eprop)
|
|
Packit |
1e8aac |
glade_base_editor_table_attach (editor,
|
|
Packit |
1e8aac |
glade_editor_property_get_item_label (eprop),
|
|
Packit |
1e8aac |
GTK_WIDGET (eprop));
|
|
Packit |
1e8aac |
property = va_arg (args, gchar *);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
va_end (args);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_add_editable:
|
|
Packit |
1e8aac |
* @editor: a #GladeBaseEditor
|
|
Packit |
1e8aac |
* @gchild: the #GladeWidget
|
|
Packit |
1e8aac |
* @page: the #GladeEditorPageType of the desired page for @gchild
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Add @gchild editor of type @page to the base editor
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* NOTE: This function is intended to be used in "child-selected" callbacks
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_base_editor_add_editable (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
GladeWidget *gchild,
|
|
Packit |
1e8aac |
GladeEditorPageType page)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditable *editable;
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_WIDGET (gchild));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editable = glade_widget_adaptor_create_editable (glade_widget_get_adaptor (gchild), page);
|
|
Packit |
1e8aac |
glade_editable_set_show_name (editable, FALSE);
|
|
Packit |
1e8aac |
glade_editable_load (editable, gchild);
|
|
Packit |
1e8aac |
gtk_widget_show (GTK_WIDGET (editable));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
row = editor->priv->row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_grid_attach (GTK_GRID (editor->priv->table), GTK_WIDGET (editable), 0,
|
|
Packit |
1e8aac |
row, 2, 1);
|
|
Packit |
1e8aac |
gtk_widget_set_hexpand (GTK_WIDGET (editable), TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
editor->priv->row++;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_hide (editor->priv->tip_label);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_add_label:
|
|
Packit |
1e8aac |
* @editor: a #GladeBaseEditor
|
|
Packit |
1e8aac |
* @str: the label string
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Adds a new label to @editor
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* NOTE: This function is intended to be used in "child-selected" callbacks
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_base_editor_add_label (GladeBaseEditor *editor, gchar *str)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *label;
|
|
Packit |
1e8aac |
gchar *markup;
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
g_return_if_fail (str != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
label = gtk_label_new (NULL);
|
|
Packit |
1e8aac |
markup = g_strdup_printf ("%s", str);
|
|
Packit |
1e8aac |
row = editor->priv->row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_label_set_markup (GTK_LABEL (label), markup);
|
|
Packit |
1e8aac |
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_widget_set_valign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_widget_set_margin_top (label, 6);
|
|
Packit |
1e8aac |
gtk_widget_set_margin_bottom (label, 6);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_grid_attach (GTK_GRID (editor->priv->table), label, 0, row, 2, 1);
|
|
Packit |
1e8aac |
gtk_widget_show (label);
|
|
Packit |
1e8aac |
editor->priv->row++;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_hide (editor->priv->tip_label);
|
|
Packit |
1e8aac |
g_free (markup);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_set_show_signal_editor:
|
|
Packit |
1e8aac |
* @editor: a #GladeBaseEditor
|
|
Packit |
1e8aac |
* @val:
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Shows/hide @editor 's signal editor
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_base_editor_set_show_signal_editor (GladeBaseEditor *editor, gboolean val)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (GLADE_IS_BASE_EDITOR (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (val)
|
|
Packit |
1e8aac |
gtk_widget_show (GTK_WIDGET (editor->priv->signal_editor));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_widget_hide (GTK_WIDGET (editor->priv->signal_editor));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Convenience functions */
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_base_editor_help (GtkButton *button, gchar *markup)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *dialog;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))),
|
|
Packit |
1e8aac |
GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
Packit |
1e8aac |
GTK_MESSAGE_INFO, GTK_BUTTONS_OK, " ");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), markup);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_dialog_run (GTK_DIALOG (dialog));
|
|
Packit |
1e8aac |
gtk_widget_destroy (dialog);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**
|
|
Packit |
1e8aac |
* glade_base_editor_pack_new_window:
|
|
Packit |
1e8aac |
* @editor: a #GladeBaseEditor
|
|
Packit |
1e8aac |
* @title: the window title
|
|
Packit |
1e8aac |
* @help_markup: the help text
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* This convenience function create a new dialog window and packs @editor in it.
|
|
Packit |
1e8aac |
*
|
|
Packit |
1e8aac |
* Returns: the newly created window
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
GtkWidget *
|
|
Packit |
1e8aac |
glade_base_editor_pack_new_window (GladeBaseEditor *editor,
|
|
Packit |
1e8aac |
gchar *title,
|
|
Packit |
1e8aac |
gchar *help_markup)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkWidget *window, *headerbar;
|
|
Packit |
1e8aac |
gchar *msg;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (GLADE_IS_BASE_EDITOR (editor), NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Window */
|
|
Packit |
1e8aac |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit |
1e8aac |
headerbar = gtk_header_bar_new ();
|
|
Packit |
1e8aac |
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (headerbar), TRUE);
|
|
Packit |
1e8aac |
gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
|
|
Packit |
1e8aac |
gtk_widget_show (headerbar);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (title)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
const gchar *name = glade_widget_get_display_name (editor->priv->gcontainer);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar), title);
|
|
Packit |
1e8aac |
gtk_header_bar_set_subtitle (GTK_HEADER_BAR (headerbar), name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect_swapped (G_OBJECT (editor), "notify::container",
|
|
Packit |
1e8aac |
G_CALLBACK (gtk_widget_destroy), window);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
msg = help_markup ? help_markup :
|
|
Packit |
1e8aac |
_("<big>Tips:</big>\n"
|
|
Packit |
1e8aac |
" * Right-click over the treeview to add items.\n"
|
|
Packit |
1e8aac |
" * Press Delete to remove the selected item.\n"
|
|
Packit |
1e8aac |
" * Drag & Drop to reorder.\n"
|
|
Packit |
1e8aac |
" * Type column is editable.");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_label_set_markup (GTK_LABEL (editor->priv->tip_label), msg);
|
|
Packit |
1e8aac |
g_signal_connect (editor->priv->help_button, "clicked",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_base_editor_help),
|
|
Packit |
1e8aac |
msg);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (editor));
|
|
Packit |
1e8aac |
gtk_widget_show_all (GTK_WIDGET (editor));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return window;
|
|
Packit |
1e8aac |
}
|