+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
+Tue Nov 13 21:00:59 2001 Jonathan Blandford <jrb@redhat.com>
+
+ * gtk/gtktreemodelsort.c (gtk_tree_model_sort_class_init): new
+ "model" construct property for language bindings.
+
+ * gtk/gtktreestore.c (gtk_tree_store_set_column_types): New
+ function to let you set the column types of a GtkTreeStore for
+ language bindings.
+
+ * gtk/gtkliststore.c (gtk_list_store_set_column_types): ditto.
+
2001-11-13 Havoc Pennington <hp@redhat.com>
* gtk/gtktextview.c (gtk_text_view_add_child_in_window): docs
list_store->stamp = g_random_int ();
list_store->length = 0;
list_store->sort_column_id = -2;
+ list_store->columns_dirty = FALSE;
}
/**
return retval;
}
+/**
+ * gtk_list_store_set_column_types:
+ * @list_store: A #GtkListStore
+ * @n_columns: Number of columns for the list store
+ * @types: An array length n of @GTypes
+ *
+ * This function is meant primarily for GObjects that inherit from GtkListStore,
+ * and should only be used when constructing a new @GtkListStore. It will not
+ * function after a row has been added, or a method on the @GtkTreeModel
+ * interface is called.
+ **/
+void
+gtk_list_store_set_column_types (GtkListStore *list_store,
+ gint n_columns,
+ GType *types)
+{
+ gint i;
+
+ g_return_if_fail (GTK_IS_LIST_STORE (list_store));
+ g_return_if_fail (list_store->columns_dirty == 0);
+
+ gtk_list_store_set_n_columns (list_store, n_columns);
+ for (i = 0; i < n_columns; i++)
+ {
+ if (! _gtk_tree_data_list_check_type (types[i]))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_list_store_set_column_types\n", G_STRLOC, g_type_name (types[i]));
+ continue;
+ }
+ gtk_list_store_set_column_type (list_store, i, types[i]);
+ }
+}
+
static void
gtk_list_store_set_n_columns (GtkListStore *list_store,
gint n_columns)
static gint
gtk_list_store_get_n_columns (GtkTreeModel *tree_model)
{
+ GtkListStore *list_store = (GtkListStore *) tree_model;
+
g_return_val_if_fail (GTK_IS_LIST_STORE (tree_model), 0);
- return GTK_LIST_STORE (tree_model)->n_columns;
+ list_store->columns_dirty = TRUE;
+
+ return list_store->n_columns;
}
static GType
gtk_list_store_get_column_type (GtkTreeModel *tree_model,
gint index)
{
+ GtkListStore *list_store = (GtkListStore *) tree_model;
+
g_return_val_if_fail (GTK_IS_LIST_STORE (tree_model), G_TYPE_INVALID);
g_return_val_if_fail (index < GTK_LIST_STORE (tree_model)->n_columns &&
index >= 0, G_TYPE_INVALID);
- return GTK_LIST_STORE (tree_model)->column_headers[index];
+ list_store->columns_dirty = TRUE;
+
+ return list_store->column_headers[index];
}
static gboolean
GtkTreeIter *iter,
GtkTreePath *path)
{
+ GtkListStore *list_store = (GtkListStore *) tree_model;
GSList *list;
gint i;
g_return_val_if_fail (GTK_IS_LIST_STORE (tree_model), FALSE);
g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
+ list_store->columns_dirty = TRUE;
+
i = gtk_tree_path_get_indices (path)[0];
- if (i >= GTK_LIST_STORE (tree_model)->length)
+ if (i >= list_store->length)
return FALSE;
- list = g_slist_nth (G_SLIST (GTK_LIST_STORE (tree_model)->root), i);
+ list = g_slist_nth (G_SLIST (list_store->root), i);
/* If this fails, list_store->length has gotten mangled. */
g_assert (list);
- iter->stamp = GTK_LIST_STORE (tree_model)->stamp;
+ iter->stamp = list_store->stamp;
iter->user_data = list;
+
return TRUE;
}
g_return_if_fail (iter != NULL);
g_return_if_fail (position >= 0);
+ list_store->columns_dirty = TRUE;
+
if (position == 0 ||
GTK_LIST_STORE_IS_SORTED (list_store))
{
if (sibling)
g_return_if_fail (VALID_ITER (sibling, list_store));
+ list_store->columns_dirty = TRUE;
if (GTK_LIST_STORE_IS_SORTED (list_store))
{
if (sibling)
g_return_if_fail (VALID_ITER (sibling, list_store));
+ list_store->columns_dirty = TRUE;
+
if (sibling == NULL ||
GTK_LIST_STORE_IS_SORTED (list_store))
{
iter->stamp = list_store->stamp;
iter->user_data = g_slist_alloc ();
+ list_store->columns_dirty = TRUE;
+
if (list_store->root == NULL)
list_store->tail = iter->user_data;
g_return_if_fail (GTK_IS_LIST_STORE (list_store));
g_return_if_fail (iter != NULL);
+ list_store->columns_dirty = TRUE;
+
if (GTK_LIST_STORE_IS_SORTED (list_store))
{
gtk_list_store_prepend (list_store, iter);
GtkTreeIterCompareFunc default_sort_func;
gpointer default_sort_data;
GtkDestroyNotify default_sort_destroy;
+ guint columns_dirty : 1;
};
struct _GtkListStoreClass
};
-GtkType gtk_list_store_get_type (void);
-GtkListStore *gtk_list_store_new (gint n_columns,
- ...);
-GtkListStore *gtk_list_store_newv (gint n_columns,
- GType *types);
-void gtk_list_store_set_value (GtkListStore *list_store,
- GtkTreeIter *iter,
- gint column,
- GValue *value);
-void gtk_list_store_set (GtkListStore *list_store,
- GtkTreeIter *iter,
- ...);
-void gtk_list_store_set_valist (GtkListStore *list_store,
- GtkTreeIter *iter,
- va_list var_args);
-void gtk_list_store_remove (GtkListStore *list_store,
- GtkTreeIter *iter);
-void gtk_list_store_insert (GtkListStore *list_store,
- GtkTreeIter *iter,
- gint position);
-void gtk_list_store_insert_before (GtkListStore *list_store,
- GtkTreeIter *iter,
- GtkTreeIter *sibling);
-void gtk_list_store_insert_after (GtkListStore *list_store,
- GtkTreeIter *iter,
- GtkTreeIter *sibling);
-void gtk_list_store_prepend (GtkListStore *list_store,
- GtkTreeIter *iter);
-void gtk_list_store_append (GtkListStore *list_store,
- GtkTreeIter *iter);
-void gtk_list_store_clear (GtkListStore *list_store);
+GtkType gtk_list_store_get_type (void);
+GtkListStore *gtk_list_store_new (gint n_columns,
+ ...);
+GtkListStore *gtk_list_store_newv (gint n_columns,
+ GType *types);
+void gtk_list_store_set_column_types (GtkListStore *list_store,
+ gint n_columns,
+ GType *types);
+void gtk_list_store_set_value (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value);
+void gtk_list_store_set (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ ...);
+void gtk_list_store_set_valist (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ va_list var_args);
+void gtk_list_store_remove (GtkListStore *list_store,
+ GtkTreeIter *iter);
+void gtk_list_store_insert (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ gint position);
+void gtk_list_store_insert_before (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *sibling);
+void gtk_list_store_insert_after (GtkListStore *list_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *sibling);
+void gtk_list_store_prepend (GtkListStore *list_store,
+ GtkTreeIter *iter);
+void gtk_list_store_append (GtkListStore *list_store,
+ GtkTreeIter *iter);
+void gtk_list_store_clear (GtkListStore *list_store);
#ifdef __cplusplus
#include "gtksignal.h"
#include "gtktreedatalist.h"
#include <string.h>
+#include "gtkintl.h"
typedef struct _SortElt SortElt;
typedef struct _SortLevel SortLevel;
gint offset;
};
+/* Properties */
+enum {
+ PROP_0,
+ /* Construct args */
+ PROP_MODEL
+};
+
+
+
#define GTK_TREE_MODEL_SORT_CACHE_CHILD_ITERS(tree_model_sort) \
(((GtkTreeModelSort *)tree_model_sort)->child_flags>K_TREE_MODEL_ITERS_PERSIST)
#define SORT_ELT(sort_elt) ((SortElt *)sort_elt)
static void gtk_tree_model_sort_tree_model_init (GtkTreeModelIface *iface);
static void gtk_tree_model_sort_tree_sortable_init (GtkTreeSortableIface *iface);
static void gtk_tree_model_sort_finalize (GObject *object);
+static void gtk_tree_model_sort_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void gtk_tree_model_sort_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
static void gtk_tree_model_sort_row_changed (GtkTreeModel *model,
GtkTreePath *start_path,
GtkTreeIter *start_iter,
object_class = (GObjectClass *) class;
parent_class = g_type_class_peek_parent (class);
+ object_class->set_property = gtk_tree_model_sort_set_property;
+ object_class->get_property = gtk_tree_model_sort_get_property;
+
object_class->finalize = gtk_tree_model_sort_finalize;
+
+ /* Properties */
+ g_object_class_install_property (object_class,
+ PROP_MODEL,
+ g_param_spec_object ("model",
+ _("TreeModelSort Model"),
+ _("The model for the TreeModelSort to sort"),
+ GTK_TYPE_TREE_MODEL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
static void
parent_class->finalize (object);
}
+static void
+gtk_tree_model_sort_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (object);
+
+ switch (prop_id)
+ {
+ case PROP_MODEL:
+ gtk_tree_model_sort_set_model (tree_model_sort, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtk_tree_model_sort_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ GtkTreeModelSort *tree_model_sort = GTK_TREE_MODEL_SORT (object);
+
+ switch (prop_id)
+ {
+ case PROP_MODEL:
+ g_value_set_object (value, gtk_tree_model_sort_get_model(tree_model_sort));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
static void
gtk_tree_model_sort_row_changed (GtkTreeModel *s_model,
GtkTreePath *start_s_path,
gtk_tree_store_init (GtkTreeStore *tree_store)
{
tree_store->root = g_node_new (NULL);
+ /* While the odds are against us getting 0...
+ */
do
{
tree_store->stamp = g_random_int ();
}
while (tree_store->stamp == 0);
+
tree_store->sort_list = NULL;
tree_store->sort_column_id = -2;
+ tree_store->columns_dirty = FALSE;
}
/**
return retval;
}
+
+/**
+ * gtk_tree_store_set_column_types:
+ * @tree_store: A #GtkTreeStore
+ * @n_columns: Number of columns for the tree store
+ * @types: An array length n of @GTypes
+ *
+ * This function is meant primarily for GObjects that inherit from GtkTreeStore,
+ * and should only be used when constructing a new @GtkTreeStore. It will not
+ * function after a row has been added, or a method on the @GtkTreeModel
+ * interface is called.
+ **/
+void
+gtk_tree_store_set_column_types (GtkTreeStore *tree_store,
+ gint n_columns,
+ GType *types)
+{
+ gint i;
+
+ g_return_if_fail (GTK_IS_TREE_STORE (tree_store));
+ g_return_if_fail (tree_store->columns_dirty == 0);
+
+ gtk_tree_store_set_n_columns (tree_store, n_columns);
+ for (i = 0; i < n_columns; i++)
+ {
+ if (! _gtk_tree_data_list_check_type (types[i]))
+ {
+ g_warning ("%s: Invalid type %s passed to gtk_tree_store_set_column_types\n", G_STRLOC, g_type_name (types[i]));
+ continue;
+ }
+ gtk_tree_store_set_column_type (tree_store, i, types[i]);
+ }
+}
+
static void
gtk_tree_store_set_n_columns (GtkTreeStore *tree_store,
gint n_columns)
static gint
gtk_tree_store_get_n_columns (GtkTreeModel *tree_model)
{
+ GtkTreeStore *tree_store = (GtkTreeStore *) tree_model;
+
g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), 0);
- return GTK_TREE_STORE (tree_model)->n_columns;
+ tree_store->columns_dirty = TRUE;
+
+ return tree_store->n_columns;
}
static GType
gtk_tree_store_get_column_type (GtkTreeModel *tree_model,
gint index)
{
+ GtkTreeStore *tree_store = (GtkTreeStore *) tree_model;
+
g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), G_TYPE_INVALID);
g_return_val_if_fail (index < GTK_TREE_STORE (tree_model)->n_columns &&
index >= 0, G_TYPE_INVALID);
- return GTK_TREE_STORE (tree_model)->column_headers[index];
+ tree_store->columns_dirty = TRUE;
+
+ return tree_store->column_headers[index];
}
static gboolean
gint depth, i;
g_return_val_if_fail (GTK_IS_TREE_STORE (tree_store), FALSE);
-
+
+ tree_store->columns_dirty = TRUE;
+
indices = gtk_tree_path_get_indices (path);
depth = gtk_tree_path_get_depth (path);
else
parent_node = tree_store->root;
+ tree_store->columns_dirty = TRUE;
+
iter->stamp = tree_store->stamp;
iter->user_data = g_node_new (NULL);
g_node_insert (parent_node, position, G_NODE (iter->user_data));
if (sibling != NULL)
g_return_if_fail (VALID_ITER (sibling, tree_store));
+ tree_store->columns_dirty = TRUE;
+
new_node = g_node_new (NULL);
if (parent == NULL && sibling == NULL)
if (sibling != NULL)
g_return_if_fail (VALID_ITER (sibling, tree_store));
+ tree_store->columns_dirty = TRUE;
+
new_node = g_node_new (NULL);
if (parent == NULL && sibling == NULL)
if (parent != NULL)
g_return_if_fail (VALID_ITER (parent, tree_store));
+ tree_store->columns_dirty = TRUE;
+
if (parent == NULL)
parent_node = tree_store->root;
else
else
parent_node = parent->user_data;
+ tree_store->columns_dirty = TRUE;
+
if (parent_node->children == NULL)
{
GtkTreePath *path;
GtkTreeIterCompareFunc default_sort_func;
gpointer default_sort_data;
GtkDestroyNotify default_sort_destroy;
+ guint columns_dirty : 1;
};
struct _GtkTreeStoreClass
};
-GtkType gtk_tree_store_get_type (void);
-GtkTreeStore *gtk_tree_store_new (gint n_columns,
- ...);
-GtkTreeStore *gtk_tree_store_newv (gint n_columns,
- GType *types);
-void gtk_tree_store_set_value (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- gint column,
- GValue *value);
-void gtk_tree_store_set (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- ...);
-void gtk_tree_store_set_valist (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- va_list var_args);
-void gtk_tree_store_remove (GtkTreeStore *tree_store,
- GtkTreeIter *iter);
-void gtk_tree_store_insert (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint position);
-void gtk_tree_store_insert_before (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- GtkTreeIter *sibling);
-void gtk_tree_store_insert_after (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- GtkTreeIter *sibling);
-void gtk_tree_store_prepend (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- GtkTreeIter *parent);
-void gtk_tree_store_append (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- GtkTreeIter *parent);
-gboolean gtk_tree_store_is_ancestor (GtkTreeStore *tree_store,
- GtkTreeIter *iter,
- GtkTreeIter *descendant);
-gint gtk_tree_store_iter_depth (GtkTreeStore *tree_store,
- GtkTreeIter *iter);
-void gtk_tree_store_clear (GtkTreeStore *tree_store);
+GtkType gtk_tree_store_get_type (void);
+GtkTreeStore *gtk_tree_store_new (gint n_columns,
+ ...);
+GtkTreeStore *gtk_tree_store_newv (gint n_columns,
+ GType *types);
+void gtk_tree_store_set_column_types (GtkTreeStore *tree_store,
+ gint n_columns,
+ GType *types);
+void gtk_tree_store_set_value (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ gint column,
+ GValue *value);
+void gtk_tree_store_set (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ ...);
+void gtk_tree_store_set_valist (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ va_list var_args);
+void gtk_tree_store_remove (GtkTreeStore *tree_store,
+ GtkTreeIter *iter);
+void gtk_tree_store_insert (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ gint position);
+void gtk_tree_store_insert_before (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ GtkTreeIter *sibling);
+void gtk_tree_store_insert_after (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent,
+ GtkTreeIter *sibling);
+void gtk_tree_store_prepend (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent);
+void gtk_tree_store_append (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *parent);
+gboolean gtk_tree_store_is_ancestor (GtkTreeStore *tree_store,
+ GtkTreeIter *iter,
+ GtkTreeIter *descendant);
+gint gtk_tree_store_iter_depth (GtkTreeStore *tree_store,
+ GtkTreeIter *iter);
+void gtk_tree_store_clear (GtkTreeStore *tree_store);
+
#ifdef __cplusplus
}
initialize_model ();
tree_view = gtk_tree_view_new_with_model (model);
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tree_view), FALSE);
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
-1,