dia r4205 - in trunk: . lib po
- From: hans svn gnome org
- To: svn-commits-list gnome org
- Subject: dia r4205 - in trunk: . lib po
- Date: Sun, 18 Jan 2009 17:41:28 +0000 (UTC)
Author: hans
Date: Sun Jan 18 17:41:28 2009
New Revision: 4205
URL: http://svn.gnome.org/viewvc/dia?rev=4205&view=rev
Log:
2009-01-18 Hans Breuer <hans breuer org>
* lib/diagramdata.c lib/layer.c : split the latter from the former to
have more manageable pieces (one class per file)
* lib/Makefile.am lib/makefile.msc po/POTFILES.in : updated accordingly
Modified:
trunk/ChangeLog
trunk/lib/Makefile.am
trunk/lib/diagramdata.c
trunk/lib/layer.c
trunk/lib/makefile.msc
trunk/po/POTFILES.in
Modified: trunk/lib/Makefile.am
==============================================================================
--- trunk/lib/Makefile.am (original)
+++ trunk/lib/Makefile.am Sun Jan 18 17:41:28 2009
@@ -47,6 +47,7 @@
diamenu.h \
diagramdata.h \
diagramdata.c \
+ layer.c \
geometry.h \
geometry.c \
color.h \
Modified: trunk/lib/diagramdata.c
==============================================================================
--- trunk/lib/diagramdata.c (original)
+++ trunk/lib/diagramdata.c Sun Jan 18 17:41:28 2009
@@ -639,499 +639,3 @@
}
}
-/** The default object renderer.
- * @param obj An object to render.
- * @param renderer The renderer to render on.
- * @param active_layer The layer containing the object.
- * @param data The diagram containing the layer.
- * @bug The active_layer and data variables can be inferred from the object.
- */
-static void
-normal_render(DiaObject *obj, DiaRenderer *renderer,
- int active_layer,
- gpointer data)
-{
- DIA_RENDERER_GET_CLASS(renderer)->draw_object(renderer, obj);
-}
-
-
-int render_bounding_boxes = FALSE;
-
-/** Render all components of a single layer. This function also handles
- * rendering of bounding boxes for debugging purposes.
- * @param layer The layer to render.
- * @param renderer The renderer to draw things with.
- * @param update The rectangle that requires update. Only objects that
- * intersect with this rectangle will actually be get rendered.
- * @param obj_renderer A function that will render an object.
- * @param data The diagram that the layer belongs to.
- * @param active_layer Which number layer in the diagram is currently active.
- */
-void
-layer_render(Layer *layer, DiaRenderer *renderer, Rectangle *update,
- ObjectRenderer obj_renderer,
- gpointer data,
- int active_layer)
-{
- GList *list;
- DiaObject *obj;
-
- if (obj_renderer == NULL)
- obj_renderer = normal_render;
-
- /* Draw all objects: */
- list = layer->objects;
- while (list!=NULL) {
- obj = (DiaObject *) list->data;
-
- if (update==NULL || rectangle_intersects(update, &obj->bounding_box)) {
- if ((render_bounding_boxes) && (renderer->is_interactive)) {
- Point p1, p2;
- Color col;
- p1.x = obj->bounding_box.left;
- p1.y = obj->bounding_box.top;
- p2.x = obj->bounding_box.right;
- p2.y = obj->bounding_box.bottom;
- col.red = 1.0;
- col.green = 0.0;
- col.blue = 1.0;
-
- DIA_RENDERER_GET_CLASS(renderer)->set_linewidth(renderer,0.01);
- DIA_RENDERER_GET_CLASS(renderer)->draw_rect(renderer, &p1, &p2, &col);
- }
- (*obj_renderer)(obj, renderer, active_layer, data);
- }
-
- list = g_list_next(list);
- }
-}
-
-/** Set the parent layer of an object.
- * @param element A DiaObject that should be part of a layer.
- * @param user_data The layer it should be part of.
- */
-static void
-set_parent_layer(gpointer element, gpointer user_data)
-{
- ((DiaObject*)element)->parent_layer = (Layer*)user_data;
- /* FIXME: even group members need a parent_layer and what about parent objects ???
- * Now I know again why I always try to avoid back-pointers )-; --hb.
- * If the group objects didn't actually leave the diagram, this wouldn't
- * be a problem. --LC */
-}
-
-/** Get the index of an object in a layer.
- * @param layer The layer the object is (should be) in.
- * @param obj The object to look for.
- * @return The index of the object in the layers list of objects. This is also
- * the vertical position of the object.
- * @bug This should be in a separate layer.c file.
- * @bug The layer could be inferred from the object, in which case the
- * layer arg is not needed, and we would be sure we always looked in the
- * right layer.
- */
-int
-layer_object_index(Layer *layer, DiaObject *obj)
-{
- return (int)g_list_index(layer->objects, (gpointer) obj);
-}
-
-/** Add an object to the top of a layer.
- * @param layer The layer to add the object to.
- * @param obj The object to add. This must not already be part of another
- * layer.
- * @bug This should be in a separate layer.c file.
- * @bug This should just call layer_add_object_at().
- */
-void
-layer_add_object(Layer *layer, DiaObject *obj)
-{
- layer->objects = g_list_append(layer->objects, (gpointer) obj);
- set_parent_layer(obj, layer);
-
- /* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,obj);
-}
-
-/** Add an object to a layer at a specific position.
- * @param layer The layer to add the object to.
- * @param obj The object to add. This must not be part of another layer.
- * @param pos The top-to-bottom position this object should be inserted at.
- * @bug This should be in a separate layer.c file.
- */
-void
-layer_add_object_at(Layer *layer, DiaObject *obj, int pos)
-{
- layer->objects = g_list_insert(layer->objects, (gpointer) obj, pos);
- set_parent_layer(obj, layer);
-
- /* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,obj);
-}
-
-/** Add a list of objects to the end of a layer.
- * @param layer The layer to add objects to.
- * @param obj_list The list of objects to add. These must not already
- * be part of another layer.
- * @bug Determine if the list is kept by g_list_concat.
- */
-void
-layer_add_objects(Layer *layer, GList *obj_list)
-{
- GList *list = obj_list;
-
- layer->objects = g_list_concat(layer->objects, obj_list);
- g_list_foreach(obj_list, set_parent_layer, layer);
-
- while (list != NULL)
- {
- /* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,list->data);
-
- list = g_list_next(list);
- }
-}
-
-/** Add a list of objects to the top of a layer.
- * @param layer The layer to add objects to.
- * @param obj_list The list of objects to add. These must not already
- * be part of another layer.
- * @bug Determine if the list is kept by g_list_concat.
- */
-void
-layer_add_objects_first(Layer *layer, GList *obj_list)
-{
- GList *list = obj_list;
-
- layer->objects = g_list_concat(obj_list, layer->objects);
- g_list_foreach(obj_list, set_parent_layer, layer);
-
- /* Send one signal per object added */
- while (list != NULL)
- {
- /* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,list->data);
-
- list = g_list_next(list);
- }
-
-}
-
-/** Remove an object from a layer.
- * @param layer The layer to remove the object from.
- * @param obj The object to remove.
- * @bug Why don't the layer_add functions deal with dynobj?
- */
-void
-layer_remove_object(Layer *layer, DiaObject *obj)
-{
- layer->objects = g_list_remove(layer->objects, obj);
- dynobj_list_remove_object(obj);
- set_parent_layer(obj, NULL);
-
- /* send a signal that we have removed a object from the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_REMOVE], 0,layer,obj);
-}
-
-/** Remove a list of objects from a layer.
- * @param layer The layer to remove the objects from.
- * @param obj The objects to remove.
- * @bug This should call layer_remove_object repeatedly.
- */
-void
-layer_remove_objects(Layer *layer, GList *obj_list)
-{
- DiaObject *obj;
- while (obj_list != NULL) {
- obj = (DiaObject *) obj_list->data;
-
- layer->objects = g_list_remove(layer->objects, obj);
-
- obj_list = g_list_next(obj_list);
- dynobj_list_remove_object(obj);
- set_parent_layer(obj, NULL);
- /* send a signal that we have removed a object from the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_REMOVE], 0,layer,obj);
- }
-}
-
-/** Find the objects that intersect a given rectangle.
- * @param layer The layer to search in.
- * @param rect The rectangle to intersect with.
- * @return List of objects whose bounding box intersect the rectangle. The
- * list should be freed by the caller.
- */
-GList *
-layer_find_objects_intersecting_rectangle(Layer *layer, Rectangle *rect)
-{
- GList *list;
- GList *selected_list;
- DiaObject *obj;
-
- selected_list = NULL;
- list = layer->objects;
- while (list != NULL) {
- obj = (DiaObject *)list->data;
-
- if (rectangle_intersects(rect, &obj->bounding_box)) {
- if (dia_object_is_selectable(obj)) {
- selected_list = g_list_prepend(selected_list, obj);
- }
- /* Objects in closed groups do not get selected, but their parents do.
- * Since the parents bbox is outside the objects, they will be found
- * anyway and the inner object can just be skipped. */
- }
-
- list = g_list_next(list);
- }
-
- return selected_list;
-}
-
-/** Find objects entirely contained in a rectangle.
- * @param layer The layer to search for objects in.
- * @param rect The rectangle that the objects should be in.
- * @return A list containing the objects that are entirely contained in the
- * rectangle. The list should be freed by the caller.
- */
-GList *
-layer_find_objects_in_rectangle(Layer *layer, Rectangle *rect)
-{
- GList *list;
- GList *selected_list;
- DiaObject *obj;
-
- selected_list = NULL;
- list = layer->objects;
- while (list != NULL) {
- obj = (DiaObject *)list->data;
-
- if (rectangle_in_rectangle(rect, &obj->bounding_box)) {
- if (dia_object_is_selectable(obj)) {
- selected_list = g_list_prepend(selected_list, obj);
- }
- }
-
- list = g_list_next(list);
- }
-
- return selected_list;
-}
-
-/** Find objects entirely containing a rectangle.
- * @param layer The layer to search for objects in.
- * @param rect The rectangle that the objects should surround.
- * @return A list containing the objects that entirely contain the
- * rectangle. The list should be freed by the caller.
- */
-GList *
-layer_find_objects_containing_rectangle(Layer *layer, Rectangle *rect)
-{
- GList *list;
- GList *selected_list;
- DiaObject *obj;
-
- selected_list = NULL;
- list = layer->objects;
- while (list != NULL) {
- obj = (DiaObject *)list->data;
-
- if (rectangle_in_rectangle(&obj->bounding_box, rect)) {
- if (dia_object_is_selectable(obj)) {
- selected_list = g_list_prepend(selected_list, obj);
- }
- }
-
- list = g_list_next(list);
- }
-
- return selected_list;
-}
-
-
-/** Find the object closest to the given point in the layer,
- * no further away than maxdist, and not included in avoid.
- * Stops it if finds an object that includes the point.
- * @param layer The layer to search in.
- * @param pos The point to compare to.
- * @param maxdist The maximum distance the object can be from the point.
- * @param avoid A list of objects that cannot be returned by this search.
- * @return The closest object, or NULL if no allowed objects are closer than
- * maxdist.
- */
-DiaObject *
-layer_find_closest_object_except(Layer *layer, Point *pos,
- real maxdist, GList *avoid)
-{
- GList *l;
- DiaObject *closest;
- DiaObject *obj;
- real dist;
- GList *avoid_tmp;
-
- closest = NULL;
-
- for (l = layer->objects; l!=NULL; l = g_list_next(l)) {
- obj = (DiaObject *) l->data;
-
- /* Check bounding box here too. Might give speedup. */
- dist = obj->ops->distance_from(obj, pos);
-
- if (maxdist-dist > 0.00000001) {
- for (avoid_tmp = avoid; avoid_tmp != NULL; avoid_tmp = avoid_tmp->next) {
- if (avoid_tmp->data == obj) {
- goto NEXTOBJECT;
- }
- }
- closest = obj;
- }
- NEXTOBJECT:
- ;
- }
-
- /* If the object is within a closed group, find the group. */
- closest = dia_object_get_parent_with_flags(closest,
- DIA_OBJECT_GRABS_CHILD_INPUT);
-
- return closest;
-}
-
-/** Find the object closest to the given point in the layer,
- * no further away than maxdist.
- * Stops it if finds an object that includes the point.
- * @param layer The layer to search in.
- * @param pos The point to compare to.
- * @param maxdist The maximum distance the object can be from the point.
- * @return The closest object, or NULL if none are closer than maxdist.
- */
-DiaObject *
-layer_find_closest_object(Layer *layer, Point *pos, real maxdist)
-{
- return layer_find_closest_object_except(layer, pos, maxdist, NULL);
-}
-
-
-/** Find the connectionpoint closest to pos in a layer.
- * @param layer
- * @param closest
- * @param pos
- * @param notthis
- * @return
- */
-real
-layer_find_closest_connectionpoint(Layer *layer,
- ConnectionPoint **closest,
- Point *pos,
- DiaObject *notthis)
-{
- GList *l;
- DiaObject *obj;
- ConnectionPoint *cp;
- real mindist, dist;
- int i;
-
- mindist = 1000000.0; /* Realy big value... */
-
- *closest = NULL;
-
- for (l = layer->objects; l!=NULL; l = g_list_next(l) ) {
- obj = (DiaObject *) l->data;
-
- if (obj == notthis) continue;
- if (obj != dia_object_get_parent_with_flags(obj, DIA_OBJECT_GRABS_CHILD_INPUT))
- continue;
- for (i=0;i<obj->num_connections;i++) {
- cp = obj->connections[i];
- /* Note: Uses manhattan metric for speed... */
- dist = distance_point_point_manhattan(pos, &cp->pos);
- if (dist<mindist) {
- mindist = dist;
- *closest = cp;
- }
- }
-
- }
-
- return mindist;
-}
-
-int
-layer_update_extents(Layer *layer)
-{
- GList *l;
- DiaObject *obj;
- Rectangle new_extents;
-
- l = layer->objects;
- if (l!=NULL) {
- obj = (DiaObject *) l->data;
- new_extents = obj->bounding_box;
- l = g_list_next(l);
-
- while(l!=NULL) {
- const Rectangle *bbox;
- obj = (DiaObject *) l->data;
- /* don't consider empty (or broken) objects in the overall extents */
- bbox = &obj->bounding_box;
- if (bbox->right > bbox->left && bbox->bottom > bbox->top)
- rectangle_union(&new_extents, &obj->bounding_box);
- l = g_list_next(l);
- }
- } else {
- new_extents = invalid_extents;
- }
-
- if (rectangle_equals(&new_extents,&layer->extents)) return FALSE;
-
- layer->extents = new_extents;
- return TRUE;
-}
-
-void
-layer_replace_object_with_list(Layer *layer, DiaObject *remove_obj,
- GList *insert_list)
-{
- GList *list;
-
- list = g_list_find(layer->objects, remove_obj);
-
- g_assert(list!=NULL);
- set_parent_layer(remove_obj, NULL);
- dynobj_list_remove_object(remove_obj);
- 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;
- }
- g_list_free_1(list);
-}
-
-static void
-layer_remove_dynobj(gpointer obj, gpointer userdata)
-{
- dynobj_list_remove_object((DiaObject*)obj);
-}
-
-void layer_set_object_list(Layer *layer, GList *list)
-{
- g_list_foreach(layer->objects, set_parent_layer, NULL);
- g_list_foreach(layer->objects, layer_remove_dynobj, NULL);
- g_list_free(layer->objects);
- layer->objects = list;
- g_list_foreach(layer->objects, set_parent_layer, layer);
-}
-
-DiagramData *
-layer_get_parent_diagram(Layer *layer)
-{
- return layer->parent_diagram;
-}
Modified: trunk/lib/layer.c
==============================================================================
--- trunk/lib/layer.c (original)
+++ trunk/lib/layer.c Sun Jan 18 17:41:28 2009
@@ -16,10 +16,6 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
-/** \file diagramdata.c This file defines the DiagramData object, which holds (mostly) saveable
- * data global to a diagram.
- */
-
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -27,617 +23,9 @@
#include "intl.h"
#include "diagramdata.h"
#include "diarenderer.h"
-#include "paper.h"
-#include "persistence.h"
-
#include "dynamic_obj.h"
-#include "diamarshal.h"
-
static const Rectangle invalid_extents = { -1.0,-1.0,-1.0,-1.0 };
-static void set_parent_layer(gpointer layer, gpointer object);
-
-static void diagram_data_class_init (DiagramDataClass *klass);
-static void diagram_data_init (DiagramData *object);
-
-enum {
- OBJECT_ADD,
- OBJECT_REMOVE,
- LAST_SIGNAL
-};
-
-static guint diagram_data_signals[LAST_SIGNAL] = { 0, };
-
-static gpointer parent_class = NULL;
-
-/** Get the type object for the DiagramData class.
- */
-GType
-diagram_data_get_type(void)
-{
- static GType object_type = 0;
-
- if (!object_type)
- {
- static const GTypeInfo object_info =
- {
- sizeof (DiagramDataClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) diagram_data_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (DiagramData),
- 0, /* n_preallocs */
- (GInstanceInitFunc)diagram_data_init /* init */
- };
-
- object_type = g_type_register_static (G_TYPE_OBJECT,
- "DiagramData",
- &object_info, 0);
- }
-
- return object_type;
-}
-
-/* signal default handlers */
-static void
-_diagram_data_object_add (DiagramData* dia,Layer* layer,DiaObject* obj)
-{
-}
-
-static void
-_diagram_data_object_remove (DiagramData* dia,Layer* layer,DiaObject* obj)
-{
-}
-
-/** Initialize a new diagram data object.
- * @param data A diagram data object to initialize.
- */
-static void
-diagram_data_init(DiagramData *data)
-{
- Color* color = persistence_register_color ("new_diagram_bgcolour", &color_white);
- gboolean compress = persistence_register_boolean ("compress_save", TRUE);
- Layer *first_layer;
-
- data->extents.left = 0.0;
- data->extents.right = 10.0;
- data->extents.top = 0.0;
- data->extents.bottom = 10.0;
-
- data->bg_color = *color;
-
- get_paper_info (&data->paper, -1, NULL);
-
- first_layer = new_layer(g_strdup(_("Background")),data);
-
- data->layers = g_ptr_array_new ();
- g_ptr_array_add (data->layers, first_layer);
- data->active_layer = first_layer;
-
- data->selected_count_private = 0;
- data->selected = NULL;
-
- data->is_compressed = compress; /* Overridden by doc */
-
- data->text_edits = NULL;
- data->active_text_edit = NULL;
-}
-
-/** Deallocate memory owned by a DiagramData object.
- * @param object A DiagramData object to finalize.
- */
-static void
-diagram_data_finalize(GObject *object)
-{
- DiagramData *data = DIA_DIAGRAM_DATA(object);
-
- guint i;
-
- g_free(data->paper.name);
-
- for (i=0;i<data->layers->len;i++) {
- layer_destroy(g_ptr_array_index(data->layers, i));
- }
- g_ptr_array_free(data->layers, TRUE);
- data->active_layer = NULL;
-
- g_list_free(data->selected);
- data->selected = NULL; /* for safety */
- data->selected_count_private = 0;
-}
-
-/** Initialize the DiagramData class data.
- * @param klass The class object to initialize functions for.
- */
-static void
-diagram_data_class_init(DiagramDataClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- parent_class = g_type_class_peek_parent (klass);
-
- diagram_data_signals[OBJECT_ADD] =
- g_signal_new ("object_add",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (DiagramDataClass, object_add),
- NULL, NULL,
- dia_marshal_VOID__POINTER_POINTER,
- G_TYPE_NONE,
- 2,
- G_TYPE_POINTER,
- G_TYPE_POINTER);
-
- diagram_data_signals[OBJECT_REMOVE] =
- g_signal_new ("object_remove",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (DiagramDataClass, object_remove),
- NULL, NULL,
- dia_marshal_VOID__POINTER_POINTER,
- G_TYPE_NONE,
- 2,
- G_TYPE_POINTER,
- G_TYPE_POINTER);
-
- object_class->finalize = diagram_data_finalize;
- klass->object_add = _diagram_data_object_add;
- klass->object_remove = _diagram_data_object_remove;
-}
-
-/** Create a new layer in this diagram.
- * @param name Name of the new layer.
- * @param parent The DiagramData that the layer will belong to,.
- * @return A new Layer object.
- * @bug Must determine if a NULL name is ok.
- * @bug This belongs in a layers.c file.
- * @bug Even though this sets parent diagram, it doesn't call the
- * update_extents functions that add_layer does.
- */
-Layer *
-new_layer(gchar *name, DiagramData *parent)
-{
- Layer *layer;
-
- layer = g_new(Layer, 1);
-
- layer->name = name;
-
- layer->parent_diagram = parent;
- layer->visible = TRUE;
- layer->connectable = TRUE;
-
- layer->objects = NULL;
-
- layer->extents.left = 0.0;
- layer->extents.right = 10.0;
- layer->extents.top = 0.0;
- layer->extents.bottom = 10.0;
-
- return layer;
-}
-
-/** Destroy a layer object.
- * @param layer The layer object to deallocate entirely.
- * @bug This belongs in a layers.c file.
- */
-void
-layer_destroy(Layer *layer)
-{
- g_free(layer->name);
- destroy_object_list(layer->objects);
- g_free(layer);
-}
-
-/** Raise a layer up one in a diagram.
- * @param data The diagram that the layer belongs to.
- * @param layer The layer to raise.
- * @bug The diagram doesn't really need to be passed, as the layer knows it.
- */
-void
-data_raise_layer(DiagramData *data, Layer *layer)
-{
- guint i;
- guint layer_nr = 0;
- Layer *tmp;
-
- for (i=0;i<data->layers->len;i++) {
- if (g_ptr_array_index(data->layers, i)==layer)
- layer_nr = i;
- }
-
- if (layer_nr < data->layers->len-1) {
- tmp = g_ptr_array_index(data->layers, layer_nr+1);
- g_ptr_array_index(data->layers, layer_nr+1) =
- g_ptr_array_index(data->layers, layer_nr);
- g_ptr_array_index(data->layers, layer_nr) = tmp;
- }
-}
-
-/** Lower a layer by one in a diagram.
- * @param data The diagram that the layer belongs to.
- * @param layer The layer to lower.
- * @bug The diagram doesn't really need to be passed, as the layer knows it.
- */
-void
-data_lower_layer(DiagramData *data, Layer *layer)
-{
- guint i;
- int layer_nr = -1;
- Layer *tmp;
-
- for (i=0;i<data->layers->len;i++) {
- if (g_ptr_array_index(data->layers, i)==layer)
- layer_nr = i;
- }
-
- g_assert(layer_nr>=0);
-
- if (layer_nr > 0) {
- tmp = g_ptr_array_index(data->layers, layer_nr-1);
- g_ptr_array_index(data->layers, layer_nr-1) =
- g_ptr_array_index(data->layers, layer_nr);
- g_ptr_array_index(data->layers, layer_nr) = tmp;
- }
-}
-
-/** Add a layer object to a diagram.
- * @param data The diagram to add the layer to.
- * @param layer The layer to add.
- * @bug Should just call data_add_layer_at().
- */
-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);
-}
-
-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);
-}
-
-/** Set which layer is the active layer in a diagram.
- * @param data The diagram in which to set the active layer.
- * @param layer The layer that should be active.
- * @bug The diagram doesn't really need to be passed, as the layer knows it.
- */
-void
-data_set_active_layer(DiagramData *data, Layer *layer)
-{
- data->active_layer = layer;
-}
-
-/** Delete a layer from a diagram.
- * @param data The diagram to delete the layer from.
- * @param layer The layer to delete.
- * @bug The diagram doesn't really need to be passed, as the layer knows it.
- */
-void
-data_delete_layer(DiagramData *data, Layer *layer)
-{
- if (data->layers->len<=1)
- return;
-
- if (data->active_layer == layer) {
- data_remove_all_selected(data);
- }
- layer->parent_diagram = NULL;
- g_ptr_array_remove(data->layers, layer);
-
- if (data->active_layer == layer) {
- data->active_layer = g_ptr_array_index(data->layers, 0);
- }
-}
-
-/** Select an object in a diagram. Note that this does not unselect other
- * objects currently selected in the diagram.
- * @param data The diagram to select in.
- * @param obj The object to select.
- * @bug Does not need to be passed the diagram, as it can be found from the
- * object.
- */
-void
-data_select(DiagramData *data, DiaObject *obj)
-{
- if (g_list_find (data->selected, obj))
- return; /* should this be an error?`*/
- data->selected = g_list_prepend(data->selected, obj);
- data->selected_count_private++;
-}
-
-/** Deselect an object in a diagram. Note that other objects may still be
- * selected after this function is done.
- * @param data The diagram to deselect in.
- * @param obj The object to deselect.
- * @bug Does not need to be passed the diagram, as it can be found from the
- * object.
- */
-void
-data_unselect(DiagramData *data, DiaObject *obj)
-{
- if (!g_list_find (data->selected, obj))
- return; /* should this be an error?`*/
- data->selected = g_list_remove(data->selected, obj);
- data->selected_count_private--;
-}
-
-/** Clears the list of selected objects.
- * Does *not* remove these objects from the object list, despite its name.
- * @param data The diagram to unselect all objects in.
- */
-void
-data_remove_all_selected(DiagramData *data)
-{
- g_list_free(data->selected); /* Remove previous selection */
- data->selected = NULL;
- data->selected_count_private = 0;
-}
-
-/** Return TRUE if the diagram has visible layers.
- * @param data The diagram to check.
- * @return TRUE if at least one layer in the diagram is visible.
- */
-static gboolean
-data_has_visible_layers(DiagramData *data)
-{
- guint i;
- for (i = 0; i < data->layers->len; i++) {
- Layer *layer = g_ptr_array_index(data->layers, i);
- if (layer->visible) return TRUE;
- }
- return FALSE;
-}
-
-/** 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;
-}
-
-/** Change diagram scaling so that the extents are exactly visible.
- * @param data The diagram to adjust.
- * @bug Consider making it a teeny bit larger, or check that *all* objects
- * calculate their extents correctly.
- */
-static void
-data_adapt_scaling_to_extents(DiagramData *data)
-{
- gdouble pwidth = data->paper.width * data->paper.scaling;
- gdouble pheight = data->paper.height * data->paper.scaling;
-
- gdouble xscale = data->paper.fitwidth * pwidth /
- (data->extents.right - data->extents.left);
- gdouble yscale = data->paper.fitheight * pheight /
- (data->extents.bottom - data->extents.top);
-
- data->paper.scaling = (float)MIN(xscale, yscale);
- data->paper.width = (float)(pwidth / data->paper.scaling);
- data->paper.height = (float)(pheight / data->paper.scaling);
-}
-
-/** 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));
-}
-
-/** Update the extents of a diagram and adjust scaling if needed.
- * @param data Diagram to update.
- * @return TRUE if the diagram extents changed.
- */
-gboolean
-data_update_extents(DiagramData *data)
-{
-
- gboolean changed;
-
- changed = data_compute_extents(data);
- if (changed && data->paper.fitto) data_adapt_scaling_to_extents(data);
-
- return changed;
-}
-
-/** Get a list of selected objects in layer ordering.
- * @param data The diagram to get objects from.
- * @return A list of all currently selected objects. These all reside in
- * the currently active layer. This list should be freed after use.
- * @bug Does selection update correctly when the layer changes?
- */
-GList *
-data_get_sorted_selected(DiagramData *data)
-{
- GList *list;
- GList *sorted_list;
- GList *found;
- DiaObject *obj;
-
- g_assert (g_list_length (data->selected) == data->selected_count_private);
- if (data->selected_count_private == 0)
- return NULL;
-
- sorted_list = NULL;
- list = g_list_last(data->active_layer->objects);
- while (list != NULL) {
- found = g_list_find(data->selected, list->data);
- if (found) {
- obj = (DiaObject *)found->data;
- sorted_list = g_list_prepend(sorted_list, obj);
- }
- list = g_list_previous(list);
- }
-
- return sorted_list;
-}
-
-/** Remove the currently selected objects from the list of objects.
- * The selected objects are returned in a newly created GList.
- * @param data The diagram to get and remove the selected objects from.
- * @return A list of all selected objects in the current diagram. This list
- * should be freed after use. Unlike data_get_sorted_selected, the
- * objects in the list are not in the diagram anymore.
- */
-GList *
-data_get_sorted_selected_remove(DiagramData *data)
-{
- GList *list,*tmp;
- GList *sorted_list;
- GList *found;
- DiaObject *obj;
-
- g_assert (g_list_length (data->selected) == data->selected_count_private);
- if (data->selected_count_private == 0)
- return NULL;
-
- sorted_list = NULL;
- list = g_list_last(data->active_layer->objects);
- while (list != NULL) {
- found = g_list_find(data->selected, list->data);
- if (found) {
- obj = (DiaObject *)found->data;
- sorted_list = g_list_prepend(sorted_list, obj);
-
- tmp = list;
- list = g_list_previous(list);
- data->active_layer->objects =
- g_list_remove_link(data->active_layer->objects, tmp);
- } else {
- list = g_list_previous(list);
- }
- }
-
- return sorted_list;
-}
-
-
-/** Emits a GObject signal on DiagramData
- * @param data The DiagramData that emits the signal.
- * @param layer The Layer that the fired signal carries.
- * @param obj The DiaObject that the fired signal carries.
- * @param signal_name The name of the signal.
- */
-void
-data_emit(DiagramData *data, Layer *layer, DiaObject* obj,
- const char *signal_name)
-{
- /* check what signal it is */
- if (strcmp("object_add",signal_name) == 0)
- g_signal_emit(data, diagram_data_signals[OBJECT_ADD], 0, layer, obj);
-
- if (strcmp("object_remove",signal_name) == 0)
- g_signal_emit(data, diagram_data_signals[OBJECT_REMOVE], 0, layer, obj);
-
-}
-
-
-/** Render a diagram.
- * @param data The diagram to render.
- * @param renderer The renderer to render on.
- * @param update The area that needs updating.
- * @param obj_renderer If non-NULL, an alternative renderer of objects.
- * @param gdata User data passed on to inner calls.
- * @bug Describe obj_renderer better.
- */
-void
-data_render(DiagramData *data, DiaRenderer *renderer, Rectangle *update,
- ObjectRenderer obj_renderer,
- gpointer gdata)
-{
- Layer *layer;
- int i;
- int active_layer;
-
- if (!renderer->is_interactive) (DIA_RENDERER_GET_CLASS(renderer)->begin_render)(renderer);
-
- for (i=0; i<data->layers->len; i++) {
- layer = (Layer *) g_ptr_array_index(data->layers, i);
- active_layer = (layer == data->active_layer);
- if (layer->visible)
- layer_render(layer, renderer, update, obj_renderer, gdata, active_layer);
- }
-
- if (!renderer->is_interactive) (DIA_RENDERER_GET_CLASS(renderer)->end_render)(renderer);
-}
-
-void
-data_foreach_object (DiagramData *data, GFunc func, gpointer user_data)
-{
- Layer *layer;
- int i;
- for (i=0; i<data->layers->len; i++) {
- layer = (Layer *) g_ptr_array_index(data->layers, i);
- g_list_foreach (layer->objects, func, user_data);
- }
-}
/** The default object renderer.
* @param obj An object to render.
@@ -750,7 +138,7 @@
set_parent_layer(obj, layer);
/* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,obj);
+ data_emit (layer_get_parent_diagram(layer), layer, obj, "object_add");
}
/** Add an object to a layer at a specific position.
@@ -766,7 +154,7 @@
set_parent_layer(obj, layer);
/* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,obj);
+ data_emit (layer_get_parent_diagram(layer), layer, obj, "object_add");
}
/** Add a list of objects to the end of a layer.
@@ -785,8 +173,9 @@
while (list != NULL)
{
+ DiaObject *obj = (DiaObject *)list->data;
/* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,list->data);
+ data_emit (layer_get_parent_diagram(layer), layer, obj, "object_add");
list = g_list_next(list);
}
@@ -809,8 +198,9 @@
/* Send one signal per object added */
while (list != NULL)
{
+ DiaObject *obj = (DiaObject *)list->data;
/* send a signal that we have added a object to the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_ADD], 0,layer,list->data);
+ data_emit (layer_get_parent_diagram(layer), layer, obj, "object_add");
list = g_list_next(list);
}
@@ -830,7 +220,7 @@
set_parent_layer(obj, NULL);
/* send a signal that we have removed a object from the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_REMOVE], 0,layer,obj);
+ data_emit (layer_get_parent_diagram(layer), layer, obj, "object_remove");
}
/** Remove a list of objects from a layer.
@@ -851,7 +241,7 @@
dynobj_list_remove_object(obj);
set_parent_layer(obj, NULL);
/* send a signal that we have removed a object from the diagram */
- g_signal_emit (layer_get_parent_diagram(layer), diagram_data_signals[OBJECT_REMOVE], 0,layer,obj);
+ data_emit (layer_get_parent_diagram(layer), layer, obj, "object_remove");
}
}
Modified: trunk/lib/makefile.msc
==============================================================================
--- trunk/lib/makefile.msc (original)
+++ trunk/lib/makefile.msc Sun Jan 18 17:41:28 2009
@@ -75,6 +75,7 @@
group.obj \
intl.obj \
dialib.obj \
+ layer.obj \
message.obj \
newgroup.obj \
neworth_conn.obj \
Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in (original)
+++ trunk/po/POTFILES.in Sun Jan 18 17:41:28 2009
@@ -48,6 +48,7 @@
lib/dialogs.c
lib/filter.c
lib/font.c
+lib/layer.c
lib/message.c
lib/newgroup.c
lib/object_defaults.c
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]