GList* seahorse_object_model_get_rows_for_object (SeahorseObjectModel *self, GObject *object) { SeahorseObjectModelPrivate *pv = SEAHORSE_OBJECT_MODEL_GET_PRIVATE (self); GList *rows = NULL; SeahorseObjectRow *skrow; GtkTreeIter *iter; GtkTreePath *path; guint i; g_return_val_if_fail (SEAHORSE_IS_OBJECT_MODEL (self), NULL); g_return_val_if_fail (G_IS_OBJECT (object), NULL); skrow = (SeahorseObjectRow*)g_hash_table_lookup (pv->rows, object); if (!skrow) return NULL; for (i = 0; i < skrow->refs->len; i++) { path = gtk_tree_row_reference_get_path (g_ptr_array_index (skrow->refs, i)); if (path) { iter = g_new0(GtkTreeIter, 1); gtk_tree_model_get_iter (GTK_TREE_MODEL (self), iter, path); rows = g_list_prepend (rows, iter); gtk_tree_path_free (path); } } return rows; }
void seahorse_object_model_remove_rows_for_object (SeahorseObjectModel *self, GObject *object) { SeahorseObjectModelPrivate *pv = SEAHORSE_OBJECT_MODEL_GET_PRIVATE (self); SeahorseObjectRow *skrow; GtkTreeIter iter; GtkTreePath *path; guint i; g_return_if_fail (SEAHORSE_IS_OBJECT_MODEL (self)); g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (pv->data_column >= 0); skrow = (SeahorseObjectRow*)g_hash_table_lookup (pv->rows, object); if (!skrow) return; for (i = 0; i < skrow->refs->len; i++) { path = gtk_tree_row_reference_get_path (g_ptr_array_index (skrow->refs, i)); if (path) { gtk_tree_model_get_iter (GTK_TREE_MODEL (self), &iter, path); gtk_tree_store_remove (GTK_TREE_STORE (self), &iter); gtk_tree_path_free (path); } } /* We no longer have rows associated with this key, then remove */ g_hash_table_remove (pv->rows, object); }
GObject * seahorse_object_model_get_row_key (SeahorseObjectModel *self, GtkTreeIter *iter) { SeahorseObjectRow *skrow; g_return_val_if_fail (SEAHORSE_IS_OBJECT_MODEL (self), NULL); g_return_val_if_fail (self->data_column >= 0, NULL); gtk_tree_model_get (GTK_TREE_MODEL (self), iter, self->data_column, &skrow, -1); if (!skrow) return NULL; g_assert (G_IS_OBJECT (skrow->object)); return skrow->object; }
void seahorse_object_model_set_column_types (SeahorseObjectModel *self, gint n_columns, GType *types) { GType *itypes; g_return_if_fail (SEAHORSE_IS_OBJECT_MODEL (self)); itypes = g_new0(GType, n_columns + 1); memcpy (itypes, types, n_columns * sizeof (GType)); itypes[n_columns] = G_TYPE_POINTER; self->data_column = n_columns; gtk_tree_store_set_column_types (GTK_TREE_STORE (self), n_columns + 1, itypes); g_free (itypes); }
static SeahorseObjectRow * key_row_new (SeahorseObjectModel *self, GObject *object) { SeahorseObjectRow *skrow; g_assert (SEAHORSE_IS_OBJECT_MODEL (self)); g_assert (G_IS_OBJECT (object)); skrow = g_new0 (SeahorseObjectRow, 1); skrow->refs = g_ptr_array_new (); skrow->self = self; skrow->object = object; skrow->binding = seahorse_bind_objects (NULL, object, (SeahorseTransfer)key_notify, self); g_object_weak_ref (G_OBJECT (object), key_destroyed, self); return skrow; }
void seahorse_object_model_set_row_object (SeahorseObjectModel *self, GtkTreeIter *iter, GObject *object) { SeahorseObjectModelPrivate *pv = SEAHORSE_OBJECT_MODEL_GET_PRIVATE (self); SeahorseObjectRow *skrow; GtkTreePath *path; GtkTreePath *ipath; guint i; g_return_if_fail (SEAHORSE_IS_OBJECT_MODEL (self)); g_return_if_fail (G_IS_OBJECT (object) || object == NULL); g_return_if_fail (pv->data_column >= 0); /* Add the row/key association */ if (object) { /* Do we already have a row for this key? */ skrow = (SeahorseObjectRow*)g_hash_table_lookup (pv->rows, object); if (!skrow) { skrow = key_row_new (self, object); /* Put it in our row cache */ g_hash_table_replace (pv->rows, object, skrow); } path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter); g_ptr_array_add (skrow->refs, gtk_tree_row_reference_new (GTK_TREE_MODEL (self), path)); gtk_tree_path_free (path); /* Remove the row/key association */ } else { gtk_tree_model_get (GTK_TREE_MODEL (self), iter, pv->data_column, &skrow, -1); if (skrow) { ipath = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter); g_return_if_fail (ipath != NULL); for (i = 0; i < skrow->refs->len; i++) { path = gtk_tree_row_reference_get_path (g_ptr_array_index (skrow->refs, i)); /* Check if they're the same or invalid, remove */ if (!path || gtk_tree_path_compare (path, ipath) == 0) { gtk_tree_row_reference_free (g_ptr_array_index (skrow->refs, i)); g_ptr_array_remove_index_fast (skrow->refs, i); i--; } if (path) gtk_tree_path_free (path); } /* If we no longer have rows associated with this key, then remove */ if (skrow->refs->len == 0) g_hash_table_remove (pv->rows, skrow->object); } } gtk_tree_store_set (GTK_TREE_STORE (self), iter, pv->data_column, object ? skrow : NULL, -1); if (object) key_notify (object, self); }