summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-10-18 11:51:14 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-10-18 11:51:14 +0000
commitaed527316ca2cff495c32f57f68e37cd5b346f12 (patch)
tree699a62ea4886ae334dc02eaa53c06a82531e5818
parentAdd precision to measure. Also change other scalar widgets to a .2 precision ... (diff)
downloadinkscape-aed527316ca2cff495c32f57f68e37cd5b346f12.tar.gz
inkscape-aed527316ca2cff495c32f57f68e37cd5b346f12.zip
Added Scale option
(bzr r14393.1.27)
-rw-r--r--src/ui/tools/measure-tool.cpp70
-rw-r--r--src/widgets/measure-toolbar.cpp46
-rw-r--r--src/widgets/toolbox.cpp2
3 files changed, 76 insertions, 42 deletions
diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp
index 57e519a0e..e56d0e916 100644
--- a/src/ui/tools/measure-tool.cpp
+++ b/src/ui/tools/measure-tool.cpp
@@ -106,14 +106,14 @@ bool SortLabelPlacement(LabelPlacement const &first, LabelPlacement const &secon
}
}
-void repositionOverlappingLabels(std::vector<LabelPlacement> &placements, SPDesktop *desktop, Geom::Point const &normal, double fontsize)
+void repositionOverlappingLabels(std::vector<LabelPlacement> &placements, SPDesktop *desktop, Geom::Point const &normal, double fontsize, int precision)
{
std::sort(placements.begin(), placements.end(), SortLabelPlacement);
double border = 3;
Geom::Rect box;
{
- Geom::Point tmp(fontsize * 8 + (border * 2), fontsize + (border * 2));
+ Geom::Point tmp(fontsize * (6 + precision) + (border * 2), fontsize + (border * 2));
tmp = desktop->w2d(tmp);
box = Geom::Rect(-tmp[Geom::X] / 2, -tmp[Geom::Y] / 2, tmp[Geom::X] / 2, tmp[Geom::Y] / 2);
}
@@ -706,12 +706,13 @@ void MeasureTool::toMarkDimension()
setMarkers();
Geom::Ray ray(start_p,end_p);
Geom::Point start = start_p + Geom::Point::polar(ray.angle(), 5);
- start = start + Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0));
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ dimension_offset = prefs->getDouble("/tools/measure/offset");
+ start = start + Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -dimension_offset);
Geom::Point end = end_p + Geom::Point::polar(ray.angle(), -5);
- end = end+ Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -(dimension_offset / 4.0));
+ end = end+ Geom::Point::polar(ray.angle() + Geom::deg_to_rad(90), -dimension_offset);
guint32 color = 0x000000ff;
setLine(start, end, true, &color);
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
Glib::ustring unit_name = prefs->getString("/tools/measure/unit");
if (!unit_name.compare("")) {
unit_name = "px";
@@ -724,7 +725,8 @@ void MeasureTool::toMarkDimension()
Geom::Point middle = Geom::middle_point(start, end);
double totallengthval = (end_p - start_p).length();
totallengthval = Inkscape::Util::Quantity::convert(totallengthval, "px", unit_name);
- gchar *totallength_str = g_strdup_printf(precision_str.str().c_str(), totallengthval, unit_name.c_str());
+ double scale = prefs->getDouble("/tools/measure/scale") / 100.0;
+ gchar *totallength_str = g_strdup_printf(precision_str.str().c_str(), totallengthval * scale, unit_name.c_str());
setLabelText(totallength_str, middle, fontsize, Geom::deg_to_rad(180) - ray.angle());
doc->ensureUpToDate();
DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MEASURE,_("Add global measure line"));
@@ -825,6 +827,8 @@ void MeasureTool::setLine(Geom::Point start_point,Geom::Point end_point, bool ma
SPItem *item = SP_ITEM(desktop->currentLayer()->appendChildRepr(repr));
Inkscape::GC::release(repr);
item->updateRepr();
+ desktop->getSelection()->clear();
+ desktop->getSelection()->add(item);
}
}
}
@@ -903,13 +907,15 @@ void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsi
SPCSSAttr *css = sp_repr_css_attr_new();
std::stringstream font_size;
font_size.imbue(std::locale::classic());
- font_size << fontsize ;
+ font_size << fontsize << "px";
sp_repr_css_set_property (css, "font-size", font_size.str().c_str());
sp_repr_css_set_property (css, "font-style", "normal");
sp_repr_css_set_property (css, "font-weight", "normal");
sp_repr_css_set_property (css, "line-height", "125%");
sp_repr_css_set_property (css, "letter-spacing", "0px");
sp_repr_css_set_property (css, "word-spacing", "0px");
+ sp_repr_css_set_property (css, "text-align", "center");
+ sp_repr_css_set_property (css, "text-anchor", "middle");
if(measure_repr) {
sp_repr_css_set_property (css, "fill", "#FFFFFF");
} else {
@@ -953,10 +959,10 @@ void MeasureTool::setLabelText(const char *value, Geom::Point pos, double fontsi
sp_repr_css_attr_unref (css);
sp_repr_set_svg_double(rgroup, "x", 0);
sp_repr_set_svg_double(rgroup, "y", 0);
- sp_repr_set_svg_double(rrect, "x", 0);
+ sp_repr_set_svg_double(rrect, "x", -bbox->width()/2.0);
sp_repr_set_svg_double(rrect, "y", -bbox->height());
- sp_repr_set_svg_double(rrect, "width", (bbox->width()) + 6);
- sp_repr_set_svg_double(rrect, "height", (bbox->height()) + 6);
+ sp_repr_set_svg_double(rrect, "width", bbox->width() + 6);
+ sp_repr_set_svg_double(rrect, "height", bbox->height() + 6);
Inkscape::XML::Node *rtextitem = text_item->getRepr();
text_item->deleteObject();
rgroup->addChild(rtextitem, NULL);
@@ -1012,7 +1018,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool show_in_between = prefs->getBool("/tools/measure/show_in_between");
bool all_layers = prefs->getBool("/tools/measure/all_layers");
- dimension_offset = prefs->getDouble("/tools/measure/offset");
+ dimension_offset = 70;
Geom::PathVector lineseg;
Geom::Path p;
p.start(desktop->dt2doc(start_p));
@@ -1102,8 +1108,8 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
if (!unit_name.compare("")) {
unit_name = "px";
}
-
- double fontsize = prefs->getInt("/tools/measure/fontsize") * (96/72);
+ double scale = prefs->getDouble("/tools/measure/scale") / 100.0;
+ double fontsize = prefs->getDouble("/tools/measure/fontsize") * (96/72);
// Normal will be used for lines and text
Geom::Point windowNormal = Geom::unit_vector(Geom::rot90(desktop->d2w(end_p - start_p)));
Geom::Point normal = desktop->w2d(windowNormal);
@@ -1128,24 +1134,24 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
LabelPlacement placement;
placement.lengthVal = (intersections[idx] - intersections[idx - 1]).length();
placement.lengthVal = Inkscape::Util::Quantity::convert(placement.lengthVal, "px", unit_name);
- placement.offset = dimension_offset;
+ placement.offset = dimension_offset / 2;
placement.start = desktop->doc2dt( (intersections[idx - 1] + intersections[idx]) / 2 );
placement.end = placement.start - (normal * placement.offset);
placements.push_back(placement);
}
-
+ int precision = prefs->getInt("/tools/measure/precision");
// Adjust positions
- repositionOverlappingLabels(placements, desktop, windowNormal, fontsize);
+ repositionOverlappingLabels(placements, desktop, windowNormal, fontsize, precision);
for (std::vector<LabelPlacement>::iterator it = placements.begin(); it != placements.end(); ++it) {
LabelPlacement &place = *it;
// TODO cleanup memory, Glib::ustring, etc.:
- int precision = prefs->getInt("/tools/measure/precision");
+
std::stringstream precision_str;
precision_str.imbue(std::locale::classic());
precision_str << "%." << precision << "f %s";
- gchar *measure_str = g_strdup_printf(precision_str.str().c_str(), place.lengthVal, unit_name.c_str());
+ gchar *measure_str = g_strdup_printf(precision_str.str().c_str(), place.lengthVal * scale, unit_name.c_str());
SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(),
desktop,
place.end,
@@ -1203,7 +1209,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
std::stringstream precision_str;
precision_str.imbue(std::locale::classic());
precision_str << "%." << precision << "f %s";
- gchar *totallength_str = g_strdup_printf(precision_str.str().c_str(), totallengthval, unit_name.c_str());
+ gchar *totallength_str = g_strdup_printf(precision_str.str().c_str(), totallengthval * scale, unit_name.c_str());
SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(),
desktop,
end_p + desktop->w2d(Geom::Point(3*fontsize, -fontsize)),
@@ -1231,10 +1237,10 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
std::stringstream precision_str;
precision_str.imbue(std::locale::classic());
precision_str << "%." << precision << "f %s";
- gchar *total_str = g_strdup_printf(precision_str.str().c_str(), totallengthval, unit_name.c_str());
+ gchar *total_str = g_strdup_printf(precision_str.str().c_str(), totallengthval * scale, unit_name.c_str());
SPCanvasText *canvas_tooltip = sp_canvastext_new(desktop->getTempGroup(),
desktop,
- desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * (dimension_offset * 2),
+ desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * dimension_offset,
total_str);
sp_canvastext_set_fontsize(canvas_tooltip, fontsize);
canvas_tooltip->rgba = 0xffffffff;
@@ -1245,7 +1251,7 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(canvas_tooltip, 0));
if(to_item) {
guint32 background = canvas_tooltip->rgba_background;
- setLabelText(total_str, desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * (dimension_offset * 2), fontsize, 0, &background, measure_repr);
+ setLabelText(total_str, desktop->doc2dt((intersections[0] + intersections[intersections.size()-1])/2) + normal * dimension_offset, fontsize, 0, &background, measure_repr);
}
g_free(total_str);
}
@@ -1341,34 +1347,34 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
ControlManager &mgr = ControlManager::getManager();
SPCtrlLine *control_line = 0;
control_line = mgr.createControlLine(desktop->getTempGroup(),
- desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2),
- desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2));
+ desktop->doc2dt(intersections[0]) + normal * dimension_offset,
+ desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset);
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0));
if(to_item) {
- setLine(desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2),
- desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2),
+ setLine(desktop->doc2dt(intersections[0]) + normal * dimension_offset,
+ desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset,
false,
&line_color_primary,
measure_repr);
}
control_line = mgr.createControlLine(desktop->getTempGroup(),
desktop->doc2dt(intersections[0]),
- desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2));
+ desktop->doc2dt(intersections[0]) + normal * dimension_offset);
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0));
if(to_item) {
setLine(desktop->doc2dt(intersections[0]),
- desktop->doc2dt(intersections[0]) + normal * (dimension_offset * 2),
+ desktop->doc2dt(intersections[0]) + normal * dimension_offset,
false,
&line_color_primary,
measure_repr);
}
control_line = mgr.createControlLine(desktop->getTempGroup(),
desktop->doc2dt(intersections[intersections.size() - 1]),
- desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2));
+ desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset);
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0));
if(to_item) {
setLine(desktop->doc2dt(intersections[intersections.size() - 1]),
- desktop->doc2dt(intersections[intersections.size() - 1]) + normal * (dimension_offset * 2),
+ desktop->doc2dt(intersections[intersections.size() - 1]) + normal * dimension_offset,
false,
&line_color_primary,
measure_repr);
@@ -1397,12 +1403,12 @@ void MeasureTool::showCanvasItems(bool to_guides, bool to_item, Inkscape::XML::N
ControlManager &mgr = ControlManager::getManager();
SPCtrlLine *control_line = mgr.createControlLine(desktop->getTempGroup(),
desktop->doc2dt(measure_text_pos),
- desktop->doc2dt(measure_text_pos) - (normal * dimension_offset),
+ desktop->doc2dt(measure_text_pos) - (normal * dimension_offset / 2),
CTLINE_SECONDARY);
measure_tmp_items.push_back(desktop->add_temporary_canvasitem(control_line, 0));
if(to_item) {
setLine(desktop->doc2dt(measure_text_pos),
- desktop->doc2dt(measure_text_pos) - (normal * dimension_offset),
+ desktop->doc2dt(measure_text_pos) - (normal * dimension_offset / 2),
false,
&line_color_secondary,
measure_repr);
diff --git a/src/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp
index 8256abc76..8d7146a46 100644
--- a/src/widgets/measure-toolbar.cpp
+++ b/src/widgets/measure-toolbar.cpp
@@ -102,6 +102,20 @@ sp_measure_offset_value_changed(GtkAdjustment *adj, GObject *tbl)
}
}
+static void sp_measure_scale_value_changed(GtkAdjustment *adj, GObject *tbl)
+{
+ SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data( tbl, "desktop" ));
+
+ if (DocumentUndo::getUndoSensitive(desktop->getDocument())) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setInt(Glib::ustring("/tools/measure/scale"),
+ gtk_adjustment_get_value(adj));
+ MeasureTool *mt = get_measure_tool();
+ if (mt) {
+ mt->showCanvasItems();
+ }
+ }
+}
static void
sp_measure_precision_value_changed(GtkAdjustment *adj, GObject *tbl)
@@ -233,7 +247,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
gtk_action_group_add_action( mainActions, GTK_ACTION(eact));
}
- // units label
+ /* units label */
{
EgeOutputAction* act = ege_output_action_new( "measure_units_label", _("Units:"), _("The units to be used for the measurements"), 0 );
ege_output_action_set_use_markup( act, TRUE );
@@ -241,7 +255,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
}
- // units menu
+ /* units menu */
{
GtkAction* act = tracker->createAction( "MeasureUnitsAction", _("Units:"), _("The units to be used for the measurements") );
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(measure_unit_changed), holder );
@@ -261,13 +275,25 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
gtk_action_group_add_action( mainActions, GTK_ACTION(eact));
}
+ /* Scale */
+ {
+ eact = create_adjustment_action( "MeasureScaleAction",
+ _("Scale %"), _("Scale %:"),
+ _("Scale the results"),
+ "/tools/measure/scale", 100.0,
+ GTK_WIDGET(desktop->canvas), holder, FALSE, NULL,
+ 0.0, 90000.0, 1.0, 4.0,
+ 0, 0, 0,
+ sp_measure_scale_value_changed, NULL, 0 , 3);
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
+ }
/* Offset */
{
eact = create_adjustment_action( "MeasureOffsetAction",
_("Offset"), _("Offset:"),
_("The offset size"),
- "/tools/measure/offset", 30.0,
+ "/tools/measure/offset", 5.0,
GTK_WIDGET(desktop->canvas), holder, FALSE, NULL,
0.0, 90000.0, 1.0, 4.0,
0, 0, 0,
@@ -275,7 +301,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
}
- // ignore_1st_and_last
+ /* ignore_1st_and_last */
{
InkToggleAction* act = ink_toggle_action_new( "MeasureIgnore1stAndLast",
_("Ignore first and last"),
@@ -286,7 +312,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_ignore_1st_and_last), desktop) ;
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
- // measure imbetweens
+ /* measure imbetweens */
{
InkToggleAction* act = ink_toggle_action_new( "MeasureInBettween",
_("Show measures between items"),
@@ -297,7 +323,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_in_between), desktop) ;
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
- // measure only current layer
+ /* measure only current layer */
{
InkToggleAction* act = ink_toggle_action_new( "MeasureAllLayers",
_("Measure all layers"),
@@ -308,7 +334,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_all_layers), desktop) ;
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
- //toogle start end
+ /* toogle start end */
{
InkAction* act = ink_action_new( "MeasureReverse",
_("Reverse measure"),
@@ -318,7 +344,7 @@ 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) );
}
- //to guides
+ /* to guides */
{
InkAction* act = ink_action_new( "MeasureToGuides",
_("To guides"),
@@ -328,7 +354,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_to_guides), 0 );
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
- //to mark dimensions
+ /* to mark dimensions */
{
InkAction* act = ink_action_new( "MeasureMarkDimension",
_("Mark Dimension"),
@@ -338,7 +364,7 @@ void sp_measure_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, G
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_to_mark_dimension), 0 );
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
}
- //to item
+ /* to item */
{
InkAction* act = ink_action_new( "MeasureToItem",
_("Convert to item"),
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index e7dd69a28..5d41d3b10 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -341,6 +341,8 @@ static gchar const * ui_descr =
" <separator />"
" <toolitem action='MeasurePrecisionAction' />"
" <separator />"
+ " <toolitem action='MeasureScaleAction' />"
+ " <separator />"
" <toolitem action='MeasureOffsetAction' />"
" <separator />"
" <toolitem action='measure_units_label' />"