#include #include "owltreemodelslice.h" struct _OwlTreeModelSlicePrivate { GtkTreeModel *child_model; GtkTreePath *root; }; #define OWL_TREE_MODEL_SLICE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), OWL_TYPE_TREE_MODEL_SLICE, OwlTreeModelSlicePrivate)) static void owl_tree_model_slice_tree_model_init (GtkTreeModelIface *iface); /* * Implementation prototypes */ static GtkTreeModelFlags owl_tree_model_slice_get_flags (GtkTreeModel *model); static gint owl_tree_model_slice_get_n_columns (GtkTreeModel *model); static GType owl_tree_model_slice_get_column_type (GtkTreeModel *model, gint index); static gboolean owl_tree_model_slice_get_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path); // TODO get_path static void owl_tree_model_slice_get_value (GtkTreeModel *model, GtkTreeIter *iter, gint column, GValue *value); static gboolean owl_tree_model_slice_iter_next (GtkTreeModel *model, GtkTreeIter *iter); static gboolean owl_tree_model_slice_iter_children (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent); static gboolean owl_tree_model_slice_iter_has_child (GtkTreeModel *model, GtkTreeIter *iter); static gint owl_tree_model_slice_iter_n_children (GtkTreeModel *model, GtkTreeIter *iter); static gboolean owl_tree_model_slice_iter_nth_child (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent, gint n); static gboolean owl_tree_model_slice_iter_parent (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *child); static void owl_tree_model_slice_ref_node (GtkTreeModel *model, GtkTreeIter *iter); static void owl_tree_model_slice_unref_node (GtkTreeModel *model, GtkTreeIter *iter); G_DEFINE_TYPE_EXTENDED (OwlTreeModelSlice, owl_tree_model_slice, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, owl_tree_model_slice_tree_model_init)); static void owl_tree_model_slice_init (OwlTreeModelSlice *slice) { slice->priv = OWL_TREE_MODEL_SLICE_GET_PRIVATE (slice); } static void owl_tree_model_slice_class_init (OwlTreeModelSliceClass *klass) { g_type_class_add_private (G_OBJECT_CLASS (klass), sizeof (OwlTreeModelSlicePrivate)); } static void owl_tree_model_slice_tree_model_init (GtkTreeModelIface *iface) { iface->get_flags = owl_tree_model_slice_get_flags; iface->get_n_columns = owl_tree_model_slice_get_n_columns; iface->get_column_type = owl_tree_model_slice_get_column_type; iface->get_iter = owl_tree_model_slice_get_iter; //iface->get_path = owl_tree_model_slice_get_path; iface->get_value = owl_tree_model_slice_get_value; iface->iter_next = owl_tree_model_slice_iter_next; iface->iter_children = owl_tree_model_slice_iter_children; iface->iter_has_child = owl_tree_model_slice_iter_has_child; iface->iter_n_children = owl_tree_model_slice_iter_n_children; iface->iter_nth_child = owl_tree_model_slice_iter_nth_child; iface->iter_parent = owl_tree_model_slice_iter_parent; iface->ref_node = owl_tree_model_slice_ref_node; iface->unref_node = owl_tree_model_slice_unref_node; } static GtkTreeModelFlags owl_tree_model_slice_get_flags (GtkTreeModel *model) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, 0); g_return_val_if_fail (slice->priv->child_model != NULL, 0); return gtk_tree_model_get_flags (slice->priv->child_model) | GTK_TREE_MODEL_LIST_ONLY; } static gint owl_tree_model_slice_get_n_columns (GtkTreeModel *model) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, 0); g_return_val_if_fail (slice->priv->child_model != NULL, 0); return gtk_tree_model_get_n_columns (slice->priv->child_model); } static GType owl_tree_model_slice_get_column_type (GtkTreeModel *model, gint index) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, G_TYPE_INVALID); g_return_val_if_fail (slice->priv->child_model != NULL, G_TYPE_INVALID); return gtk_tree_model_get_column_type (slice->priv->child_model, index); } static GtkTreePath* convert_to_child (OwlTreeModelSlice *slice, GtkTreePath *path) { GtkTreePath *new_path; gint depth; gint *indices; g_assert (slice); g_assert (path); if (slice->priv->root == NULL) return gtk_tree_path_copy (path); new_path = gtk_tree_path_copy (slice->priv->root); depth = gtk_tree_path_get_depth (path); indices = gtk_tree_path_get_indices (path); while (depth--) gtk_tree_path_append_index (new_path, *indices++); return new_path; } static gboolean owl_tree_model_slice_get_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); GtkTreePath *child_path; gboolean res; g_return_val_if_fail (slice != NULL, FALSE); g_return_val_if_fail (slice->priv->child_model != NULL, FALSE); child_path = convert_to_child (slice, path); res = gtk_tree_model_get_iter (slice->priv->child_model, iter, child_path); gtk_tree_path_free (child_path); return res; } static void owl_tree_model_slice_get_value (GtkTreeModel *model, GtkTreeIter *iter, gint column, GValue *value) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_if_fail (slice != NULL); g_return_if_fail (slice->priv->child_model != NULL); gtk_tree_model_get_value (slice->priv->child_model, iter, column, value); } static gboolean owl_tree_model_slice_iter_next (GtkTreeModel *model, GtkTreeIter *iter) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, FALSE); g_return_val_if_fail (slice->priv->child_model != NULL, FALSE); return gtk_tree_model_iter_next (slice->priv->child_model, iter); } static gboolean owl_tree_model_slice_iter_children (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, FALSE); g_return_val_if_fail (slice->priv->child_model != NULL, FALSE); if (parent == NULL) return gtk_tree_model_get_iter_first (model, iter); else return FALSE; } static gboolean owl_tree_model_slice_iter_has_child (GtkTreeModel *model, GtkTreeIter *iter) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, FALSE); g_return_val_if_fail (slice->priv->child_model != NULL, FALSE); return FALSE; } static gint owl_tree_model_slice_iter_n_children (GtkTreeModel *model, GtkTreeIter *iter) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, 0); g_return_val_if_fail (slice->priv->child_model != NULL, 0); if (iter) { return 0; } else { GtkTreeIter child_iter; if (!gtk_tree_model_get_iter (slice->priv->child_model, &child_iter, slice->priv->root)) { g_warning ("Cannot get child iterator"); return 0; } return gtk_tree_model_iter_n_children (slice->priv->child_model, &child_iter); } } static gboolean owl_tree_model_slice_iter_nth_child (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *parent, gint n) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, FALSE); g_return_val_if_fail (slice->priv->child_model != NULL, FALSE); if (parent != NULL) return FALSE; else return gtk_tree_model_iter_nth_child (slice->priv->child_model, iter, parent, n); } static gboolean owl_tree_model_slice_iter_parent (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *child) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_val_if_fail (slice != NULL, FALSE); g_return_val_if_fail (slice->priv->child_model != NULL, FALSE); return FALSE; } static void owl_tree_model_slice_ref_node (GtkTreeModel *model, GtkTreeIter *iter) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_if_fail (slice != NULL); g_return_if_fail (slice->priv->child_model != NULL); gtk_tree_model_ref_node (slice->priv->child_model, iter); } static void owl_tree_model_slice_unref_node (GtkTreeModel *model, GtkTreeIter *iter) { OwlTreeModelSlice *slice = OWL_TREE_MODEL_SLICE (model); g_return_if_fail (slice != NULL); g_return_if_fail (slice->priv->child_model != NULL); gtk_tree_model_unref_node (slice->priv->child_model, iter); } GtkTreeModel * owl_tree_model_slice_new (GtkTreeModel *child_model, GtkTreePath *root) { OwlTreeModelSlice *slice; g_return_val_if_fail (child_model != NULL, NULL); slice = g_object_new (OWL_TYPE_TREE_MODEL_SLICE, NULL); slice->priv->child_model = child_model; if (root) { slice->priv->root = gtk_tree_path_copy (root); } else { slice->priv->root = NULL; } return (GtkTreeModel *)slice; } GtkTreeModel * owl_tree_model_slice_get_model (OwlTreeModelSlice *slice) { g_return_val_if_fail (OWL_IS_TREE_MODEL_SLICE (slice), NULL); return slice->priv->child_model; } void owl_tree_model_slice_set_root (OwlTreeModelSlice *slice, GtkTreePath *root) { g_return_if_fail (OWL_IS_TREE_MODEL_SLICE (slice)); g_return_if_fail (OWL_IS_TREE_MODEL_SLICE (slice->priv->child_model)); if (root) { slice->priv->root = gtk_tree_path_copy (root); } else { slice->priv->root = NULL; } /* TODO: emit change events */ } #if 0 /* Not sure we need these */ void owl_tree_model_slice_convert_child_iter_to_iter (OwlTreeModelSlice *slice, GtkTreeIter *slice_iter, GtkTreeIter *child_iter); void owl_tree_model_slice_convert_iter_to_child_iter (OwlTreeModelSlice *slice, GtkTreeIter *child_iter, GtkTreeIter *slice_iter); #endif /* TODO */ GtkTreePath *owl_tree_model_slice_convert_child_path_to_path (OwlTreeModelSlice *slice, GtkTreePath *child_path); GtkTreePath * owl_tree_model_slice_convert_path_to_child_path (OwlTreeModelSlice *slice, GtkTreePath *slice_path) { g_return_val_if_fail (OWL_IS_TREE_MODEL_SLICE (slice), NULL); g_return_val_if_fail (slice->priv->child_model != NULL, NULL); g_return_val_if_fail (slice_path != NULL, NULL); return convert_to_child (slice, slice_path); }