summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDiederik van Lierop <mail@diedenrezi.nl>2012-01-01 15:46:12 +0000
committerDiederik van Lierop <mail@diedenrezi.nl>2012-01-01 15:46:12 +0000
commit6a7bd5175bba266e10ff5eac5c630ec3115b2e19 (patch)
treee3982ca0e391ecc060d2f7403e77a936783979a2 /src
parentItem and image properties dialog update: restoring correct behaviour in case ... (diff)
downloadinkscape-6a7bd5175bba266e10ff5eac5c630ec3115b2e19.tar.gz
inkscape-6a7bd5175bba266e10ff5eac5c630ec3115b2e19.zip
1) Fix CanvasText alignment bugs caused by static variables, uninitialized variables, and variable border width
2) Snap tooltips no longer overlap with measure tool tooltips, and now have a background color (similar to the measure tool) (bzr r10816)
Diffstat (limited to 'src')
-rw-r--r--src/display/canvas-text.cpp61
-rw-r--r--src/display/canvas-text.h6
-rw-r--r--src/display/snap-indicator.cpp23
-rw-r--r--src/live_effects/parameter/text.cpp8
-rw-r--r--src/lpe-tool-context.cpp6
-rw-r--r--src/measure-context.cpp7
6 files changed, 67 insertions, 44 deletions
diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp
index 809bb4eeb..a563bddac 100644
--- a/src/display/canvas-text.cpp
+++ b/src/display/canvas-text.cpp
@@ -74,6 +74,8 @@ static void
sp_canvastext_init (SPCanvasText *canvastext)
{
canvastext->anchor_position = TEXT_ANCHOR_CENTER;
+ canvastext->anchor_offset_x = 0;
+ canvastext->anchor_offset_y = 0;
canvastext->rgba = 0x33337fff;
canvastext->rgba_stroke = 0xffffffff;
canvastext->rgba_background = 0x0000007f;
@@ -84,6 +86,9 @@ sp_canvastext_init (SPCanvasText *canvastext)
canvastext->item = NULL;
canvastext->desktop = NULL;
canvastext->text = NULL;
+ canvastext->outline = false;
+ canvastext->background = false;
+ canvastext->border = 3; // must be a constant, and not proportional to any width, height, or fontsize to allow alignment with other text boxes
}
static void
@@ -102,10 +107,6 @@ sp_canvastext_destroy (GtkObject *object)
(* GTK_OBJECT_CLASS (parent_class_ct)->destroy) (object);
}
-// these are set in sp_canvastext_update() and then re-used in sp_canvastext_render(), which is called afterwards
-static double anchor_offset_x = 0;
-static double anchor_offset_y = 0;
-
static void
sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf)
{
@@ -117,8 +118,8 @@ sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf)
Geom::Point s = cl->s * cl->affine;
double offsetx = s[Geom::X] - buf->rect.left();
double offsety = s[Geom::Y] - buf->rect.top();
- offsetx -= anchor_offset_x;
- offsety -= anchor_offset_y;
+ offsetx -= cl->anchor_offset_x;
+ offsety -= cl->anchor_offset_y;
cairo_set_font_size(buf->ct, cl->fontsize);
@@ -126,7 +127,7 @@ sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf)
cairo_text_extents_t extents;
cairo_text_extents(buf->ct, cl->text, &extents);
- double border = extents.height*0.5;
+ double border = cl->border;
cairo_rectangle(buf->ct, offsetx - extents.x_bearing - border,
offsety + extents.y_bearing - border,
extents.width + 2*border,
@@ -172,7 +173,7 @@ sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned i
cairo_set_font_size(tmp_buf, cl->fontsize);
cairo_text_extents_t extents;
cairo_text_extents(tmp_buf, cl->text, &extents);
- double border = extents.height;
+ double border = cl->border;
item->x1 = s[Geom::X] - extents.x_bearing - 2*border;
item->y1 = s[Geom::Y] + extents.y_bearing - 2*border;
@@ -182,36 +183,36 @@ sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned i
// adjust update region according to anchor shift
switch (cl->anchor_position){
case TEXT_ANCHOR_LEFT:
- anchor_offset_x = -2*border;
- anchor_offset_y = -extents.height/2;
+ cl->anchor_offset_x = -2*border;
+ cl->anchor_offset_y = -extents.height/2;
break;
case TEXT_ANCHOR_RIGHT:
- anchor_offset_x = extents.width + 2*border;
- anchor_offset_y = -extents.height/2;
+ cl->anchor_offset_x = extents.width + 2*border;
+ cl->anchor_offset_y = -extents.height/2;
break;
case TEXT_ANCHOR_BOTTOM:
- anchor_offset_x = extents.width/2;
- anchor_offset_y = 2*border;
+ cl->anchor_offset_x = extents.width/2;
+ cl->anchor_offset_y = 2*border;
break;
case TEXT_ANCHOR_TOP:
- anchor_offset_x = extents.width/2;
- anchor_offset_y = -extents.height - 2*border;
+ cl->anchor_offset_x = extents.width/2;
+ cl->anchor_offset_y = -extents.height - 2*border;
break;
case TEXT_ANCHOR_ZERO:
- anchor_offset_x = 0;
- anchor_offset_y = 0;
+ cl->anchor_offset_x = 0;
+ cl->anchor_offset_y = 0;
break;
case TEXT_ANCHOR_CENTER:
default:
- anchor_offset_x = extents.width/2;
- anchor_offset_y = -extents.height/2;
+ cl->anchor_offset_x = extents.width/2;
+ cl->anchor_offset_y = -extents.height/2;
break;
}
- item->x1 -= anchor_offset_x;
- item->x2 -= anchor_offset_x;
- item->y1 -= anchor_offset_y;
- item->y2 -= anchor_offset_y;
+ item->x1 -= cl->anchor_offset_x;
+ item->x2 -= cl->anchor_offset_x;
+ item->y1 -= cl->anchor_offset_y;
+ item->y2 -= cl->anchor_offset_y;
sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
}
@@ -295,12 +296,12 @@ sp_canvastext_set_fontsize (SPCanvasText *ct, double size)
ct->fontsize = size;
}
-void
-sp_canvastext_set_anchor (SPCanvasText *ct, double anchor_x, double anchor_y)
-{
- ct->anchor_x = anchor_x;
- ct->anchor_y = anchor_y;
-}
+//void
+//sp_canvastext_set_anchor (SPCanvasText *ct, double anchor_x, double anchor_y)
+//{
+// ct->anchor_x = anchor_x;
+// ct->anchor_y = anchor_y;
+//}
/*
diff --git a/src/display/canvas-text.h b/src/display/canvas-text.h
index 90c02717c..d21a08dbd 100644
--- a/src/display/canvas-text.h
+++ b/src/display/canvas-text.h
@@ -39,6 +39,7 @@ struct SPCanvasText : public SPCanvasItem {
guint32 rgba_background;
bool outline;
bool background;
+ double border;
CanvasTextAnchorPositionEnum anchor_position;
SPDesktop *desktop; // the desktop to which this text is attached; needed for coordinate transforms (TODO: these should be eliminated)
@@ -47,8 +48,8 @@ struct SPCanvasText : public SPCanvasItem {
Geom::Point s;
Geom::Affine affine;
double fontsize;
- double anchor_x;
- double anchor_y;
+ double anchor_offset_x;
+ double anchor_offset_y;
};
struct SPCanvasTextClass : public SPCanvasItemClass{};
@@ -62,7 +63,6 @@ void sp_canvastext_set_coords (SPCanvasText *ct, const Geom::Point start);
void sp_canvastext_set_text (SPCanvasText *ct, gchar const* new_text);
void sp_canvastext_set_number_as_text (SPCanvasText *ct, int num);
void sp_canvastext_set_fontsize (SPCanvasText *ct, double size);
-void sp_canvastext_set_anchor (SPCanvasText *ct, double anchor_x, double anchor_y);
#endif // SEEN_SP_CANVASTEXT_H
diff --git a/src/display/snap-indicator.cpp b/src/display/snap-indicator.cpp
index 3b9bb57e1..7864c0e53 100644
--- a/src/display/snap-indicator.cpp
+++ b/src/display/snap-indicator.cpp
@@ -6,7 +6,7 @@
* Diederik van Lierop
*
* Copyright (C) Johan Engelen 2009 <j.b.c.engelen@utwente.nl>
- * Copyright (C) Diederik van Lierop 2010 <mail@diedenrezi.nl>
+ * Copyright (C) Diederik van Lierop 2010 - 2012 <mail@diedenrezi.nl>
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -22,6 +22,7 @@
#include "knot.h"
#include "preferences.h"
#include <glibmm/i18n.h>
+#include "tools-switch.h"
namespace Inkscape {
namespace Display {
@@ -253,15 +254,29 @@ SnapIndicator::set_new_snaptarget(Inkscape::SnappedPoint const &p, bool pre_snap
} else {
tooltip_str = g_strdup(source_name);
}
- Geom::Point tooltip_pos = p.getPoint() + _desktop->w2d(Geom::Point(15, -15));
+ double fontsize = prefs->getInt("/tools/measure/fontsize");
+
+ Geom::Point tooltip_pos = p.getPoint();
+ if (tools_isactive(_desktop, TOOLS_MEASURE)) {
+ // Make sure that the snap tooltips do not overlap the ones from the measure tool
+ tooltip_pos += _desktop->w2d(Geom::Point(0, -3*fontsize));
+ } else {
+ tooltip_pos += _desktop->w2d(Geom::Point(0, -2*fontsize));
+ }
SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(_desktop), _desktop, tooltip_pos, tooltip_str);
+ sp_canvastext_set_fontsize(SP_CANVASTEXT(canvas_tooltip), fontsize);
+ SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff;
+ SP_CANVASTEXT(canvas_tooltip)->outline = false;
+ SP_CANVASTEXT(canvas_tooltip)->background = true;
if (pre_snap) {
- SP_CANVASTEXT(canvas_tooltip)->rgba = 0x7f7f7fff;
+ SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x33337f40;
+ } else {
+ SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x33337f7f;
}
+ SP_CANVASTEXT(canvas_tooltip)->anchor_position = TEXT_ANCHOR_CENTER;
g_free(tooltip_str);
- sp_canvastext_set_anchor((SPCanvasText* )canvas_tooltip, -1, 1);
_snaptarget_tooltip = _desktop->add_temporary_canvasitem(canvas_tooltip, timeout_val);
// Display the bounding box, if we snapped to one
diff --git a/src/live_effects/parameter/text.cpp b/src/live_effects/parameter/text.cpp
index 0c0c3d69c..2c17a23a5 100644
--- a/src/live_effects/parameter/text.cpp
+++ b/src/live_effects/parameter/text.cpp
@@ -62,10 +62,12 @@ TextParam::setPosAndAnchor(const Geom::Piecewise<Geom::D2<Geom::SBasis> > &pwd2,
Point pos = pwd2_reparam.valueAt(t_reparam);
Point dir = unit_vector(derivative(pwd2_reparam).valueAt(t_reparam));
Point n = -rot90(dir);
- double angle = Geom::angle_between(dir, Point(1,0));
+ // double angle = Geom::angle_between(dir, Point(1,0));
sp_canvastext_set_coords(canvas_text, pos + n * length);
- sp_canvastext_set_anchor(canvas_text, std::sin(angle), -std::cos(angle));
+ // Canvastext currently no longer allows for setting a custom anchor position,
+ // This functionality was broken as of rev. #10331 (2011-06-21), and for now completely removed as of 2012-01-01
+ //sp_canvastext_set_anchor(canvas_text, std::sin(angle), -std::cos(angle));
}
void
@@ -73,7 +75,7 @@ TextParam::setAnchor(double x_value, double y_value)
{
anchor_x = x_value;
anchor_y = y_value;
- sp_canvastext_set_anchor (canvas_text, anchor_x, anchor_y);
+ //sp_canvastext_set_anchor (canvas_text, anchor_x, anchor_y);
}
bool
diff --git a/src/lpe-tool-context.cpp b/src/lpe-tool-context.cpp
index c164dfbd1..eb4cd0876 100644
--- a/src/lpe-tool-context.cpp
+++ b/src/lpe-tool-context.cpp
@@ -446,10 +446,12 @@ set_pos_and_anchor(SPCanvasText *canvas_text, const Geom::Piecewise<Geom::D2<Geo
Point pos = pwd2_reparam.valueAt(t_reparam);
Point dir = unit_vector(derivative(pwd2_reparam).valueAt(t_reparam));
Point n = -rot90(dir);
- double angle = Geom::angle_between(dir, Point(1,0));
+ // double angle = Geom::angle_between(dir, Point(1,0));
sp_canvastext_set_coords(canvas_text, pos + n * length);
- sp_canvastext_set_anchor(canvas_text, std::sin(angle), -std::cos(angle));
+ // Canvastext currently no longer allows for setting a custom anchor position,
+ // This functionality was broken as of rev. #10331, and completely removed as of 2012-01-01
+ //sp_canvastext_set_anchor(canvas_text, std::sin(angle), -std::cos(angle));
}
void
diff --git a/src/measure-context.cpp b/src/measure-context.cpp
index 8d33608a0..f98ff4de1 100644
--- a/src/measure-context.cpp
+++ b/src/measure-context.cpp
@@ -395,12 +395,13 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
// TODO cleanup memory, Glib::ustring, etc.:
char* angle_str = static_cast<char*>(malloc(20));
sprintf(angle_str, "%.2f °", angle * 180/M_PI);
- SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, end_point + desktop->w2d(Geom::Point(5*fontsize,0)), angle_str);
+ SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, end_point + desktop->w2d(Geom::Point(3*fontsize, fontsize)), angle_str);
sp_canvastext_set_fontsize(SP_CANVASTEXT(canvas_tooltip), fontsize);
SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff;
SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x337f337f;
SP_CANVASTEXT(canvas_tooltip)->outline = false;
SP_CANVASTEXT(canvas_tooltip)->background = true;
+ SP_CANVASTEXT(canvas_tooltip)->anchor_position = TEXT_ANCHOR_LEFT;
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0));
free(angle_str);
@@ -411,12 +412,13 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
char* totallength_str = static_cast<char*>(malloc(20));
sprintf(totallength_str, "%.2f %s", totallengthval, unit.abbr);
- SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, end_point + desktop->w2d(Geom::Point(5*fontsize,-2*fontsize)), totallength_str);
+ SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, end_point + desktop->w2d(Geom::Point(3*fontsize, -fontsize)), totallength_str);
sp_canvastext_set_fontsize(SP_CANVASTEXT(canvas_tooltip), fontsize);
SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff;
SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x3333337f;
SP_CANVASTEXT(canvas_tooltip)->outline = false;
SP_CANVASTEXT(canvas_tooltip)->background = true;
+ SP_CANVASTEXT(canvas_tooltip)->anchor_position = TEXT_ANCHOR_LEFT;
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0));
free(totallength_str);
@@ -449,6 +451,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv
SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x33337f7f;
SP_CANVASTEXT(canvas_tooltip)->outline = false;
SP_CANVASTEXT(canvas_tooltip)->background = true;
+ SP_CANVASTEXT(canvas_tooltip)->anchor_position = TEXT_ANCHOR_CENTER;
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0));
free(total_str);