/** Set the diagram extents field to the union of the extents of the layers. * @param data The diagram to get the extents for. */ static void data_get_layers_extents_union(DiagramData *data) { guint i; gboolean first = TRUE; Rectangle new_extents; for ( i = 0 ; i<data->layers->len; i++) { Layer *layer = g_ptr_array_index(data->layers, i); if (!layer->visible) continue; layer_update_extents(layer); if (first) { new_extents = layer->extents; first = rectangle_equals(&new_extents,&invalid_extents); } else { if (!rectangle_equals(&layer->extents,&invalid_extents)) { rectangle_union(&new_extents, &layer->extents); } } } data->extents = new_extents; }
/** Adjust the extents field of a diagram. * @param data The diagram to adjust. * @return TRUE if the extents changed. */ static gboolean data_compute_extents(DiagramData *data) { Rectangle old_extents = data->extents; if (!data_has_visible_layers(data)) { if (data->layers->len > 0) { Layer *layer = g_ptr_array_index(data->layers, 0); layer_update_extents(layer); data->extents = layer->extents; } else { data->extents = invalid_extents; } } else { data_get_layers_extents_union(data); } if (rectangle_equals(&data->extents,&invalid_extents)) { data->extents.left = 0.0; data->extents.right = 10.0; data->extents.top = 0.0; data->extents.bottom = 10.0; } return (!rectangle_equals(&data->extents,&old_extents)); }
/** Add a layer object to a diagram. * @param data The diagram to add the layer to. * @param layer The layer to add. */ void data_add_layer(DiagramData *data, Layer *layer) { g_ptr_array_add(data->layers, layer); layer->parent_diagram = data; layer_update_extents(layer); data_update_extents(data); }
/*! * \brief Add a layer object to a diagram. * @param data The diagram to add the layer to. * @param layer The layer to add. * \memberof _DiagramData */ void data_add_layer(DiagramData *data, Layer *layer) { g_ptr_array_add(data->layers, layer); layer->parent_diagram = data; data_emit (data, layer, NULL, "object_add"); layer_update_extents(layer); data_update_extents(data); }
void data_add_layer_at(DiagramData *data, Layer *layer, int pos) { int len; int i; g_ptr_array_add(data->layers, layer); len = data->layers->len; if ( (pos>=0) && (pos < len)) { for (i=len-1;i>pos;i--) { g_ptr_array_index(data->layers, i) = g_ptr_array_index(data->layers, i-1); } g_ptr_array_index(data->layers, pos) = layer; } layer->parent_diagram = data; layer_update_extents(layer); data_update_extents(data); }
/*! * \brief Swaps a list of objects with a single object * * This function exchanges the given object with the list of objects. * Ownership of remove_obj and insert_list objects is swapped, too. * * \memberof _Layer */ void layer_replace_object_with_list(Layer *layer, DiaObject *remove_obj, GList *insert_list) { GList *list, *il; list = g_list_find(layer->objects, remove_obj); g_assert(list!=NULL); dynobj_list_remove_object(remove_obj); data_emit (layer_get_parent_diagram(layer), layer, remove_obj, "object_remove"); set_parent_layer(remove_obj, NULL); g_list_foreach(insert_list, set_parent_layer, layer); if (list->prev == NULL) { layer->objects = insert_list; } else { list->prev->next = insert_list; insert_list->prev = list->prev; } if (list->next != NULL) { GList *last; last = g_list_last(insert_list); last->next = list->next; list->next->prev = last; } il = insert_list; while (il) { data_emit (layer_get_parent_diagram(layer), layer, il->data, "object_add"); il = g_list_next(il); } g_list_free_1(list); /* with transformed groups the list and the single object are not necessarily * of the same size */ layer_update_extents (layer); }
void dia::Layer::update_extents () { g_return_if_fail (self != NULL); layer_update_extents(self); }