]> git.sur5r.net Git - glabels/blobdiff - glabels2/src/view.c
2007-09-27 Jim Evins <evins@snaught.com>
[glabels] / glabels2 / src / view.c
index 5587b6db40cb7b287414def1adc0d5cccd4740c8..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);
         }
@@ -968,6 +1006,10 @@ draw_select_region_layer (glView  *view,
                 w  = fabs (view->select_region.x2 - view->select_region.x1);
                 h  = fabs (view->select_region.y2 - view->select_region.y1);
 
+                cairo_save (cr);
+
+                cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+
                 cairo_rectangle (cr, x1, y1, w, h);
 
                 cairo_set_source_rgba (cr, SELECT_FILL_RGBA_ARGS);
@@ -976,6 +1018,8 @@ draw_select_region_layer (glView  *view,
                 cairo_set_line_width (cr, SELECT_LINE_WIDTH_PIXELS/(view->home_scale * view->zoom));
                 cairo_set_source_rgba (cr, SELECT_LINE_RGBA_ARGS);
                 cairo_stroke (cr);
+
+                cairo_restore (cr);
         }
 }
 
@@ -1405,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");
 
@@ -1419,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");
 }
 
@@ -3205,10 +3254,16 @@ motion_notify_event_cb (glView            *view,
                         break;
 
                 case GL_VIEW_ARROW_SELECT_REGION:
+#ifdef CLIP_UPDATES                                
                         gl_view_update_region (view, cr, &view->select_region);
+#endif
                         view->select_region.x2 = x;
                         view->select_region.y2 = y;
+#ifdef CLIP_UPDATES                                
                         gl_view_update_region (view, cr, &view->select_region);
+#else
+                        gl_view_update (view);
+#endif
                         break;
 
                 case GL_VIEW_ARROW_MOVE:
@@ -3485,7 +3540,11 @@ button_release_event_cb (glView            *view,
                                 break;
 
                         case GL_VIEW_ARROW_SELECT_REGION:
+#ifdef CLIP_UPDATES                                
                                 gl_view_update_region (view, cr, &view->select_region);
+#else
+                                gl_view_update (view);
+#endif
 
                                 view->select_region_visible = FALSE;
                                 view->select_region.x2 = x;