]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/view.c
2007-09-27 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / view.c
index d6847f15623bf5d9cd6d10fda2b934ba42b95e67..2636eb9d088b145bee344f3be2d2145a694af83c 100644 (file)
@@ -143,6 +143,9 @@ static void       label_changed_cb                (glView         *view);
 
 static void       label_resized_cb                (glView         *view);
 
+static void       label_object_added_cb           (glView         *view,
+                                                   glLabelObject  *object);
+
 static void       draw_layers                     (glView         *view,
                                                    cairo_t        *cr);
 
@@ -483,6 +486,8 @@ gl_view_construct (glView  *view,
                                   G_CALLBACK (label_changed_cb), view);
        g_signal_connect_swapped (G_OBJECT (view->label), "size_changed",
                                   G_CALLBACK (label_resized_cb), view);
+       g_signal_connect_swapped (G_OBJECT (view->label), "object_added",
+                                  G_CALLBACK (label_object_added_cb), view);
 
        gl_debug (DEBUG_VIEW, "END");
 }
@@ -729,6 +734,39 @@ label_resized_cb (glView  *view)
 }
 
 
+/*---------------------------------------------------------------------------*/
+/* PRIVATE.  Handle new label object.                                        */
+/*---------------------------------------------------------------------------*/
+static void
+label_object_added_cb (glView         *view,
+                       glLabelObject  *object)
+{
+        glViewObject *view_object;
+
+       g_return_if_fail (view && GL_IS_VIEW (view));
+       g_return_if_fail (object && GL_IS_LABEL_OBJECT (object));
+
+        if (GL_IS_LABEL_BOX (object)) {
+                view_object = gl_view_box_new (GL_LABEL_BOX(object), view);
+        } else if (GL_IS_LABEL_ELLIPSE (object)) {
+                view_object = gl_view_ellipse_new (GL_LABEL_ELLIPSE(object), view);
+        } else if (GL_IS_LABEL_LINE (object)) {
+                view_object = gl_view_line_new (GL_LABEL_LINE(object), view);
+        } else if (GL_IS_LABEL_IMAGE (object)) {
+                view_object = gl_view_image_new (GL_LABEL_IMAGE(object), view);
+        } else if (GL_IS_LABEL_TEXT (object)) {
+                view_object = gl_view_text_new (GL_LABEL_TEXT(object), view);
+        } else if (GL_IS_LABEL_BARCODE (object)) {
+                view_object = gl_view_barcode_new (GL_LABEL_BARCODE(object), view);
+        } else {
+                /* Should not happen! */
+                view_object = NULL;
+                g_message ("Invalid label object type.");
+        }
+
+        gl_view_select_object (view, view_object);
+}
+
 /*---------------------------------------------------------------------------*/
 /* PRIVATE.  Create, draw and order layers.                                  */
 /*---------------------------------------------------------------------------*/
@@ -805,7 +843,7 @@ draw_grid_layer (glView  *view,
        gdouble                    w, h;
        gdouble                    x, y;
        gdouble                    x0, y0;
-       const glTemplateLabelType *label_type;
+       const lglTemplateFrame    *frame;
 
        gl_debug (DEBUG_VIEW, "START");
 
@@ -815,11 +853,11 @@ draw_grid_layer (glView  *view,
         if (view->grid_visible)
         {
 
-                label_type = gl_template_get_first_label_type (view->label->template);
+                frame = lgl_template_get_first_frame (view->label->template);
 
                 gl_label_get_size (view->label, &w, &h);
        
-                if (label_type->shape == GL_TEMPLATE_SHAPE_RECT) {
+                if (frame->shape == LGL_TEMPLATE_FRAME_SHAPE_RECT) {
                         x0 = 0.0;
                         y0 = 0.0;
                 } else {
@@ -864,9 +902,9 @@ draw_markup_layer (glView  *view,
                    cairo_t *cr)
 {
        glLabel                   *label;
-       const glTemplateLabelType *label_type;
+       const lglTemplateFrame    *frame;
        GList                     *p;
-       glTemplateMarkup          *markup;
+       lglTemplateMarkup         *markup;
 
        g_return_if_fail (view && GL_IS_VIEW (view));
        g_return_if_fail (view->label && GL_IS_LABEL (view->label));
@@ -875,21 +913,21 @@ draw_markup_layer (glView  *view,
         {
 
                 label      = view->label;
-                label_type = gl_template_get_first_label_type (label->template);
+                frame = lgl_template_get_first_frame (label->template);
 
                 cairo_save (cr);
 
                 cairo_set_line_width (cr, MARKUP_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
                 cairo_set_source_rgb (cr, MARKUP_RGB_ARGS);
 
-                for ( p=label_type->markups; p != NULL; p=p->next )
+                for ( p=frame->all.markups; p != NULL; p=p->next )
                 {
-                        markup = (glTemplateMarkup *)p->data;
+                        markup = (lglTemplateMarkup *)p->data;
 
                         gl_cairo_markup_path (cr, markup, label);
-                }
 
-                cairo_stroke (cr);
+                        cairo_stroke (cr);
+                }
 
                 cairo_restore (cr);
         }
@@ -1411,9 +1449,11 @@ gl_view_is_selection_atomic (glView *view)
 void
 gl_view_delete_selection (glView *view)
 {
-       GList *object_list;
-       GList *p;
-       GList *p_next;
+       GList         *object_list;
+       GList         *p;
+       GList         *p_next;
+       glViewObject  *view_object;
+       glLabelObject *object;
 
        gl_debug (DEBUG_VIEW, "START");
 
@@ -1425,10 +1465,13 @@ gl_view_delete_selection (glView *view)
 
        for (p = object_list; p != NULL; p = p_next) {
                p_next = p->next;
-               g_object_unref (G_OBJECT (p->data));
-               object_list = g_list_delete_link (object_list, p);
+               view_object = GL_VIEW_OBJECT (p->data);
+               object = gl_view_object_get_object (view_object);
+                gl_label_object_remove (object);
        }
 
+        g_list_free (object_list);
+
        gl_debug (DEBUG_VIEW, "END");
 }