diff options
| author | Maximilian Albert <maximilian.albert@gmail.com> | 2009-01-26 14:41:05 +0000 |
|---|---|---|
| committer | cilix42 <cilix42@users.sourceforge.net> | 2009-01-26 14:41:05 +0000 |
| commit | 87f6a22451870cf5993212d1e90327280b2e14ae (patch) | |
| tree | 25cea0126b6df96208c4d6301f971630cd2f48a0 /src/display/guideline.cpp | |
| parent | removing a g_warning (diff) | |
| download | inkscape-87f6a22451870cf5993212d1e90327280b2e14ae.tar.gz inkscape-87f6a22451870cf5993212d1e90327280b2e14ae.zip | |
display guide anchor on canvas; anchor and angle can be edited by mouse
(bzr r7180)
Diffstat (limited to 'src/display/guideline.cpp')
| -rw-r--r-- | src/display/guideline.cpp | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp index cd1a12213..5380eec45 100644 --- a/src/display/guideline.cpp +++ b/src/display/guideline.cpp @@ -6,9 +6,11 @@ * Authors: * Lauris Kaplinski <lauris@kaplinski.com> * Johan Engelen + * Maximilian Albert <maximilian.albert@gmail.com> * * Copyright (C) 2000-2002 Lauris Kaplinski * Copyright (C) 2007 Johan Engelen + * Copyright (C) 2009 Maximilian Albert * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -18,6 +20,7 @@ #include <2geom/transforms.h> #include "display-forward.h" #include "sp-canvas-util.h" +#include "sp-ctrlquadr.h" #include "guideline.h" static void sp_guideline_class_init(SPGuideLineClass *c); @@ -32,6 +35,7 @@ static double sp_guideline_point(SPCanvasItem *item, Geom::Point p, SPCanvasItem static void sp_guideline_drawline (SPCanvasBuf *buf, gint x0, gint y0, gint x1, gint y1, guint32 rgba); static SPCanvasItemClass *parent_class; +static const double radius = 7.0; GType sp_guideline_get_type() { @@ -76,10 +80,24 @@ static void sp_guideline_init(SPGuideLine *gl) gl->angle = 3.14159265358979323846/2; gl->point_on_line = Geom::Point(0,0); gl->sensitive = 0; + + gl->origin = NULL; } static void sp_guideline_destroy(GtkObject *object) { + g_return_if_fail (object != NULL); + g_return_if_fail (SP_IS_GUIDELINE (object)); + //g_return_if_fail (SP_GUIDELINE(object)->origin != NULL); + //g_return_if_fail (SP_IS_CTRLQUADR(SP_GUIDELINE(object)->origin)); + + if (SP_GUIDELINE(object)->origin != NULL && SP_IS_CTRLQUADR(SP_GUIDELINE(object)->origin)) { + gtk_object_destroy(GTK_OBJECT(SP_GUIDELINE(object)->origin)); + } else { + // FIXME: This branch shouldn't be reached (although it seems to be harmless). + //g_error("Why can it be that gl->origin is not a valid SPCtrlQuadr?\n"); + } + GTK_OBJECT_CLASS(parent_class)->destroy(object); } @@ -169,6 +187,16 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf) } } +static void set_origin_coords(SPCtrlQuadr *quadr, Geom::Point const ¢er, double const r) +{ + sp_ctrlquadr_set_coords(quadr, + center + Geom::Point(-r,-r), + center + Geom::Point(-r, r), + center + Geom::Point( r, r), + center + Geom::Point( r,-r)); + +} + static void sp_guideline_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags) { SPGuideLine *gl = SP_GUIDELINE(item); @@ -180,6 +208,9 @@ static void sp_guideline_update(SPCanvasItem *item, Geom::Matrix const &affine, gl->point_on_line[Geom::X] = affine[4]; gl->point_on_line[Geom::Y] = affine[5]; + set_origin_coords(gl->origin, gl->point_on_line * affine.inverse(), radius); + sp_canvas_item_request_update(SP_CANVAS_ITEM (gl->origin)); + if (gl->is_horizontal()) { sp_canvas_update_bbox (item, -1000000, (int) Inkscape::round(gl->point_on_line[Geom::Y]), 1000000, (int) Inkscape::round(gl->point_on_line[Geom::Y] + 1)); } else if (gl->is_vertical()) { @@ -208,21 +239,26 @@ static double sp_guideline_point(SPCanvasItem *item, Geom::Point p, SPCanvasItem SPCanvasItem *sp_guideline_new(SPCanvasGroup *parent, Geom::Point point_on_line, Geom::Point normal) { SPCanvasItem *item = sp_canvas_item_new(parent, SP_TYPE_GUIDELINE, NULL); + SPCanvasItem *origin = sp_canvas_item_new(parent, SP_TYPE_CTRLQUADR, NULL); SPGuideLine *gl = SP_GUIDELINE(item); + SPCtrlQuadr *cp = SP_CTRLQUADR(origin); + gl->origin = cp; normal.normalize(); gl->normal_to_line = normal; gl->angle = tan( -gl->normal_to_line[Geom::X] / gl->normal_to_line[Geom::Y]); sp_guideline_set_position(gl, point_on_line); + set_origin_coords(cp, point_on_line, radius); + return item; } void sp_guideline_set_position(SPGuideLine *gl, Geom::Point point_on_line) { - sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl), - Geom::Matrix(Geom::Translate(point_on_line))); + sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl), Geom::Matrix(Geom::Translate(point_on_line))); + sp_canvas_item_affine_absolute(SP_CANVAS_ITEM (gl->origin), Geom::Matrix(Geom::Translate(point_on_line))); } void sp_guideline_set_normal(SPGuideLine *gl, Geom::Point normal_to_line) @@ -236,6 +272,7 @@ void sp_guideline_set_normal(SPGuideLine *gl, Geom::Point normal_to_line) void sp_guideline_set_color(SPGuideLine *gl, unsigned int rgba) { gl->rgba = rgba; + sp_ctrlquadr_set_rgba32(gl->origin, rgba); sp_canvas_item_request_update(SP_CANVAS_ITEM(gl)); } @@ -245,6 +282,12 @@ void sp_guideline_set_sensitive(SPGuideLine *gl, int sensitive) gl->sensitive = sensitive; } +void sp_guideline_delete(SPGuideLine *gl) +{ + //gtk_object_destroy(GTK_OBJECT(gl->origin)); + gtk_object_destroy(GTK_OBJECT(gl)); +} + //########################################################## // Line rendering #define SAFE_SETPIXEL //undefine this when it is certain that setpixel is never called with invalid params |
