|
Packit |
1e8aac |
/*
|
|
Packit |
1e8aac |
* Copyright (C) 2008 Tristan Van Berkom.
|
|
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 |
* Tristan Van Berkom <tvb@gnome.org>
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <config.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include <gladeui/glade.h>
|
|
Packit |
1e8aac |
#include <gtk/gtk.h>
|
|
Packit |
1e8aac |
#include <gdk/gdkkeysyms.h>
|
|
Packit |
1e8aac |
#include <glib/gi18n-lib.h>
|
|
Packit |
1e8aac |
#include <string.h>
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
#include "glade-model-data.h"
|
|
Packit |
1e8aac |
#include "glade-column-types.h"
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeModelData *
|
|
Packit |
1e8aac |
glade_model_data_new (GType type, const gchar * column_name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeModelData *data = g_slice_new0 (GladeModelData);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (type != 0)
|
|
Packit |
1e8aac |
g_value_init (&data->value, type);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (type == G_TYPE_STRING)
|
|
Packit |
1e8aac |
data->i18n_translatable = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data->name = g_strdup (column_name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return data;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeModelData *
|
|
Packit |
1e8aac |
glade_model_data_copy (GladeModelData * data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeModelData *dup;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!data)
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
dup = g_slice_new0 (GladeModelData);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (G_VALUE_TYPE (&data->value) != 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_value_init (&dup->value, G_VALUE_TYPE (&data->value));
|
|
Packit |
1e8aac |
g_value_copy (&data->value, &dup->value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
dup->name = g_strdup (data->name);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
dup->i18n_translatable = data->i18n_translatable;
|
|
Packit |
1e8aac |
dup->i18n_context = g_strdup (data->i18n_context);
|
|
Packit |
1e8aac |
dup->i18n_comment = g_strdup (data->i18n_comment);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return dup;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_model_data_free (GladeModelData * data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (G_VALUE_TYPE (&data->value) != 0)
|
|
Packit |
1e8aac |
g_value_unset (&data->value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (data->name);
|
|
Packit |
1e8aac |
g_free (data->i18n_context);
|
|
Packit |
1e8aac |
g_free (data->i18n_comment);
|
|
Packit |
1e8aac |
g_slice_free (GladeModelData, data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GNode *
|
|
Packit |
1e8aac |
glade_model_data_tree_copy (GNode * node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
return g_node_copy_deep (node, (GCopyFunc) glade_model_data_copy, NULL);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
model_data_traverse_free (GNode * node, gpointer data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_model_data_free ((GladeModelData *) node->data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_model_data_tree_free (GNode * node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (node)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_node_traverse (node, G_IN_ORDER, G_TRAVERSE_ALL, -1,
|
|
Packit |
1e8aac |
(GNodeTraverseFunc) model_data_traverse_free, NULL);
|
|
Packit |
1e8aac |
g_node_destroy (node);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GladeModelData *
|
|
Packit |
1e8aac |
glade_model_data_tree_get_data (GNode * data_tree, gint row, gint colnum)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GNode *node;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (data_tree != NULL, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((node = g_node_nth_child (data_tree, row)) != NULL)
|
|
Packit |
1e8aac |
if ((node = g_node_nth_child (node, colnum)) != NULL)
|
|
Packit |
1e8aac |
return (GladeModelData *) node->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_model_data_insert_column (GNode * node,
|
|
Packit |
1e8aac |
GType type, const gchar * column_name, gint nth)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GNode *row, *item;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (row = node->children; row; row = row->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (nth >= 0 && nth <= g_node_n_children (row));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data = glade_model_data_new (type, column_name);
|
|
Packit |
1e8aac |
item = g_node_new (data);
|
|
Packit |
1e8aac |
g_node_insert (row, nth, item);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_model_data_remove_column (GNode * node, gint nth)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GNode *row, *item;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (row = node->children; row; row = row->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (nth >= 0 && nth < g_node_n_children (row));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
item = g_node_nth_child (row, nth);
|
|
Packit |
1e8aac |
data = item->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_model_data_free (data);
|
|
Packit |
1e8aac |
g_node_destroy (item);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_model_data_reorder_column (GNode * node, gint column, gint nth)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GNode *row, *item;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (row = node->children; row; row = row->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_return_if_fail (nth >= 0 && nth < g_node_n_children (row));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
item = g_node_nth_child (row, column);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_node_unlink (item);
|
|
Packit |
1e8aac |
g_node_insert (row, nth, item);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gint
|
|
Packit |
1e8aac |
glade_model_data_column_index (GNode * node, const gchar * column_name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint i;
|
|
Packit |
1e8aac |
GNode *item;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_val_if_fail (node != NULL, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (i = 0, item = node->children->children; item; i++, item = item->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
data = item->data;
|
|
Packit |
1e8aac |
if (strcmp (data->name, column_name) == 0)
|
|
Packit |
1e8aac |
return i;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return -1;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
void
|
|
Packit |
1e8aac |
glade_model_data_column_rename (GNode * node,
|
|
Packit |
1e8aac |
const gchar * column_name,
|
|
Packit |
1e8aac |
const gchar * new_name)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint idx;
|
|
Packit |
1e8aac |
GNode *row, *iter;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_return_if_fail (node != NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((idx = glade_model_data_column_index (node, column_name)) < 0)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (row = node->children; row; row = row->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iter = g_node_nth_child (row, idx);
|
|
Packit |
1e8aac |
data = iter->data;
|
|
Packit |
1e8aac |
g_free (data->name);
|
|
Packit |
1e8aac |
data->name = g_strdup (new_name);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GType
|
|
Packit |
1e8aac |
glade_model_data_tree_get_type (void)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
static GType type_id = 0;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!type_id)
|
|
Packit |
1e8aac |
type_id = g_boxed_type_register_static
|
|
Packit |
1e8aac |
("GladeModelDataTree",
|
|
Packit |
1e8aac |
(GBoxedCopyFunc) glade_model_data_tree_copy,
|
|
Packit |
1e8aac |
(GBoxedFreeFunc) glade_model_data_tree_free);
|
|
Packit |
1e8aac |
return type_id;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/**************************** GladeEditorProperty *****************************/
|
|
Packit |
1e8aac |
enum
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
COLUMN_ROW = 0, /* row number */
|
|
Packit |
1e8aac |
NUM_COLUMNS
|
|
Packit |
1e8aac |
};
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
typedef struct
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorProperty parent_instance;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GtkTreeView *view;
|
|
Packit |
1e8aac |
GtkListStore *store;
|
|
Packit |
1e8aac |
GtkTreeSelection *selection;
|
|
Packit |
1e8aac |
GNode *pending_data_tree;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Used for setting focus on newly added rows */
|
|
Packit |
1e8aac |
gboolean adding_row;
|
|
Packit |
1e8aac |
gboolean want_focus;
|
|
Packit |
1e8aac |
gboolean setting_focus;
|
|
Packit |
1e8aac |
gint editing_row;
|
|
Packit |
1e8aac |
gint editing_column;
|
|
Packit |
1e8aac |
} GladeEPropModelData;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
GLADE_MAKE_EPROP (GladeEPropModelData, glade_eprop_model_data)
|
|
Packit |
1e8aac |
#define GLADE_EPROP_MODEL_DATA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLADE_TYPE_EPROP_MODEL_DATA, GladeEPropModelData))
|
|
Packit |
1e8aac |
#define GLADE_EPROP_MODEL_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLADE_TYPE_EPROP_MODEL_DATA, GladeEPropModelDataClass))
|
|
Packit |
1e8aac |
#define GLADE_IS_EPROP_MODEL_DATA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLADE_TYPE_EPROP_MODEL_DATA))
|
|
Packit |
1e8aac |
#define GLADE_IS_EPROP_MODEL_DATA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLADE_TYPE_EPROP_MODEL_DATA))
|
|
Packit |
1e8aac |
#define GLADE_EPROP_MODEL_DATA_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GLADE_EPROP_MODEL_DATA, GladeEPropModelDataClass))
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void eprop_data_focus_editing_cell (GladeEPropModelData *eprop_data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void append_row (GNode * node, GList * columns)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
GladeColumnType *column;
|
|
Packit |
1e8aac |
GNode *row;
|
|
Packit |
1e8aac |
GList *list;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_assert (node && columns);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
row = g_node_new (NULL);
|
|
Packit |
1e8aac |
g_node_append (node, row);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (list = columns; list; list = list->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
column = list->data;
|
|
Packit |
1e8aac |
data =
|
|
Packit |
1e8aac |
glade_model_data_new (g_type_from_name (column->type_name),
|
|
Packit |
1e8aac |
column->column_name);
|
|
Packit |
1e8aac |
g_node_append_data (row, data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
clear_view (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Clear columns ... */
|
|
Packit |
1e8aac |
while ((column = gtk_tree_view_get_column (eprop_data->view, 0)) != NULL)
|
|
Packit |
1e8aac |
gtk_tree_view_remove_column (eprop_data->view, column);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Clear store ... (this will unref the old store) */
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (eprop_data->view, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
update_data_tree_idle (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
GValue value = { 0, };
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_init (&value, GLADE_TYPE_MODEL_DATA_TREE);
|
|
Packit |
1e8aac |
g_value_take_boxed (&value, eprop_data->pending_data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Only commit the value if it changed, otherwise this
|
|
Packit |
1e8aac |
* can trigger a load.. which we dont handle well in this
|
|
Packit |
1e8aac |
* editor
|
|
Packit |
1e8aac |
*/
|
|
Packit |
1e8aac |
if (!glade_property_equals_value (property, &value))
|
|
Packit |
1e8aac |
glade_editor_property_commit (eprop, &value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (&value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->pending_data_tree = NULL;
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
update_and_focus_data_tree_idle (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->want_focus = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
update_data_tree_idle (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* XXX Have to load it regardless if it changed, this is a slow and redundant way... */
|
|
Packit |
1e8aac |
glade_editor_property_load (eprop, property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->want_focus = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
focus_data_tree_idle (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->want_focus = TRUE;
|
|
Packit |
1e8aac |
eprop_data_focus_editing_cell (eprop_data);
|
|
Packit |
1e8aac |
eprop_data->want_focus = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_eprop_model_data_add_row (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GValue value = { 0, };
|
|
Packit |
1e8aac |
GNode *node = NULL;
|
|
Packit |
1e8aac |
GList *columns = NULL;
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &node);
|
|
Packit |
1e8aac |
glade_widget_property_get (glade_property_get_widget (property), "columns", &columns);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!columns)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
clear_view (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!node)
|
|
Packit |
1e8aac |
node = g_node_new (NULL);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
node = glade_model_data_tree_copy (node);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
append_row (node, columns);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->adding_row = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_init (&value, GLADE_TYPE_MODEL_DATA_TREE);
|
|
Packit |
1e8aac |
g_value_take_boxed (&value, node);
|
|
Packit |
1e8aac |
glade_editor_property_commit (eprop, &value);
|
|
Packit |
1e8aac |
g_value_unset (&value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->adding_row = FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_eprop_model_data_delete_selected (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
GNode *data_tree = NULL, *row;
|
|
Packit |
1e8aac |
gint rownum = -1;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* NOTE: This will trigger row-deleted below... */
|
|
Packit |
1e8aac |
if (!gtk_tree_selection_get_selected (eprop_data->selection, NULL, &iter))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (eprop_data->store), &iter,
|
|
Packit |
1e8aac |
COLUMN_ROW, &rownum, -1);
|
|
Packit |
1e8aac |
g_assert (rownum >= 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* if theres a sected row, theres data... */
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
g_assert (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data_tree = glade_model_data_tree_copy (data_tree);
|
|
Packit |
1e8aac |
row = g_node_nth_child (data_tree, rownum);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_node_unlink (row);
|
|
Packit |
1e8aac |
glade_model_data_tree_free (row);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (eprop_data->pending_data_tree)
|
|
Packit |
1e8aac |
glade_model_data_tree_free (eprop_data->pending_data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->pending_data_tree = data_tree;
|
|
Packit |
1e8aac |
g_idle_add ((GSourceFunc) update_data_tree_idle, eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_eprop_model_data_add_clicked (GtkWidget * button,
|
|
Packit |
1e8aac |
GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_eprop_model_data_add_row (eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_eprop_model_data_delete_clicked (GtkWidget * button,
|
|
Packit |
1e8aac |
GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_eprop_model_data_delete_selected (eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
eprop_treeview_key_press (GtkWidget * treeview,
|
|
Packit |
1e8aac |
GdkEventKey * event, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (event->keyval == GDK_KEY_Delete)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_eprop_model_data_delete_selected (eprop);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if ((event->state & GDK_CONTROL_MASK) != 0 &&
|
|
Packit |
1e8aac |
(event->keyval == GDK_KEY_n || event->keyval == GDK_KEY_N))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
glade_eprop_model_data_add_row (eprop);
|
|
Packit |
1e8aac |
return TRUE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static gboolean
|
|
Packit |
1e8aac |
data_changed_idle (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
GNode *data_tree = NULL, *new_tree, *row;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gint rownum;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
g_assert (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
new_tree = g_node_new (NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (eprop_data->store), &iter))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
do
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (eprop_data->store), &iter,
|
|
Packit |
1e8aac |
COLUMN_ROW, &rownum, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((row = g_node_nth_child (data_tree, rownum)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Make a new tree by copying row by row... */
|
|
Packit |
1e8aac |
row = glade_model_data_tree_copy (row);
|
|
Packit |
1e8aac |
g_node_append (new_tree, row);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
while (gtk_tree_model_iter_next
|
|
Packit |
1e8aac |
(GTK_TREE_MODEL (eprop_data->store), &iter));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Were already in an idle, no need to idle from here... */
|
|
Packit |
1e8aac |
if (eprop_data->pending_data_tree)
|
|
Packit |
1e8aac |
glade_model_data_tree_free (eprop_data->pending_data_tree);
|
|
Packit |
1e8aac |
eprop_data->pending_data_tree = new_tree;
|
|
Packit |
1e8aac |
update_data_tree_idle (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
eprop_treeview_row_deleted (GtkTreeModel * tree_model,
|
|
Packit |
1e8aac |
GtkTreePath * path, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (glade_editor_property_loading (eprop))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_idle_add ((GSourceFunc) data_changed_idle, eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_eprop_model_data_finalize (GObject * object)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Chain up */
|
|
Packit |
1e8aac |
GObjectClass *parent_class =
|
|
Packit |
1e8aac |
g_type_class_peek_parent (G_OBJECT_GET_CLASS (object));
|
|
Packit |
1e8aac |
//GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (object);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
G_OBJECT_CLASS (parent_class)->finalize (object);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkListStore *
|
|
Packit |
1e8aac |
eprop_model_data_generate_store (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkListStore *store = NULL;
|
|
Packit |
1e8aac |
GladeModelData *iter_data;
|
|
Packit |
1e8aac |
GNode *data_tree = NULL, *iter_node, *row_node;
|
|
Packit |
1e8aac |
GArray *gtypes = g_array_new (FALSE, TRUE, sizeof (GType));
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gint column_num, row_num;
|
|
Packit |
1e8aac |
GType index_type = G_TYPE_INT, string_type = G_TYPE_STRING, pointer_type = G_TYPE_POINTER;
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!data_tree || !data_tree->children || !data_tree->children->children)
|
|
Packit |
1e8aac |
return NULL;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Generate store with tailored column types */
|
|
Packit |
1e8aac |
g_array_append_val (gtypes, index_type);
|
|
Packit |
1e8aac |
for (iter_node = data_tree->children->children; iter_node;
|
|
Packit |
1e8aac |
iter_node = iter_node->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iter_data = iter_node->data;
|
|
Packit |
1e8aac |
if (G_VALUE_TYPE (&iter_data->value) == 0)
|
|
Packit |
1e8aac |
g_array_append_val (gtypes, pointer_type);
|
|
Packit |
1e8aac |
else if (G_VALUE_TYPE (&iter_data->value) == GDK_TYPE_PIXBUF)
|
|
Packit |
1e8aac |
g_array_append_val (gtypes, string_type);
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
g_array_append_val (gtypes, G_VALUE_TYPE (&iter_data->value));
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
store = gtk_list_store_newv (gtypes->len, (GType *) gtypes->data);
|
|
Packit |
1e8aac |
g_array_free (gtypes, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Now populate the store with data */
|
|
Packit |
1e8aac |
for (row_num = 0, row_node = data_tree->children; row_node;
|
|
Packit |
1e8aac |
row_num++, row_node = row_node->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gtk_list_store_append (store, &iter);
|
|
Packit |
1e8aac |
gtk_list_store_set (store, &iter, COLUMN_ROW, row_num, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
for (column_num = NUM_COLUMNS, iter_node = row_node->children; iter_node;
|
|
Packit |
1e8aac |
column_num++, iter_node = iter_node->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iter_data = iter_node->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (G_VALUE_TYPE (&iter_data->value) == 0)
|
|
Packit |
1e8aac |
continue;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Special case, show the filename in the cellrenderertext */
|
|
Packit |
1e8aac |
if (G_VALUE_TYPE (&iter_data->value) == GDK_TYPE_PIXBUF)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GObject *object = g_value_get_object (&iter_data->value);
|
|
Packit |
1e8aac |
gchar *filename = NULL;
|
|
Packit |
1e8aac |
if (object)
|
|
Packit |
1e8aac |
filename = g_object_get_data (object, "GladeFileName");
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_list_store_set (store, &iter, column_num, filename, -1);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
gtk_list_store_set_value (store, &iter, column_num,
|
|
Packit |
1e8aac |
&iter_data->value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
return store;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
value_toggled (GtkCellRendererToggle * cell,
|
|
Packit |
1e8aac |
gchar * path, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gint colnum = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column-number"));
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
GNode *data_tree = NULL;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
gboolean active;
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!gtk_tree_model_get_iter_from_string
|
|
Packit |
1e8aac |
(GTK_TREE_MODEL (eprop_data->store), &iter, path))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (eprop_data->store), &iter,
|
|
Packit |
1e8aac |
COLUMN_ROW, &row, NUM_COLUMNS + colnum, &active, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* if we are editing, then there is data in the datatree */
|
|
Packit |
1e8aac |
g_assert (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data_tree = glade_model_data_tree_copy (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data = glade_model_data_tree_get_data (data_tree, row, colnum);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_set_boolean (&data->value, !active);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->editing_row = row;
|
|
Packit |
1e8aac |
eprop_data->editing_column = colnum;
|
|
Packit |
1e8aac |
if (eprop_data->pending_data_tree)
|
|
Packit |
1e8aac |
glade_model_data_tree_free (eprop_data->pending_data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->pending_data_tree = data_tree;
|
|
Packit |
1e8aac |
g_idle_add ((GSourceFunc) update_and_focus_data_tree_idle, eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
value_i18n_activate (GladeCellRendererIcon * cell,
|
|
Packit |
1e8aac |
const gchar * path, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gint colnum = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column-number"));
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
GNode *data_tree = NULL;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
gchar *new_text;
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!gtk_tree_model_get_iter_from_string
|
|
Packit |
1e8aac |
(GTK_TREE_MODEL (eprop_data->store), &iter, path))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (eprop_data->store), &iter,
|
|
Packit |
1e8aac |
COLUMN_ROW, &row, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* if we are editing, then there is data in the datatree */
|
|
Packit |
1e8aac |
g_assert (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data_tree = glade_model_data_tree_copy (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data = glade_model_data_tree_get_data (data_tree, row, colnum);
|
|
Packit |
1e8aac |
g_assert (G_VALUE_TYPE (&data->value) == G_TYPE_STRING);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
new_text = g_value_dup_string (&data->value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (glade_editor_property_show_i18n_dialog (NULL,
|
|
Packit |
1e8aac |
&new_text,
|
|
Packit |
1e8aac |
&data->i18n_context,
|
|
Packit |
1e8aac |
&data->i18n_comment,
|
|
Packit |
1e8aac |
&data->i18n_translatable))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
g_value_set_string (&data->value, new_text);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->editing_row = row;
|
|
Packit |
1e8aac |
eprop_data->editing_column = colnum;
|
|
Packit |
1e8aac |
if (eprop_data->pending_data_tree)
|
|
Packit |
1e8aac |
glade_model_data_tree_free (eprop_data->pending_data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->pending_data_tree = data_tree;
|
|
Packit |
1e8aac |
g_idle_add ((GSourceFunc) update_and_focus_data_tree_idle, eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
glade_model_data_tree_free (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (new_text);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
value_text_edited (GtkCellRendererText * cell,
|
|
Packit |
1e8aac |
const gchar * path,
|
|
Packit |
1e8aac |
const gchar * new_text, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
gint colnum = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column-number"));
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
GNode *data_tree = NULL;
|
|
Packit |
1e8aac |
GladeModelData *data;
|
|
Packit |
1e8aac |
GValue *value;
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!gtk_tree_model_get_iter_from_string
|
|
Packit |
1e8aac |
(GTK_TREE_MODEL (eprop_data->store), &iter, path))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (eprop_data->store), &iter,
|
|
Packit |
1e8aac |
COLUMN_ROW, &row, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* if we are editing, then there is data in the datatree */
|
|
Packit |
1e8aac |
g_assert (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data_tree = glade_model_data_tree_copy (data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
data = glade_model_data_tree_get_data (data_tree, row, colnum);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Untranslate string and update value in tree. */
|
|
Packit |
1e8aac |
if (G_VALUE_HOLDS_ENUM (&data->value) || G_VALUE_HOLDS_FLAGS (&data->value))
|
|
Packit |
1e8aac |
value = glade_utils_value_from_string (G_VALUE_TYPE (&data->value),
|
|
Packit |
1e8aac |
glade_get_value_from_displayable
|
|
Packit |
1e8aac |
(G_VALUE_TYPE (&data->value),
|
|
Packit |
1e8aac |
new_text),
|
|
Packit |
1e8aac |
glade_widget_get_project (glade_property_get_widget (property)));
|
|
Packit |
1e8aac |
else
|
|
Packit |
1e8aac |
value =
|
|
Packit |
1e8aac |
glade_utils_value_from_string (G_VALUE_TYPE (&data->value), new_text,
|
|
Packit |
1e8aac |
glade_widget_get_project (glade_property_get_widget (property)));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_copy (value, &data->value);
|
|
Packit |
1e8aac |
g_value_unset (value);
|
|
Packit |
1e8aac |
g_free (value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->editing_row = row;
|
|
Packit |
1e8aac |
eprop_data->editing_column = colnum;
|
|
Packit |
1e8aac |
if (eprop_data->pending_data_tree)
|
|
Packit |
1e8aac |
glade_model_data_tree_free (eprop_data->pending_data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->pending_data_tree = data_tree;
|
|
Packit |
1e8aac |
g_idle_add ((GSourceFunc) update_and_focus_data_tree_idle, eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
enum_flags_format_cell_data (GtkCellLayout * cell_layout,
|
|
Packit |
1e8aac |
GtkCellRenderer * cell,
|
|
Packit |
1e8aac |
GtkTreeModel * tree_model,
|
|
Packit |
1e8aac |
GtkTreeIter * iter, gpointer data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
gint colnum =
|
|
Packit |
1e8aac |
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column-number"));
|
|
Packit |
1e8aac |
GValue value = { 0, };
|
|
Packit |
1e8aac |
gchar *string;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get_value (tree_model, iter, NUM_COLUMNS + colnum, &value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
string = glade_utils_string_from_value (&value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set (cell, "text", string && string[0] ?
|
|
Packit |
1e8aac |
glade_get_displayable_value (G_VALUE_TYPE (&value),
|
|
Packit |
1e8aac |
string) : "", NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_free (string);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_value_unset (&value);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
data_editing_started (GtkCellRenderer * cell,
|
|
Packit |
1e8aac |
GtkCellEditable * editable,
|
|
Packit |
1e8aac |
gchar * path, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
gint colnum =
|
|
Packit |
1e8aac |
GPOINTER_TO_INT (g_object_get_data (G_OBJECT (cell), "column-number"));
|
|
Packit |
1e8aac |
gint row;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!gtk_tree_model_get_iter_from_string
|
|
Packit |
1e8aac |
(GTK_TREE_MODEL (eprop_data->store), &iter, path))
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_model_get (GTK_TREE_MODEL (eprop_data->store), &iter,
|
|
Packit |
1e8aac |
COLUMN_ROW, &row, -1);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->editing_row = row;
|
|
Packit |
1e8aac |
eprop_data->editing_column = colnum;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
data_editing_canceled (GtkCellRenderer * renderer, GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (eprop_data->setting_focus)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_idle_add ((GSourceFunc) focus_data_tree_idle, eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkTreeViewColumn *
|
|
Packit |
1e8aac |
eprop_model_generate_column (GladeEditorProperty * eprop,
|
|
Packit |
1e8aac |
gint colnum, GladeModelData * data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column = gtk_tree_view_column_new ();
|
|
Packit |
1e8aac |
GtkCellRenderer *renderer = NULL;
|
|
Packit |
1e8aac |
GtkAdjustment *adjustment;
|
|
Packit |
1e8aac |
GtkListStore *store;
|
|
Packit |
1e8aac |
GType type = G_TYPE_INVALID;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_title (column, data->name);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_resizable (column, TRUE);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_expand (column, TRUE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
type = G_VALUE_TYPE (&data->value);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Support enum and flag types, and a hardcoded list of fundamental types */
|
|
Packit |
1e8aac |
if (type == G_TYPE_CHAR ||
|
|
Packit |
1e8aac |
type == G_TYPE_UCHAR || type == G_TYPE_STRING || type == GDK_TYPE_PIXBUF)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Text renderer */
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer),
|
|
Packit |
1e8aac |
"editable", TRUE,
|
|
Packit |
1e8aac |
"ellipsize", PANGO_ELLIPSIZE_END, "width", 90, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, renderer, FALSE);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_attributes (column, renderer,
|
|
Packit |
1e8aac |
"text", NUM_COLUMNS + colnum, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (type == G_TYPE_CHAR || type == G_TYPE_UCHAR)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* XXX restrict to 1 char !! */
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "edited",
|
|
Packit |
1e8aac |
G_CALLBACK (value_text_edited), eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Trigger i18n dialog from here */
|
|
Packit |
1e8aac |
if (type == G_TYPE_STRING)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkCellRenderer *icon_renderer = glade_cell_renderer_icon_new ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (icon_renderer),
|
|
Packit |
1e8aac |
"activatable", TRUE,
|
|
Packit |
1e8aac |
"icon-name", "gtk-edit",
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, icon_renderer, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (icon_renderer), "column-number",
|
|
Packit |
1e8aac |
GINT_TO_POINTER (colnum));
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (icon_renderer), "activate",
|
|
Packit |
1e8aac |
G_CALLBACK (value_i18n_activate), eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (type == G_TYPE_BOOLEAN)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Toggle renderer */
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_toggle_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, renderer, FALSE);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_attributes (column, renderer,
|
|
Packit |
1e8aac |
"active", NUM_COLUMNS + colnum,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "toggled",
|
|
Packit |
1e8aac |
G_CALLBACK (value_toggled), eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
/* Check renderer */
|
|
Packit |
1e8aac |
else if (type == G_TYPE_INT ||
|
|
Packit |
1e8aac |
type == G_TYPE_UINT ||
|
|
Packit |
1e8aac |
type == G_TYPE_LONG ||
|
|
Packit |
1e8aac |
type == G_TYPE_ULONG ||
|
|
Packit |
1e8aac |
type == G_TYPE_INT64 ||
|
|
Packit |
1e8aac |
type == G_TYPE_UINT64 ||
|
|
Packit |
1e8aac |
type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Spin renderer */
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_spin_new ();
|
|
Packit |
1e8aac |
adjustment =
|
|
Packit |
1e8aac |
(GtkAdjustment *) gtk_adjustment_new (0, -G_MAXDOUBLE, G_MAXDOUBLE,
|
|
Packit |
1e8aac |
100, 100, 0);
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "editable", TRUE, "adjustment",
|
|
Packit |
1e8aac |
adjustment, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, renderer, TRUE);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_attributes (column, renderer,
|
|
Packit |
1e8aac |
"text", NUM_COLUMNS + colnum, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (type == G_TYPE_FLOAT || type == G_TYPE_DOUBLE)
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "digits", 2, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "edited",
|
|
Packit |
1e8aac |
G_CALLBACK (value_text_edited), eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (G_TYPE_IS_ENUM (type))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Combo renderer */
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_combo_new ();
|
|
Packit |
1e8aac |
store = glade_utils_liststore_from_enum_type (type, FALSE);
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer),
|
|
Packit |
1e8aac |
"editable", TRUE,
|
|
Packit |
1e8aac |
"text-column", 0, "has-entry", FALSE, "model", store, NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, renderer, TRUE);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_attributes (column, renderer,
|
|
Packit |
1e8aac |
"text", NUM_COLUMNS + colnum, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (column),
|
|
Packit |
1e8aac |
renderer,
|
|
Packit |
1e8aac |
(GtkCellLayoutDataFunc)
|
|
Packit |
1e8aac |
enum_flags_format_cell_data, NULL,
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "edited",
|
|
Packit |
1e8aac |
G_CALLBACK (value_text_edited), eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else if (G_TYPE_IS_FLAGS (type))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Export a flags dialog from glade-editor-property... */
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, renderer, FALSE);
|
|
Packit |
1e8aac |
gtk_tree_view_column_set_attributes (column, renderer,
|
|
Packit |
1e8aac |
"text", NUM_COLUMNS + colnum, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
else /* All uneditable types at this point (currently we dont do object data here, TODO) */
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* text renderer and object dialog (or raw text for pixbuf) */
|
|
Packit |
1e8aac |
renderer = gtk_cell_renderer_text_new ();
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
|
|
Packit |
1e8aac |
gtk_tree_view_column_pack_start (column, renderer, FALSE);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "editing-started",
|
|
Packit |
1e8aac |
G_CALLBACK (data_editing_started), eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (renderer), "editing-canceled",
|
|
Packit |
1e8aac |
G_CALLBACK (data_editing_canceled), eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set_data (G_OBJECT (renderer), "column-number",
|
|
Packit |
1e8aac |
GINT_TO_POINTER (colnum));
|
|
Packit |
1e8aac |
g_object_set_data_full (G_OBJECT (column), "column-type",
|
|
Packit |
1e8aac |
g_memdup (&type, sizeof (GType)), g_free);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
return column;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
eprop_model_data_generate_columns (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GladeProperty *property = glade_editor_property_get_property (eprop);
|
|
Packit |
1e8aac |
GladeModelData *iter_data;
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column;
|
|
Packit |
1e8aac |
GNode *data_tree = NULL, *iter_node;
|
|
Packit |
1e8aac |
gint colnum;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
glade_property_get (property, &data_tree);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (!data_tree || !data_tree->children || !data_tree->children->children)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Append new columns */
|
|
Packit |
1e8aac |
for (colnum = 0, iter_node = data_tree->children->children; iter_node;
|
|
Packit |
1e8aac |
colnum++, iter_node = iter_node->next)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
iter_data = iter_node->data;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
column = eprop_model_generate_column (eprop, colnum, iter_data);
|
|
Packit |
1e8aac |
gtk_tree_view_append_column (eprop_data->view, column);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
eprop_data_focus_new (GladeEPropModelData * eprop_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Focus and edit the first column of a newly added row */
|
|
Packit |
1e8aac |
if (eprop_data->store)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreePath *new_item_path;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column;
|
|
Packit |
1e8aac |
gint n_children;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
n_children =
|
|
Packit |
1e8aac |
gtk_tree_model_iter_n_children (GTK_TREE_MODEL (eprop_data->store),
|
|
Packit |
1e8aac |
NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((column =
|
|
Packit |
1e8aac |
gtk_tree_view_get_column (eprop_data->view,
|
|
Packit |
1e8aac |
eprop_data->editing_column)) != NULL &&
|
|
Packit |
1e8aac |
n_children > 0 &&
|
|
Packit |
1e8aac |
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (eprop_data->store),
|
|
Packit |
1e8aac |
&iter, NULL, n_children - 1))
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
new_item_path =
|
|
Packit |
1e8aac |
gtk_tree_model_get_path (GTK_TREE_MODEL (eprop_data->store), &iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->setting_focus = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_grab_focus (GTK_WIDGET (eprop_data->view));
|
|
Packit |
1e8aac |
gtk_tree_view_expand_to_path (eprop_data->view, new_item_path);
|
|
Packit |
1e8aac |
gtk_tree_view_set_cursor (eprop_data->view, new_item_path, column, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->setting_focus = FALSE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_path_free (new_item_path);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
eprop_data_focus_editing_cell (GladeEPropModelData * eprop_data)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
/* Focus and edit the first column of a newly added row */
|
|
Packit |
1e8aac |
if (!eprop_data->setting_focus && eprop_data->store && eprop_data->want_focus
|
|
Packit |
1e8aac |
&& eprop_data->editing_column >= 0 && eprop_data->editing_row >= 0)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GtkTreePath *item_path;
|
|
Packit |
1e8aac |
GtkTreeIter iter;
|
|
Packit |
1e8aac |
GtkTreeViewColumn *column;
|
|
Packit |
1e8aac |
gint row, col;
|
|
Packit |
1e8aac |
GList *column_list;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
column_list = gtk_tree_view_get_columns (eprop_data->view);
|
|
Packit |
1e8aac |
g_list_free (column_list);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
col = eprop_data->editing_column;
|
|
Packit |
1e8aac |
row = eprop_data->editing_row;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((column = gtk_tree_view_get_column (eprop_data->view, col)) != NULL &&
|
|
Packit |
1e8aac |
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (eprop_data->store),
|
|
Packit |
1e8aac |
&iter, NULL, row))
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
item_path =
|
|
Packit |
1e8aac |
gtk_tree_model_get_path (GTK_TREE_MODEL (eprop_data->store),
|
|
Packit |
1e8aac |
&iter);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->setting_focus = TRUE;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_grab_focus (GTK_WIDGET (eprop_data->view));
|
|
Packit |
1e8aac |
gtk_tree_view_expand_to_path (eprop_data->view, item_path);
|
|
Packit |
1e8aac |
gtk_tree_view_set_cursor (eprop_data->view, item_path, column, FALSE);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_path_free (item_path);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->setting_focus = FALSE;
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static void
|
|
Packit |
1e8aac |
glade_eprop_model_data_load (GladeEditorProperty * eprop,
|
|
Packit |
1e8aac |
GladeProperty * property)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEditorPropertyClass *parent_class =
|
|
Packit |
1e8aac |
g_type_class_peek_parent (GLADE_EDITOR_PROPERTY_GET_CLASS (eprop));
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
clear_view (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Chain up in a clean state... */
|
|
Packit |
1e8aac |
parent_class->load (eprop, property);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (eprop_data->view, NULL);
|
|
Packit |
1e8aac |
if (!property)
|
|
Packit |
1e8aac |
return;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if ((eprop_data->store = eprop_model_data_generate_store (eprop)) != NULL)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
eprop_data->selection = gtk_tree_view_get_selection (eprop_data->view);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Pass ownership of the store to the view... */
|
|
Packit |
1e8aac |
gtk_tree_view_set_model (eprop_data->view,
|
|
Packit |
1e8aac |
GTK_TREE_MODEL (eprop_data->store));
|
|
Packit |
1e8aac |
g_object_unref (G_OBJECT (eprop_data->store));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (eprop_data->store), "row-deleted",
|
|
Packit |
1e8aac |
G_CALLBACK (eprop_treeview_row_deleted), eprop);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Create new columns with renderers */
|
|
Packit |
1e8aac |
eprop_model_data_generate_columns (eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
if (eprop_data->store)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
if (eprop_data->adding_row)
|
|
Packit |
1e8aac |
eprop_data_focus_new (eprop_data);
|
|
Packit |
1e8aac |
else if (eprop_data->want_focus &&
|
|
Packit |
1e8aac |
eprop_data->editing_row >= 0 && eprop_data->editing_column >= 0)
|
|
Packit |
1e8aac |
eprop_data_focus_editing_cell (eprop_data);
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
}
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
static GtkWidget *
|
|
Packit |
1e8aac |
glade_eprop_model_data_create_input (GladeEditorProperty * eprop)
|
|
Packit |
1e8aac |
{
|
|
Packit |
1e8aac |
GladeEPropModelData *eprop_data = GLADE_EPROP_MODEL_DATA (eprop);
|
|
Packit |
1e8aac |
GtkWidget *vbox, *hbox, *button, *swin, *label;
|
|
Packit |
1e8aac |
gchar *string;
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* hbox with add/remove row buttons on the right... */
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
string = g_strdup_printf ("%s", _("Add and remove rows:"));
|
|
Packit |
1e8aac |
label = gtk_label_new (string);
|
|
Packit |
1e8aac |
g_free (string);
|
|
Packit |
1e8aac |
gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
|
|
Packit |
1e8aac |
gtk_widget_set_halign (label, GTK_ALIGN_START);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
button = gtk_button_new ();
|
|
Packit |
1e8aac |
gtk_button_set_image (GTK_BUTTON (button),
|
|
Packit |
1e8aac |
gtk_image_new_from_icon_name ("list-add-symbolic",
|
|
Packit |
1e8aac |
GTK_ICON_SIZE_BUTTON));
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (button), "clicked",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_eprop_model_data_add_clicked),
|
|
Packit |
1e8aac |
eprop_data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
button = gtk_button_new ();
|
|
Packit |
1e8aac |
gtk_button_set_image (GTK_BUTTON (button),
|
|
Packit |
1e8aac |
gtk_image_new_from_icon_name ("list-remove-symbolic",
|
|
Packit |
1e8aac |
GTK_ICON_SIZE_BUTTON));
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (G_OBJECT (button), "clicked",
|
|
Packit |
1e8aac |
G_CALLBACK (glade_eprop_model_data_delete_clicked),
|
|
Packit |
1e8aac |
eprop_data);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
/* Pack treeview/swindow on the left... */
|
|
Packit |
1e8aac |
swin = gtk_scrolled_window_new (NULL, NULL);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (swin),
|
|
Packit |
1e8aac |
GTK_SHADOW_IN);
|
|
Packit |
1e8aac |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swin),
|
|
Packit |
1e8aac |
GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
|
|
Packit |
1e8aac |
gtk_box_pack_start (GTK_BOX (vbox), swin, TRUE, TRUE, 0);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
eprop_data->view = (GtkTreeView *) gtk_tree_view_new ();
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_signal_connect (eprop_data->view, "key-press-event",
|
|
Packit |
1e8aac |
G_CALLBACK (eprop_treeview_key_press), eprop);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (eprop_data->view),
|
|
Packit |
1e8aac |
GTK_TREE_VIEW_GRID_LINES_BOTH);
|
|
Packit |
1e8aac |
gtk_tree_view_set_reorderable (GTK_TREE_VIEW (eprop_data->view), TRUE);
|
|
Packit |
1e8aac |
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (eprop_data->view), TRUE);
|
|
Packit |
1e8aac |
gtk_container_add (GTK_CONTAINER (swin), GTK_WIDGET (eprop_data->view));
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
g_object_set (G_OBJECT (vbox), "height-request", 300, NULL);
|
|
Packit |
1e8aac |
|
|
Packit |
1e8aac |
gtk_widget_show_all (vbox);
|
|
Packit |
1e8aac |
return vbox;
|
|
Packit |
1e8aac |
}
|