diff options
| author | Jon A. Cruz <jon@joncruz.org> | 2012-05-28 07:27:39 +0000 |
|---|---|---|
| committer | Jon A. Cruz <jon@joncruz.org> | 2012-05-28 07:27:39 +0000 |
| commit | e9cec1110c7abef2d7c89161ca07d2819a7bdff1 (patch) | |
| tree | 35b594de2d302f580516a361ee026bc9c2ecb6d2 /src | |
| parent | Stop using deprecated GdkBitmap in custom cursors (diff) | |
| download | inkscape-e9cec1110c7abef2d7c89161ca07d2819a7bdff1.tar.gz inkscape-e9cec1110c7abef2d7c89161ca07d2819a7bdff1.zip | |
Cleanup of measure text for moving away from overlap.
(bzr r11430)
Diffstat (limited to 'src')
| -rw-r--r-- | src/display/canvas-text.cpp | 5 | ||||
| -rw-r--r-- | src/display/canvas-text.h | 2 | ||||
| -rw-r--r-- | src/measure-context.cpp | 98 |
3 files changed, 56 insertions, 49 deletions
diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp index f7a8713b6..c7ca4ab16 100644 --- a/src/display/canvas-text.cpp +++ b/src/display/canvas-text.cpp @@ -255,8 +255,7 @@ sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned i item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2); } -SPCanvasItem * -sp_canvastext_new(SPCanvasGroup *parent, SPDesktop *desktop, Geom::Point pos, gchar const *new_text) +SPCanvasText *sp_canvastext_new(SPCanvasGroup *parent, SPDesktop *desktop, Geom::Point pos, gchar const *new_text) { // Pos specifies the position of the anchor, which is at the bounding box of the text itself (i.e. not at the border of the filled background rectangle) // The relative position of the anchor can be set using e.g. anchor_position = TEXT_ANCHOR_LEFT @@ -270,7 +269,7 @@ sp_canvastext_new(SPCanvasGroup *parent, SPDesktop *desktop, Geom::Point pos, gc g_free(ct->text); ct->text = g_strdup(new_text); - return item; + return ct; } diff --git a/src/display/canvas-text.h b/src/display/canvas-text.h index ecdb77f1c..b779d7170 100644 --- a/src/display/canvas-text.h +++ b/src/display/canvas-text.h @@ -58,7 +58,7 @@ struct SPCanvasTextClass : public SPCanvasItemClass{}; GType sp_canvastext_get_type (void); -SPCanvasItem *sp_canvastext_new(SPCanvasGroup *parent, SPDesktop *desktop, Geom::Point pos, gchar const *text); +SPCanvasText *sp_canvastext_new(SPCanvasGroup *parent, SPDesktop *desktop, Geom::Point pos, gchar const *text); void sp_canvastext_set_rgba32 (SPCanvasText *ct, guint32 rgba, guint32 rgba_stroke); void sp_canvastext_set_coords (SPCanvasText *ct, gdouble x0, gdouble y0); diff --git a/src/measure-context.cpp b/src/measure-context.cpp index 4aa007464..db6183d71 100644 --- a/src/measure-context.cpp +++ b/src/measure-context.cpp @@ -353,6 +353,10 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv previous_point = intersections[0]; } + + // Normal will be used for lines and text + Geom::Point normal = desktop->w2d(Geom::unit_vector(Geom::rot90(desktop->d2w(end_point - start_point)))); + for (size_t idx = 1; idx < intersections.size(); ++idx) { Geom::Point measure_text_pos = (previous_point + intersections[idx]) / 2; //TODO: shift label a few pixels in the y coordinate @@ -361,77 +365,81 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv sp_convert_distance(&lengthval, &sp_unit_get_by_id(SP_UNIT_PX), &unit); // TODO cleanup memory, Glib::ustring, etc.: - char* measure_str = static_cast<char*>(malloc(20)); - sprintf(measure_str, "%.2f %s", lengthval, unit.abbr); - SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, desktop->doc2dt(measure_text_pos), measure_str); - - sp_canvastext_set_fontsize(SP_CANVASTEXT(canvas_tooltip), fontsize); - SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff; - SP_CANVASTEXT(canvas_tooltip)->rgba_background = 0x0000007f; - SP_CANVASTEXT(canvas_tooltip)->outline = false; - SP_CANVASTEXT(canvas_tooltip)->background = true; - SP_CANVASTEXT(canvas_tooltip)->anchor_position = TEXT_ANCHOR_CENTER; + gchar *measure_str = g_strdup_printf("%.2f %s", lengthval, unit.abbr); + SPCanvasText *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), + desktop, + desktop->doc2dt(measure_text_pos), + measure_str); + sp_canvastext_set_fontsize(canvas_tooltip, fontsize); + canvas_tooltip->rgba = 0xffffffff; + canvas_tooltip->rgba_background = 0x0000007f; + canvas_tooltip->outline = false; + canvas_tooltip->background = true; + canvas_tooltip->anchor_position = TEXT_ANCHOR_CENTER; measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); - free(measure_str); + g_free(measure_str); previous_point = intersections[idx]; } { // 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(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; + gchar *angle_str = g_strdup_printf("%.2f °", angle * 180/M_PI); + SPCanvasText *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(canvas_tooltip, fontsize); + canvas_tooltip->rgba = 0xffffffff; + canvas_tooltip->rgba_background = 0x337f337f; + canvas_tooltip->outline = false; + canvas_tooltip->background = true; + canvas_tooltip->anchor_position = TEXT_ANCHOR_LEFT; measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); - free(angle_str); + g_free(angle_str); } { double totallengthval = (end_point - start_point).length(); sp_convert_distance(&totallengthval, &sp_unit_get_by_id(SP_UNIT_PX), &unit); - 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(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; + // TODO cleanup memory, Glib::ustring, etc.: + gchar *totallength_str = g_strdup_printf("%.2f %s", totallengthval, unit.abbr); + SPCanvasText *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(canvas_tooltip, fontsize); + canvas_tooltip->rgba = 0xffffffff; + canvas_tooltip->rgba_background = 0x3333337f; + canvas_tooltip->outline = false; + canvas_tooltip->background = true; + canvas_tooltip->anchor_position = TEXT_ANCHOR_LEFT; measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); - free(totallength_str); + g_free(totallength_str); } - // Normal will be used for lines and text - Geom::Point normal = desktop->w2d(Geom::unit_vector(Geom::rot90(desktop->d2w(end_point - start_point)))); - if (intersections.size() > 2) { double totallengthval = (intersections[intersections.size()-1] - intersections[0]).length(); sp_convert_distance(&totallengthval, &sp_unit_get_by_id(SP_UNIT_PX), &unit); // TODO cleanup memory, Glib::ustring, etc.: - char* total_str = static_cast<char*>(malloc(20)); - sprintf(total_str, "%.2f %s", totallengthval, unit.abbr); - - SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal*60, total_str); - sp_canvastext_set_fontsize(SP_CANVASTEXT(canvas_tooltip), fontsize); - SP_CANVASTEXT(canvas_tooltip)->rgba = 0xffffffff; - 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; + gchar *total_str = g_strdup_printf("%.2f %s", totallengthval, unit.abbr); + SPCanvasText *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), + desktop, + desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * 60, + total_str); + sp_canvastext_set_fontsize(canvas_tooltip, fontsize); + canvas_tooltip->rgba = 0xffffffff; + canvas_tooltip->rgba_background = 0x33337f7f; + canvas_tooltip->outline = false; + canvas_tooltip->background = true; + canvas_tooltip->anchor_position = TEXT_ANCHOR_CENTER; measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); - free(total_str); + g_free(total_str); } // Now that text has been added, we can add lines and controls so that they go underneath |
