diff options
| author | Felipe Corr??a da Silva Sanches <juca@members.fsf.org> | 2011-06-13 02:07:23 +0000 |
|---|---|---|
| committer | Felipe C. da S. Sanches <juca@members.fsf.org> | 2011-06-13 02:07:23 +0000 |
| commit | 68519ec20c94cc0a9c00134a5139ed0517a61659 (patch) | |
| tree | a2cb6eb766ce09b9a75ca9a1b7a8e8f1440bacc9 /src/measure-context.cpp | |
| parent | Replace deprecated gtk_signal API (diff) | |
| download | inkscape-68519ec20c94cc0a9c00134a5139ed0517a61659.tar.gz inkscape-68519ec20c94cc0a9c00134a5139ed0517a61659.zip | |
more improvements in the measurement tool:
* select elements crossed by the line segment drawn with the tool
* allow user to select font size for the length labels (in the toolbar)
* use temporary canvas items
(bzr r10284)
Diffstat (limited to 'src/measure-context.cpp')
| -rw-r--r-- | src/measure-context.cpp | 76 |
1 files changed, 30 insertions, 46 deletions
diff --git a/src/measure-context.cpp b/src/measure-context.cpp index 2aeb39d5d..6870786f2 100644 --- a/src/measure-context.cpp +++ b/src/measure-context.cpp @@ -48,7 +48,7 @@ static gint tolerance = 0; static bool within_tolerance = false; static SPCanvasItem * line = NULL; Geom::Point start_point; -SPCanvasItem *measure_text = NULL; +std::vector<Inkscape::Display::TemporaryItem*> measure_tmp_items; GType sp_measure_context_get_type(void) { @@ -157,16 +157,8 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv line = sp_canvas_item_new(sp_desktop_controls(desktop), SP_TYPE_CTRLLINE, NULL); } - if (!measure_text){ - measure_text = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, start_point, ""); - SP_CANVASTEXT(measure_text)->rgba = 0x7f7f7fff; - sp_canvastext_set_anchor(SP_CANVASTEXT(measure_text), -1, 1);//why? - } - sp_ctrlline_set_coords (SP_CTRLLINE(line), start_point, start_point); - sp_canvastext_set_text (SP_CANVASTEXT(measure_text), ""); sp_canvas_item_show (line); - sp_canvas_item_show (measure_text); sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK, @@ -195,23 +187,23 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv sp_ctrlline_set_coords (SP_CTRLLINE(line), start_point[Geom::X], start_point[Geom::Y], motion_dt[Geom::X], motion_dt[Geom::Y]); - - //our control line - Geom::PathVector line; + Geom::PathVector lineseg; Geom::Path p; p.start(desktop->dt2doc(start_point)); p.appendNew<Geom::LineSegment>(desktop->dt2doc(motion_dt)); - line.push_back(p); + lineseg.push_back(p); + +//TODO: calculate NPOINTS +//800 seems to be a good value for 800x600 resolution +#define NPOINTS 800 std::vector<Geom::Point> points; double i; -#define NPOINTS 3000 for (i=0; i<NPOINTS; i++){ points.push_back(desktop->d2w(start_point + (i/NPOINTS)*(motion_dt-start_point))); } - double length; -//select elements crossed by line segment: + //select elements crossed by line segment: GSList *items = sp_desktop_document(desktop)->getItemsAtPoints(desktop->dkey, points); SPItem* item; GSList *l; @@ -242,16 +234,16 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv Geom::PathVector pathv = curve->get_pathvector(); // Find all intersections of the control-line with this shape - Geom::CrossingSet cs = Geom::crossings(line, pathv); + Geom::CrossingSet cs = Geom::crossings(lineseg, pathv); // Store the results as intersection points unsigned int index = 0; for (Geom::CrossingSet::const_iterator i = cs.begin(); i != cs.end(); i++) { - if (index >= line.size()) { + if (index >= lineseg.size()) { break; } // Reconstruct and store the points of intersection for (Geom::Crossings::const_iterator m = (*i).begin(); m != (*i).end(); m++) { - intersections.push_back(line[index].pointAt((*m).ta)); + intersections.push_back(lineseg[index].pointAt((*m).ta)); } index++; } @@ -262,8 +254,12 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv //sort intersections std::sort(intersections.begin(), intersections.end(), GeomPointSortPredicate); -//TODO: make these not fade out. unsigned int idx; + for (idx=0; idx<measure_tmp_items.size(); idx++){ + desktop->remove_temporary_canvasitem(measure_tmp_items[idx]); + } + measure_tmp_items.clear(); + for (idx=0;idx<intersections.size(); idx++){ // Display the intersection indicator (i.e. the cross) SPCanvasItem * canvasitem = NULL; @@ -278,44 +274,30 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv NULL ); SP_CTRL(canvasitem)->moveto(desktop->doc2dt(intersections[idx])); - desktop->add_temporary_canvasitem(canvasitem, 100); - } + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); + } -//TODO: make these not fade out. Geom::Point previous_point = intersections[0]; for (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 - length = (intersections[idx] - previous_point).length(); char* measure_str = (char*) malloc(sizeof(char)*20); - sprintf(measure_str, "%f", length); - -// sp_canvastext_set_coords (SP_CANVASTEXT(measure_text), desktop->dt2doc(measure_text_pos)); -// sp_canvastext_set_text (SP_CANVASTEXT(measure_text), measure_str); - -// SPCanvasItem * canvasitem = NULL; + sprintf(measure_str, "%.2f", (intersections[idx] - previous_point).length()); SPCanvasItem *canvas_tooltip = sp_canvastext_new(sp_desktop_tempgroup(desktop), desktop, desktop->dt2doc(measure_text_pos), measure_str); - desktop->add_temporary_canvasitem(canvas_tooltip, 100); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + double fontsize = prefs->getInt("/tools/measure/fontsize"); - free(measure_str); + //TODO: get font size option from toolbar + sp_canvastext_set_fontsize (SP_CANVASTEXT(canvas_tooltip), fontsize); + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); + free(measure_str); previous_point = intersections[idx]; } -#if 0 - Geom::Point measure_text_pos = (pa + pb)/2; - - length = (pa - pb).length(); - char* measure_str = (char*) malloc(sizeof(char)*20); - sprintf(measure_str, "%f", length); - - sp_canvastext_set_coords (SP_CANVASTEXT(measure_text), desktop->dt2doc(measure_text_pos)); - sp_canvastext_set_text (SP_CANVASTEXT(measure_text), measure_str); - free(measure_str); -#endif - gobble_motion_events(GDK_BUTTON1_MASK); } break; @@ -327,9 +309,11 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv sp_canvas_item_hide(line); } - if (measure_text){ - sp_canvas_item_hide(measure_text); + unsigned int idx; + for (idx=0; idx<measure_tmp_items.size(); idx++){ + desktop->remove_temporary_canvasitem(measure_tmp_items[idx]); } + measure_tmp_items.clear(); if (mc->grabbed) { sp_canvas_item_ungrab(mc->grabbed, event->button.time); |
