static gboolean _dtm_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter) { int i; if (NODE_OBJECT(iter)) { if (!NODE_LAYER(iter)) return FALSE; i = layer_object_get_index (NODE_LAYER(iter), NODE_OBJECT(iter)); ++i; NODE_OBJECT(iter) = layer_object_get_nth(NODE_LAYER(iter), i); return NODE_OBJECT(iter) != NULL; } else if (NODE_LAYER(iter)) { if (!NODE_DIAGRAM(iter)) return FALSE; i = data_layer_get_index (NODE_DIAGRAM(iter), NODE_LAYER(iter)); ++i; NODE_LAYER(iter) = data_layer_get_nth(NODE_DIAGRAM(iter), i); return NODE_LAYER(iter) != NULL; } else if (NODE_DIAGRAM(iter)) { GList *list = dia_open_diagrams(); i = g_list_index (list, NODE_DIAGRAM(iter)); ++i; list = g_list_nth (list, i); NODE_DIAGRAM(iter) = list ? list->data : NULL; return NODE_DIAGRAM(iter) != NULL; } else { /* empy iter? */ GList *list = dia_open_diagrams(); NODE_DIAGRAM(iter) = list ? list->data : NULL; return NODE_DIAGRAM(iter) != NULL; } return FALSE; }
void diagram_ungroup_selected(Diagram *dia) { DiaObject *group; GList *group_list; GList *selected, *selection_copy; int group_index; int any_groups = 0; if (g_list_length(dia->data->selected) < 1) { message_error("Trying to ungroup with no selected objects."); return; } selection_copy = g_list_copy(dia->data->selected); selected = selection_copy; while (selected != NULL) { group = (DiaObject *)selected->data; if (IS_GROUP(group)) { Change *change; /* Fix selection */ diagram_unselect_object(dia, group); group_list = group_objects(group); group_index = layer_object_get_index(dia->data->active_layer, group); change = undo_ungroup_objects(dia, group_list, group, group_index); (change->apply)(change, dia); diagram_select_list(dia, group_list); any_groups = 1; } selected = g_list_next(selected); } g_list_free(selection_copy); if (any_groups) { diagram_modified(dia); diagram_flush(dia); undo_set_transactionpoint(dia->undo); } }
static GtkTreePath * _dtm_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter) { GtkTreePath *result; int index = 0; if (!NODE_DIAGRAM(iter) && !NODE_LAYER(iter) && !NODE_OBJECT(iter)) { /* the root path */ return gtk_tree_path_new_first (); } result = gtk_tree_path_new (); if (NODE_DIAGRAM(iter)) { GList *list = dia_open_diagrams(); gtk_tree_path_append_index (result, g_list_index (list, NODE_DIAGRAM(iter))); } if (NODE_LAYER(iter)) { g_return_val_if_fail (NODE_DIAGRAM(iter) == layer_get_parent_diagram (NODE_LAYER(iter)), NULL); index = data_layer_get_index (NODE_DIAGRAM(iter), NODE_LAYER(iter)); if (index >= 0) gtk_tree_path_append_index (result, index); } if (index >= 0 && NODE_OBJECT(iter)) { g_return_val_if_fail (NODE_LAYER(iter) == dia_object_get_parent_layer (NODE_OBJECT(iter)), NULL); index = layer_object_get_index (NODE_LAYER(iter), NODE_OBJECT(iter)); if (index >= 0) gtk_tree_path_append_index (result, index); } if (index < 0) { gtk_tree_path_free (result); return NULL; } return result; }
//! objects are kept in an ordered list, this is the index of the given object int dia::Layer::object_index (Object* o) const { g_return_val_if_fail (self != NULL, -1); return layer_object_get_index (self, o->Self()); }