summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabiertxof <jtx@jtx>2016-12-16 22:49:53 +0000
committerJabiertxof <jtx@jtx>2016-12-16 22:49:53 +0000
commit5927b3bf5d9d8dcc9f519b4b9060669bd2599a28 (patch)
tree3b51f70f9b467bb016c678afcaae650e3afd395b
parentworking with mirrors (diff)
downloadinkscape-5927b3bf5d9d8dcc9f519b4b9060669bd2599a28.tar.gz
inkscape-5927b3bf5d9d8dcc9f519b4b9060669bd2599a28.zip
Rollback 15315
(bzr r15295.1.25)
-rw-r--r--CMakeLists.txt4
-rw-r--r--share/extensions/dpiswitcher.py398
-rw-r--r--share/icons/icons.svg14
-rw-r--r--src/desktop-style.cpp11
-rw-r--r--src/file.cpp270
-rw-r--r--src/live_effects/lpe-angle_bisector.cpp8
-rw-r--r--src/live_effects/lpe-attach-path.cpp5
-rw-r--r--src/live_effects/lpe-bendpath.cpp3
-rw-r--r--src/live_effects/lpe-bounding-box.cpp6
-rw-r--r--src/live_effects/lpe-bspline.h2
-rw-r--r--src/live_effects/lpe-circle_3pts.cpp2
-rw-r--r--src/live_effects/lpe-circle_with_radius.cpp2
-rw-r--r--src/live_effects/lpe-clone-original.cpp5
-rw-r--r--src/live_effects/lpe-constructgrid.cpp4
-rw-r--r--src/live_effects/lpe-copy_rotate.cpp156
-rw-r--r--src/live_effects/lpe-copy_rotate.h14
-rw-r--r--src/live_effects/lpe-curvestitch.cpp5
-rw-r--r--src/live_effects/lpe-dynastroke.cpp2
-rw-r--r--src/live_effects/lpe-ellipse_5pts.cpp5
-rw-r--r--src/live_effects/lpe-envelope.cpp2
-rw-r--r--src/live_effects/lpe-extrude.cpp4
-rw-r--r--src/live_effects/lpe-fill-between-many.cpp2
-rw-r--r--src/live_effects/lpe-fill-between-strokes.cpp5
-rw-r--r--src/live_effects/lpe-fillet-chamfer.cpp2
-rw-r--r--src/live_effects/lpe-gears.cpp5
-rw-r--r--src/live_effects/lpe-interpolate.cpp6
-rw-r--r--src/live_effects/lpe-interpolate_points.cpp3
-rw-r--r--src/live_effects/lpe-jointype.cpp2
-rw-r--r--src/live_effects/lpe-knot.cpp3
-rw-r--r--src/live_effects/lpe-lattice.cpp3
-rw-r--r--src/live_effects/lpe-lattice2.cpp3
-rw-r--r--src/live_effects/lpe-lattice2.h2
-rw-r--r--src/live_effects/lpe-line_segment.cpp2
-rw-r--r--src/live_effects/lpe-mirror_symmetry.cpp314
-rw-r--r--src/live_effects/lpe-mirror_symmetry.h24
-rw-r--r--src/live_effects/lpe-offset.cpp5
-rw-r--r--src/live_effects/lpe-parallel.cpp5
-rw-r--r--src/live_effects/lpe-path_length.cpp4
-rw-r--r--src/live_effects/lpe-patternalongpath.cpp2
-rw-r--r--src/live_effects/lpe-perp_bisector.cpp6
-rw-r--r--src/live_effects/lpe-perspective-envelope.cpp3
-rw-r--r--src/live_effects/lpe-perspective_path.cpp5
-rw-r--r--src/live_effects/lpe-powerstroke.cpp3
-rw-r--r--src/live_effects/lpe-recursiveskeleton.cpp5
-rw-r--r--src/live_effects/lpe-rough-hatches.cpp3
-rw-r--r--src/live_effects/lpe-roughen.cpp3
-rw-r--r--src/live_effects/lpe-roughen.h1
-rw-r--r--src/live_effects/lpe-ruler.cpp3
-rw-r--r--src/live_effects/lpe-show_handles.cpp2
-rw-r--r--src/live_effects/lpe-show_handles.h1
-rw-r--r--src/live_effects/lpe-simplify.cpp2
-rw-r--r--src/live_effects/lpe-simplify.h1
-rw-r--r--src/live_effects/lpe-skeleton.cpp3
-rw-r--r--src/live_effects/lpe-sketch.cpp5
-rw-r--r--src/live_effects/lpe-tangent_to_curve.cpp4
-rw-r--r--src/live_effects/lpe-taperstroke.cpp2
-rw-r--r--src/live_effects/lpe-test-doEffect-stack.cpp5
-rw-r--r--src/live_effects/lpe-text_label.cpp5
-rw-r--r--src/live_effects/lpe-transform_2pts.cpp1
-rw-r--r--src/live_effects/lpe-vonkoch.cpp2
-rw-r--r--src/live_effects/parameter/fontbutton.cpp2
-rw-r--r--src/live_effects/parameter/fontbutton.h1
-rw-r--r--src/preferences-skeleton.h5
-rw-r--r--src/sp-item-group.cpp5
-rw-r--r--src/sp-lpe-item.cpp6
-rw-r--r--src/sp-lpe-item.h2
-rw-r--r--src/sp-mesh-array.cpp10
-rw-r--r--src/ui/tools/tweak-tool.cpp3
-rw-r--r--src/widgets/mesh-toolbar.cpp165
-rw-r--r--src/widgets/text-toolbar.cpp166
-rw-r--r--src/widgets/toolbox.cpp11
71 files changed, 620 insertions, 1135 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 612423ef0..efd6ff128 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -91,9 +91,7 @@ include(CMakeScripts/HelperMacros.cmake) # Misc Utility Macros
# -----------------------------------------------------------------------------
# BAD HACKS, NEED TO INVESTIGATE MAKING THESE LESS BAD
-if (NOT CMAKE_BUILD_TYPE MATCHES Debug)
- add_definitions(-D_FORTIFY_SOURCE=2)
-endif()
+add_definitions(-D_FORTIFY_SOURCE=2)
add_definitions(-DORBIT2=1)
add_definitions(-DHAVE_CONFIG_H)
add_definitions(-DHAVE_CAIRO_PDF=1) # needed for src/libnrtype/Layout-TNG.h
diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py
index 317616db5..e7adbc0cf 100644
--- a/share/extensions/dpiswitcher.py
+++ b/share/extensions/dpiswitcher.py
@@ -1,11 +1,10 @@
#!/usr/bin/env python
'''
-This extension scales a document to fit different SVG DPI -90/96-
+This extension scale or reduce a document to fit diferent SVG DPI -90/96-
Copyright (C) 2012 Jabiertxo Arraiza, jabier.arraiza@marker.es
-Copyright (C) 2016 su_v, <suv-sf@users.sf.net>
-Version 0.6 - DPI Switcher
+Version 0.5 - DPI Switcher
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -20,178 +19,10 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Changes since v0.5:
- - transform all top-level containers and graphics elements
- - support scientific notation in SVG lengths
- - fix scaling with existing matrix() (use functions from simpletransform.py)
- - support different units for document width, height attributes
- - improve viewBox support (syntax, offset)
- - support common cases of text-put-on-path in SVG root
- - support common cases of <use> references in SVG root
- - examples from http://tavmjong.free.fr/INKSCAPE/UNITS/ tested
-
-TODO:
- - check grids/guides created with 0.91:
- http://tavmjong.free.fr/INKSCAPE/UNITS/units_mm_nv_90dpi.svg
- - check <symbol> instances
- - check more <use> and text-on-path cases (reverse scaling needed?)
- - scale perspective of 3dboxes
-
'''
-# standard libraries
-import sys
-import re
-import string
-import math
-from lxml import etree
-# local libraries
-import inkex
-import simpletransform
-import simplestyle
-
-
-# globals
-SKIP_CONTAINERS = [
- 'defs',
- 'glyph',
- 'marker',
- 'mask',
- 'missing-glyph',
- 'pattern',
- 'symbol',
-]
-CONTAINER_ELEMENTS = [
- 'a',
- 'g',
- 'switch',
-]
-GRAPHICS_ELEMENTS = [
- 'circle',
- 'ellipse',
- 'image',
- 'line',
- 'path',
- 'polygon',
- 'polyline',
- 'rect',
- 'text',
- 'use',
-]
-
-def is_3dbox(element):
- """Check whether element is an Inkscape 3dbox type."""
- return element.get(inkex.addNS('type', 'sodipodi')) == 'inkscape:box3d'
-
-
-def is_use(element):
- """Check whether element is of type <text>."""
- return element.tag == inkex.addNS('use', 'svg')
-
-
-def is_text(element):
- """Check whether element is of type <text>."""
- return element.tag == inkex.addNS('text', 'svg')
-
-
-def is_text_on_path(element):
- """Check whether text element is put on a path."""
- if is_text(element):
- text_path = element.find(inkex.addNS('textPath', 'svg'))
- if text_path is not None and len(text_path):
- return True
- return False
-
-
-def is_sibling(element1, element2):
- """Check whether element1 and element2 are siblings of same parent."""
- return element2 in element1.getparent()
-
-
-def is_in_defs(doc, element):
- """Check whether element is in defs."""
- if element is not None:
- defs = doc.find('defs', namespaces=inkex.NSS)
- if defs is not None:
- return linked_node in defs.iterdescendants()
- return False
-
-
-def get_linked(doc, element):
- """Return linked element or None."""
- if element is not None:
- href = element.get(inkex.addNS('href', 'xlink'), None)
- if href is not None:
- linked_id = href[href.find('#')+1:]
- path = '//*[@id="%s"]' % linked_id
- el_list = doc.xpath(path, namespaces=inkex.NSS)
- if isinstance(el_list, list) and len(el_list):
- return el_list[0]
- else:
- return None
-
-
-def check_3dbox(svg, element, scale_x, scale_y):
- """Check transformation for 3dbox element."""
- skip = False
- if skip:
- # 3dbox elements ignore preserved transforms
- # FIXME: manually update geometry of 3dbox?
- pass
- return skip
-
-
-def check_text_on_path(svg, element, scale_x, scale_y):
- """Check whether to skip scaling a text put on a path."""
- skip = False
- path = get_linked(svg, element.find(inkex.addNS('textPath', 'svg')))
- if not is_in_defs(svg, path):
- if is_sibling(element, path):
- # skip common element scaling if both text and path are siblings
- skip = True
- # scale offset
- if 'transform' in element.attrib:
- mat = simpletransform.parseTransform(element.get('transform'))
- mat[0][2] *= scale_x
- mat[1][2] *= scale_y
- element.set('transform', simpletransform.formatTransform(mat))
- # scale font size
- mat = simpletransform.parseTransform(
- 'scale({},{})'.format(scale_x, scale_y))
- det = abs(mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0])
- descrim = math.sqrt(abs(det))
- prop = 'font-size'
- # outer text
- sdict = simplestyle.parseStyle(element.get('style'))
- if prop in sdict:
- sdict[prop] = float(sdict[prop]) * descrim
- element.set('style', simplestyle.formatStyle(sdict))
- # inner tspans
- for child in element.iterdescendants():
- if child.tag == inkex.addNS('tspan', 'svg'):
- sdict = simplestyle.parseStyle(child.get('style'))
- if prop in sdict:
- sdict[prop] = float(sdict[prop]) * descrim
- child.set('style', simplestyle.formatStyle(sdict))
- return skip
-
-
-def check_use(svg, element, scale_x, scale_y):
- """Check whether to skip scaling an instanciated element (<use>)."""
- skip = False
- path = get_linked(svg, element)
- if not is_in_defs(svg, path):
- if is_sibling(element, path):
- skip = True
- # scale offset
- if 'transform' in element.attrib:
- mat = simpletransform.parseTransform(element.get('transform'))
- mat[0][2] *= scale_x
- mat[1][2] *= scale_y
- element.set('transform', simpletransform.formatTransform(mat))
- return skip
+import inkex, sys, re, string
+from lxml import etree
class DPISwitcher(inkex.Effect):
@@ -208,140 +39,106 @@ class DPISwitcher(inkex.Effect):
self.units = "px"
self.unitExponent = 1.0
- # dictionaries of unit to user unit conversion factors
- __uuconvLegacy = {
- 'in': 90.0,
- 'pt': 1.25,
- 'px': 1.0,
- 'mm': 3.5433070866,
- 'cm': 35.433070866,
- 'm': 3543.3070866,
- 'km': 3543307.0866,
- 'pc': 15.0,
- 'yd': 3240.0,
- 'ft': 1080.0,
- }
- __uuconv = {
- 'in': 96.0,
- 'pt': 1.33333333333,
- 'px': 1.0,
- 'mm': 3.77952755913,
- 'cm': 37.7952755913,
- 'm': 3779.52755913,
- 'km': 3779527.55913,
- 'pc': 16.0,
- 'yd': 3456.0,
- 'ft': 1152.0,
- }
-
- def parse_length(self, length, percent=False):
- """Parse SVG length."""
- if self.options.switcher == "0": # dpi90to96
- known_units = self.__uuconvLegacy.keys()
- else: # dpi96to90
- known_units = self.__uuconv.keys()
- if percent:
- unitmatch = re.compile('(%s)$' % '|'.join(known_units + ['%']))
- else:
- unitmatch = re.compile('(%s)$' % '|'.join(known_units))
- param = re.compile(r'(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)')
- p = param.match(length)
- u = unitmatch.search(length)
- val = 100 # fallback: assume default length of 100
- unit = 'px' # fallback: assume 'px' unit
- if p:
- val = float(p.string[p.start():p.end()])
- if u:
- unit = u.string[u.start():u.end()]
- return (val, unit)
-
- def convert_length(self, val, unit):
- """Convert length to self.units if unit differs."""
- doc_unit = self.units or 'px'
- if unit != doc_unit:
- if self.options.switcher == "0": # dpi90to96
- val_px = val * self.__uuconvLegacy[unit]
- val = val_px / (self.__uuconvLegacy[doc_unit] / self.__uuconvLegacy['px'])
- unit = doc_unit
- else: # dpi96to90
- val_px = val * self.__uuconv[unit]
- val = val_px / (self.__uuconv[doc_unit] / self.__uuconv['px'])
- unit = doc_unit
- return (val, unit)
-
- def check_attr_unit(self, element, attr, unit_list):
- """Check unit of attribute value, match to units in *unit_list*."""
- if attr in element.attrib:
- unit = self.parse_length(element.get(attr), percent=True)[1]
- return unit in unit_list
-
- def scale_attr_val(self, element, attr, unit_list, factor):
- """Scale attribute value if unit matches one in *unit_list*."""
- if attr in element.attrib:
- val, unit = self.parse_length(element.get(attr), percent=True)
- if unit in unit_list:
- element.set(attr, '{}{}'.format(val * factor, unit))
-
def scaleRoot(self, svg):
- """Scale all top-level elements in SVG root."""
-
- # update viewport
- widthNumber = self.parse_length(svg.get('width'))[0]
- heightNumber = self.convert_length(*self.parse_length(svg.get('height')))[0]
- widthDoc = widthNumber * self.factor_a * self.unitExponent
- heightDoc = heightNumber * self.factor_a * self.unitExponent
-
+ widthNumber = re.sub("[a-zA-Z]", "", svg.get('width'))
+ heightNumber = re.sub("[a-zA-Z]", "", svg.get('height'))
+ widthDoc = str(float(widthNumber) * self.factor_a * self.unitExponent)
+ heightDoc = str(float(heightNumber) * self.factor_a * self.unitExponent)
+ if svg.get('viewBox'):
+ widthNumber = svg.get('viewBox').split(" ")[2]
+ heightNumber = svg.get('viewBox').split(" ")[3]
if svg.get('height'):
- svg.set('height', str(heightDoc))
+ svg.set('height', heightDoc)
if svg.get('width'):
- svg.set('width', str(widthDoc))
-
- # update viewBox
+ svg.set('width', widthDoc)
if svg.get('viewBox'):
- viewboxstring = re.sub(' +|, +|,',' ', svg.get('viewBox'))
- viewboxlist = [float(i) for i in viewboxstring.strip().split(' ', 4)]
- svg.set('viewBox','{} {} {} {}'.format(*[(val * self.factor_a) for val in viewboxlist]))
-
- # update guides, grids
+ svg.set('viewBox',"0 0 " + str(float(widthNumber) * self.factor_a) + " " + str(float(heightNumber) * self.factor_a))
if self.options.switcher == "1":
- # FIXME: dpi96to90 only?
self.scaleGuides(svg)
self.scaleGrid(svg)
-
- for element in svg: # iterate all top-level elements of SVGRoot
-
- # init variables
- tag = etree.QName(element).localname
+ for element in svg:
+ box3DSide = element.get(inkex.addNS('box3dsidetype', 'inkscape'))
+ if box3DSide:
+ continue
+ uri, tag = element.tag.split("}")
width_scale = self.factor_a
height_scale = self.factor_a
+ if tag == "rect" or tag == "image" or tag == "path" or tag == "circle" or tag == "ellipse" or tag == "text":
+ if element.get('width') is not None and \
+ (re.sub("[0-9]*\.?[0-9]", "", element.get('width')) == "%" or \
+ re.sub("[0-9]*\.?[0-9]", "", element.get('width')) == "px"):
+ width_scale = 1.0;
+ if element.get('height') is not None and \
+ (re.sub("[0-9]*\.?[0-9]", "", element.get('height')) == "%" or \
+ re.sub("[0-9]*\.?[0-9]", "", element.get('height')) == "px"):
+ height_scale = 1.0;
+ if element.get('x') is not None and \
+ re.sub("[0-9]*\.?[0-9]", "", element.get('x')) == "%":
+ xpos = str(float(element.get('x').replace('%','')) * self.factor_b) + '%'
+ element.set('x', xpos)
+ if element.get('y') is not None and \
+ re.sub("[0-9]*\.?[0-9]", "", element.get('y')) == "%":
+ ypos = str(float(element.get('y').replace('%','')) * self.factor_b) + '%'
+ element.set('y', ypos)
+ if element.get('transform'):
+ if "matrix" in str(element.get('transform')) and width_scale != 1.0:
+ result = re.sub(r".*?matrix( \(|\()(.*?)\)", self.matrixElement, str(element.get('transform')))
+ element.set('transform', result)
+ if "scale" in str(element.get('transform')) and width_scale != 1.0:
+ result = re.sub(r".*?scale( \(|\()(.*?)\)", self.scaleElement, str(element.get('transform')))
+ element.set('transform', result)
+ if "translate" in str(element.get('transform')) and width_scale != 1.0:
+ result = re.sub(r".*?translate( \(|\()(.*?)\)", self.translateElement, str(element.get('transform')))
+ element.set('transform', result)
+ if "skew" in str(element.get('transform')) and width_scale != 1.0:
+ result = re.sub(r".*?skew( \(|\()(.*?)\)", self.skewElement, str(element.get('transform')))
+ element.set('transform', result)
+ if "scale" not in str(element.get('transform')) and "matrix" not in str(element.get('transform')):
+ element.set('transform', str(element.get('transform')) + "scale(" + str( width_scale) + ", " + str(height_scale) + ")")
+ else:
+ element.set('transform', "scale(" + str(width_scale) + ", " + str(height_scale) + ")")
- if tag in GRAPHICS_ELEMENTS or tag in CONTAINER_ELEMENTS:
+ #a dictionary of unit to user unit conversion factors
+ __uuconv = {'in':96.0, 'pt':1.33333333333, 'px':1.0, 'mm':3.77952755913, 'cm':37.7952755913,
+ 'm':3779.52755913, 'km':3779527.55913, 'pc':16.0, 'yd':3456.0 , 'ft':1152.0}
+
+ __uuconvLegazy = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, 'm':3543.3070866,
+ 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080}
- # test for specific elements to skip from scaling
- if is_3dbox(element):
- if check_3dbox(svg, element, width_scale, height_scale):
- continue
- if is_text_on_path(element):
- if check_text_on_path(svg, element, width_scale, height_scale):
- continue
- if is_use(element):
- if check_use(svg, element, width_scale, height_scale):
- continue
+ def scaleElement(self, m):
+ scaleVal = m.group(2).replace(" ","")
+ total = scaleVal.count(',')
+ if total == 1:
+ scaleVal = scaleVal.split(",")
+ return "matrix(" + str(float(scaleVal[0]) * self.factor_a) + ",0,0," + str(float(scaleVal[1]) * self.factor_a) + ",0,0)"
+ else:
+ return "matrix(" + str(float(scaleVal) * self.factor_a) + ",0,0," + str(float(scaleVal) * self.factor_a) + ",0,0)"
- # relative units ('%') in presentation attributes
- for attr in ['width', 'height']:
- self.scale_attr_val(element, attr, ['%'], 1.0 / self.factor_a)
- for attr in ['x', 'y']:
- self.scale_attr_val(element, attr, ['%'], 1.0 / self.factor_a)
- # set preserved transforms on top-level elements
- if width_scale != 1.0 and height_scale != 1.0:
- mat = simpletransform.parseTransform(
- 'scale({},{})'.format(width_scale, height_scale))
- simpletransform.applyTransformToNode(mat, element)
+ def translateElement(self, m):
+ translateVal = m.group(2).replace(" ","")
+ total = translateVal.count(',')
+ if total == 1:
+ translateVal = translateVal.split(",")
+ return "matrix(" + str(self.factor_a) + ",0,0," + str(self.factor_a) + "," + str(float(translateVal[0]) * self.factor_a) + "," + str(float(translateVal[1]) * self.factor_a) + ")"
+ else:
+ return "matrix(" + str(self.factor_a) + ",0,0," + str(self.factor_a) + "," + str(float(translateVal) * self.factor_a) + "," + str(float(translateVal) * self.factor_a) + ")"
+
+ def skewElement(self, m):
+ skeweVal = m.group(2).replace(" ","")
+ total = skewVal.count(',')
+ if total == 1:
+ skeweVal = skewVal.split(",")
+ return "skew(" + str(float(skewVal[0]) * self.factor_a) + "," + str(float(skewVal[1]) * self.factor_a) + ") matrix(" + str(self.factor_a) + ",0,0," + str(self.factor_a) + ",0,0)"
+ else:
+ return "skew(" + str(float(skewVal) * self.factor_a) + ") matrix(" + str(self.factor_a) + ",0,0," + str(self.factor_a) + ",0,0)"
- def scaleElement(self, m):
- pass # TODO: optionally scale graphics elements only?
+ def matrixElement(self, m):
+ matrixVal = m.group(2).replace(" ","")
+ total = matrixVal.count(',')
+ matrixVal = matrixVal.split(",")
+ if total == 5:
+ return "matrix(" + str(float(matrixVal[0]) * self.factor_a) + "," + matrixVal[1] + "," + matrixVal[2] + "," + str(float(matrixVal[3]) * self.factor_a) + "," + str(float(matrixVal[4]) * self.factor_a) + "," + str(float(matrixVal[5]) * self.factor_a) + ")"
def scaleGuides(self, svg):
xpathStr = '//sodipodi:guide'
@@ -369,10 +166,11 @@ class DPISwitcher(inkex.Effect):
grid.set("originy", str(originy))
def effect(self):
+ action = self.options.action.strip("\"") # TODO Is this a bug? (Extra " characters)
saveout = sys.stdout
sys.stdout = sys.stderr
svg = self.document.getroot()
- if self.options.action == '"page_info"':
+ if action == "page_info":
print ":::SVG document related info:::"
print "version: " + str(svg.get(inkex.addNS('version',u'inkscape')))
width = svg.get('width')
@@ -408,18 +206,14 @@ class DPISwitcher(inkex.Effect):
self.factor_b = 90.0/96.0
namedview = svg.find(inkex.addNS('namedview', 'sodipodi'))
namedview.set(inkex.addNS('document-units', 'inkscape'), "px")
- self.units = self.parse_length(svg.get('width'))[1]
+ self.units = re.sub("[0-9]*\.?[0-9]", "", svg.get('width'))
if self.units and self.units <> "px" and self.units <> "" and self.units <> "%":
if self.options.switcher == "0":
self.unitExponent = 1.0/(self.factor_a/self.__uuconv[self.units])
else:
- self.unitExponent = 1.0/(self.factor_a/self.__uuconvLegacy[self.units])
+ self.unitExponent = 1.0/(self.factor_a/self.__uuconvLegazy[self.units])
self.scaleRoot(svg);
sys.stdout = saveout
-
-if __name__ == '__main__':
- effect = DPISwitcher()
- effect.affect()
-
-# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
+effect = DPISwitcher()
+effect.affect()
diff --git a/share/icons/icons.svg b/share/icons/icons.svg
index fa5ea4626..5ceaac9bb 100644
--- a/share/icons/icons.svg
+++ b/share/icons/icons.svg
@@ -3812,20 +3812,6 @@ http://www.inkscape.org/</dc:description>
</g>
<rect y="51.96389" x="1353.87" height="28" width="28" id="rect6752" style="fill:none" />
</g>
-<g id="text_outer_style" transform="translate(690,322)">
-<rect id="text_outer_style_rect" x="0" y="0" width="28" height="28" style="fill:none" />
-<g aria-label="T" style="font-weight:bold;font-size:20px;font-family:sans-serif;text-anchor:middle;fill:#4d4d4d;stroke:#000000;stroke-width:0.75">
-<path id="BigT" d="m 2.28125,2.4199219 h 13.4375 V 5.2617187 H 10.884766 V 17 H 7.125 V 5.2617187 H 2.28125 Z" />
-</g>
-<g aria-label="T" style="font-weight:bold;font-size:12px;font-family:sans-serif;text-anchor:middle;fill:#4d4d4d;stroke:#000000;stroke-width:0.75">
-<path id="LittleT" d="m 13.96875,13.251953 h 8.0625 v 1.705078 H 19.130859 V 22 H 16.875 v -7.042969 h -2.90625 z" />
-</g>
-<path id="text_outer_style_path1" d="m 20,2 h 6 V 26 H 2 V 10" style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round" />
-<path id="text_outer_style_path2" d="M 3,3 H 15" style="fill:none;stroke:#999999;stroke-width:0.75;stroke-linecap:round" />
-<path id="text_outer_style_path3" d="M 7.8,5.5 V 16.25" style="fill:none;stroke:#999999;stroke-width:0.75;stroke-linecap:round" />
-<path id="text_outer_style_path4" d="m 14.6,13.75 h 6.8" style="fill:#4d4d4d;stroke:#999999;stroke-width:0.5;stroke-linecap:round" />
-<path id="text_outer_style_path5" d="m 17.5,14.85 v 6.5" style="fill:#4d4d4d;stroke:#999999;stroke-width:0.5;stroke-linecap:round" />
-</g>
<g id="text_line_spacing" transform="translate(-0.0508118,0.0123038)">
<rect y="321.9877" x="480.0508" height="28" width="28" id="rect6696" style="fill:none" />
<g transform="translate(-787.9306,270.3015)" id="g7600">
diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index 4c07c76ea..65e511245 100644
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
@@ -209,7 +209,7 @@ sp_desktop_set_style(Inkscape::ObjectSet *set, SPDesktop *desktop, SPCSSAttr *cs
if (!change)
return;
-// 2. Emit signal... See desktop->connectSetStyle in text-tool, tweak-tool, and gradient-drag.
+// 2. Emit signal
bool intercepted = desktop->_set_style_signal.emit(css);
/** \todo
@@ -1045,7 +1045,6 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
bool lineheight_normal = false;
bool lineheight_unit_proportional = false;
bool lineheight_unit_absolute = false;
- bool lineheight_set = false; // Set true if any object has lineheight set.
double size_prev = 0;
double letterspacing_prev = 0;
@@ -1131,9 +1130,6 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
lineheight_normal = false;
lineheight += lineheight_current * doc_scale;
}
- if (style->line_height.set) {
- lineheight_set = true;
- }
if ((size_prev != 0 && style->font_size.computed != size_prev) ||
(letterspacing_prev != 0 && style->letter_spacing.computed != letterspacing_prev) ||
@@ -1209,9 +1205,6 @@ objects_query_fontnumbers (const std::vector<SPItem*> &objects, SPStyle *style_r
}
}
- // Used by text toolbar unset 'line-height'
- style_res->line_height.set = lineheight_set;
-
if (texts > 1) {
if (different || different_lineheight) {
return QUERY_STYLE_MULTIPLE_AVERAGED;
@@ -1914,7 +1907,7 @@ sp_desktop_query_style_from_list (const std::vector<SPItem*> &list, SPStyle *sty
int
sp_desktop_query_style(SPDesktop *desktop, SPStyle *style, int property)
{
- // Used by text tool and in gradient dragging. See connectQueryStyle.
+ // Used by text tool and in gradient dragging
int ret = desktop->_query_style_signal.emit(style, property);
if (ret != QUERY_STYLE_NOTHING)
diff --git a/src/file.cpp b/src/file.cpp
index 8f283e1f8..55089209a 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -66,10 +66,6 @@
// For updating old Inkscape SVG files
#include "display/canvas-grid.h"
#include "sp-guide.h"
-#include "selection-chemistry.h"
-#include "persp3d.h"
-#include "proj_pt.h"
-#include "ui/shape-editor.h"
#include <gtkmm.h>
@@ -357,13 +353,11 @@ bool sp_file_open(const Glib::ustring &uri,
bool need_fix_units = false;
bool need_fix_guides = false;
bool need_fix_grid_mm = false;
- bool need_fix_box3d = false;
- bool did_scaling = false;
+ bool is_extension = false;
// Check if potentially need viewbox or unit fix
switch (root->width.unit) {
case SP_CSS_UNIT_PC:
- case SP_CSS_UNIT_PT:
case SP_CSS_UNIT_MM:
case SP_CSS_UNIT_CM:
case SP_CSS_UNIT_IN:
@@ -372,19 +366,13 @@ bool sp_file_open(const Glib::ustring &uri,
case SP_CSS_UNIT_NONE:
case SP_CSS_UNIT_PX:
need_fix_units = true;
+ default:
break;
- case SP_CSS_UNIT_EM:
- case SP_CSS_UNIT_EX:
- case SP_CSS_UNIT_PERCENT:
// OK
- break;
- default:
- std::cerr << "sp_file_open: Unhandled width unit!" << std::endl;
}
switch (root->height.unit) {
case SP_CSS_UNIT_PC:
- case SP_CSS_UNIT_PT:
case SP_CSS_UNIT_MM:
case SP_CSS_UNIT_CM:
case SP_CSS_UNIT_IN:
@@ -393,21 +381,14 @@ bool sp_file_open(const Glib::ustring &uri,
case SP_CSS_UNIT_NONE:
case SP_CSS_UNIT_PX:
need_fix_units = true;
+ default:
break;
- case SP_CSS_UNIT_EM:
- case SP_CSS_UNIT_EX:
- case SP_CSS_UNIT_PERCENT:
// OK
- break;
- default:
- std::cerr << "sp_file_open: Unhandled height unit!" << std::endl;
}
// std::cout << "Absolute SVG units in root? " << (need_fix_viewbox?"true":"false") << std::endl;
// std::cout << "User units in root? " << (need_fix_units ?"true":"false") << std::endl;
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
-
if (!root->viewBox_set && need_fix_viewbox) {
Glib::ustring msg = _(
@@ -420,37 +401,31 @@ bool sp_file_open(const Glib::ustring &uri,
Gtk::Label info;
info.set_markup(msg.c_str());
info.show();
- scaleDialog.get_content_area()->pack_start(info, false, false, 20);
+ scaleDialog.get_content_area()->pack_start(info, false, false, 20);
Gtk::CheckButton backupButton( _("Create backup file (in same directory).") );
- bool backup = prefs->getBool("/options/dpifixbackup", true);
- backupButton.set_active( backup );
+ backupButton.set_active();
backupButton.show();
- scaleDialog.get_content_area()->pack_start(backupButton, false, false, 20);
- scaleDialog.add_button(_("Set 'viewBox'"), 1);
- scaleDialog.add_button(_("Scale elements"), 2);
- scaleDialog.add_button(_("Ignore"), 3);
- scaleDialog.add_button("Scale test - group", 4);
- scaleDialog.add_button("Scale test - children", 5);
+ scaleDialog.get_content_area()->pack_start(backupButton, false, false, 20);
+ scaleDialog.add_button("Set 'viewBox'", 1);
+ scaleDialog.add_button("Scale elements", 2);
+ scaleDialog.add_button("Ignore", 3);
gint response = scaleDialog.run();
- backup = backupButton.get_active();
- prefs->setBool("/options/dpifixbackup", backup);
-
- if ( backup && response != 3) {
- sp_file_save_backup( uri );
- }
-
+ bool backup = backupButton.get_active();
if (response == 1) {
-
+ if (backup) {
+ sp_file_save_backup( uri );
+ }
doc->setViewBox(Geom::Rect::from_xywh(
0, 0,
doc->getWidth().value("px") * ratio,
doc->getHeight().value("px") * ratio));
-
} else if (response == 2 ) {
-
+ if (backup) {
+ sp_file_save_backup( uri );
+ }
std::list<Inkscape::Extension::Effect *> effects;
Inkscape::Extension::db.get_effect_list(effects);
std::list<Inkscape::Extension::Effect *>::iterator it = effects.begin();
@@ -467,65 +442,12 @@ bool sp_file_open(const Glib::ustring &uri,
if (!did) {
std::cerr << "sp_file_open: Failed to find dpi90to96 extension." << std::endl;
}
- did_scaling = true;
-
- } else if (response == 4) {
-
- // Save preferences
- bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive",true);
- bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
-
- prefs->setBool("/options/kbselection/onlysensitive", false);
- prefs->setBool("/options/kbselection/onlyvisible", false);
-
- Inkscape::Selection *selection = desktop->getSelection();
- Inkscape::SelectionHelper::selectAllInAll( desktop );
- selection->group();
- SPItem * group = selection->singleItem();
- if (group) {
- group->setAttribute("transform","scale(1.06666667,1.06666667)");
- } else {
- std::cerr << "sp_file_open: Failed to get group!" << std::endl;
- }
- selection->clear();
- selection->add( group );
- selection->ungroup();
- selection->clear();
-
- prefs->setBool("/options/kbselection/onlysensitive", onlysensitive);
- prefs->setBool("/options/kbselection/onlyvisible", onlyvisible );
-
- did_scaling = true;
-
- } else if (response == 5) {
-
- // Save preferences
- bool transform_stroke = prefs->getBool("/options/transform/stroke", true);
- bool transform_rectcorners = prefs->getBool("/options/transform/rectcorners", true);
- bool transform_pattern = prefs->getBool("/options/transform/pattern", true);
- bool transform_gradient = prefs->getBool("/options/transform/gradient", true);
-
- prefs->setBool("/options/transform/stroke", true);
- prefs->setBool("/options/transform/rectcorners", true);
- prefs->setBool("/options/transform/pattern", true);
- prefs->setBool("/options/transform/gradient", true);
-
- Inkscape::UI::ShapeEditor::blockSetItem(true);
- doc->getRoot()->scaleChildItemsRec(Geom::Scale(1/ratio),Geom::Point(0, 0), false);
- Inkscape::UI::ShapeEditor::blockSetItem(false);
-
- // Restore preferences
- prefs->setBool("/options/transform/stroke", transform_stroke);
- prefs->setBool("/options/transform/rectcorners", transform_rectcorners);
- prefs->setBool("/options/transform/pattern", transform_pattern);
- prefs->setBool("/options/transform/gradient", transform_gradient);
+ is_extension = true;
}
-
- need_fix_box3d = true;
need_fix_guides = true; // Always fix guides
}
- else if (need_fix_units) {
+ if (need_fix_units) {
Glib::ustring msg = (
"Old Inkscape files use 1in == 90px. CSS requires 1in == 96px.\n"
"Drawings meant to match a physical size (e.g. Letter or A4)\n"
@@ -540,27 +462,19 @@ bool sp_file_open(const Glib::ustring &uri,
scaleDialog.get_content_area()->pack_start(info, false, false, 20);
Gtk::CheckButton backupButton( _("Create backup file (in same directory).") );
- bool backup = prefs->getBool("/options/dpifixbackup", true);
- backupButton.set_active( backup );
- backupButton.show();
scaleDialog.get_content_area()->pack_start(backupButton, false, false, 20);
+ backupButton.show();
- scaleDialog.add_button(_("Set 'viewBox'"), 1);
- scaleDialog.add_button(_("Scale elements"), 2);
- scaleDialog.add_button(_("Ignore"), 3);
- scaleDialog.add_button("Scale test - group", 4);
- scaleDialog.add_button("Scale test - children", 5);
+ scaleDialog.add_button("Set 'viewBox'", 1);
+ scaleDialog.add_button("Scale elements", 2);
+ scaleDialog.add_button("Ignore", 3);
gint response = scaleDialog.run();
- backup = backupButton.get_active();
- prefs->setBool("/options/dpifixbackup", backup);
-
- if ( backup && response != 3) {
- sp_file_save_backup( uri );
- }
-
+ bool backup = backupButton.get_active();
if (response == 1) {
-
+ if (backup) {
+ sp_file_save_backup( uri );
+ }
if (!root->viewBox_set) {
doc->setViewBox(Geom::Rect::from_xywh(
0, 0,
@@ -574,10 +488,10 @@ bool sp_file_open(const Glib::ustring &uri,
doc->setWidthAndHeight( width, height, false );
need_fix_guides = true; // Only fix guides if drawing scaled
- need_fix_box3d = true;
-
} else if (response == 2) {
-
+ if (backup) {
+ sp_file_save_backup( uri );
+ }
std::list<Inkscape::Extension::Effect *> effects;
Inkscape::Extension::db.get_effect_list(effects);
std::list<Inkscape::Extension::Effect *>::iterator it = effects.begin();
@@ -595,94 +509,14 @@ bool sp_file_open(const Glib::ustring &uri,
std::cerr << "sp_file_open: Failed to find dpi90to96 extension." << std::endl;
}
need_fix_guides = true; // Only fix guides if drawing scaled
- did_scaling = true;
-
- } else if (response == 4) {
-
- Inkscape::Util::Quantity width =
- Inkscape::Util::Quantity(doc->getWidth().value("px")/ratio, "px" );
- Inkscape::Util::Quantity height =
- Inkscape::Util::Quantity(doc->getHeight().value("px")/ratio,"px" );
- doc->setWidthAndHeight( width, height, false );
-
- if (!root->viewBox_set) {
-
- // Save preferences
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive",true);
- bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
-
- prefs->setBool("/options/kbselection/onlysensitive", false);
- prefs->setBool("/options/kbselection/onlyvisible", false);
-
- Inkscape::Selection *selection = desktop->getSelection();
- Inkscape::SelectionHelper::selectAllInAll( desktop );
- selection->group();
- SPItem * group = selection->singleItem();
- if (group) {
- group->setAttribute("transform","scale(1.06666667,1.06666667)");
- } else {
- std::cerr << "sp_file_open: Failed to get group!" << std::endl;
- }
- selection->clear();
- selection->add( group );
- selection->ungroup();
- selection->clear();
-
- prefs->setBool("/options/kbselection/onlysensitive", onlysensitive);
- prefs->setBool("/options/kbselection/onlyvisible", onlyvisible );
-
- did_scaling = true;
- }
-
- need_fix_box3d = true;
- need_fix_guides = true; // Only fix guides if drawing scaled
-
- } else if (response == 5) {
-
- Inkscape::Util::Quantity width =
- Inkscape::Util::Quantity(doc->getWidth().value("px")/ratio, "px" );
- Inkscape::Util::Quantity height =
- Inkscape::Util::Quantity(doc->getHeight().value("px")/ratio,"px" );
- doc->setWidthAndHeight( width, height, false );
-
- if (!root->viewBox_set) {
-
- // Save preferences
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- bool transform_stroke = prefs->getBool("/options/transform/stroke", true);
- bool transform_rectcorners = prefs->getBool("/options/transform/rectcorners", true);
- bool transform_pattern = prefs->getBool("/options/transform/pattern", true);
- bool transform_gradient = prefs->getBool("/options/transform/gradient", true);
-
- prefs->setBool("/options/transform/stroke", true);
- prefs->setBool("/options/transform/rectcorners", true);
- prefs->setBool("/options/transform/pattern", true);
- prefs->setBool("/options/transform/gradient", true);
-
- Inkscape::UI::ShapeEditor::blockSetItem(true);
- doc->getRoot()->scaleChildItemsRec(Geom::Scale(1/ratio),Geom::Point(0, 0), false);
- Inkscape::UI::ShapeEditor::blockSetItem(false);
-
- // Restore preferences
- prefs->setBool("/options/transform/stroke", transform_stroke);
- prefs->setBool("/options/transform/rectcorners", transform_rectcorners);
- prefs->setBool("/options/transform/pattern", transform_pattern);
- prefs->setBool("/options/transform/gradient", transform_gradient);
-
- did_scaling = true;
- }
-
- need_fix_box3d = true;
- need_fix_guides = true; // Only fix guides if drawing scaled
-
+ is_extension = true;
} else {
// Ignore
need_fix_grid_mm = true;
}
}
- // Fix guides and grids and perspective
+ // Fix guides and grids
for (SPObject *child = root->firstChild() ; child; child = child->getNext() ) {
SPNamedView *nv = dynamic_cast<SPNamedView *>(child);
if (nv) {
@@ -721,53 +555,21 @@ bool sp_file_open(const Glib::ustring &uri,
}
} else {
if (need_fix_guides) {
- if(did_scaling){
+ // HACK: Scaling the document does not seem to cause
+ // grids defined in document units to be updated.
+ // This forces an update.
+ if(is_extension){
xy->Scale( Geom::Scale(ratio,ratio).inverse() );
} else {
- // HACK: Scaling the document does not seem to cause
- // grids defined in document units to be updated.
- // This forces an update.
xy->Scale( Geom::Scale(1,1) );
}
}
}
}
}
- } // If SPNamedView
-
- SPDefs *defs = dynamic_cast<SPDefs *>(child);
- if (defs && need_fix_box3d) {
- for (SPObject *child = defs->firstChild() ; child; child = child->getNext() ) {
- Persp3D* persp3d = dynamic_cast<Persp3D *>(child);
- if (persp3d) {
- std::vector<Glib::ustring> tokens;
-
- const gchar* vp_x = persp3d->getAttribute("inkscape:vp_x");
- const gchar* vp_y = persp3d->getAttribute("inkscape:vp_y");
- const gchar* vp_z = persp3d->getAttribute("inkscape:vp_z");
- const gchar* vp_o = persp3d->getAttribute("inkscape:persp3d-origin");
- // std::cout << "Found Persp3d: "
- // << " vp_x: " << vp_x
- // << " vp_y: " << vp_y
- // << " vp_z: " << vp_z << std::endl;
- Proj::Pt2 pt_x (vp_x);
- Proj::Pt2 pt_y (vp_y);
- Proj::Pt2 pt_z (vp_z);
- Proj::Pt2 pt_o (vp_o);
- pt_x = pt_x * (1.0/ratio);
- pt_y = pt_y * (1.0/ratio);
- pt_z = pt_z * (1.0/ratio);
- pt_o = pt_o * (1.0/ratio);
- persp3d->setAttribute("inkscape:vp_x",pt_x.coord_string());
- persp3d->setAttribute("inkscape:vp_y",pt_y.coord_string());
- persp3d->setAttribute("inkscape:vp_z",pt_z.coord_string());
- persp3d->setAttribute("inkscape:persp3d-origin",pt_o.coord_string());
- }
- }
}
- } // Look for SPNamedView and SPDefs loop
+ } // Look for SPNamedView loop
- // desktop->getDocument()->ensureUpToDate(); // Does not update box3d!
DocumentUndo::done(desktop->getDocument(), SP_VERB_NONE, _("Update Document"));
} // If old Inkscape version
diff --git a/src/live_effects/lpe-angle_bisector.cpp b/src/live_effects/lpe-angle_bisector.cpp
index 56d33eb4b..9bfbf4ca8 100644
--- a/src/live_effects/lpe-angle_bisector.cpp
+++ b/src/live_effects/lpe-angle_bisector.cpp
@@ -8,13 +8,15 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-angle_bisector.h"
-#include "2geom/sbasis-to-bezier.h"
+
+#include <2geom/sbasis-to-bezier.h>
+
#include "sp-lpe-item.h"
#include "knot-holder-entity.h"
#include "knotholder.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-attach-path.cpp b/src/live_effects/lpe-attach-path.cpp
index 302165719..d2b44dd4e 100644
--- a/src/live_effects/lpe-attach-path.cpp
+++ b/src/live_effects/lpe-attach-path.cpp
@@ -4,14 +4,15 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
#include <math.h>
+
#include "live_effects/lpe-attach-path.h"
+
#include "display/curve.h"
#include "sp-shape.h"
#include "sp-text.h"
#include "2geom/path-sink.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp
index b1e133292..c24d38d7b 100644
--- a/src/live_effects/lpe-bendpath.cpp
+++ b/src/live_effects/lpe-bendpath.cpp
@@ -7,10 +7,9 @@
#include "live_effects/lpe-bendpath.h"
#include "sp-item-group.h"
+
#include "knot-holder-entity.h"
#include "knotholder.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
using std::vector;
diff --git a/src/live_effects/lpe-bounding-box.cpp b/src/live_effects/lpe-bounding-box.cpp
index 11fb34e04..2de768c3a 100644
--- a/src/live_effects/lpe-bounding-box.cpp
+++ b/src/live_effects/lpe-bounding-box.cpp
@@ -3,14 +3,14 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-bounding-box.h"
#include "display/curve.h"
#include "sp-shape.h"
#include "sp-text.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-bspline.h b/src/live_effects/lpe-bspline.h
index 90cf82c19..7823f00f0 100644
--- a/src/live_effects/lpe-bspline.h
+++ b/src/live_effects/lpe-bspline.h
@@ -6,8 +6,8 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
#include "live_effects/effect.h"
+
#include <vector>
namespace Inkscape {
diff --git a/src/live_effects/lpe-circle_3pts.cpp b/src/live_effects/lpe-circle_3pts.cpp
index 3410b13f2..18252f6a0 100644
--- a/src/live_effects/lpe-circle_3pts.cpp
+++ b/src/live_effects/lpe-circle_3pts.cpp
@@ -17,8 +17,6 @@
// You might need to include other 2geom files. You can add them here:
#include <2geom/circle.h>
#include <2geom/path-sink.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-circle_with_radius.cpp b/src/live_effects/lpe-circle_with_radius.cpp
index fcefc4ec6..6e03cb1ce 100644
--- a/src/live_effects/lpe-circle_with_radius.cpp
+++ b/src/live_effects/lpe-circle_with_radius.cpp
@@ -17,8 +17,6 @@
// You might need to include other 2geom files. You can add them here:
#include <2geom/circle.h>
#include <2geom/path-sink.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
using namespace Geom;
diff --git a/src/live_effects/lpe-clone-original.cpp b/src/live_effects/lpe-clone-original.cpp
index 10418a02d..7541c0be2 100644
--- a/src/live_effects/lpe-clone-original.cpp
+++ b/src/live_effects/lpe-clone-original.cpp
@@ -4,10 +4,11 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-clone-original.h"
+
#include "display/curve.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-constructgrid.cpp b/src/live_effects/lpe-constructgrid.cpp
index 8d24f9f47..4af8891e8 100644
--- a/src/live_effects/lpe-constructgrid.cpp
+++ b/src/live_effects/lpe-constructgrid.cpp
@@ -10,10 +10,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "live_effects/lpe-constructgrid.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
+#include "live_effects/lpe-constructgrid.h"
+
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp
index 5b94e9083..1133e083a 100644
--- a/src/live_effects/lpe-copy_rotate.cpp
+++ b/src/live_effects/lpe-copy_rotate.cpp
@@ -11,17 +11,36 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
#include <gdk/gdk.h>
#include <2geom/path-intersection.h>
#include <2geom/sbasis-to-bezier.h>
#include "live_effects/lpe-copy_rotate.h"
+
+#include "knotholder.h"
// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
+namespace CR {
+
+class KnotHolderEntityStartingAngle : public LPEKnotHolderEntity {
+public:
+ KnotHolderEntityStartingAngle(LPECopyRotate *effect) : LPEKnotHolderEntity(effect) {};
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+};
+
+class KnotHolderEntityRotationAngle : public LPEKnotHolderEntity {
+public:
+ KnotHolderEntityRotationAngle(LPECopyRotate *effect) : LPEKnotHolderEntity(effect) {};
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+};
+
+} // namespace CR
+
bool
pointInTriangle(Geom::Point const &p, Geom::Point const &p1, Geom::Point const &p2, Geom::Point const &p3)
{
@@ -40,7 +59,6 @@ pointInTriangle(Geom::Point const &p, Geom::Point const &p1, Geom::Point const &
LPECopyRotate::LPECopyRotate(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
origin(_("Origin"), _("Origin of the rotation"), "origin", &wr, this),
- starting_point("hidden", "hidden", "starting_point", &wr, this),
starting_angle(_("Starting:"), _("Angle of the first copy"), "starting_angle", &wr, this, 0.0),
rotation_angle(_("Rotation angle:"), _("Angle between two successive copies"), "rotation_angle", &wr, this, 60.0),
num_copies(_("Number of copies:"), _("Number of copies of the original path"), "num_copies", &wr, this, 6),
@@ -56,7 +74,6 @@ LPECopyRotate::LPECopyRotate(LivePathEffectObject *lpeobject) :
registerParameter(&copies_to_360);
registerParameter(&fuse_paths);
registerParameter(&starting_angle);
- registerParameter(&starting_point);
registerParameter(&rotation_angle);
registerParameter(&num_copies);
registerParameter(&origin);
@@ -70,41 +87,6 @@ LPECopyRotate::~LPECopyRotate()
}
-Gtk::Widget * LPECopyRotate::newWidget()
-{
- // use manage here, because after deletion of Effect object, others might
- // still be pointing to this widget.
- Gtk::VBox *vbox = Gtk::manage(new Gtk::VBox(Effect::newWidget()));
-
- vbox->set_border_width(5);
- vbox->set_homogeneous(false);
- vbox->set_spacing(2);
-
- std::vector<Parameter *>::iterator it = param_vector.begin();
- while (it != param_vector.end()) {
- if ((*it)->widget_is_visible) {
- Parameter *param = *it;
- Gtk::Widget *widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
- Glib::ustring *tip = param->param_getTooltip();
- if (widg) {
- if (param->param_key != "starting_point") {
- vbox->pack_start(*widg, true, true, 2);
- if (tip) {
- widg->set_tooltip_text(*tip);
- } else {
- widg->set_tooltip_text("");
- widg->set_has_tooltip(false);
- }
- }
- }
- }
-
- ++it;
- }
- return dynamic_cast<Gtk::Widget *>(vbox);
-}
-
-
void
LPECopyRotate::doOnApply(SPLPEItem const* lpeitem)
{
@@ -122,6 +104,11 @@ LPECopyRotate::doOnApply(SPLPEItem const* lpeitem)
void
LPECopyRotate::transform_multiply(Geom::Affine const& postmul, bool set)
{
+ if(fuse_paths) {
+ Geom::Coord angle = Geom::deg_from_rad(atan(-postmul[1]/postmul[0]));
+ angle += starting_angle;
+ starting_angle.param_set_value(angle);
+ }
// cycle through all parameters. Most parameters will not need transformation, but path and point params do.
for (std::vector<Parameter *>::iterator it = param_vector.begin(); it != param_vector.end(); ++it) {
@@ -159,25 +146,11 @@ LPECopyRotate::doBeforeEffect (SPLPEItem const* lpeitem)
dir = unit_vector(B - A);
// I first suspected the minus sign to be a bug in 2geom but it is
// likely due to SVG's choice of coordinate system orientation (max)
- bool near = Geom::are_near(previous_start_point, (Geom::Point)starting_point, 0.01);
- if (!near) {
- starting_angle.param_set_value(deg_from_rad(-angle_between(dir, starting_point - origin)));
- if (GDK_SHIFT_MASK) {
- dist_angle_handle = L2(B - A);
- } else {
- dist_angle_handle = L2(starting_point - origin);
- }
- }
start_pos = origin + dir * Rotate(-rad_from_deg(starting_angle)) * dist_angle_handle;
rot_pos = origin + dir * Rotate(-rad_from_deg(rotation_angle+starting_angle)) * dist_angle_handle;
- if (near) {
- starting_point.param_setValue(start_pos);
- }
- previous_start_point = (Geom::Point)starting_point;
if ( fuse_paths || copies_to_360 ) {
rot_pos = origin;
}
-
SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
item->apply_to_clippath(item);
item->apply_to_mask(item);
@@ -445,6 +418,85 @@ LPECopyRotate::resetDefaults(SPItem const* item)
original_bbox(SP_LPE_ITEM(item));
}
+void
+LPECopyRotate::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item)
+{
+ {
+ KnotHolderEntity *e = new CR::KnotHolderEntityStartingAngle(this);
+ e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN,
+ _("Adjust the starting angle"));
+ knotholder->add(e);
+ }
+ {
+ KnotHolderEntity *e = new CR::KnotHolderEntityRotationAngle(this);
+ e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN,
+ _("Adjust the rotation angle"));
+ knotholder->add(e);
+ }
+};
+
+namespace CR {
+
+using namespace Geom;
+
+void
+KnotHolderEntityStartingAngle::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+{
+ LPECopyRotate* lpe = dynamic_cast<LPECopyRotate *>(_effect);
+
+ Geom::Point const s = snap_knot_position(p, state);
+
+ // I first suspected the minus sign to be a bug in 2geom but it is
+ // likely due to SVG's choice of coordinate system orientation (max)
+ lpe->starting_angle.param_set_value(deg_from_rad(-angle_between(lpe->dir, s - lpe->origin)));
+ if (state & GDK_SHIFT_MASK) {
+ lpe->dist_angle_handle = L2(lpe->B - lpe->A);
+ } else {
+ lpe->dist_angle_handle = L2(p - lpe->origin);
+ }
+
+ // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating.
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+}
+
+void
+KnotHolderEntityRotationAngle::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+{
+ LPECopyRotate* lpe = dynamic_cast<LPECopyRotate *>(_effect);
+
+ Geom::Point const s = snap_knot_position(p, state);
+
+ // I first suspected the minus sign to be a bug in 2geom but it is
+ // likely due to SVG's choice of coordinate system orientation (max)
+ lpe->rotation_angle.param_set_value(deg_from_rad(-angle_between(lpe->dir, s - lpe->origin)) - lpe->starting_angle);
+ if (state & GDK_SHIFT_MASK) {
+ lpe->dist_angle_handle = L2(lpe->B - lpe->A);
+ } else {
+ lpe->dist_angle_handle = L2(p - lpe->origin);
+ }
+
+ // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating.
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+}
+
+Geom::Point
+KnotHolderEntityStartingAngle::knot_get() const
+{
+ LPECopyRotate const *lpe = dynamic_cast<LPECopyRotate const*>(_effect);
+ return lpe->start_pos;
+}
+
+Geom::Point
+KnotHolderEntityRotationAngle::knot_get() const
+{
+ LPECopyRotate const *lpe = dynamic_cast<LPECopyRotate const*>(_effect);
+ return lpe->rot_pos;
+}
+
+} // namespace CR
+
+/* ######################## */
+
} //namespace LivePathEffect
} /* namespace Inkscape */
diff --git a/src/live_effects/lpe-copy_rotate.h b/src/live_effects/lpe-copy_rotate.h
index 8f9fc12ac..87af867df 100644
--- a/src/live_effects/lpe-copy_rotate.h
+++ b/src/live_effects/lpe-copy_rotate.h
@@ -21,6 +21,12 @@
namespace Inkscape {
namespace LivePathEffect {
+namespace CR {
+// we need a separate namespace to avoid clashes with LPEPerpBisector
+class KnotHolderEntityStartingAngle;
+class KnotHolderEntityRotationAngle;
+}
+
class LPECopyRotate : public Effect, GroupBBoxEffect {
public:
LPECopyRotate(LivePathEffectObject *lpeobject);
@@ -32,13 +38,16 @@ public:
virtual void split(Geom::PathVector &path_in, Geom::Path const &divider);
virtual void resetDefaults(SPItem const* item);
virtual void transform_multiply(Geom::Affine const& postmul, bool set);
- virtual Gtk::Widget * newWidget();
+ /* the knotholder entity classes must be declared friends */
+ friend class CR::KnotHolderEntityStartingAngle;
+ friend class CR::KnotHolderEntityRotationAngle;
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
+
protected:
virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec);
private:
PointParam origin;
- PointParam starting_point;
ScalarParam starting_angle;
ScalarParam rotation_angle;
ScalarParam num_copies;
@@ -49,7 +58,6 @@ private:
Geom::Point dir;
Geom::Point start_pos;
Geom::Point rot_pos;
- Geom::Point previous_start_point;
double dist_angle_handle;
LPECopyRotate(const LPECopyRotate&);
LPECopyRotate& operator=(const LPECopyRotate&);
diff --git a/src/live_effects/lpe-curvestitch.cpp b/src/live_effects/lpe-curvestitch.cpp
index 38cbeaac0..3beedaf57 100644
--- a/src/live_effects/lpe-curvestitch.cpp
+++ b/src/live_effects/lpe-curvestitch.cpp
@@ -13,6 +13,8 @@
*/
#include "ui/widget/scalar.h"
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-curvestitch.h"
#include "sp-path.h"
@@ -20,9 +22,6 @@
#include "xml/repr.h"
#include <2geom/bezier-to-sbasis.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-dynastroke.cpp b/src/live_effects/lpe-dynastroke.cpp
index 50bbe6451..7e22f6e51 100644
--- a/src/live_effects/lpe-dynastroke.cpp
+++ b/src/live_effects/lpe-dynastroke.cpp
@@ -16,8 +16,6 @@
#include <2geom/bezier-to-sbasis.h>
#include <2geom/sbasis-math.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-ellipse_5pts.cpp b/src/live_effects/lpe-ellipse_5pts.cpp
index 28e7058d7..0371fc313 100644
--- a/src/live_effects/lpe-ellipse_5pts.cpp
+++ b/src/live_effects/lpe-ellipse_5pts.cpp
@@ -12,14 +12,15 @@
*/
#include "live_effects/lpe-ellipse_5pts.h"
+
+// You might need to include other 2geom files. You can add them here:
+#include <glibmm/i18n.h>
#include <2geom/circle.h>
#include <2geom/ellipse.h>
#include <2geom/path-sink.h>
#include "inkscape.h"
#include "desktop.h"
#include "message-stack.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-envelope.cpp b/src/live_effects/lpe-envelope.cpp
index 61a696435..c3b0a7c10 100644
--- a/src/live_effects/lpe-envelope.cpp
+++ b/src/live_effects/lpe-envelope.cpp
@@ -6,8 +6,6 @@
#include "live_effects/lpe-envelope.h"
#include "display/curve.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
using std::vector;
diff --git a/src/live_effects/lpe-extrude.cpp b/src/live_effects/lpe-extrude.cpp
index daa30d45a..d22007f76 100644
--- a/src/live_effects/lpe-extrude.cpp
+++ b/src/live_effects/lpe-extrude.cpp
@@ -12,10 +12,10 @@
*/
#include "live_effects/lpe-extrude.h"
-#include "sp-item.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
+
#include <glibmm/i18n.h>
+#include "sp-item.h"
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-fill-between-many.cpp b/src/live_effects/lpe-fill-between-many.cpp
index 1e2eadfdb..2087925fa 100644
--- a/src/live_effects/lpe-fill-between-many.cpp
+++ b/src/live_effects/lpe-fill-between-many.cpp
@@ -11,7 +11,7 @@
#include "display/curve.h"
#include "sp-shape.h"
#include "sp-text.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
+
#include <glibmm/i18n.h>
namespace Inkscape {
diff --git a/src/live_effects/lpe-fill-between-strokes.cpp b/src/live_effects/lpe-fill-between-strokes.cpp
index 0dbebdf26..b1e328d18 100644
--- a/src/live_effects/lpe-fill-between-strokes.cpp
+++ b/src/live_effects/lpe-fill-between-strokes.cpp
@@ -3,13 +3,14 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-fill-between-strokes.h"
#include "display/curve.h"
#include "sp-shape.h"
#include "sp-text.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-fillet-chamfer.cpp b/src/live_effects/lpe-fillet-chamfer.cpp
index 1e2df7dc8..24ee2ccc3 100644
--- a/src/live_effects/lpe-fillet-chamfer.cpp
+++ b/src/live_effects/lpe-fillet-chamfer.cpp
@@ -25,8 +25,8 @@
// for programmatically updating knots
#include "ui/tools-switch.h"
+
// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
using namespace Geom;
namespace Inkscape {
diff --git a/src/live_effects/lpe-gears.cpp b/src/live_effects/lpe-gears.cpp
index 17579c64e..1d5398aa5 100644
--- a/src/live_effects/lpe-gears.cpp
+++ b/src/live_effects/lpe-gears.cpp
@@ -7,10 +7,11 @@
*/
#include "live_effects/lpe-gears.h"
-#include <2geom/bezier-to-sbasis.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
+
#include <glibmm/i18n.h>
+#include <2geom/bezier-to-sbasis.h>
+
using std::vector;
using namespace Geom;
diff --git a/src/live_effects/lpe-interpolate.cpp b/src/live_effects/lpe-interpolate.cpp
index e95dc5f38..43da4d105 100644
--- a/src/live_effects/lpe-interpolate.cpp
+++ b/src/live_effects/lpe-interpolate.cpp
@@ -9,15 +9,15 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-interpolate.h"
#include <2geom/sbasis-to-bezier.h>
#include "sp-path.h"
#include "display/curve.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-interpolate_points.cpp b/src/live_effects/lpe-interpolate_points.cpp
index 0a0bcea14..ab0576174 100644
--- a/src/live_effects/lpe-interpolate_points.cpp
+++ b/src/live_effects/lpe-interpolate_points.cpp
@@ -12,9 +12,8 @@
*/
#include "live_effects/lpe-interpolate_points.h"
+
#include "live_effects/lpe-powerstroke-interpolators.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-jointype.cpp b/src/live_effects/lpe-jointype.cpp
index dacb87dd9..3bfbd6288 100644
--- a/src/live_effects/lpe-jointype.cpp
+++ b/src/live_effects/lpe-jointype.cpp
@@ -19,8 +19,6 @@
#include <2geom/elliptical-arc.h>
#include "lpe-jointype.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp
index c35da0601..474523aa3 100644
--- a/src/live_effects/lpe-knot.cpp
+++ b/src/live_effects/lpe-knot.cpp
@@ -33,9 +33,6 @@
#include "document.h"
#include "document-undo.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-lattice.cpp b/src/live_effects/lpe-lattice.cpp
index acffed000..091b6ddca 100644
--- a/src/live_effects/lpe-lattice.cpp
+++ b/src/live_effects/lpe-lattice.cpp
@@ -20,8 +20,7 @@
#include <2geom/sbasis-2d.h>
#include <2geom/bezier-to-sbasis.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
+
using namespace Geom;
namespace Inkscape {
diff --git a/src/live_effects/lpe-lattice2.cpp b/src/live_effects/lpe-lattice2.cpp
index e827491c0..9e9fc153a 100644
--- a/src/live_effects/lpe-lattice2.cpp
+++ b/src/live_effects/lpe-lattice2.cpp
@@ -16,15 +16,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
#include "live_effects/lpe-lattice2.h"
#include "display/curve.h"
#include "helper/geom.h"
#include <2geom/sbasis-2d.h>
#include <2geom/bezier-to-sbasis.h>
-
// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
using namespace Geom;
diff --git a/src/live_effects/lpe-lattice2.h b/src/live_effects/lpe-lattice2.h
index 59a0350d3..4a025d182 100644
--- a/src/live_effects/lpe-lattice2.h
+++ b/src/live_effects/lpe-lattice2.h
@@ -18,7 +18,7 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
+#include <gtkmm.h>
#include "live_effects/effect.h"
#include "live_effects/parameter/enum.h"
#include "live_effects/parameter/point.h"
diff --git a/src/live_effects/lpe-line_segment.cpp b/src/live_effects/lpe-line_segment.cpp
index cc024fb92..4c9edabd4 100644
--- a/src/live_effects/lpe-line_segment.cpp
+++ b/src/live_effects/lpe-line_segment.cpp
@@ -13,8 +13,6 @@
#include "live_effects/lpe-line_segment.h"
#include "ui/tools/lpe-tool.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp
index f34421df2..11620b23f 100644
--- a/src/live_effects/lpe-mirror_symmetry.cpp
+++ b/src/live_effects/lpe-mirror_symmetry.cpp
@@ -13,10 +13,6 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
-#include <gtkmm.h>
-#include "live_effects/lpeobject.h"
-#include "live_effects/lpeobject-reference.h"
#include "live_effects/lpe-mirror_symmetry.h"
#include "display/curve.h"
#include "svg/path-string.h"
@@ -31,7 +27,6 @@
#include "knotholder.h"
#include "style.h"
#include "xml/sp-css-attr.h"
-
// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
@@ -48,6 +43,17 @@ static const Util::EnumData<ModeType> ModeTypeData[MT_END] = {
static const Util::EnumDataConverter<ModeType>
MTConverter(ModeTypeData, MT_END);
+namespace MS {
+
+class KnotHolderEntityCenterMirrorSymmetry : public LPEKnotHolderEntity {
+public:
+ KnotHolderEntityCenterMirrorSymmetry(LPEMirrorSymmetry *effect) : LPEKnotHolderEntity(effect){};
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+};
+
+} // namespace MS
+
LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
mode(_("Mode"), _("Symmetry move mode"), "mode", MTConverter, &wr, this, MT_FREE),
@@ -55,26 +61,27 @@ LPEMirrorSymmetry::LPEMirrorSymmetry(LivePathEffectObject *lpeobject) :
discard_orig_path(_("Discard original path?"), _("Check this to only keep the mirrored part of the path"), "discard_orig_path", &wr, this, false),
fuse_paths(_("Fuse paths"), _("Fuse original and the reflection into a single path"), "fuse_paths", &wr, this, false),
oposite_fuse(_("Opposite fuse"), _("Picks the other side of the mirror as the original"), "oposite_fuse", &wr, this, false),
- split_elements(_("Split elements"), _("Split elements, this allow gradients and other paints. Group result to apply nested"), "split_elements", &wr, this, false),
- start_point(_("Start mirror line"), _("Start mirror line"), "start_point", &wr, this, _("Adjust the start of mirroring")),
- end_point(_("End mirror line"), _("End mirror line"), "end_point", &wr, this, _("Adjust end of mirroring")),
- center_point(_("Center mirror line"), _("Center mirror line"), "center_point", &wr, this, _("Adjust center of mirroring"))
+ split_elements(_("Split elements"), _("Split elements, this allow gradients and other paints"), "split_elements", &wr, this, false),
+ start_point(_("Start mirror line"), _("Start mirror line"), "start_point", &wr, this, "Adjust the start of mirroring"),
+ end_point(_("End mirror line"), _("End mirror line"), "end_point", &wr, this, "Adjust end of mirroring"),
+ id_origin("id_origin", "id_origin", "id_origin", &wr, this,"")
{
show_orig_path = true;
registerParameter(&mode);
- registerParameter(&split_gap);
- registerParameter(&discard_orig_path);
- registerParameter(&fuse_paths);
- registerParameter(&oposite_fuse);
- registerParameter(&split_elements);
- registerParameter(&start_point);
- registerParameter(&end_point);
- registerParameter(&center_point);
+ registerParameter( &split_gap);
+ registerParameter( &discard_orig_path);
+ registerParameter( &fuse_paths);
+ registerParameter( &oposite_fuse);
+ registerParameter( &split_elements);
+ registerParameter( &start_point);
+ registerParameter( &end_point);
+ registerParameter( &id_origin);
+ id_origin.param_hide_canvas_text();
split_gap.param_set_range(-999999.0, 999999.0);
split_gap.param_set_increments(0.1, 0.1);
split_gap.param_set_digits(2);
apply_to_clippath_and_mask = true;
- previous_center = Geom::Point(0,0);
+ actual = true;
}
LPEMirrorSymmetry::~LPEMirrorSymmetry()
@@ -87,10 +94,11 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
SPLPEItem * splpeitem = const_cast<SPLPEItem *>(lpeitem);
if (SPDesktop *desktop = SP_ACTIVE_DESKTOP) {
Inkscape::Selection *sel = desktop->getSelection();
- if ( sel && !sel->isEmpty()) {
+ if ( sel && !sel->isEmpty() && actual) {
SPItem *item = sel->singleItem();
if (item) {
if(std::strcmp(splpeitem->getId(),item->getId()) != 0) {
+ actual = false;
return;
}
}
@@ -109,14 +117,11 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
point_a = Geom::Point(center_point[X],boundingbox_Y.min());
point_b = Geom::Point(center_point[X],boundingbox_Y.max());
}
- if (Geom::are_near((Geom::Point)start_point, (Geom::Point)end_point, 0.01)) {
- start_point.param_setValue(point_a);
- end_point.param_setValue(point_b);
- }
line_separation.setPoints(point_a, point_b);
if ( mode == MT_X || mode == MT_Y ) {
start_point.param_setValue(point_a);
end_point.param_setValue(point_b);
+ center_point = Geom::middle_point(point_a, point_b);
} else if ( mode == MT_FREE) {
if(!are_near(previous_center,center_point, 0.01)) {
Geom::Point trans = center_point - previous_center;
@@ -124,6 +129,7 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
end_point.param_setValue(end_point * trans);
line_separation.setPoints(start_point, end_point);
} else {
+ center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point);
line_separation.setPoints(start_point, end_point);
}
} else if ( mode == MT_V){
@@ -136,6 +142,7 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
Geom::Point ep = Geom::Point(view_box_rect.width()/2.0, view_box_rect.height());
ep *= i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(SP_ACTIVE_DESKTOP->currentLayer()->parent)) .inverse();
end_point.param_setValue(ep);
+ center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point);
line_separation.setPoints(start_point, end_point);
}
} else { //horizontal page
@@ -148,56 +155,53 @@ LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
Geom::Point ep = Geom::Point(view_box_rect.width(), view_box_rect.height()/2.0);
ep *= i2anc_affine(SP_OBJECT(lpeitem), SP_OBJECT(SP_ACTIVE_DESKTOP->currentLayer()->parent)) .inverse();
end_point.param_setValue(ep);
+ center_point = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point);
line_separation.setPoints(start_point, end_point);
}
}
-
- previous_center = Geom::middle_point((Geom::Point)start_point, (Geom::Point)end_point);
- if (!are_near(previous_center, center_point,0.01)) {
- center_point.param_setValue(previous_center);
- }
- if (split_elements && allow_split()) {
- container = dynamic_cast<SPObject *>(splpeitem->parent);
+ previous_center = center_point;
+ if (split_elements) {
+ ms_container = dynamic_cast<SPObject *>(splpeitem->parent);
SPDocument * doc = SP_ACTIVE_DOCUMENT;
Inkscape::XML::Node *root = splpeitem->document->getReprRoot();
Inkscape::XML::Node *root_origin = doc->getReprRoot();
if (root_origin != root) {
return;
}
- const char * mirror = g_strdup(Glib::ustring("mirror-b-").append(this->getRepr()->attribute("id")).c_str());
-// if (std::strcmp(splpeitem->getId(), mirror_b) == 0) {
-// syncMirror(splpeitem, mirror_a);
-// } else {
- Geom::Point point_a(line_separation.initialPoint());
- Geom::Point point_b(line_separation.finalPoint());
- Geom::Point gap(split_gap,0);
- Geom::Translate m1(point_a[0], point_a[1]);
- double hyp = Geom::distance(point_a, point_b);
- double cos = 0;
- double sin = 0;
- if (hyp > 0) {
- cos = (point_b[0] - point_a[0]) / hyp;
- sin = (point_b[1] - point_a[1]) / hyp;
- }
- Geom::Affine m2(cos, -sin, sin, cos, 0.0, 0.0);
- Geom::Point dir = unit_vector(point_b - point_a);
- Geom::Point offset = (point_a + point_b)/2 + dir.ccw() * split_gap;
- line_separation *= Geom::Translate(offset);
- Geom::Scale sca(1.0, -1.0);
- m = m1.inverse() * m2;
- m = m * sca;
- m = m * m2.inverse();
- m = m * m1;
- m = m * splpeitem->transform;
- createMirror(splpeitem, m);
- //}
- } else {
- if (!allow_split()) {
- std::cout << "Only one operation of split allowed. Group results to nested effects.\n";
- split_elements.param_setValue(false);
+ Geom::Point point_a(line_separation.initialPoint());
+ Geom::Point point_b(line_separation.finalPoint());
+ Geom::Point gap(split_gap,0);
+ Geom::Translate m1(point_a[0], point_a[1]);
+ double hyp = Geom::distance(point_a, point_b);
+ double cos = 0;
+ double sin = 0;
+ if (hyp > 0) {
+ cos = (point_b[0] - point_a[0]) / hyp;
+ sin = (point_b[1] - point_a[1]) / hyp;
}
- processObjects(LPE_ERASE);
+ Geom::Affine m2(cos, -sin, sin, cos, 0.0, 0.0);
+ Geom::Point dir = unit_vector(point_b - point_a);
+ Geom::Point offset = (point_a + point_b)/2 + dir.ccw() * split_gap;
+ line_separation *= Geom::Translate(offset);
+ Geom::Scale sca(1.0, -1.0);
+ const char * id_original = id_origin.param_getSVGValue();
+ const char * id = g_strdup(Glib::ustring("mirror-").append(id_original).append("-").append(this->getRepr()->attribute("id")).c_str());
+ m = m1.inverse() * m2;
+ m = m * sca;
+ m = m * m2.inverse();
+ m = m * m1;
+ m = m * lpeitem->transform;
+ if (std::strcmp(splpeitem->getId(), id) == 0) {
+ createMirror(splpeitem, m, id_original);
+ } else {
+ createMirror(splpeitem, m, id);
+ }
+ elements.clear();
+ elements.push_back(id);
+ elements.push_back(id_original);
+ } else {
elements.clear();
+ processObjects(LPE_ERASE);
}
}
@@ -251,7 +255,7 @@ LPEMirrorSymmetry::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, c
if (c) {
dest->getRepr()->setAttribute(att,sp_svg_write_path(c->get_pathvector()));
c->reset();
- g_free(c);
+ g_free(c);
} else {
dest->getRepr()->setAttribute(att,NULL);
}
@@ -264,19 +268,9 @@ LPEMirrorSymmetry::cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, c
}
void
-LPEMirrorSymmetry::createMirror(SPLPEItem *origin, Geom::Affine transform)
+LPEMirrorSymmetry::createMirror(SPLPEItem *origin, Geom::Affine transform, const char * id)
{
if (SPDesktop *desktop = SP_ACTIVE_DESKTOP) {
- const char * id;
- Glib::ustring idbase = Glib::ustring(sp_lpe_item->getId());
- size_t pos = idbase.find("-mirror");
- if (pos <= idbase.size()) {
- id = g_strdup(idbase.substr(pos).c_str());
- } else {
- id = g_strdup(idbase.append("-mirror").c_str());
- elements.clear();
- elements.push_back(id);
- }
Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
Inkscape::URI SVGElem_uri(Glib::ustring("#").append(id).c_str());
Inkscape::URIReference* SVGElemRef = new Inkscape::URIReference(desktop->doc());
@@ -288,95 +282,24 @@ LPEMirrorSymmetry::createMirror(SPLPEItem *origin, Geom::Affine transform)
} else {
phantom = origin->getRepr()->duplicate(xml_doc);
}
+
phantom->setAttribute("id", id);
if (!elemref) {
- elemref = container->appendChildRepr(phantom);
+ elemref = ms_container->appendChildRepr(phantom);
Inkscape::GC::release(phantom);
}
- cloneAttrbutes(SP_OBJECT(origin), elemref, true, "inkscape:original-d", "inkscape:path-effect", NULL); //NULL required
+ cloneAttrbutes(SP_OBJECT(origin), elemref, true, "inkscape:original-d", NULL); //NULL required
elemref->getRepr()->setAttribute("transform" , sp_svg_transform_write(transform));
- if (elemref->parent != container) {
+ if (elemref->parent != ms_container) {
Inkscape::XML::Node *copy = phantom->duplicate(xml_doc);
copy->setAttribute("id", id);
- container->appendChildRepr(copy);
+ ms_container->appendChildRepr(copy);
Inkscape::GC::release(copy);
elemref->deleteObject();
}
}
}
-//void
-//LPEMirrorSymmetry::syncMirror(SPLPEItem *origin, const char * id)
-//{
-// if (SPDesktop *desktop = SP_ACTIVE_DESKTOP) {
-// Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
-// Inkscape::URI SVGElem_uri(Glib::ustring("#").append(id).c_str());
-// Inkscape::URIReference* SVGElemRef = new Inkscape::URIReference(desktop->doc());
-// SVGElemRef->attach(SVGElem_uri);
-// SPObject *elemref= NULL;
-// Inkscape::XML::Node *phantom = NULL;
-// if (elemref = SVGElemRef->getObject()) {
-// cloneAttrbutes(SP_OBJECT(origin), elemref, true, "inkscape:original-d", "inkscape:path-effect", NULL); //NULL required
-// }
-// }
-//}
-
-bool
-LPEMirrorSymmetry::allow_split(){
- if (sp_lpe_item->path_effect_list->empty()) {
- return false;
- }
- size_t count = 0;
- for (PathEffectList::const_iterator it = sp_lpe_item->path_effect_list->begin(); it != sp_lpe_item->path_effect_list->end(); ++it)
- {
- LivePathEffectObject *lpeobj = (*it)->lpeobject;
- if (lpeobj) {
- Inkscape::LivePathEffect::LPEMirrorSymmetry * ms = dynamic_cast<Inkscape::LivePathEffect::LPEMirrorSymmetry *>(lpeobj->get_lpe());
- if (ms && ms->split_elements) {
- count++;
- }
- }
- }
- return count <= 1;
-}
-
-//Gtk::Widget *
-//LPEMirrorSymmetry::newWidget()
-//{
-// // use manage here, because after deletion of Effect object, others might
-// // still be pointing to this widget.
-// Gtk::VBox *vbox = Gtk::manage(new Gtk::VBox(Effect::newWidget()));
-
-// vbox->set_border_width(5);
-// std::vector<Parameter *>::iterator it = param_vector.begin();
-// while (it != param_vector.end()) {
-// if ((*it)->widget_is_visible) {
-// Parameter *param = *it;
-// Gtk::Widget *widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
-// if (widg) {
-// if (param->param_key == "split_elements") {
-// Gtk::CheckButton *widg_registered = Gtk::manage(dynamic_cast<Gtk::CheckButton *>(widg));
-// if (!allow_split()) {
-// widg_registered->set_sensitive("false");
-// }
-// widg = dynamic_cast<Gtk::Widget *>(widg_registered);
-// }
-// Glib::ustring *tip = param->param_getTooltip();
-// vbox->pack_start(*widg, true, true, 2);
-// if (tip) {
-// widg->set_tooltip_text(*tip);
-// } else {
-// widg->set_tooltip_text("");
-// widg->set_has_tooltip(false);
-// }
-// }
-// }
-
-// ++it;
-// }
-// return dynamic_cast<Gtk::Widget *>(vbox);
-//}
-
//TODO: Migrate the tree next function to effect.cpp/h to avoid duplication
void
LPEMirrorSymmetry::doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/)
@@ -426,15 +349,15 @@ LPEMirrorSymmetry::processObjects(LpeAction lpe_action)
break;
case LPE_ERASE:
- //if (std::strcmp(elemref->getId(),sp_lpe_item->getId()) != 0) {
+ if (std::strcmp(elemref->getId(),id_origin.param_getSVGValue()) != 0) {
elemref->deleteObject();
- //}
+ }
break;
case LPE_VISIBILITY:
css = sp_repr_css_attr_new();
sp_repr_css_attr_add_from_string(css, elemref->getRepr()->attribute("style"));
- if (!this->isVisible()/* && std::strcmp(elemref->getId(),sp_lpe_item->getId()) != 0*/) {
+ if (!this->isVisible() && std::strcmp(elemref->getId(),id_origin.param_getSVGValue()) != 0) {
css->setAttribute("display", "none");
} else {
css->setAttribute("display", NULL);
@@ -459,6 +382,8 @@ void
LPEMirrorSymmetry::transform_multiply(Geom::Affine const& postmul, bool set)
{
if( !split_elements) {
+ center_point *= postmul;
+ previous_center = center_point;
// cycle through all parameters. Most parameters will not need transformation, but path and point params do.
for (std::vector<Parameter *>::iterator it = param_vector.begin(); it != param_vector.end(); ++it) {
Parameter * param = *it;
@@ -481,15 +406,10 @@ LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem)
start_point.param_update_default(point_a);
end_point.param_setValue(point_b);
end_point.param_update_default(point_b);
- center_point.param_setValue(point_c);
+ center_point = point_c;
previous_center = center_point;
-// SPLPEItem * splpeitem = const_cast<SPLPEItem *>(lpeitem);
-// if (!lpeitem->hasPathEffectOfType(this->effectType(), false) ){ //first applied not ready yet
-// const char * mirror_a = g_strdup(Glib::ustring("mirror-a-").append(this->getRepr()->attribute("id")).c_str());
-// splpeitem->setAttribute("id", mirror_a);
-// first_lpe.param_setValue(this->getRepr()->attribute("id"));
-// first_lpe.write_to_SVG();
-// }
+ id_origin.param_setValue(Glib::ustring(lpeitem->getId()));
+ id_origin.write_to_SVG();
}
@@ -640,6 +560,41 @@ LPEMirrorSymmetry::doEffect_path (Geom::PathVector const & path_in)
return path_out;
}
+
+Gtk::Widget *LPEMirrorSymmetry::newWidget()
+{
+ // use manage here, because after deletion of Effect object, others might
+ // still be pointing to this widget.
+ Gtk::VBox *vbox = Gtk::manage(new Gtk::VBox(Effect::newWidget()));
+
+ vbox->set_border_width(5);
+ vbox->set_homogeneous(false);
+ vbox->set_spacing(2);
+
+ std::vector<Parameter *>::iterator it = param_vector.begin();
+ while (it != param_vector.end()) {
+ if ((*it)->widget_is_visible) {
+ Parameter *param = *it;
+ Gtk::Widget *widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
+ Glib::ustring *tip = param->param_getTooltip();
+ if (widg) {
+ if (param->param_key != "id_origin") {
+ vbox->pack_start(*widg, true, true, 2);
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
+ }
+ }
+
+ ++it;
+ }
+ return dynamic_cast<Gtk::Widget *>(vbox);
+}
+
void
LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
{
@@ -655,6 +610,43 @@ LPEMirrorSymmetry::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector
hp_vec.push_back(helper);
}
+void
+LPEMirrorSymmetry::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item)
+{
+ SPKnotShapeType knot_shape = SP_KNOT_SHAPE_CIRCLE;
+ SPKnotModeType knot_mode = SP_KNOT_MODE_XOR;
+ guint32 knot_color = 0x0000ff00;
+ {
+ KnotHolderEntity *c = new MS::KnotHolderEntityCenterMirrorSymmetry(this);
+ c->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN,
+ _("Adjust the center"), knot_shape, knot_mode, knot_color );
+ knotholder->add(c);
+ }
+};
+
+namespace MS {
+
+using namespace Geom;
+
+void
+KnotHolderEntityCenterMirrorSymmetry::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
+{
+ LPEMirrorSymmetry* lpe = dynamic_cast<LPEMirrorSymmetry *>(_effect);
+ Geom::Point const s = snap_knot_position(p, state);
+ lpe->center_point = s;
+ // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating.
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+}
+
+Geom::Point
+KnotHolderEntityCenterMirrorSymmetry::knot_get() const
+{
+ LPEMirrorSymmetry const *lpe = dynamic_cast<LPEMirrorSymmetry const*>(_effect);
+ return lpe->center_point;
+}
+
+} // namespace CR
+
} //namespace LivePathEffect
} /* namespace Inkscape */
diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h
index 12ceebaf8..7b090ed82 100644
--- a/src/live_effects/lpe-mirror_symmetry.h
+++ b/src/live_effects/lpe-mirror_symmetry.h
@@ -15,10 +15,10 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
+#include <gtkmm.h>
#include "live_effects/effect.h"
-#include "live_effects/parameter/parameter.h"
#include "live_effects/parameter/text.h"
+#include "live_effects/parameter/parameter.h"
#include "live_effects/parameter/point.h"
#include "live_effects/parameter/path.h"
#include "live_effects/parameter/enum.h"
@@ -27,6 +27,11 @@
namespace Inkscape {
namespace LivePathEffect {
+namespace MS {
+// we need a separate namespace to avoid clashes with LPEPerpBisector
+class KnotHolderEntityCenterMirrorSymmetry;
+}
+
enum ModeType {
MT_V,
MT_H,
@@ -46,13 +51,14 @@ public:
virtual Geom::PathVector doEffect_path (Geom::PathVector const & path_in);
virtual void doOnRemove (SPLPEItem const* /*lpeitem*/);
virtual void doOnVisibilityToggled(SPLPEItem const* /*lpeitem*/);
-// virtual Gtk::Widget * newWidget();
+ virtual Gtk::Widget *newWidget();
void processObjects(LpeAction lpe_action);
- void createMirror(SPLPEItem *origin, Geom::Affine transform);
+ /* the knotholder entity classes must be declared friends */
+ friend class MS::KnotHolderEntityCenterMirrorSymmetry;
+ void createMirror(SPLPEItem *origin, Geom::Affine transform, const char * id);
// void cloneAttrbutes(Inkscape::XML::Node * origin, Inkscape::XML::Node * dest, const char * first_attribute, ...);
-// void syncMirror(SPLPEItem *origin, const char * id);
void cloneAttrbutes(SPObject *origin, SPObject *dest, bool live, const char * first_attribute, ...);
- bool allow_split();
+ void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
protected:
virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec);
@@ -66,11 +72,13 @@ private:
BoolParam split_elements;
PointParam start_point;
PointParam end_point;
- PointParam center_point;
+ TextParam id_origin;
Geom::Line line_separation;
Geom::Point previous_center;
+ Geom::Point center_point;
+ bool actual;
std::vector<const char *> elements;
- SPObject * container;
+ SPObject * ms_container;
LPEMirrorSymmetry(const LPEMirrorSymmetry&);
LPEMirrorSymmetry& operator=(const LPEMirrorSymmetry&);
};
diff --git a/src/live_effects/lpe-offset.cpp b/src/live_effects/lpe-offset.cpp
index 057f404e0..a0fa46c3f 100644
--- a/src/live_effects/lpe-offset.cpp
+++ b/src/live_effects/lpe-offset.cpp
@@ -11,12 +11,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-offset.h"
#include "sp-shape.h"
#include "display/curve.h"
+
#include <2geom/elliptical-arc.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-parallel.cpp b/src/live_effects/lpe-parallel.cpp
index 276749c43..9cd8ecf46 100644
--- a/src/live_effects/lpe-parallel.cpp
+++ b/src/live_effects/lpe-parallel.cpp
@@ -11,15 +11,14 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-parallel.h"
#include "sp-shape.h"
#include "display/curve.h"
#include "knotholder.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-path_length.cpp b/src/live_effects/lpe-path_length.cpp
index a06dbde98..6ec1e0ede 100644
--- a/src/live_effects/lpe-path_length.cpp
+++ b/src/live_effects/lpe-path_length.cpp
@@ -11,10 +11,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-path_length.h"
#include "util/units.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp
index 9cfeffee7..15c2817c4 100644
--- a/src/live_effects/lpe-patternalongpath.cpp
+++ b/src/live_effects/lpe-patternalongpath.cpp
@@ -12,8 +12,6 @@
#include "knotholder.h"
#include <algorithm>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
using std::vector;
diff --git a/src/live_effects/lpe-perp_bisector.cpp b/src/live_effects/lpe-perp_bisector.cpp
index bce22250a..f69dae6a1 100644
--- a/src/live_effects/lpe-perp_bisector.cpp
+++ b/src/live_effects/lpe-perp_bisector.cpp
@@ -11,6 +11,9 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-perp_bisector.h"
#include "display/curve.h"
#include "sp-path.h"
@@ -18,9 +21,6 @@
#include "knotholder.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
namespace PB {
diff --git a/src/live_effects/lpe-perspective-envelope.cpp b/src/live_effects/lpe-perspective-envelope.cpp
index e834c0e86..6a6b59519 100644
--- a/src/live_effects/lpe-perspective-envelope.cpp
+++ b/src/live_effects/lpe-perspective-envelope.cpp
@@ -20,9 +20,6 @@
#include "display/curve.h"
#include <gsl/gsl_linalg.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
using namespace Geom;
namespace Inkscape {
diff --git a/src/live_effects/lpe-perspective_path.cpp b/src/live_effects/lpe-perspective_path.cpp
index 2c6d66cee..cb4e43d87 100644
--- a/src/live_effects/lpe-perspective_path.cpp
+++ b/src/live_effects/lpe-perspective_path.cpp
@@ -11,6 +11,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include <gtkmm.h>
+#include <glibmm/i18n.h>
+
#include "persp3d.h"
//#include "transf_mat_3x4.h"
#include "document-private.h"
@@ -21,9 +23,6 @@
#include "desktop.h"
#include <util/units.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp
index e9f3975c7..329a00756 100644
--- a/src/live_effects/lpe-powerstroke.cpp
+++ b/src/live_effects/lpe-powerstroke.cpp
@@ -25,9 +25,6 @@
#include <2geom/circle.h>
#include "helper/geom.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Geom {
// should all be moved to 2geom at some point
diff --git a/src/live_effects/lpe-recursiveskeleton.cpp b/src/live_effects/lpe-recursiveskeleton.cpp
index aa0db920b..ed0c915ce 100644
--- a/src/live_effects/lpe-recursiveskeleton.cpp
+++ b/src/live_effects/lpe-recursiveskeleton.cpp
@@ -10,13 +10,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-recursiveskeleton.h"
#include <2geom/bezier-to-sbasis.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-rough-hatches.cpp b/src/live_effects/lpe-rough-hatches.cpp
index 3cc8658ea..2fb65b349 100644
--- a/src/live_effects/lpe-rough-hatches.cpp
+++ b/src/live_effects/lpe-rough-hatches.cpp
@@ -13,6 +13,7 @@
*/
#include "ui/widget/scalar.h"
+#include <glibmm/i18n.h>
#include "live_effects/lpe-rough-hatches.h"
#include "sp-item.h"
@@ -22,8 +23,6 @@
#include <2geom/sbasis-math.h>
#include <2geom/bezier-to-sbasis.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp
index c6edffd9b..3a486ff10 100644
--- a/src/live_effects/lpe-roughen.cpp
+++ b/src/live_effects/lpe-roughen.cpp
@@ -13,14 +13,11 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
#include "live_effects/lpe-roughen.h"
#include "display/curve.h"
#include <boost/functional/hash.hpp>
#include "helper/geom.h"
-
// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-roughen.h b/src/live_effects/lpe-roughen.h
index bab06022f..dbdb91e62 100644
--- a/src/live_effects/lpe-roughen.h
+++ b/src/live_effects/lpe-roughen.h
@@ -12,6 +12,7 @@
#ifndef INKSCAPE_LPE_ROUGHEN_H
#define INKSCAPE_LPE_ROUGHEN_H
+#include <gtkmm.h>
#include "live_effects/effect.h"
#include "live_effects/parameter/enum.h"
#include "live_effects/parameter/parameter.h"
diff --git a/src/live_effects/lpe-ruler.cpp b/src/live_effects/lpe-ruler.cpp
index 60c2a3e1c..3a2d78b2c 100644
--- a/src/live_effects/lpe-ruler.cpp
+++ b/src/live_effects/lpe-ruler.cpp
@@ -12,8 +12,7 @@
*/
#include "live_effects/lpe-ruler.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
+
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-show_handles.cpp b/src/live_effects/lpe-show_handles.cpp
index 7c298d0e7..170b6dccb 100644
--- a/src/live_effects/lpe-show_handles.cpp
+++ b/src/live_effects/lpe-show_handles.cpp
@@ -6,7 +6,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
#include "live_effects/lpe-show_handles.h"
#include <2geom/sbasis-to-bezier.h>
#include <2geom/svg-path-parser.h>
@@ -14,7 +13,6 @@
#include "desktop-style.h"
#include "style.h"
#include "svg/svg.h"
-
// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
diff --git a/src/live_effects/lpe-show_handles.h b/src/live_effects/lpe-show_handles.h
index c46abd2c2..3eda04649 100644
--- a/src/live_effects/lpe-show_handles.h
+++ b/src/live_effects/lpe-show_handles.h
@@ -8,6 +8,7 @@
* Copyright (C) Jabier Arraiza Cenoz 2014 <jabier.arraiza@marker.es>
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <gtkmm.h>
#include "helper/geom-nodetype.h"
#include "live_effects/effect.h"
#include "live_effects/lpegroupbbox.h"
diff --git a/src/live_effects/lpe-simplify.cpp b/src/live_effects/lpe-simplify.cpp
index 8bdb19b4f..ec21e10d2 100644
--- a/src/live_effects/lpe-simplify.cpp
+++ b/src/live_effects/lpe-simplify.cpp
@@ -2,7 +2,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
#include "live_effects/lpe-simplify.h"
#include "display/curve.h"
#include "helper/geom.h"
@@ -10,7 +9,6 @@
#include "svg/svg.h"
#include "ui/tools/node-tool.h"
#include "ui/icon-names.h"
-
// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
diff --git a/src/live_effects/lpe-simplify.h b/src/live_effects/lpe-simplify.h
index 6c407f572..8135561af 100644
--- a/src/live_effects/lpe-simplify.h
+++ b/src/live_effects/lpe-simplify.h
@@ -6,6 +6,7 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <gtkmm.h>
#include "live_effects/effect.h"
#include "live_effects/parameter/togglebutton.h"
#include "live_effects/lpegroupbbox.h"
diff --git a/src/live_effects/lpe-skeleton.cpp b/src/live_effects/lpe-skeleton.cpp
index adc4a3493..7d34db699 100644
--- a/src/live_effects/lpe-skeleton.cpp
+++ b/src/live_effects/lpe-skeleton.cpp
@@ -20,7 +20,8 @@
#include "live_effects/lpe-skeleton.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
+// You might need to include other 2geom files. You can add them here:
+
#include <glibmm/i18n.h>
namespace Inkscape {
diff --git a/src/live_effects/lpe-sketch.cpp b/src/live_effects/lpe-sketch.cpp
index e01516f2e..95e2f6f0d 100644
--- a/src/live_effects/lpe-sketch.cpp
+++ b/src/live_effects/lpe-sketch.cpp
@@ -13,14 +13,13 @@
#include "live_effects/lpe-sketch.h"
+#include <glibmm/i18n.h>
+
// You might need to include other 2geom files. You can add them here:
#include <2geom/sbasis-math.h>
#include <2geom/bezier-to-sbasis.h>
#include <2geom/path-intersection.h>
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-tangent_to_curve.cpp b/src/live_effects/lpe-tangent_to_curve.cpp
index 76d4ea71b..b308ef8d7 100644
--- a/src/live_effects/lpe-tangent_to_curve.cpp
+++ b/src/live_effects/lpe-tangent_to_curve.cpp
@@ -13,13 +13,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm/i18n.h>
+
#include "live_effects/lpe-tangent_to_curve.h"
#include "sp-path.h"
#include "display/curve.h"
#include "knotholder.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-taperstroke.cpp b/src/live_effects/lpe-taperstroke.cpp
index 4ffc41691..f6f6b33dc 100644
--- a/src/live_effects/lpe-taperstroke.cpp
+++ b/src/live_effects/lpe-taperstroke.cpp
@@ -26,8 +26,6 @@
#include "svg/svg.h"
#include "knotholder.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
-#include <glibmm/i18n.h>
template<typename T>
inline bool withinRange(T value, T low, T high) {
diff --git a/src/live_effects/lpe-test-doEffect-stack.cpp b/src/live_effects/lpe-test-doEffect-stack.cpp
index 324893706..c7ecf6481 100644
--- a/src/live_effects/lpe-test-doEffect-stack.cpp
+++ b/src/live_effects/lpe-test-doEffect-stack.cpp
@@ -4,11 +4,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "live_effects/lpe-test-doEffect-stack.h"
-
-// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
+#include "live_effects/lpe-test-doEffect-stack.h"
+
using std::memcpy;
namespace Inkscape {
diff --git a/src/live_effects/lpe-text_label.cpp b/src/live_effects/lpe-text_label.cpp
index 709d05e18..602a6897c 100644
--- a/src/live_effects/lpe-text_label.cpp
+++ b/src/live_effects/lpe-text_label.cpp
@@ -11,11 +11,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "live_effects/lpe-text_label.h"
-
-// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
+#include "live_effects/lpe-text_label.h"
+
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp
index e1f36eee7..78db622f2 100644
--- a/src/live_effects/lpe-transform_2pts.cpp
+++ b/src/live_effects/lpe-transform_2pts.cpp
@@ -20,7 +20,6 @@
// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
-
namespace Inkscape {
namespace LivePathEffect {
diff --git a/src/live_effects/lpe-vonkoch.cpp b/src/live_effects/lpe-vonkoch.cpp
index 47e2a1cec..2486f3366 100644
--- a/src/live_effects/lpe-vonkoch.cpp
+++ b/src/live_effects/lpe-vonkoch.cpp
@@ -5,7 +5,7 @@
*/
#include "live_effects/lpe-vonkoch.h"
-// TODO due to internal breakage in glibmm headers, this must be last:
+
#include <glibmm/i18n.h>
//using std::vector;
diff --git a/src/live_effects/parameter/fontbutton.cpp b/src/live_effects/parameter/fontbutton.cpp
index 64c203093..ff8ab76a0 100644
--- a/src/live_effects/parameter/fontbutton.cpp
+++ b/src/live_effects/parameter/fontbutton.cpp
@@ -4,7 +4,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtkmm.h>
+
#include "ui/widget/registered-widget.h"
#include "live_effects/parameter/fontbutton.h"
#include "live_effects/effect.h"
diff --git a/src/live_effects/parameter/fontbutton.h b/src/live_effects/parameter/fontbutton.h
index df47251a2..387ad130b 100644
--- a/src/live_effects/parameter/fontbutton.h
+++ b/src/live_effects/parameter/fontbutton.h
@@ -8,6 +8,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include <glib.h>
+#include <gtkmm.h>
#include "live_effects/parameter/parameter.h"
namespace Inkscape {
diff --git a/src/preferences-skeleton.h b/src/preferences-skeleton.h
index ed00092b2..ff43c2ca3 100644
--- a/src/preferences-skeleton.h
+++ b/src/preferences-skeleton.h
@@ -74,7 +74,8 @@ static char const preferences_skeleton[] =
" </group>\n"
"\n"
" <group id=\"tools\"\n"
-" bounding_box=\"0\">\n"
+" bounding_box=\"0\"\n"
+" style=\"fill:none;stroke:black;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;\">\n"
" <group id=\"shapes\" style=\"fill-rule:evenodd;\" selcue=\"1\" gradientdrag=\"1\">\n"
" <eventcontext id=\"rect\" style=\"fill:blue;\" usecurrent=\"1\"/>\n"
" <eventcontext id=\"3dbox\" style=\"stroke:none;stroke-linejoin:round;\" usecurrent=\"1\">\n"
@@ -87,7 +88,7 @@ static char const preferences_skeleton[] =
" </eventcontext>\n"
" <eventcontext id=\"arc\" style=\"fill:red;\" end=\"0\" start=\"0\" usecurrent=\"1\"/>\n"
" <eventcontext id=\"star\" magnitude=\"5\" style=\"fill:yellow;\" usecurrent=\"1\"/>\n"
-" <eventcontext id=\"spiral\" style=\"fill:none;stroke:black\" expansion=\"1\" usecurrent=\"0\"/>\n"
+" <eventcontext id=\"spiral\" style=\"fill:none;\" usecurrent=\"0\"/>\n"
" </group>\n"
" <group id=\"freehand\"\n"
" style=\"fill:none;stroke:black;stroke-opacity:1;stroke-linejoin:miter;stroke-linecap:butt;\">\n"
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index 7b2507b5e..96dcdbe30 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -584,13 +584,12 @@ sp_item_group_ungroup (SPGroup *group, std::vector<SPItem*> &children, bool do_d
SPText * text = dynamic_cast<SPText *>(citem);
if (text) {
//this causes a change in text-on-path appearance when there is a non-conformal transform, see bug #1594565
+ double scale = (ctrans.expansionX() + ctrans.expansionY()) / 2.0;
SPTextPath * text_path = dynamic_cast<SPTextPath *>(text->firstChild());
if (!text_path) {
nrepr->setAttribute("transform", affinestr);
} else {
- // The following breaks roundtripping group -> ungroup
- // double scale = (ctrans.expansionX() + ctrans.expansionY()) / 2.0;
- // sp_recursive_scale_text_size(nrepr, scale);
+ sp_recursive_scale_text_size(nrepr, scale);
Geom::Affine ttrans = ctrans.inverse() * SP_ITEM(text)->transform * ctrans;
gchar *affinestr = sp_svg_transform_write(ttrans);
nrepr->setAttribute("transform", affinestr);
diff --git a/src/sp-lpe-item.cpp b/src/sp-lpe-item.cpp
index 98428512f..9cf9dadc1 100644
--- a/src/sp-lpe-item.cpp
+++ b/src/sp-lpe-item.cpp
@@ -607,7 +607,7 @@ bool SPLPEItem::hasPathEffect() const
return true;
}
-bool SPLPEItem::hasPathEffectOfType(int const type, bool is_ready) const
+bool SPLPEItem::hasPathEffectOfType(int const type) const
{
if (path_effect_list->empty()) {
return false;
@@ -619,9 +619,7 @@ bool SPLPEItem::hasPathEffectOfType(int const type, bool is_ready) const
if (lpeobj) {
Inkscape::LivePathEffect::Effect const* lpe = lpeobj->get_lpe();
if (lpe && (lpe->effectType() == type)) {
- if (is_ready || lpe->isReady()) {
- return true;
- }
+ return true;
}
}
}
diff --git a/src/sp-lpe-item.h b/src/sp-lpe-item.h
index db4a0c7a3..9e5cb3329 100644
--- a/src/sp-lpe-item.h
+++ b/src/sp-lpe-item.h
@@ -73,7 +73,7 @@ public:
bool pathEffectsEnabled() const;
bool hasPathEffect() const;
- bool hasPathEffectOfType(int const type, bool is_ready = true) const;
+ bool hasPathEffectOfType(int const type) const;
bool hasPathEffectRecursive() const;
Inkscape::LivePathEffect::Effect* getPathEffectOfType(int type);
Inkscape::LivePathEffect::Effect const* getPathEffectOfType(int type) const;
diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp
index f192d0e44..f2604976e 100644
--- a/src/sp-mesh-array.cpp
+++ b/src/sp-mesh-array.cpp
@@ -1198,7 +1198,7 @@ void SPMeshNodeArray::create( SPMeshGradient *mg, SPItem *item, Geom::OptRect bb
ry = arc->ry.computed;
start = arc->start;
end = arc->end;
- if( end <= start ) {
+ if( end == start ) {
end += 2.0 * M_PI;
}
}
@@ -2026,7 +2026,7 @@ guint SPMeshNodeArray::side_arc( std::vector<guint> corners ) {
{
case 'L':
case 'l':
- std::cerr << "SPMeshNodeArray::side_arc: Can't convert straight lines to arcs." << std::endl;
+ std::cout << "SPMeshNodeArray::arc_sides: Can't convert straight lines to arcs.";
break;
case 'C':
@@ -2052,15 +2052,15 @@ guint SPMeshNodeArray::side_arc( std::vector<guint> corners ) {
++arced;
} else {
- std::cerr << "SPMeshNodeArray::side_arc: No crossing, can't turn into arc." << std::endl;
+ std::cout << "SPMeshNodeArray::arc_sides: No crossing, can't turn into arc." << std::endl;
}
} else {
- std::cerr << "SPMeshNodeArray::side_arc: Handles parallel, can't turn into arc." << std::endl;
+ std::cout << "SPMeshNodeArray::arc_sides: Handles parallel, can't turn into arc." << std::endl;
}
break;
}
default:
- std::cerr << "SPMeshNodeArray::side_arc: Invalid path type: " << n[1]->path_type << std::endl;
+ std::cout << "SPMeshNodeArray::arc_sides: Invalid path type: " << n[1]->path_type << std::endl;
}
}
}
diff --git a/src/ui/tools/tweak-tool.cpp b/src/ui/tools/tweak-tool.cpp
index ff5d623c2..56939cc30 100644
--- a/src/ui/tools/tweak-tool.cpp
+++ b/src/ui/tools/tweak-tool.cpp
@@ -1084,8 +1084,7 @@ sp_tweak_dilate (TweakTool *tc, Geom::Point event_p, Geom::Point p, Geom::Point
double move_force = get_move_force(tc);
double color_force = MIN(sqrt(path_force)/20.0, 1);
-// auto items= selection->items();
- std::vector<SPItem*> items(selection->items().begin(), selection->items().end());
+ auto items= selection->items();
for(auto i=items.begin();i!=items.end(); ++i){
SPItem *item = *i;
diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp
index ea0faf1df..f7b7a6ec9 100644
--- a/src/widgets/mesh-toolbar.cpp
+++ b/src/widgets/mesh-toolbar.cpp
@@ -67,79 +67,76 @@ static bool blocked = false;
//## Mesh ##
//########################
-
-// Get a list of selected meshes taking into account fill/stroke toggles
-std::vector<SPMeshGradient *> ms_get_dt_selected_gradients(Inkscape::Selection *selection)
+/*
+ * Get the current selection and dragger status from the desktop
+ */
+void ms_read_selection( Inkscape::Selection *selection,
+ SPMeshGradient *&ms_selected,
+ bool &ms_selected_multi,
+ SPMeshType &ms_type,
+ bool &ms_type_multi )
{
- std::vector<SPMeshGradient *> ms_selected;
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- bool edit_fill = prefs->getBool("/tools/mesh/edit_fill", true);
- bool edit_stroke = prefs->getBool("/tools/mesh/edit_stroke", true);
+ // Read desktop selection
+ bool first = true;
+ ms_type = SP_MESH_TYPE_COONS;
+
auto itemlist= selection->items();
for(auto i=itemlist.begin();i!=itemlist.end();++i){
- SPItem *item = *i;// get the items gradient, not the getVector() version
+ SPItem *item = *i;
SPStyle *style = item->style;
- if (style) {
+ if (style && (style->fill.isPaintserver())) {
+ SPPaintServer *server = item->style->getFillPaintServer();
+ if ( SP_IS_MESHGRADIENT(server) ) {
-
- if (edit_fill && style->fill.isPaintserver()) {
- SPPaintServer *server = item->style->getFillPaintServer();
- SPMeshGradient *mesh = dynamic_cast<SPMeshGradient *>(server);
- if (mesh) {
- ms_selected.push_back(mesh);
- }
- }
+ SPMeshGradient *gradient = SP_MESHGRADIENT(server); // ->getVector();
+ SPMeshType type = gradient->type;
- if (edit_stroke && style->stroke.isPaintserver()) {
- SPPaintServer *server = item->style->getStrokePaintServer();
- SPMeshGradient *mesh = dynamic_cast<SPMeshGradient *>(server);
- if (mesh) {
- ms_selected.push_back(mesh);
+ if (gradient != ms_selected) {
+ if (ms_selected) {
+ ms_selected_multi = true;
+ } else {
+ ms_selected = gradient;
+ }
}
+ if( type != ms_type ) {
+ if (ms_type != SP_MESH_TYPE_COONS && !first) {
+ ms_type_multi = true;
+ } else {
+ ms_type = type;
+ }
+ }
+ first = false;
}
}
- }
- return ms_selected;
-}
+ if (style && (style->stroke.isPaintserver())) {
+ SPPaintServer *server = item->style->getStrokePaintServer();
+ if ( SP_IS_MESHGRADIENT(server) ) {
+ SPMeshGradient *gradient = SP_MESHGRADIENT(server); // ->getVector();
+ SPMeshType type = gradient->type;
-/*
- * Get the current selection status from the desktop
- */
-void ms_read_selection( Inkscape::Selection *selection,
- SPMeshGradient *&ms_selected,
- bool &ms_selected_multi,
- SPMeshType &ms_type,
- bool &ms_type_multi )
-{
- ms_selected = NULL;
- ms_selected_multi = false;
- ms_type = SP_MESH_TYPE_COONS;
- ms_type_multi = false;
-
- bool first = true;
-
- // Read desktop selection, taking into account fill/stroke toggles
- std::vector<SPMeshGradient *> meshes = ms_get_dt_selected_gradients( selection );
- for (auto i = meshes.begin(); i != meshes.end(); ++i) {
- if (first) {
- ms_selected = (*i);
- ms_type = (*i)->type;
- first = false;
- } else {
- if (ms_selected != (*i)) {
- ms_selected_multi = true;
- }
- if (ms_type != (*i)->type) {
- ms_type_multi = true;
+ if (gradient != ms_selected) {
+ if (ms_selected) {
+ ms_selected_multi = true;
+ } else {
+ ms_selected = gradient;
+ }
+ }
+ if( type != ms_type ) {
+ if (ms_type != SP_MESH_TYPE_COONS && !first) {
+ ms_type_multi = true;
+ } else {
+ ms_type = type;
+ }
+ }
+ first = false;
}
}
}
-}
+ }
/*
* Core function, setup all the widgets whenever something changes on the desktop
@@ -176,7 +173,7 @@ static void ms_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointe
// std::cout << " type: " << ms_type << std::endl;
EgeSelectOneAction* type = (EgeSelectOneAction *) g_object_get_data(G_OBJECT(widget), "mesh_select_type_action");
- gtk_action_set_sensitive( GTK_ACTION(type), (ms_selected && !ms_type_multi) );
+ gtk_action_set_sensitive( GTK_ACTION(type), (ms_selected && !ms_selected_multi) );
if (ms_selected) {
blocked = TRUE;
ege_select_one_action_set_active( type, ms_type );
@@ -207,6 +204,34 @@ static void ms_defs_modified(SPObject * /*defs*/, guint /*flags*/, GObject *widg
ms_tb_selection_changed(NULL, widget);
}
+void ms_get_dt_selected_gradient(Inkscape::Selection *selection, SPMeshGradient *&ms_selected)
+{
+ SPMeshGradient *gradient = 0;
+
+ auto itemlist= selection->items();
+ for(auto i=itemlist.begin();i!=itemlist.end();++i){
+ SPItem *item = *i;// get the items gradient, not the getVector() version
+ SPStyle *style = item->style;
+ SPPaintServer *server = 0;
+
+ if (style && (style->fill.isPaintserver())) {
+ server = item->style->getFillPaintServer();
+ }
+ if (style && (style->stroke.isPaintserver())) {
+ server = item->style->getStrokePaintServer();
+ }
+
+ if ( SP_IS_MESHGRADIENT(server) ) {
+ gradient = SP_MESHGRADIENT(server);
+ }
+ }
+
+ if (gradient) {
+ ms_selected = gradient;
+ }
+}
+
+
/*
* Callback functions for user actions
*/
@@ -271,17 +296,18 @@ static void ms_type_changed(EgeSelectOneAction *act, GtkWidget *widget)
SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop"));
Inkscape::Selection *selection = desktop->getSelection();
- std::vector<SPMeshGradient *> meshes = ms_get_dt_selected_gradients(selection);
+ SPMeshGradient *gradient = 0;
+ ms_get_dt_selected_gradient(selection, gradient);
- SPMeshType type = (SPMeshType) ege_select_one_action_get_active(act);
- for (auto i = meshes.begin(); i != meshes.end(); ++i) {
+ if (gradient) {
+ SPMeshType type = (SPMeshType) ege_select_one_action_get_active(act);
// std::cout << " type: " << type << std::endl;
- (*i)->type = type;
- (*i)->type_set = true;
- (*i)->updateRepr();
- }
- if (!meshes.empty() ) {
- DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MESH,_("Set mesh type"));
+ gradient->type = type;
+ gradient->type_set = true;
+ gradient->updateRepr();
+
+ DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_MESH,
+ _("Set mesh type"));
}
}
@@ -340,7 +366,7 @@ static void ms_toggle_handles(void)
}
}
-static void ms_toggle_fill_stroke(InkToggleAction * /*act*/, gpointer data)
+static void ms_toggle_fill_stroke(void)
{
MeshTool *mt = get_mesh_tool();
if (mt) {
@@ -348,7 +374,6 @@ static void ms_toggle_fill_stroke(InkToggleAction * /*act*/, gpointer data)
drag->updateDraggers();
drag->updateLines();
drag->updateLevels();
- ms_tb_selection_changed(NULL, data); // Need to update Type widget
}
}
@@ -482,7 +507,7 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
PrefPusher *pusher = new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/mesh/edit_fill");
g_signal_connect( holder, "destroy", G_CALLBACK(delete_prefspusher), pusher);
- g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), holder);
+ g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), 0);
}
/* Edit stroke mesh */
@@ -495,7 +520,7 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
PrefPusher *pusher = new PrefPusher(GTK_TOGGLE_ACTION(act), "/tools/mesh/edit_stroke");
g_signal_connect( holder, "destroy", G_CALLBACK(delete_prefspusher), pusher);
- g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), holder);
+ g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(ms_toggle_fill_stroke), 0);
}
/* Show/hide side and tensor handles */
diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp
index 784c467f1..114d946bb 100644
--- a/src/widgets/text-toolbar.cpp
+++ b/src/widgets/text-toolbar.cpp
@@ -117,8 +117,6 @@ static void sp_print_fontstyle( SPStyle *query ) {
}
#endif
-static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/, GObject *tbl, bool subselection = false);
-
// Font family
static void sp_text_fontfamily_value_changed( Ink_ComboBoxEntry_Action *act, GObject *tbl )
{
@@ -227,35 +225,8 @@ static void sp_text_fontsize_value_changed( Ink_ComboBoxEntry_Action *act, GObje
sp_repr_css_set_property (css, "font-size", osfs.str().c_str());
// Apply font size to selected objects.
- // Calling sp_desktop_set_style will result in a call to TextTool::_styleSet() which
- // will set the style on selected text inside the <text> element. If we want to set
- // the style on the outer <text> objects we need to bypass this call.
- bool outer = prefs->getInt("/tools/text/outer_style", false);
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- if (outer) {
- Inkscape::Selection *selection = desktop->getSelection();
- auto itemlist= selection->items();
- for(auto i=itemlist.begin();i!=itemlist.end(); ++i){
- if (dynamic_cast<SPText *>(*i) || dynamic_cast<SPFlowtext *>(*i)) {
- SPItem *item = *i;
-
- // Scale by inverse of accumulated parent transform
- SPCSSAttr *css_set = sp_repr_css_attr_new();
- sp_repr_css_merge(css_set, css);
- Geom::Affine const local(item->i2doc_affine());
- double const ex(local.descrim());
- if ( (ex != 0.0) && (ex != 1.0) ) {
- sp_css_attr_scale(css_set, 1/ex);
- }
-
- item->changeCSS(css_set,"style");
-
- sp_repr_css_attr_unref(css_set);
- }
- }
- } else {
- sp_desktop_set_style (desktop, css, true, true);
- }
+ sp_desktop_set_style (desktop, css, true, true);
// If no selected objects, set default.
SPStyle query(SP_ACTIVE_DOCUMENT);
@@ -310,40 +281,6 @@ static void sp_text_fontstyle_value_changed( Ink_ComboBoxEntry_Action *act, GObj
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
}
-// Changes selection to only text outer elements.
-static void sp_text_outer_style_changed( InkToggleAction*act, GObject *tbl )
-{
- bool outer = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(act) );
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setInt("/tools/text/outer_style", outer);
-
- // Update widgets to reflect new state of Text Outer Style button.
- sp_text_toolbox_selection_changed( NULL, tbl );
-}
-
-// Unset line height on selection's inner text objects (tspan, etc.).
-static void sp_text_lineheight_unset_changed( InkToggleAction*act, GObject *tbl )
-{
- // quit if run by the _changed callbacks
- if (g_object_get_data(G_OBJECT(tbl), "freeze")) {
- return;
- }
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
-
- SPCSSAttr *css = sp_repr_css_attr_new();
- sp_repr_css_unset_property(css, "line-height");
-
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- sp_desktop_set_style (desktop, css);
-
- sp_repr_css_attr_unref(css);
-
- DocumentUndo::done(desktop->getDocument(), SP_VERB_CONTEXT_TEXT,
- _("Text: Unset line height."));
-
- g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
-}
-
// Handles both Superscripts and Subscripts
static void sp_text_script_changed( InkToggleAction* act, GObject *tbl )
{
@@ -612,34 +549,9 @@ static void sp_text_lineheight_value_changed( GtkAdjustment *adj, GObject *tbl )
sp_repr_css_set_property (css, "line-height", osfs.str().c_str());
- // Apply line-height to selected objects. See comment in font size function.
- bool outer = prefs->getInt("/tools/text/outer_style", false);
+ // Apply line-height to selected objects.
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- if (outer) {
- Inkscape::Selection *selection = desktop->getSelection();
- auto itemlist= selection->items();
- for(auto i=itemlist.begin();i!=itemlist.end(); ++i){
- if (dynamic_cast<SPText *>(*i) || dynamic_cast<SPFlowtext *>(*i)) {
- SPItem *item = *i;
-
- // Scale by inverse of accumulated parent transform
- SPCSSAttr *css_set = sp_repr_css_attr_new();
- sp_repr_css_merge(css_set, css);
- Geom::Affine const local(item->i2doc_affine());
- double const ex(local.descrim());
- if ( (ex != 0.0) && (ex != 1.0) ) {
- sp_css_attr_scale(css_set, 1/ex);
- }
-
- item->changeCSS(css_set,"style");
-
- sp_repr_css_attr_unref(css_set);
- }
- }
- } else {
- sp_desktop_set_style (desktop, css, true, true);
- }
-
+ sp_desktop_set_style (desktop, css, true, false);
// Only need to save for undo if a text item has been changed.
@@ -740,7 +652,7 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
double font_size = 0;
int count = 0;
for(auto i=itemlist.begin();i!=itemlist.end(); ++i){
- if (SP_IS_TEXT (*i) || SP_IS_FLOWTEXT(*i)) {
+ if (SP_IS_TEXT (*i)) {
double doc_scale = Geom::Affine((*i)->i2dt_affine()).descrim();
font_size += (*i)->style->font_size.computed * doc_scale;
++count;
@@ -769,7 +681,7 @@ static void sp_text_lineheight_unit_changed( gpointer /* */, GObject *tbl )
double font_size = 0;
int count = 0;
for(auto i=itemlist.begin();i!=itemlist.end(); ++i){
- if (SP_IS_TEXT (*i) || SP_IS_FLOWTEXT (*i)) {
+ if (SP_IS_TEXT (*i)) {
double doc_scale = Geom::Affine((*i)->i2dt_affine()).descrim();
font_size += (*i)->style->font_size.computed * doc_scale;
++count;
@@ -1161,7 +1073,7 @@ static void sp_text_set_sizes(GtkListStore* model_size, int unit)
* It is called whenever a text selection is changed, including stepping cursor
* through text, or setting focus to text.
*/
-static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/, GObject *tbl, bool subselection) // don't bother to update font list if subsel changed
+static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/, GObject *tbl, bool subselection = false) // don't bother to update font list if subsel changed
{
#ifdef DEBUG_TEXT
static int count = 0;
@@ -1170,11 +1082,12 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
std::cout << "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" << std::endl;
std::cout << "sp_text_toolbox_selection_changed: start " << count << std::endl;
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = desktop->getSelection();
- auto itemlist0= selection->items();
- for(auto i=itemlist0.begin();i!=itemlist0.end(); ++i) {
- const gchar* id = (*i)->getId();
+ std::cout << " Selected items:" << std::endl;
+ for (GSList const *items = SP_ACTIVE_DESKTOP->getSelection()->itemList();
+ items != NULL;
+ items = items->next)
+ {
+ const gchar* id = reinterpret_cast<SPItem *>(items->data)->getId();
std::cout << " " << id << std::endl;
}
Glib::ustring selected_text = sp_text_get_selected_text((SP_ACTIVE_DESKTOP)->event_context);
@@ -1216,7 +1129,8 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
gboolean isFlow = false;
auto itemlist= SP_ACTIVE_DESKTOP->getSelection()->items();
for(auto i=itemlist.begin();i!=itemlist.end(); ++i){
- // std::cout << " " << ((*i)->getId()?(*i)->getId():"null") << std::endl;
+ // const gchar* id = reinterpret_cast<SPItem *>(items->data)->getId();
+ // std::cout << " " << id << std::endl;
if( SP_IS_FLOWTEXT(*i)) {
isFlow = true;
// std::cout << " Found flowed text" << std::endl;
@@ -1234,26 +1148,10 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
SPStyle query(SP_ACTIVE_DOCUMENT);
int result_family = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTFAMILY);
int result_style = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTSTYLE);
+ int result_numbers = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
int result_baseline = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_BASELINES);
int result_wmode = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_WRITINGMODES);
- // Calling sp_desktop_query_style will result in a call to TextTool::_styleQueried().
- // This returns the style of the selected text inside the <text> element... which
- // is often the style of one or more <tspan>s. If we want the style of the outer
- // <text> objects then we need to bypass the call to TextTool::_styleQueried().
- // The desktop selection never includes the elements inside the <text> element.
- int result_numbers = 0;
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- bool outer = prefs->getInt("/tools/text/outer_style", false);
- if (outer) {
- Inkscape::Selection *selection = desktop->getSelection();
- std::vector<SPItem *> vec(selection->items().begin(), selection->items().end());
- result_numbers = sp_desktop_query_style_from_list (vec, &query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
- } else {
- result_numbers = sp_desktop_query_style (SP_ACTIVE_DESKTOP, &query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
- }
-
/*
* If no text in selection (querying returned nothing), read the style from
* the /tools/text preferencess (default style for new texts). Return if
@@ -1428,13 +1326,7 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
}
// Save unit so we can do convertions between new/old units.
g_object_set_data( tbl, "lineheight_unit", GINT_TO_POINTER(line_height_unit));
-
- // Enable and turn on only if selection includes an object with line height set.
- InkToggleAction* lineHeightUnset =
- INK_TOGGLE_ACTION( g_object_get_data( tbl, "TextLineHeightUnsetAction"));
- gtk_action_set_sensitive(GTK_ACTION(lineHeightUnset), query.line_height.set );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(lineHeightUnset), query.line_height.set );
-
+
// Word spacing
double wordSpacing;
if (query.word_spacing.normal) wordSpacing = 0.0;
@@ -2129,32 +2021,6 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
g_object_set( G_OBJECT(eact), "iconId", "text_rotation", NULL );
}
- /* Text line height unset */
- {
- InkToggleAction* act = ink_toggle_action_new( "TextLineHeightUnsetAction", // Name
- _("Unset line height"), // Label
- _("If enabled, line height is set on part of selection. Click to unset."),
- INKSCAPE_ICON("paint-unknown"),
- secondarySize ); // Icon size
- gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_text_lineheight_unset_changed), holder );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/text/line_height_unset", false) );
- g_object_set_data( holder, "TextLineHeightUnsetAction", act );
- }
-
- /* Text outer style */
- {
- InkToggleAction* act = ink_toggle_action_new( "TextOuterStyleAction", // Name
- _("Show outer style"), // Label
- _("Show style of outermost text element. The 'font-size' and 'line-height' values of the outermost text element determine the minimum line spacing in the block."),
- INKSCAPE_ICON("text_outer_style"),
- secondarySize ); // Icon size
- gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_text_outer_style_changed), holder );
- gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/text/outer_style", false) );
- g_object_set_data( holder, "TextOuterStyleAction", act );
- }
-
// Is this necessary to call? Shouldn't hurt.
sp_text_toolbox_selection_changed(desktop->getSelection(), holder);
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index a3db3c33d..53de2d342 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -508,19 +508,18 @@ static gchar const * ui_descr =
" <toolbar name='TextToolbar'>"
" <toolitem action='TextFontFamilyAction' />"
- " <toolitem action='TextFontStyleAction' />"
- " <separator />"
- " <toolitem action='TextOuterStyleAction' />"
" <toolitem action='TextFontSizeAction' />"
- " <toolitem action='TextLineHeightAction' />"
- " <toolitem action='TextLineHeightUnitsAction' />"
- " <toolitem action='TextLineHeightUnsetAction' />"
+ " <toolitem action='TextFontStyleAction' />"
+// " <toolitem action='TextBoldAction' />"
+// " <toolitem action='TextItalicAction' />"
" <separator />"
" <toolitem action='TextAlignAction' />"
" <separator />"
" <toolitem action='TextSuperscriptAction' />"
" <toolitem action='TextSubscriptAction' />"
" <separator />"
+ " <toolitem action='TextLineHeightAction' />"
+ " <toolitem action='TextLineHeightUnitsAction' />"
" <toolitem action='TextLetterSpacingAction' />"
" <toolitem action='TextWordSpacingAction' />"
" <toolitem action='TextDxAction' />"