diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2016-02-06 20:43:47 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2016-02-06 20:43:47 +0000 |
| commit | 8117b4c9cdc45fd1c277819e804511c1bbc68226 (patch) | |
| tree | 7db1b2a6f3384ef88a9ac8fde9b3b573442e6907 /src | |
| parent | Remove duplicated variable on meassure (diff) | |
| download | inkscape-8117b4c9cdc45fd1c277819e804511c1bbc68226.tar.gz inkscape-8117b4c9cdc45fd1c277819e804511c1bbc68226.zip | |
Added phantom meassure feature to meassure tool
(bzr r14634)
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/tools/measure-tool.cpp | 106 | ||||
| -rw-r--r-- | src/ui/tools/measure-tool.h | 10 | ||||
| -rw-r--r-- | src/widgets/measure-toolbar.cpp | 18 | ||||
| -rw-r--r-- | src/widgets/toolbox.cpp | 1 |
4 files changed, 104 insertions, 31 deletions
diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp index dae7a244d..bc0ab6d46 100644 --- a/src/ui/tools/measure-tool.cpp +++ b/src/ui/tools/measure-tool.cpp @@ -18,6 +18,7 @@ #include "display/curve.h" #include "display/sodipodi-ctrl.h" #include "display/sp-ctrlline.h" +#include "display/sp-ctrlcurve.h" #include "display/sp-canvas.h" #include "display/sp-canvas-item.h" #include "display/sp-canvas-util.h" @@ -270,7 +271,7 @@ void setMeasureItem(Geom::PathVector pathv, bool is_curve, bool markers, guint32 * @param angle the angle of the arc segment to draw. * @param measure_rpr the container of the curve if converted to items. */ -void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom::Point const &end, Geom::Point const &anchor, double angle, std::vector<Inkscape::Display::TemporaryItem*> &measure_tmp_items, Inkscape::XML::Node *measure_repr = NULL) +void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom::Point const &end, Geom::Point const &anchor, double angle, bool to_phantom, std::vector<Inkscape::Display::TemporaryItem*> &measure_phantom_items , std::vector<Inkscape::Display::TemporaryItem*> &measure_tmp_items , Inkscape::XML::Node *measure_repr = NULL) { // Given that we have a point on the arc's edge and the angle of the arc, we need to get the two endpoints. @@ -306,8 +307,12 @@ void createAngleDisplayCurve(SPDesktop *desktop, Geom::Point const ¢er, Geom Geom::Point p3(xc + bx + (k2 * by), yc + by - (k2 * bx)); SPCtrlCurve *curve = ControlManager::getManager().createControlCurve(desktop->getTempGroup(), p1, p2, p3, p4, CTLINE_SECONDARY); - - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(SP_CANVAS_ITEM(curve), 0, true)); + if(to_phantom){ + curve->rgba = 0x8888887f; + measure_phantom_items.push_back(desktop->add_temporary_canvasitem(SP_CANVAS_ITEM(curve), 0, true)); + } else { + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(SP_CANVAS_ITEM(curve), 0, true)); + } if(measure_repr) { Geom::PathVector pathv; Geom::Path path; @@ -380,6 +385,10 @@ MeasureTool::~MeasureTool() desktop->remove_temporary_canvasitem(measure_tmp_items[idx]); } measure_tmp_items.clear(); + for (size_t idx = 0; idx < measure_phantom_items.size(); ++idx) { + desktop->remove_temporary_canvasitem(measure_phantom_items[idx]); + } + measure_phantom_items.clear(); } Geom::Point MeasureTool::readMeasurePoint(bool is_start) { @@ -730,6 +739,26 @@ void MeasureTool::toGuides() DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE,_("Add guides from measure tool")); } +void MeasureTool::toPhantom() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if(!desktop || !start_p.isFinite() || !end_p.isFinite() || start_p == end_p) { + return; + } + SPDocument *doc = desktop->getDocument(); + for (size_t idx = 0; idx < measure_phantom_items.size(); ++idx) { + desktop->remove_temporary_canvasitem(measure_phantom_items[idx]); + } + measure_phantom_items.clear(); + for (size_t idx = 0; idx < measure_tmp_items.size(); ++idx) { + desktop->remove_temporary_canvasitem(measure_tmp_items[idx]); + } + measure_tmp_items.clear(); + showCanvasItems(false, false, true); + doc->ensureUpToDate(); + DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE,_("Add Stored to measure tool")); +} + void MeasureTool::toItem() { SPDesktop *desktop = SP_ACTIVE_DESKTOP; @@ -741,7 +770,7 @@ void MeasureTool::toItem() guint32 line_color_primary = 0x0000ff7f; Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); Inkscape::XML::Node *rgroup = xml_doc->createElement("svg:g"); - showCanvasItems(false, true, rgroup); + showCanvasItems(false, true, false, rgroup); setLine(start_p,end_p, false, line_color_primary, rgroup); SPItem *measure_item = SP_ITEM(desktop->currentLayer()->appendChildRepr(rgroup)); Inkscape::GC::release(rgroup); @@ -984,7 +1013,7 @@ void MeasureTool::reset() measure_tmp_items.clear(); } -void MeasureTool::setMeasureCanvasText(bool is_angle, double precision, double amount, double fontsize, Glib::ustring unit_name, Geom::Point position, guint32 background, CanvasTextAnchorPositionEnum text_anchor, bool to_item, Inkscape::XML::Node *measure_repr) +void MeasureTool::setMeasureCanvasText(bool is_angle, double precision, double amount, double fontsize, Glib::ustring unit_name, Geom::Point position, guint32 background, CanvasTextAnchorPositionEnum text_anchor, bool to_item, bool to_phantom, Inkscape::XML::Node *measure_repr) { SPDesktop *desktop = SP_ACTIVE_DESKTOP; std::stringstream precision_str; @@ -1005,40 +1034,62 @@ void MeasureTool::setMeasureCanvasText(bool is_angle, double precision, double a canvas_tooltip->outline = false; canvas_tooltip->background = true; canvas_tooltip->anchor_position = text_anchor; - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0)); + if(to_phantom){ + canvas_tooltip->rgba_background = 0x4444447f; + measure_phantom_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0, false)); + } else { + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0, false)); + } if(to_item) { setLabelText(measure_str, position, fontsize, 0, background, measure_repr); } g_free(measure_str); } -void MeasureTool::setMeasureCanvasItem(Geom::Point position, bool to_item, Inkscape::XML::Node *measure_repr){ +void MeasureTool::setMeasureCanvasItem(Geom::Point position, bool to_item, bool to_phantom, Inkscape::XML::Node *measure_repr){ SPDesktop *desktop = SP_ACTIVE_DESKTOP; + guint32 color = 0xff0000ff; + if(to_phantom){ + color = 0x888888ff; + } SPCanvasItem * canvasitem = sp_canvas_item_new(desktop->getTempGroup(), SP_TYPE_CTRL, "anchor", SP_ANCHOR_CENTER, "size", 8.0, "stroked", TRUE, - "stroke_color", 0xff0000ff, + "stroke_color", color, "mode", SP_KNOT_MODE_XOR, "shape", SP_KNOT_SHAPE_CROSS, NULL ); SP_CTRL(canvasitem)->moveto(position); - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); + if(to_phantom){ + measure_phantom_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); + } else { + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvasitem, 0)); + } + if(to_item) { setPoint(position, measure_repr); } } -void MeasureTool::setMeasureCanvasControlLine(Geom::Point start, Geom::Point end, bool to_item, Inkscape::CtrlLineType ctrl_line_type, Inkscape::XML::Node *measure_repr){ +void MeasureTool::setMeasureCanvasControlLine(Geom::Point start, Geom::Point end, bool to_item, bool to_phantom, Inkscape::CtrlLineType ctrl_line_type, Inkscape::XML::Node *measure_repr){ SPDesktop *desktop = SP_ACTIVE_DESKTOP; + gint32 color = ctrl_line_type == CTLINE_PRIMARY ? 0x0000ff7f : 0xff00007f; + if(to_phantom){ + color = ctrl_line_type == CTLINE_PRIMARY ? 0x4444447f : 0x8888887f; + } SPCtrlLine *control_line = ControlManager::getManager().createControlLine(desktop->getTempGroup(), start, end, ctrl_line_type); - measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); - gint32 color = ctrl_line_type == CTLINE_PRIMARY ? 0x0000ff7f : 0xff00007f; + control_line->rgba = color; + if(to_phantom){ + measure_phantom_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); + } else { + measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0)); + } if(to_item) { setLine(start, end, @@ -1048,7 +1099,7 @@ void MeasureTool::setMeasureCanvasControlLine(Geom::Point start, Geom::Point end } } -void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::Node *measure_repr) +void MeasureTool::showCanvasItems(bool to_guides, bool to_item, bool to_phantom, Inkscape::XML::Node *measure_repr) { SPDesktop *desktop = SP_ACTIVE_DESKTOP; if(!desktop || !start_p.isFinite() || !end_p.isFinite() || start_p == end_p) { @@ -1181,37 +1232,38 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N repositionOverlappingLabels(placements, desktop, windowNormal, fontsize, precision); for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) { LabelPlacement &place = *it; - setMeasureCanvasText(false, precision, place.lengthVal * scale, fontsize, unit_name, place.end, 0x0000007f, TEXT_ANCHOR_CENTER, to_item, measure_repr); + + setMeasureCanvasText(false, precision, place.lengthVal * scale, fontsize, unit_name, place.end, 0x0000007f, TEXT_ANCHOR_CENTER, to_item, to_phantom, measure_repr); } Geom::Point angleDisplayPt = calcAngleDisplayAnchor(desktop, angle, baseAngle, start_p, end_p, fontsize); { - setMeasureCanvasText(true, precision, Geom::rad_to_deg(angle), fontsize, unit_name, angleDisplayPt, 0x337f337f, TEXT_ANCHOR_CENTER, to_item, measure_repr); + setMeasureCanvasText(true, precision, Geom::rad_to_deg(angle), fontsize, unit_name, angleDisplayPt, 0x337f337f, TEXT_ANCHOR_CENTER, to_item, to_phantom, measure_repr); } { double totallengthval = (end_p - start_p).length(); totallengthval = Inkscape::Util::Quantity::convert(totallengthval, "px", unit_name); Geom::Point origin = end_p + desktop->w2d(Geom::Point(3*fontsize, -fontsize)); - setMeasureCanvasText(false, precision, totallengthval * scale, fontsize, unit_name, origin, 0x3333337f, TEXT_ANCHOR_LEFT, to_item, measure_repr); + setMeasureCanvasText(false, precision, totallengthval * scale, fontsize, unit_name, origin, 0x3333337f, TEXT_ANCHOR_LEFT, to_item, to_phantom, measure_repr); } if (intersections.size() > 2) { double totallengthval = (intersections[intersections.size()-1] - intersections[0]).length(); totallengthval = Inkscape::Util::Quantity::convert(totallengthval, "px", unit_name); Geom::Point origin = desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * dimension_offset; - setMeasureCanvasText(false, precision, totallengthval * scale, fontsize, unit_name, origin, 0x33337f7f, TEXT_ANCHOR_CENTER, to_item, measure_repr); + setMeasureCanvasText(false, precision, totallengthval * scale, fontsize, unit_name, origin, 0x33337f7f, TEXT_ANCHOR_CENTER, to_item, to_phantom, measure_repr); } // Initial point { - setMeasureCanvasItem(start_p, false, measure_repr); + setMeasureCanvasItem(start_p, false, to_phantom, measure_repr); } // Now that text has been added, we can add lines and controls so that they go underneath for (size_t idx = 0; idx < intersections.size(); ++idx) { - setMeasureCanvasItem(desktop->doc2dt(intersections[idx]), to_item, measure_repr); + setMeasureCanvasItem(desktop->doc2dt(intersections[idx]), to_item, to_phantom, measure_repr); if(to_guides) { gchar *cross_number; if (!prefs->getBool("/tools/measure/ignore_1st_and_last", true)) { @@ -1231,7 +1283,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N // draw main control line { - setMeasureCanvasControlLine(start_p, end_p, false, CTLINE_PRIMARY, measure_repr); + setMeasureCanvasControlLine(start_p, end_p, false, to_phantom, CTLINE_PRIMARY, measure_repr); double length = std::abs((end_p - start_p).length()); Geom::Point anchorEnd = start_p; anchorEnd[Geom::X] += length; @@ -1240,28 +1292,28 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N * Geom::Affine(Geom::Rotate(baseAngle)) * Geom::Affine(Geom::Translate(start_p))); } - setMeasureCanvasControlLine(start_p, anchorEnd, to_item, CTLINE_SECONDARY, measure_repr); - createAngleDisplayCurve(desktop, start_p, end_p, angleDisplayPt, angle, measure_tmp_items, measure_repr); + setMeasureCanvasControlLine(start_p, anchorEnd, to_item, to_phantom, CTLINE_SECONDARY, measure_repr); + createAngleDisplayCurve(desktop, start_p, end_p, angleDisplayPt, angle, to_phantom, measure_phantom_items, measure_tmp_items, measure_repr); } if (intersections.size() > 2) { - setMeasureCanvasControlLine(desktop->doc2dt(intersections[0]) + normal * dimension_offset, desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset, to_item, CTLINE_PRIMARY , measure_repr); + setMeasureCanvasControlLine(desktop->doc2dt(intersections[0]) + normal * dimension_offset, desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset, to_item, to_phantom, CTLINE_PRIMARY , measure_repr); - setMeasureCanvasControlLine(desktop->doc2dt(intersections[0]), desktop->doc2dt(intersections[0]) + normal * dimension_offset, to_item, CTLINE_PRIMARY , measure_repr); + setMeasureCanvasControlLine(desktop->doc2dt(intersections[0]), desktop->doc2dt(intersections[0]) + normal * dimension_offset, to_item, to_phantom, CTLINE_PRIMARY , measure_repr); - setMeasureCanvasControlLine(desktop->doc2dt(intersections[intersections.size() - 1]), desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset, to_item, CTLINE_PRIMARY , measure_repr); + setMeasureCanvasControlLine(desktop->doc2dt(intersections[intersections.size() - 1]), desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset, to_item, to_phantom, CTLINE_PRIMARY , measure_repr); } // call-out lines for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) { LabelPlacement &place = *it; - setMeasureCanvasControlLine(place.start, place.end, to_item, CTLINE_SECONDARY, measure_repr); + setMeasureCanvasControlLine(place.start, place.end, to_item, to_phantom, CTLINE_SECONDARY, measure_repr); } { for (size_t idx = 1; idx < intersections.size(); ++idx) { Geom::Point measure_text_pos = (intersections[idx - 1] + intersections[idx]) / 2; - setMeasureCanvasControlLine(desktop->doc2dt(measure_text_pos), desktop->doc2dt(measure_text_pos) - (normal * dimension_offset / 2), to_item, CTLINE_SECONDARY, measure_repr); + setMeasureCanvasControlLine(desktop->doc2dt(measure_text_pos), desktop->doc2dt(measure_text_pos) - (normal * dimension_offset / 2), to_item, to_phantom, CTLINE_SECONDARY, measure_repr); } } } diff --git a/src/ui/tools/measure-tool.h b/src/ui/tools/measure-tool.h index fbabb304d..b5e9f8a1b 100644 --- a/src/ui/tools/measure-tool.h +++ b/src/ui/tools/measure-tool.h @@ -38,9 +38,10 @@ public: virtual void finish(); virtual bool root_handler(GdkEvent* event); - virtual void showCanvasItems(bool to_guides = false, bool to_item = false, Inkscape::XML::Node *measure_repr = NULL); + virtual void showCanvasItems(bool to_guides = false, bool to_item = false, bool to_phantom = false, Inkscape::XML::Node *measure_repr = NULL); virtual void reverseKnots(); virtual void toGuides(); + virtual void toPhantom(); virtual void toMarkDimension(); virtual void toItem(); virtual void reset(); @@ -52,9 +53,9 @@ public: void setGuide(Geom::Point origin, double angle, const char *label); void setPoint(Geom::Point origin, Inkscape::XML::Node *measure_repr); void setLine(Geom::Point start_point,Geom::Point end_point, bool markers, guint32 color, Inkscape::XML::Node *measure_repr = NULL); - void setMeasureCanvasText(bool is_angle, double precision, double amount, double fontsize, Glib::ustring unit_name, Geom::Point position, guint32 background, CanvasTextAnchorPositionEnum text_anchor, bool to_item, Inkscape::XML::Node *measure_repr); - void setMeasureCanvasItem(Geom::Point position, bool to_item, Inkscape::XML::Node *measure_repr); - void setMeasureCanvasControlLine(Geom::Point start, Geom::Point end, bool to_item, Inkscape::CtrlLineType ctrl_line_type, Inkscape::XML::Node *measure_repr); + void setMeasureCanvasText(bool is_angle, double precision, double amount, double fontsize, Glib::ustring unit_name, Geom::Point position, guint32 background, CanvasTextAnchorPositionEnum text_anchor, bool to_item, bool to_phantom, Inkscape::XML::Node *measure_repr); + void setMeasureCanvasItem(Geom::Point position, bool to_item, bool to_phantom, Inkscape::XML::Node *measure_repr); + void setMeasureCanvasControlLine(Geom::Point start, Geom::Point end, bool to_item, bool to_phantom, Inkscape::CtrlLineType ctrl_line_type, Inkscape::XML::Node *measure_repr); void setLabelText(const char *value, Geom::Point pos, double fontsize, Geom::Coord angle, guint32 background , Inkscape::XML::Node *measure_repr = NULL, CanvasTextAnchorPositionEnum text_anchor = TEXT_ANCHOR_CENTER ); void knotStartMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state); void knotEndMovedHandler(SPKnot */*knot*/, Geom::Point const &ppointer, guint state); @@ -70,6 +71,7 @@ private: Geom::Point start_p; Geom::Point end_p; std::vector<Inkscape::Display::TemporaryItem*> measure_tmp_items; + std::vector<Inkscape::Display::TemporaryItem*> measure_phantom_items; sigc::connection _knot_start_moved_connection; sigc::connection _knot_start_ungrabbed_connection; sigc::connection _knot_end_moved_connection; diff --git a/src/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp index f48dcd4e0..9bab3ad4a 100644 --- a/src/widgets/measure-toolbar.cpp +++ b/src/widgets/measure-toolbar.cpp @@ -242,6 +242,14 @@ sp_to_guides(void){ } static void +sp_to_phantom(void){ + MeasureTool *mt = get_measure_tool(); + if (mt) { + mt->toPhantom(); + } +} + +static void sp_to_item(void){ MeasureTool *mt = get_measure_tool(); if (mt) { @@ -381,6 +389,16 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_reverse_knots), 0 ); gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); } + /* phantom measure */ + { + InkAction* act = ink_action_new( "MeasureToPhantom", + _("Phantom measure"), + _("Phantom measure"), + INKSCAPE_ICON("selection-make-bitmap-copy"), + secondarySize ); + g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_to_phantom), 0 ); + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + } /* to guides */ { InkAction* act = ink_action_new( "MeasureToGuides", diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index edee612e5..88dc7a190 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -375,6 +375,7 @@ static gchar const * ui_descr = " <toolitem action='MeasureOnlyVisible' />" " <toolitem action='MeasureAllLayers' />" " <toolitem action='MeasureReverse' />" + " <toolitem action='MeasureToPhantom' />" " <toolitem action='MeasureToGuides' />" " <toolitem action='MeasureMarkDimension' />" " <toolitem action='MeasureToItem' />" |
