summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2014-11-24 21:38:54 +0000
committerJabiertxof <jtx@jtx.marker.es>2014-11-24 21:38:54 +0000
commit5497de6e39d4fc31a6824eb9f9e638635de4521b (patch)
treed1e5d867d3b9f618846bdfe65e147b23df8ed58a /src
parentFixing bend from clipboard to trunk 0.92 (diff)
parentFix a bug in pen/cil modes triangle in/out (diff)
downloadinkscape-5497de6e39d4fc31a6824eb9f9e638635de4521b.tar.gz
inkscape-5497de6e39d4fc31a6824eb9f9e638635de4521b.zip
update to trunk
(bzr r12588.1.37)
Diffstat (limited to 'src')
-rw-r--r--src/document.cpp8
-rw-r--r--src/document.h1
-rw-r--r--src/extension/internal/emf-print.cpp2
-rw-r--r--src/extension/internal/grid.cpp2
-rw-r--r--src/live_effects/lpe-roughen.cpp10
-rw-r--r--src/seltrans.cpp8
-rw-r--r--src/sp-guide.cpp4
-rw-r--r--src/sp-namedview.cpp37
-rw-r--r--src/sp-namedview.h4
-rw-r--r--src/sp-text.cpp2
-rw-r--r--src/ui/dialog/clonetiler.cpp4
-rw-r--r--src/ui/dialog/document-properties.cpp4
-rw-r--r--src/ui/dialog/export.cpp2
-rw-r--r--src/ui/dialog/guides.cpp4
-rw-r--r--src/ui/dialog/transformation.cpp4
-rw-r--r--src/ui/tool/node.cpp10
-rw-r--r--src/ui/tools/arc-tool.cpp4
-rw-r--r--src/ui/tools/pen-tool.cpp2
-rw-r--r--src/ui/tools/rect-tool.cpp4
-rw-r--r--src/ui/tools/spiral-tool.cpp2
-rw-r--r--src/ui/tools/star-tool.cpp2
-rw-r--r--src/ui/tools/text-tool.cpp4
-rw-r--r--src/ui/widget/page-sizer.cpp4
-rw-r--r--src/ui/widget/selected-style.cpp2
-rw-r--r--src/util/units.cpp24
-rw-r--r--src/util/units.h3
-rw-r--r--src/verbs.cpp2
-rw-r--r--src/widgets/desktop-widget.cpp10
-rw-r--r--src/widgets/lpe-toolbar.cpp2
-rw-r--r--src/widgets/node-toolbar.cpp2
-rw-r--r--src/widgets/rect-toolbar.cpp14
-rw-r--r--src/widgets/select-toolbar.cpp2
-rw-r--r--src/widgets/stroke-style.cpp6
33 files changed, 120 insertions, 75 deletions
diff --git a/src/document.cpp b/src/document.cpp
index f5269eab3..3715d8e6e 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -599,6 +599,14 @@ Inkscape::Util::Unit const* SPDocument::getDefaultUnit() const
return nv ? nv->getDefaultUnit() : unit_table.getUnit("pt");
}
+/// guaranteed not to return nullptr
+// returns 'px' units as default, like legacy Inkscape
+Inkscape::Util::Unit const& SPDocument::getSVGUnit() const
+{
+ SPNamedView const* nv = sp_document_namedview(this, NULL);
+ return nv ? nv->getSVGUnit() : *unit_table.getUnit("px");
+}
+
Inkscape::Util::Quantity SPDocument::getWidth() const
{
g_return_val_if_fail(this->priv != NULL, Inkscape::Util::Quantity(0.0, unit_table.getUnit("")));
diff --git a/src/document.h b/src/document.h
index 4ace249ae..065c5f323 100644
--- a/src/document.h
+++ b/src/document.h
@@ -242,6 +242,7 @@ public:
SPDocument *doRef();
SPDocument *doUnref();
Inkscape::Util::Unit const* getDefaultUnit() const;
+ Inkscape::Util::Unit const& getSVGUnit() const;
Inkscape::Util::Quantity getWidth() const;
Inkscape::Util::Quantity getHeight() const;
Geom::Point getDimensions() const;
diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp
index 0f43fbca1..f7b6626c4 100644
--- a/src/extension/internal/emf-print.cpp
+++ b/src/extension/internal/emf-print.cpp
@@ -144,7 +144,7 @@ unsigned int PrintEmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc)
// width and height in px
_width = doc->getWidth().value("px");
_height = doc->getHeight().value("px");
- _doc_unit_scale = Inkscape::Util::Quantity::convert(1, (doc->getDefaultUnit()), "px");
+ _doc_unit_scale = Inkscape::Util::Quantity::convert(1, &doc->getSVGUnit(), "px");
// initialize a few global variables
hbrush = hbrushOld = hpen = 0;
diff --git a/src/extension/internal/grid.cpp b/src/extension/internal/grid.cpp
index 0059bbec2..f4e0e5843 100644
--- a/src/extension/internal/grid.cpp
+++ b/src/extension/internal/grid.cpp
@@ -113,7 +113,7 @@ Grid::effect (Inkscape::Extension::Effect *module, Inkscape::UI::View::View *doc
bounding_area = temprec;
}
- gdouble scale = Inkscape::Util::Quantity::convert(1, "px", (document->doc())->getDefaultUnit());
+ gdouble scale = Inkscape::Util::Quantity::convert(1, "px", &document->doc()->getSVGUnit());
bounding_area *= Geom::Scale(scale);
Geom::Point spacings( scale * module->get_param_float("xspacing"),
scale * module->get_param_float("yspacing") );
diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp
index 07d9e63e8..8cef9a3a3 100644
--- a/src/live_effects/lpe-roughen.cpp
+++ b/src/live_effects/lpe-roughen.cpp
@@ -160,11 +160,11 @@ double LPERoughen::sign(double randNumber)
Geom::Point LPERoughen::randomize()
{
- Inkscape::Util::Unit const *doc_units = SP_ACTIVE_DESKTOP->namedview->doc_units;
+ Inkscape::Util::Unit const *svg_units = SP_ACTIVE_DESKTOP->namedview->svg_units;
double displaceXParsed = Inkscape::Util::Quantity::convert(
- displaceX * globalRandomize, unit.get_abbreviation(), doc_units->abbr);
+ displaceX * globalRandomize, unit.get_abbreviation(), svg_units->abbr);
double displaceYParsed = Inkscape::Util::Quantity::convert(
- displaceY * globalRandomize, unit.get_abbreviation(), doc_units->abbr);
+ displaceY * globalRandomize, unit.get_abbreviation(), svg_units->abbr);
Geom::Point output = Geom::Point(sign(displaceXParsed), sign(displaceYParsed));
return output;
@@ -175,7 +175,7 @@ void LPERoughen::doEffect(SPCurve *curve)
Geom::PathVector const original_pathv =
pathv_to_linear_and_cubic_beziers(curve->get_pathvector());
curve->reset();
- Inkscape::Util::Unit const *doc_units = SP_ACTIVE_DESKTOP->namedview->doc_units;
+ Inkscape::Util::Unit const *svg_units = SP_ACTIVE_DESKTOP->namedview->svg_units;
for (Geom::PathVector::const_iterator path_it = original_pathv.begin();
path_it != original_pathv.end(); ++path_it) {
if (path_it->empty())
@@ -221,7 +221,7 @@ void LPERoughen::doEffect(SPCurve *curve)
nCurve->lineto(A3);
}
double length = Inkscape::Util::Quantity::convert(
- curve_it1->length(0.001), doc_units->abbr, unit.get_abbreviation());
+ curve_it1->length(0.001), svg_units->abbr, unit.get_abbreviation());
std::size_t splits = 0;
if (method == DM_SEGMENTS) {
splits = segments;
diff --git a/src/seltrans.cpp b/src/seltrans.cpp
index 96c7fb49b..a9ae9e465 100644
--- a/src/seltrans.cpp
+++ b/src/seltrans.cpp
@@ -1306,8 +1306,8 @@ gboolean Inkscape::SelTrans::centerRequest(Geom::Point &pt, guint state)
// status text
Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(pt[Geom::X], "px");
Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(pt[Geom::Y], "px");
- GString *xs = g_string_new(x_q.string(_desktop->namedview->doc_units).c_str());
- GString *ys = g_string_new(y_q.string(_desktop->namedview->doc_units).c_str());
+ GString *xs = g_string_new(x_q.string(_desktop->namedview->display_units).c_str());
+ GString *ys = g_string_new(y_q.string(_desktop->namedview->display_units).c_str());
_message_context.setF(Inkscape::NORMAL_MESSAGE, _("Move <b>center</b> to %s, %s"), xs->str, ys->str);
g_string_free(xs, FALSE);
g_string_free(ys, FALSE);
@@ -1460,8 +1460,8 @@ void Inkscape::SelTrans::moveTo(Geom::Point const &xy, guint state)
// status text
Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(dxy[Geom::X], "px");
Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(dxy[Geom::Y], "px");
- GString *xs = g_string_new(x_q.string(_desktop->namedview->doc_units).c_str());
- GString *ys = g_string_new(y_q.string(_desktop->namedview->doc_units).c_str());
+ GString *xs = g_string_new(x_q.string(_desktop->namedview->display_units).c_str());
+ GString *ys = g_string_new(y_q.string(_desktop->namedview->display_units).c_str());
_message_context.setF(Inkscape::NORMAL_MESSAGE, _("<b>Move</b> by %s, %s; with <b>Ctrl</b> to restrict to horizontal/vertical; with <b>Shift</b> to disable snapping"), xs->str, ys->str);
g_string_free(xs, TRUE);
g_string_free(ys, TRUE);
diff --git a/src/sp-guide.cpp b/src/sp-guide.cpp
index 581c8a440..74a0d829c 100644
--- a/src/sp-guide.cpp
+++ b/src/sp-guide.cpp
@@ -410,8 +410,8 @@ char* SPGuide::description(bool const verbose) const
Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(this->point_on_line[X], "px");
Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(this->point_on_line[Y], "px");
- GString *position_string_x = g_string_new(x_q.string(namedview->doc_units).c_str());
- GString *position_string_y = g_string_new(y_q.string(namedview->doc_units).c_str());
+ GString *position_string_x = g_string_new(x_q.string(namedview->display_units).c_str());
+ GString *position_string_y = g_string_new(y_q.string(namedview->display_units).c_str());
gchar *shortcuts = g_strdup_printf("; %s", _("<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to delete"));
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index b68421dc6..09d383e3c 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -76,7 +76,9 @@ SPNamedView::SPNamedView() : SPObjectGroup(), snap_manager(this) {
this->window_x = 0;
this->cy = 0;
this->window_y = 0;
- this->doc_units = NULL;
+ this->svg_units = unit_table.getUnit("px"); // legacy behavior: if no viewbox present, default to 'px' units
+ this->display_units = NULL;
+ this->page_size_units = NULL;
this->pagecolor = 0;
this->cx = 0;
this->pageshadow = 0;
@@ -262,6 +264,14 @@ void SPNamedView::build(SPDocument *document, Inkscape::XML::Node *repr) {
// backwards compatibility with grid settings (pre 0.46)
sp_namedview_generate_old_grid(this, document, repr);
+
+ // If viewbox defined: try to calculate the SVG unit from document width and viewbox
+ if (document->getRoot()->viewBox_set) {
+ Inkscape::Util::Quantity svgwidth = document->getWidth();
+ Geom::Rect viewbox = document->getRoot()->viewBox;
+ double factor = svgwidth.value(unit_table.primary(Inkscape::Util::UNIT_TYPE_LINEAR)) / viewbox.width();
+ svg_units = unit_table.findUnit(factor, Inkscape::Util::UNIT_TYPE_LINEAR);
+ }
}
void SPNamedView::release() {
@@ -540,22 +550,13 @@ void SPNamedView::set(unsigned int key, const gchar* value) {
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_INKSCAPE_DOCUMENT_UNITS: {
- /* The default unit if the document doesn't override this: e.g. for files saved as
+ /* The default display unit if the document doesn't override this: e.g. for files saved as
* `plain SVG', or non-inkscape files, or files created by an inkscape 0.40 &
* earlier.
*
- * Here we choose `px': useful for screen-destined SVGs, and fewer bug reports
- * about "not the same numbers as what's in the SVG file" (at least for documents
- * without a viewBox attribute on the root <svg> element). Similarly, it's also
- * the most reliable unit (i.e. least likely to be wrong in different viewing
- * conditions) for viewBox-less SVG files given that it's the unit that inkscape
- * uses for all coordinates.
+ * Note that these units are not the same as the units used for the values in SVG!
*
- * For documents that do have a viewBox attribute on the root <svg> element, it
- * might be better if we used either viewBox coordinates or if we used the unit of
- * say the width attribute of the root <svg> element. However, these pose problems
- * in that they aren't in general absolute units as currently required by
- * doc_units.
+ * We default to `px'.
*/
static Inkscape::Util::Unit const *px = unit_table.getUnit("px");
Inkscape::Util::Unit const *new_unit = px;
@@ -576,7 +577,7 @@ void SPNamedView::set(unsigned int key, const gchar* value) {
/* fixme: Don't use g_log (see above). */
}
}
- this->doc_units = new_unit;
+ this->display_units = new_unit;
this->requestModified(SP_OBJECT_MODIFIED_FLAG);
break;
}
@@ -1133,7 +1134,13 @@ double SPNamedView::getMarginLength(gchar const * const key,
*/
Inkscape::Util::Unit const * SPNamedView::getDefaultUnit() const
{
- return doc_units ? doc_units : unit_table.getUnit("pt");
+ return display_units ? display_units : unit_table.getUnit("pt");
+}
+
+Inkscape::Util::Unit const & SPNamedView::getSVGUnit() const
+{
+ assert(svg_units);
+ return *svg_units;
}
/**
diff --git a/src/sp-namedview.h b/src/sp-namedview.h
index 4746b2962..64bf14a8b 100644
--- a/src/sp-namedview.h
+++ b/src/sp-namedview.h
@@ -61,7 +61,8 @@ public:
GSList * grids;
bool grids_visible;
- Inkscape::Util::Unit const *doc_units;
+ Inkscape::Util::Unit const *svg_units; // Units used for the values in SVG
+ Inkscape::Util::Unit const *display_units; // Units used for the UI (*not* the same as units of SVG coordinates)
Inkscape::Util::Unit const *page_size_units; // Only used in "Custom size" part of Document Properties dialog
GQuark default_layer_id;
@@ -86,6 +87,7 @@ public:
unsigned int getViewCount();
GSList const *getViewList() const;
Inkscape::Util::Unit const * getDefaultUnit() const;
+ Inkscape::Util::Unit const & getSVGUnit() const;
void translateGuides(Geom::Translate const &translation);
void translateGrids(Geom::Translate const &translation);
diff --git a/src/sp-text.cpp b/src/sp-text.cpp
index 93d81e47b..8922d3c73 100644
--- a/src/sp-text.cpp
+++ b/src/sp-text.cpp
@@ -362,7 +362,7 @@ gchar* SPText::description() const {
char *n = xml_quote_strdup( style->font_family.value );
Inkscape::Util::Quantity q = Inkscape::Util::Quantity(style->font_size.computed, "px");
- GString *xs = g_string_new(q.string(sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units).c_str());
+ GString *xs = g_string_new(q.string(sp_desktop_namedview(SP_ACTIVE_DESKTOP)->display_units).c_str());
char const *trunc = "";
Inkscape::Text::Layout const *layout = te_get_layout((SPItem *) this);
diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
index d1a675735..7a776a9b8 100644
--- a/src/ui/dialog/clonetiler.cpp
+++ b/src/ui/dialog/clonetiler.cpp
@@ -1096,7 +1096,7 @@ CloneTiler::CloneTiler (void) :
// unitmenu
unit_menu = new Inkscape::UI::Widget::UnitMenu();
unit_menu->setUnitType(Inkscape::Util::UNIT_TYPE_LINEAR);
- unit_menu->setUnit(sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units->abbr);
+ unit_menu->setUnit(sp_desktop_namedview(SP_ACTIVE_DESKTOP)->display_units->abbr);
unitChangedConn = unit_menu->signal_changed().connect(sigc::mem_fun(*this, &CloneTiler::clonetiler_unit_changed));
{
@@ -2251,7 +2251,7 @@ void CloneTiler::clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg)
clonetiler_remove (NULL, dlg, false);
- double scale_units = Inkscape::Util::Quantity::convert(1, "px", sp_desktop_document(desktop)->getDefaultUnit());
+ double scale_units = Inkscape::Util::Quantity::convert(1, "px", &sp_desktop_document(desktop)->getSVGUnit());
double shiftx_per_i = 0.01 * prefs->getDoubleLimited(prefs_path + "shiftx_per_i", 0, -10000, 10000);
double shifty_per_i = 0.01 * prefs->getDoubleLimited(prefs_path + "shifty_per_i", 0, -10000, 10000);
diff --git a/src/ui/dialog/document-properties.cpp b/src/ui/dialog/document-properties.cpp
index 9ab607ed2..f7701655c 100644
--- a/src/ui/dialog/document-properties.cpp
+++ b/src/ui/dialog/document-properties.cpp
@@ -1480,8 +1480,8 @@ void DocumentProperties::update()
_rcb_antialias.set_xml_target(root->getRepr(), dt->getDocument());
_rcb_antialias.setActive(root->style->shape_rendering.computed != SP_CSS_SHAPE_RENDERING_CRISPEDGES);
- if (nv->doc_units) {
- _rum_deflt.setUnit (nv->doc_units->abbr);
+ if (nv->display_units) {
+ _rum_deflt.setUnit (nv->display_units->abbr);
}
double doc_w = sp_desktop_document(dt)->getRoot()->width.value;
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index b044a6e2c..37022a186 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -206,7 +206,7 @@ Export::Export (void) :
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop) {
- unit_selector.setUnit(sp_desktop_namedview(desktop)->doc_units->abbr);
+ unit_selector.setUnit(sp_desktop_namedview(desktop)->display_units->abbr);
}
unitChangedConn = unit_selector.signal_changed().connect(sigc::mem_fun(*this, &Export::onUnitChanged));
unitbox.pack_end(unit_selector, false, false, 0);
diff --git a/src/ui/dialog/guides.cpp b/src/ui/dialog/guides.cpp
index 4519a905f..221f9a1c0 100644
--- a/src/ui/dialog/guides.cpp
+++ b/src/ui/dialog/guides.cpp
@@ -216,8 +216,8 @@ void GuidelinePropertiesDialog::_setup() {
/* fixme: We should allow percents here too, as percents of the canvas size */
_unit_menu.setUnitType(UNIT_TYPE_LINEAR);
_unit_menu.setUnit("px");
- if (_desktop->namedview->doc_units) {
- _unit_menu.setUnit( _desktop->namedview->doc_units->abbr );
+ if (_desktop->namedview->display_units) {
+ _unit_menu.setUnit( _desktop->namedview->display_units->abbr );
}
_spin_angle.setUnit(_angle_unit_status);
diff --git a/src/ui/dialog/transformation.cpp b/src/ui/dialog/transformation.cpp
index 3e135b9b2..6dbcf4a05 100644
--- a/src/ui/dialog/transformation.cpp
+++ b/src/ui/dialog/transformation.cpp
@@ -208,8 +208,8 @@ void Transformation::layoutPageMove()
// Setting default unit to document unit
SPDesktop *dt = getDesktop();
SPNamedView *nv = sp_desktop_namedview(dt);
- if (nv->doc_units) {
- _units_move.setUnit(nv->doc_units->abbr);
+ if (nv->display_units) {
+ _units_move.setUnit(nv->display_units->abbr);
}
_scalar_move_horizontal.initScalar(-1e6, 1e6);
diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp
index 8a1ca0b90..8c22f7c6e 100644
--- a/src/ui/tool/node.cpp
+++ b/src/ui/tool/node.cpp
@@ -566,9 +566,9 @@ Glib::ustring Handle::_getDragTip(GdkEventMotion */*event*/) const
Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(dist[Geom::X], "px");
Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(dist[Geom::Y], "px");
Inkscape::Util::Quantity len_q = Inkscape::Util::Quantity(length(), "px");
- GString *x = g_string_new(x_q.string(_desktop->namedview->doc_units).c_str());
- GString *y = g_string_new(y_q.string(_desktop->namedview->doc_units).c_str());
- GString *len = g_string_new(len_q.string(_desktop->namedview->doc_units).c_str());
+ GString *x = g_string_new(x_q.string(_desktop->namedview->display_units).c_str());
+ GString *y = g_string_new(y_q.string(_desktop->namedview->display_units).c_str());
+ GString *len = g_string_new(len_q.string(_desktop->namedview->display_units).c_str());
Glib::ustring ret = format_tip(C_("Path handle tip",
"Move handle by %s, %s; angle %.2f°, length %s"), x->str, y->str, angle, len->str);
g_string_free(x, TRUE);
@@ -1490,8 +1490,8 @@ Glib::ustring Node::_getDragTip(GdkEventMotion */*event*/) const
Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(dist[Geom::X], "px");
Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(dist[Geom::Y], "px");
- GString *x = g_string_new(x_q.string(_desktop->namedview->doc_units).c_str());
- GString *y = g_string_new(y_q.string(_desktop->namedview->doc_units).c_str());
+ GString *x = g_string_new(x_q.string(_desktop->namedview->display_units).c_str());
+ GString *y = g_string_new(y_q.string(_desktop->namedview->display_units).c_str());
Glib::ustring ret = format_tip(C_("Path node tip", "Move node by %s, %s"), x->str, y->str);
g_string_free(x, TRUE);
g_string_free(y, TRUE);
diff --git a/src/ui/tools/arc-tool.cpp b/src/ui/tools/arc-tool.cpp
index 4f64ade25..9c3195a42 100644
--- a/src/ui/tools/arc-tool.cpp
+++ b/src/ui/tools/arc-tool.cpp
@@ -405,8 +405,8 @@ void ArcTool::drag(Geom::Point pt, guint state) {
Inkscape::Util::Quantity rdimx_q = Inkscape::Util::Quantity(rdimx, "px");
Inkscape::Util::Quantity rdimy_q = Inkscape::Util::Quantity(rdimy, "px");
- GString *xs = g_string_new(rdimx_q.string(desktop->namedview->doc_units).c_str());
- GString *ys = g_string_new(rdimy_q.string(desktop->namedview->doc_units).c_str());
+ GString *xs = g_string_new(rdimx_q.string(desktop->namedview->display_units).c_str());
+ GString *ys = g_string_new(rdimy_q.string(desktop->namedview->display_units).c_str());
if (state & GDK_CONTROL_MASK) {
int ratio_x, ratio_y;
diff --git a/src/ui/tools/pen-tool.cpp b/src/ui/tools/pen-tool.cpp
index 92937a135..fbcdf6142 100644
--- a/src/ui/tools/pen-tool.cpp
+++ b/src/ui/tools/pen-tool.cpp
@@ -1366,7 +1366,7 @@ void PenTool::_setAngleDistanceStatusMessage(Geom::Point const p, int pc_point_t
Geom::Point rel = p - this->p[pc_point_to_compare];
Inkscape::Util::Quantity q = Inkscape::Util::Quantity(Geom::L2(rel), "px");
- GString *dist = g_string_new(q.string(desktop->namedview->doc_units).c_str());
+ GString *dist = g_string_new(q.string(desktop->namedview->display_units).c_str());
double angle = atan2(rel[Geom::Y], rel[Geom::X]) * 180 / M_PI;
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (prefs->getBool("/options/compassangledisplay/value", 0) != 0) {
diff --git a/src/ui/tools/rect-tool.cpp b/src/ui/tools/rect-tool.cpp
index de91dcff4..67df0d9a5 100644
--- a/src/ui/tools/rect-tool.cpp
+++ b/src/ui/tools/rect-tool.cpp
@@ -422,8 +422,8 @@ void RectTool::drag(Geom::Point const pt, guint state) {
Inkscape::Util::Quantity rdimx_q = Inkscape::Util::Quantity(rdimx, "px");
Inkscape::Util::Quantity rdimy_q = Inkscape::Util::Quantity(rdimy, "px");
- GString *xs = g_string_new(rdimx_q.string(desktop->namedview->doc_units).c_str());
- GString *ys = g_string_new(rdimy_q.string(desktop->namedview->doc_units).c_str());
+ GString *xs = g_string_new(rdimx_q.string(desktop->namedview->display_units).c_str());
+ GString *ys = g_string_new(rdimy_q.string(desktop->namedview->display_units).c_str());
if (state & GDK_CONTROL_MASK) {
int ratio_x, ratio_y;
diff --git a/src/ui/tools/spiral-tool.cpp b/src/ui/tools/spiral-tool.cpp
index 18c3e4e2d..31c4e8829 100644
--- a/src/ui/tools/spiral-tool.cpp
+++ b/src/ui/tools/spiral-tool.cpp
@@ -395,7 +395,7 @@ void SpiralTool::drag(Geom::Point const &p, guint state) {
/* status text */
Inkscape::Util::Quantity q = Inkscape::Util::Quantity(rad, "px");
- GString *rads = g_string_new(q.string(desktop->namedview->doc_units).c_str());
+ GString *rads = g_string_new(q.string(desktop->namedview->display_units).c_str());
this->message_context->setF(Inkscape::IMMEDIATE_MESSAGE,
_("<b>Spiral</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle"),
rads->str, sp_round((arg + 2.0*M_PI*this->spiral->revo)*180/M_PI, 0.0001));
diff --git a/src/ui/tools/star-tool.cpp b/src/ui/tools/star-tool.cpp
index 7604ba04e..b5544d263 100644
--- a/src/ui/tools/star-tool.cpp
+++ b/src/ui/tools/star-tool.cpp
@@ -411,7 +411,7 @@ void StarTool::drag(Geom::Point p, guint state)
/* status text */
Inkscape::Util::Quantity q = Inkscape::Util::Quantity(r1, "px");
- GString *rads = g_string_new(q.string(desktop->namedview->doc_units).c_str());
+ GString *rads = g_string_new(q.string(desktop->namedview->display_units).c_str());
this->message_context->setF(Inkscape::IMMEDIATE_MESSAGE,
( this->isflatsided?
_("<b>Polygon</b>: radius %s, angle %5g&#176;; with <b>Ctrl</b> to snap angle")
diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp
index a72748733..578add843 100644
--- a/src/ui/tools/text-tool.cpp
+++ b/src/ui/tools/text-tool.cpp
@@ -590,8 +590,8 @@ bool TextTool::root_handler(GdkEvent* event) {
// status text
Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(fabs((p - this->p0)[Geom::X]), "px");
Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(fabs((p - this->p0)[Geom::Y]), "px");
- GString *xs = g_string_new(x_q.string(desktop->namedview->doc_units).c_str());
- GString *ys = g_string_new(y_q.string(desktop->namedview->doc_units).c_str());
+ GString *xs = g_string_new(x_q.string(desktop->namedview->display_units).c_str());
+ GString *ys = g_string_new(y_q.string(desktop->namedview->display_units).c_str());
this->message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("<b>Flowed text frame</b>: %s &#215; %s"), xs->str, ys->str);
g_string_free(xs, FALSE);
diff --git a/src/ui/widget/page-sizer.cpp b/src/ui/widget/page-sizer.cpp
index 32e357c57..b775b3c49 100644
--- a/src/ui/widget/page-sizer.cpp
+++ b/src/ui/widget/page-sizer.cpp
@@ -313,8 +313,8 @@ PageSizer::PageSizer(Registry & _wr)
_wr.setUpdating (true);
if (nv->page_size_units) {
_dimensionUnits.setUnit(nv->page_size_units->abbr);
- } else if (nv->doc_units) {
- _dimensionUnits.setUnit(nv->doc_units->abbr);
+ } else if (nv->display_units) {
+ _dimensionUnits.setUnit(nv->display_units->abbr);
}
_wr.setUpdating (false);
diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp
index d22c59aa4..aebef2c4e 100644
--- a/src/ui/widget/selected-style.cpp
+++ b/src/ui/widget/selected-style.cpp
@@ -498,7 +498,7 @@ SelectedStyle::setDesktop(SPDesktop *desktop)
this )
));
- _sw_unit = sp_desktop_namedview(desktop)->doc_units;
+ _sw_unit = sp_desktop_namedview(desktop)->display_units;
// Set the doc default unit active in the units list
gint length = g_slist_length(_unit_mis);
diff --git a/src/util/units.cpp b/src/util/units.cpp
index 3d635e2d2..8ad3560dd 100644
--- a/src/util/units.cpp
+++ b/src/util/units.cpp
@@ -21,6 +21,8 @@
#include <glibmm/fileutils.h>
#include <glibmm/markup.h>
+#include <2geom/coord.h>
+
#include "util/units.h"
#include "path-prefix.h"
#include "streq.h"
@@ -279,6 +281,28 @@ Unit const *UnitTable::getUnit(SVGLength::Unit u) const
return &_empty_unit;
}
+Unit const *UnitTable::findUnit(double factor, UnitType type) const
+{
+ const double eps = factor * 0.01; // allow for 1% deviation
+
+ UnitCodeMap::const_iterator cit = _unit_map.begin();
+ while (cit != _unit_map.end()) {
+ if (cit->second->type == type) {
+ if (Geom::are_near(cit->second->factor, factor, eps)) {
+ // unit found!
+ break;
+ }
+ }
+ ++cit;
+ }
+
+ if (cit != _unit_map.end()) {
+ return cit->second;
+ } else {
+ return getUnit(_primary_unit[type]);
+ }
+}
+
Quantity UnitTable::parseQuantity(Glib::ustring const &q) const
{
Glib::MatchInfo match_info;
diff --git a/src/util/units.h b/src/util/units.h
index efe1dbec7..13777fd1b 100644
--- a/src/util/units.h
+++ b/src/util/units.h
@@ -141,6 +141,9 @@ public:
/** Retrieve a given unit based on its string identifier */
Unit const *getUnit(Glib::ustring const &name) const;
Unit const *getUnit(char const *name) const;
+
+ /** Try to find a unit based on its conversion factor to the primary */
+ Unit const *findUnit(double factor, UnitType type) const;
/** Retrieve a given unit based on its SVGLength unit */
Unit const *getUnit(SVGLength::Unit u) const;
diff --git a/src/verbs.cpp b/src/verbs.cpp
index b4743751e..33810fba2 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -1860,7 +1860,7 @@ void ZoomVerb::perform(SPAction *action, void *data)
double zcorr = 1.0;
Glib::ustring abbr = prefs->getString("/options/zoomcorrection/unit");
- if (dt->namedview->doc_units && dt->namedview->doc_units->abbr == abbr)
+ if (dt->namedview->display_units && (dt->namedview->display_units->abbr == abbr))
zcorr = prefs->getDouble("/options/zoomcorrection/value", 1.0);
Geom::Rect const d = dt->get_display_area();
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 9c8dac7dc..2aab68812 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -1665,7 +1665,7 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview)
{
SPDesktopWidget *dtw = static_cast<SPDesktopWidget*>(g_object_new(SP_TYPE_DESKTOP_WIDGET, NULL));
- dtw->dt2r = 1. / namedview->doc_units->factor;
+ dtw->dt2r = 1. / namedview->display_units->factor;
dtw->ruler_origin = Geom::Point(0,0); //namedview->gridorigin; Why was the grid origin used here?
@@ -1737,7 +1737,7 @@ void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags)
SPNamedView *nv=SP_NAMEDVIEW(obj);
if (flags & SP_OBJECT_MODIFIED_FLAG) {
- this->dt2r = 1. / nv->doc_units->factor;
+ this->dt2r = 1. / nv->display_units->factor;
this->ruler_origin = Geom::Point(0,0); //nv->gridorigin; Why was the grid origin used here?
sp_ruler_set_unit(SP_RULER (this->vruler), nv->getDefaultUnit());
@@ -1771,14 +1771,14 @@ void SPDesktopWidget::namedviewModified(SPObject *obj, guint flags)
if (tracker == NULL) // it's null when inkscape is first opened
continue;
- tracker->setActiveUnit( nv->doc_units );
+ tracker->setActiveUnit( nv->display_units );
} // grandchildren
} // if child is a container
} // children
} // if aux_toolbox is a container
- gtk_widget_set_tooltip_text(this->hruler_box, gettext(nv->doc_units->name_plural.c_str()));
- gtk_widget_set_tooltip_text(this->vruler_box, gettext(nv->doc_units->name_plural.c_str()));
+ gtk_widget_set_tooltip_text(this->hruler_box, gettext(nv->display_units->name_plural.c_str()));
+ gtk_widget_set_tooltip_text(this->vruler_box, gettext(nv->display_units->name_plural.c_str()));
sp_desktop_widget_update_rulers(this);
ToolboxFactory::updateSnapToolbox(this->desktop, 0, this->snap_toolbox);
diff --git a/src/widgets/lpe-toolbar.cpp b/src/widgets/lpe-toolbar.cpp
index a85f3ae78..c6da46956 100644
--- a/src/widgets/lpe-toolbar.cpp
+++ b/src/widgets/lpe-toolbar.cpp
@@ -280,7 +280,7 @@ static void lpetool_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBas
void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
- tracker->setActiveUnit(sp_desktop_namedview(desktop)->doc_units);
+ tracker->setActiveUnit(sp_desktop_namedview(desktop)->display_units);
g_object_set_data(holder, "tracker", tracker);
Unit const *unit = tracker->getActiveUnit();
g_return_if_fail(unit != NULL);
diff --git a/src/widgets/node-toolbar.cpp b/src/widgets/node-toolbar.cpp
index 467325d08..1224ab355 100644
--- a/src/widgets/node-toolbar.cpp
+++ b/src/widgets/node-toolbar.cpp
@@ -330,7 +330,7 @@ static void node_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase*
void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
- Unit doc_units = *sp_desktop_namedview(desktop)->doc_units;
+ Unit doc_units = *sp_desktop_namedview(desktop)->display_units;
tracker->setActiveUnit(&doc_units);
g_object_set_data( holder, "tracker", tracker );
diff --git a/src/widgets/rect-toolbar.cpp b/src/widgets/rect-toolbar.cpp
index b6b7e435d..5356ebb0d 100644
--- a/src/widgets/rect-toolbar.cpp
+++ b/src/widgets/rect-toolbar.cpp
@@ -109,7 +109,7 @@ static void sp_rtb_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *
for (GSList const *items = selection->itemList(); items != NULL; items = items->next) {
if (SP_IS_RECT(items->data)) {
if (gtk_adjustment_get_value(adj) != 0) {
- (SP_RECT(items->data)->*setter)(Quantity::convert(gtk_adjustment_get_value(adj), unit, sp_desktop_namedview(desktop)->doc_units));
+ (SP_RECT(items->data)->*setter)(Quantity::convert(gtk_adjustment_get_value(adj), unit, sp_desktop_namedview(desktop)->svg_units));
} else {
SP_OBJECT(items->data)->getRepr()->setAttribute(value_name, NULL);
}
@@ -181,7 +181,7 @@ static void rect_tb_event_attr_changed(Inkscape::XML::Node * /*repr*/, gchar con
UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) );
Unit const *unit = tracker->getActiveUnit();
- Unit const *doc_unit = sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units;
+ Unit const *svg_unit = sp_desktop_namedview(SP_ACTIVE_DESKTOP)->svg_units;
g_return_if_fail(unit != NULL);
gpointer item = g_object_get_data( tbl, "item" );
@@ -190,28 +190,28 @@ static void rect_tb_event_attr_changed(Inkscape::XML::Node * /*repr*/, gchar con
GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "rx" ) );
gdouble rx = SP_RECT(item)->getVisibleRx();
- gtk_adjustment_set_value(adj, Quantity::convert(rx, doc_unit, unit));
+ gtk_adjustment_set_value(adj, Quantity::convert(rx, svg_unit, unit));
}
{
GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "ry" ) );
gdouble ry = SP_RECT(item)->getVisibleRy();
- gtk_adjustment_set_value(adj, Quantity::convert(ry, doc_unit, unit));
+ gtk_adjustment_set_value(adj, Quantity::convert(ry, svg_unit, unit));
}
{
GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "width" ) );
gdouble width = SP_RECT(item)->getVisibleWidth();
- gtk_adjustment_set_value(adj, Quantity::convert(width, doc_unit, unit));
+ gtk_adjustment_set_value(adj, Quantity::convert(width, svg_unit, unit));
}
{
GtkAdjustment *adj = GTK_ADJUSTMENT( g_object_get_data( tbl, "height" ) );
gdouble height = SP_RECT(item)->getVisibleHeight();
- gtk_adjustment_set_value(adj, Quantity::convert(height, doc_unit, unit));
+ gtk_adjustment_set_value(adj, Quantity::convert(height, svg_unit, unit));
}
}
@@ -307,7 +307,7 @@ void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
//tracker->addUnit( SP_UNIT_PERCENT, 0 );
// fixme: add % meaning per cent of the width/height
- tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units );
+ tracker->setActiveUnit( sp_desktop_namedview(desktop)->display_units );
g_object_set_data( holder, "tracker", tracker );
/* W */
diff --git a/src/widgets/select-toolbar.cpp b/src/widgets/select-toolbar.cpp
index 08a46354e..80fe93356 100644
--- a/src/widgets/select-toolbar.cpp
+++ b/src/widgets/select-toolbar.cpp
@@ -488,7 +488,7 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
// Create the units menu.
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
tracker->addUnit(unit_table.getUnit("%"));
- tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units );
+ tracker->setActiveUnit( sp_desktop_namedview(desktop)->display_units );
g_object_set_data( G_OBJECT(spw), "tracker", tracker );
g_signal_connect( G_OBJECT(spw), "destroy", G_CALLBACK(destroy_tracker), spw );
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index 02dd5df6e..7c85689a2 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -204,8 +204,8 @@ StrokeStyle::StrokeStyle() :
unitSelector->addUnit(*unit_table.getUnit("%"));
_old_unit = unitSelector->getUnit();
if (desktop) {
- unitSelector->setUnit(sp_desktop_namedview(desktop)->doc_units->abbr);
- _old_unit = sp_desktop_namedview(desktop)->doc_units;
+ unitSelector->setUnit(sp_desktop_namedview(desktop)->svg_units->abbr);
+ _old_unit = sp_desktop_namedview(desktop)->svg_units;
}
widthSpin->setUnitMenu(unitSelector);
unitChangedConn = unitSelector->signal_changed().connect(sigc::mem_fun(*this, &StrokeStyle::unitChangedCB));
@@ -839,7 +839,7 @@ StrokeStyle::updateLine()
// same width, or only one object; no sense to keep percent, switch to absolute
Inkscape::Util::Unit const *tempunit = unitSelector->getUnit();
if (tempunit->type != Inkscape::Util::UNIT_TYPE_LINEAR) {
- unitSelector->setUnit(sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units->abbr);
+ unitSelector->setUnit(sp_desktop_namedview(SP_ACTIVE_DESKTOP)->display_units->abbr);
}
}