/* listen on the diagram for object add/remove */ static void _object_add (DiagramData *dia, Layer *layer, DiaObject *obj, DiagramTreeModel *dtm) { GtkTreePath *path; GtkTreeIter _iter; GtkTreeIter *iter = &_iter; /* a bit backward: the first child is in the diagram, but not the tree yet */ gboolean had_child = layer_object_count (layer) > 1; g_return_if_fail (DIA_DIAGRAM(dia) != NULL); NODE_DIAGRAM(iter) = dia; NODE_LAYER(iter) = layer; NODE_OBJECT(iter) = obj; /* FIXME: this may get called before the layer is added to the tree */ path = _dtm_get_path (GTK_TREE_MODEL (dtm), iter); if (path) { gtk_tree_model_row_inserted (GTK_TREE_MODEL (dtm), path, iter); /* enforce update */ if (!had_child && gtk_tree_path_up (path)) gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (dtm), path, &_iter); gtk_tree_path_free (path); } }
static void _object_remove(DiagramData *dia, Layer *layer, DiaObject *obj, DiagramTreeModel *dtm) { GtkTreePath *path; GtkTreeIter _iter; GtkTreeIter *iter = &_iter; gboolean last_child = layer_object_count (layer) == 0; g_return_if_fail (DIA_DIAGRAM(dia) != NULL); NODE_DIAGRAM(iter) = dia; NODE_LAYER(iter) = layer; NODE_OBJECT(iter) = obj; path = _dtm_get_path (GTK_TREE_MODEL (dtm), iter); gtk_tree_model_row_deleted (GTK_TREE_MODEL (dtm), path); gtk_tree_path_free (path); /* enforce update - but the arrow on layer does not vanish */ if (last_child) { NODE_OBJECT(iter) = NULL; path = _dtm_get_path (GTK_TREE_MODEL (dtm), iter); gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (dtm), path, iter); gtk_tree_path_free (path); } }
static void report_row_has_child_toggled (FMTreeModel *model, GtkTreeIter *iter) { GtkTreePath *path; path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), iter); gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (model), path, iter); gtk_tree_path_free (path); }
/* * MODELCHANGES * * No matter if we are wrapped in the SortModel change signals are always * sent to this model. In the sortable case the GtkTreeModelSort translates * them to the right coordinates for the tree view. */ static gboolean _recurse_row_inserted (GtkTreeModel *model, GtkTreeIter *parent) { GtkTreeIter iter; int n = 0; while (_dtm_iter_nth_child (model, &iter, parent, n)) { GtkTreePath *path = _dtm_get_path (model, &iter); gtk_tree_model_row_inserted (model, path, &iter); /* gtk_tree_model_row_has_child_toggled * ... emitted when a row has gotten the first child row ... * So no need to do it here. Or maybe not for the sorted model? */ if (_recurse_row_inserted (model, &iter)) gtk_tree_model_row_has_child_toggled (model, path, &iter); gtk_tree_path_free (path); ++n; } return (n > 0); }
/* listen to diagram creation */ static void _diagram_add (DiaApplication *app, Diagram *dia, DiagramTreeModel *dtm) { GtkTreePath *path; GtkTreeIter _iter = {0,}; /* all null is our root */ GtkTreeIter *iter = &_iter; NODE_DIAGRAM(iter) = DIA_DIAGRAM_DATA (dia); path = _dtm_get_path (GTK_TREE_MODEL (dtm), iter); /* we always get a path, but it may not be a valid one */ if (path) { /* gtk_tree_model_row_changed is not 'strong' enough, lets try to re-add the root */ gtk_tree_model_row_inserted (GTK_TREE_MODEL (dtm), path, iter); /* looks like the GtkTreeView is somewhat out of service */ if (_recurse_row_inserted (GTK_TREE_MODEL (dtm), iter)) gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (dtm), path, iter); gtk_tree_path_free (path); } _dtm_listen_on_diagram (dtm, dia); }
static void fm_dir_tree_model_remove_all_children (FmDirTreeModel *dir_tree_model, GList *item_list, GtkTreePath *tree_path) { FmDirTreeItem *dir_tree_item = (FmDirTreeItem*)item_list->data; if (G_UNLIKELY (!dir_tree_item->children)) return; gtk_tree_path_append_index (tree_path, 0); while (dir_tree_item->children) { fm_dir_tree_item_free_l (dir_tree_item->children); dir_tree_item->children = g_list_delete_link (dir_tree_item->children, dir_tree_item->children); char *tmp_path = gtk_tree_path_to_string (tree_path); //TREEVIEW_DEBUG ("TREEVIEW_DEBUG: fm_dir_tree_model_remove_all_children %s\n", tmp_path); g_free (tmp_path); // signal the view that we removed the placeholder item. // everytime we remove the first item, its next item became the // first item, so there is no need to update tree_path. gtk_tree_model_row_deleted (GTK_TREE_MODEL (dir_tree_model), tree_path); } if (dir_tree_item->hidden_children) { g_list_foreach (dir_tree_item->hidden_children, (GFunc)fm_dir_tree_item_free, NULL); g_list_free (dir_tree_item->hidden_children); dir_tree_item->hidden_children = NULL; } gtk_tree_path_up (tree_path); GtkTreeIter it; gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (dir_tree_model), tree_path, &it); // ??? //~ gtk_tree_model_row_changed ((GtkTreeModel*) dir_tree_model, tree_path, &it); }
gboolean fm_list_model_add_file (FMListModel *model, CajaFile *file, CajaDirectory *directory) { GtkTreeIter iter; GtkTreePath *path; FileEntry *file_entry; GSequenceIter *ptr, *parent_ptr; GSequence *files; gboolean replace_dummy; GHashTable *parent_hash; parent_ptr = g_hash_table_lookup (model->details->directory_reverse_map, directory); if (parent_ptr) { file_entry = g_sequence_get (parent_ptr); ptr = g_hash_table_lookup (file_entry->reverse_map, file); } else { file_entry = NULL; ptr = g_hash_table_lookup (model->details->top_reverse_map, file); } if (ptr != NULL) { g_warning ("file already in tree (parent_ptr: %p)!!!\n", parent_ptr); return FALSE; } file_entry = g_new0 (FileEntry, 1); file_entry->file = caja_file_ref (file); file_entry->parent = NULL; file_entry->subdirectory = NULL; file_entry->files = NULL; files = model->details->files; parent_hash = model->details->top_reverse_map; replace_dummy = FALSE; if (parent_ptr != NULL) { file_entry->parent = g_sequence_get (parent_ptr); /* At this point we set loaded. Either we saw * "done" and ignored it waiting for this, or we do this * earlier, but then we replace the dummy row anyway, * so it doesn't matter */ file_entry->parent->loaded = 1; parent_hash = file_entry->parent->reverse_map; files = file_entry->parent->files; if (g_sequence_get_length (files) == 1) { GSequenceIter *dummy_ptr = g_sequence_get_iter_at_pos (files, 0); FileEntry *dummy_entry = g_sequence_get (dummy_ptr); if (dummy_entry->file == NULL) { /* replace the dummy loading entry */ model->details->stamp++; g_sequence_remove (dummy_ptr); replace_dummy = TRUE; } } } file_entry->ptr = g_sequence_insert_sorted (files, file_entry, fm_list_model_file_entry_compare_func, model); g_hash_table_insert (parent_hash, file, file_entry->ptr); iter.stamp = model->details->stamp; iter.user_data = file_entry->ptr; path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter); if (replace_dummy) { gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter); } else { gtk_tree_model_row_inserted (GTK_TREE_MODEL (model), path, &iter); } if (caja_file_is_directory (file)) { file_entry->files = g_sequence_new ((GDestroyNotify)file_entry_free); add_dummy_row (model, file_entry); gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (model), path, &iter); } gtk_tree_path_free (path); return TRUE; }
static VALUE rg_row_has_child_toggled(VALUE self, VALUE path, VALUE iter) { gtk_tree_model_row_has_child_toggled(_SELF(self), RVAL2GTKTREEPATH(path), RVAL2GTKTREEITER(iter)); return self; }