From 31099efbe04b0b71835f11a077ddd6fce7010d9d Mon Sep 17 00:00:00 2001 From: Felipe Corr??a da Silva Sanches Date: Thu, 9 Jun 2011 22:09:54 -0300 Subject: improving measurement tool (bzr r10265) --- src/measure-context.cpp | 57 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 15 deletions(-) (limited to 'src/measure-context.cpp') diff --git a/src/measure-context.cpp b/src/measure-context.cpp index f89878f7e..2aeb39d5d 100644 --- a/src/measure-context.cpp +++ b/src/measure-context.cpp @@ -124,6 +124,11 @@ static gint sp_measure_context_item_handler(SPEventContext *event_context, SPIte return ret; } +bool GeomPointSortPredicate(const Geom::Point& p1, const Geom::Point& p2) +{ + return p1[Geom::Y] < p2[Geom::Y]; +} + static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEvent *event) { SPDesktop *desktop = event_context->desktop; @@ -199,20 +204,21 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv line.push_back(p); std::vector points; - int i; - for (i=0; i<30; i++){ - points.push_back(start_point + i*(motion_dt-start_point)/30); + double i; +#define NPOINTS 3000 + for (i=0; id2w(start_point + (i/NPOINTS)*(motion_dt-start_point))); } - SPDocument *doc = sp_desktop_document(desktop); - GSList *items = sp_desktop_document(desktop)->getItemsInBox(desktop->dkey, Geom::Rect(start_point, motion_dt)); double length; -//TODO: select elements crossed by line segment: -// GSList *items = sp_desktop_document(desktop)->getItemsAtPoints(desktop->dkey, points); +//select elements crossed by line segment: + GSList *items = sp_desktop_document(desktop)->getItemsAtPoints(desktop->dkey, points); SPItem* item; GSList *l; int counter=0; std::vector intersections; + intersections.push_back(desktop->dt2doc(start_point)); + for (l = items; l != NULL; l = l->next){ item = (SPItem*) (l->data); #if 0 @@ -251,15 +257,12 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv } //g_free(repr); } - - Geom::Point pa = start_point; - Geom::Point pb = motion_dt; + intersections.push_back(desktop->dt2doc(motion_dt)); - if (intersections.size() >= 2){ - pa = desktop->doc2dt(intersections[0]); - pb = desktop->doc2dt(intersections[1]); - } + //sort intersections + std::sort(intersections.begin(), intersections.end(), GeomPointSortPredicate); +//TODO: make these not fade out. unsigned int idx; for (idx=0;idxdt2doc(measure_text_pos)); +// sp_canvastext_set_text (SP_CANVASTEXT(measure_text), measure_str); + +// SPCanvasItem * canvasitem = NULL; + 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); + + free(measure_str); + + previous_point = intersections[idx]; + } + +#if 0 Geom::Point measure_text_pos = (pa + pb)/2; length = (pa - pb).length(); @@ -288,6 +314,7 @@ static gint sp_measure_context_root_handler(SPEventContext *event_context, GdkEv 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); } -- cgit v1.2.3